diff options
| author | crupest <crupest@outlook.com> | 2022-12-12 16:21:44 +0800 | 
|---|---|---|
| committer | crupest <crupest@outlook.com> | 2022-12-20 20:32:53 +0800 | 
| commit | 48742e28c612b9c1b2b1435cdd32152f61041645 (patch) | |
| tree | e474fb98d41de5b48b2e9b11cc2909dda2fc9b6a /docker/crupest-api/CrupestApi | |
| parent | 24d42e5eb284267966aee8bb687710bfcbc1a255 (diff) | |
| download | crupest-48742e28c612b9c1b2b1435cdd32152f61041645.tar.gz crupest-48742e28c612b9c1b2b1435cdd32152f61041645.tar.bz2 crupest-48742e28c612b9c1b2b1435cdd32152f61041645.zip | |
Develop secret api. v30
Diffstat (limited to 'docker/crupest-api/CrupestApi')
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));      } | 
