aboutsummaryrefslogtreecommitdiff
path: root/docker/crupest-api/CrupestApi
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2022-12-12 16:21:44 +0800
committercrupest <crupest@outlook.com>2022-12-20 20:32:53 +0800
commit48742e28c612b9c1b2b1435cdd32152f61041645 (patch)
treee474fb98d41de5b48b2e9b11cc2909dda2fc9b6a /docker/crupest-api/CrupestApi
parent24d42e5eb284267966aee8bb687710bfcbc1a255 (diff)
downloadcrupest-48742e28c612b9c1b2b1435cdd32152f61041645.tar.gz
crupest-48742e28c612b9c1b2b1435cdd32152f61041645.tar.bz2
crupest-48742e28c612b9c1b2b1435cdd32152f61041645.zip
Develop secret api. v30
Diffstat (limited to 'docker/crupest-api/CrupestApi')
-rw-r--r--docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/CrudService.cs4
-rw-r--r--docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/README.md6
-rw-r--r--docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs43
3 files changed, 41 insertions, 12 deletions
diff --git a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/CrudService.cs b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/CrudService.cs
index 9400a7b..53424a4 100644
--- a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/CrudService.cs
+++ b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/CrudService.cs
@@ -41,7 +41,7 @@ public class CrudService<TEntity> : IDisposable where TEntity : class
public List<TEntity> Select(IWhereClause? filter)
{
- return _table.Select(_dbConnection, filter).Cast<TEntity>().ToList();
+ return _table.Select<TEntity>(_dbConnection, null, filter).ToList();
}
public bool Exists(IWhereClause? filter)
@@ -60,7 +60,7 @@ public class CrudService<TEntity> : IDisposable where TEntity : class
return _table.Insert(_dbConnection, insertClause);
}
- // Return the key.
+ // Return the key. TODO: Continue here.
public object Insert(TEntity entity)
{
return _table.Insert(_dbConnection, );
diff --git a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/README.md b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/README.md
index c30ea90..589b0a8 100644
--- a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/README.md
+++ b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/README.md
@@ -1,5 +1,9 @@
# CRUD Technic Notes
+## Overview
+
+The ultimate CRUD scaffold finally comes.
+
## Database Pipeline
### Select
@@ -10,8 +14,6 @@
4. Run hook `AfterSelect` for every column.
5. Convert `dynamic`s to `TEntity`s.
-TODO: Continue here.
-
### Insert
1. Create insert clause consisting of insert items.
diff --git a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs
index 089ff8a..64ea505 100644
--- a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs
+++ b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs
@@ -284,6 +284,25 @@ CREATE TABLE {tableName}(
return (result.ToString(), parameters);
}
+ public void CheckInsertClause(IInsertClause insertClause)
+ {
+ var columnNameSet = new HashSet<string>(ColumnInfos.Select(c => c.ColumnName));
+
+ foreach (var item in insertClause.Items)
+ {
+ columnNameSet.Remove(item.ColumnName);
+ }
+
+ foreach (var columnName in columnNameSet)
+ {
+ var column = GetColumn(columnName);
+ if (!column.IsAutoIncrement)
+ {
+ throw new Exception($"Column {columnName} is not specified and is not auto increment.");
+ }
+ }
+ }
+
/// <summary>
/// If you call this manually, it's your duty to call hooks.
/// </summary>
@@ -291,6 +310,7 @@ CREATE TABLE {tableName}(
public (string sql, ParamList parameters) GenerateInsertSql(IInsertClause insertClause, string? dbProviderId = null)
{
CheckRelatedColumns(insertClause);
+ CheckInsertClause(insertClause);
var parameters = new ParamList();
@@ -463,7 +483,6 @@ CREATE TABLE {tableName}(
return queryResult.Select(MapDynamicTo<TResult>).ToList();
}
- // TODO: Continue here.
/// <summary>
/// Insert a entity and call hooks.
/// </summary>
@@ -473,7 +492,7 @@ CREATE TABLE {tableName}(
object? key = null;
foreach (var column in ColumnInfos)
{
- InsertItem? item = insert.Items.FirstOrDefault(i => i.ColumnName == column.ColumnName);
+ InsertItem? item = insert.Items.SingleOrDefault(i => i.ColumnName == column.ColumnName);
object? value = null;
if (item is null)
{
@@ -505,21 +524,29 @@ CREATE TABLE {tableName}(
/// <returns>The key of insert entity.</returns>
public virtual int Update(IDbConnection dbConnection, IWhereClause? where, IUpdateClause update)
{
- var (sql, parameters) = GenerateUpdateSql(where, update);
-
- var readUpdateClause = UpdateClause.Create();
+ var realUpdate = UpdateClause.Create();
foreach (var column in ColumnInfos)
{
UpdateItem? item = update.Items.FirstOrDefault(i => i.ColumnName == column.ColumnName);
- var value = item?.Value;
- column.Hooks.BeforeUpdate(column, ref value, item is null ? false : true);
+
+ object? value = item?.Value;
+ column.Hooks.BeforeUpdate(column, ref value, false);
+
if (value is not null)
{
- readUpdateClause.Add(column.ColumnName, value);
+ if (value is DbNullValue)
+ {
+ realUpdate.Add(column.ColumnName, null);
+ }
+ else
+ {
+ realUpdate.Add(column.ColumnName, value);
+ }
}
}
+ var (sql, parameters) = GenerateUpdateSql(where, realUpdate);
return dbConnection.Execute(sql, ConvertParameters(parameters));
}