diff options
| author | crupest <crupest@outlook.com> | 2022-12-11 11:12:29 +0800 | 
|---|---|---|
| committer | crupest <crupest@outlook.com> | 2022-12-20 20:32:53 +0800 | 
| commit | 8243498d2a201616239c6f4c48fa68737175978c (patch) | |
| tree | 3dbe79a875e9f7d602cba6e551c69193cadaf1ea /docker/crupest-api/CrupestApi/CrupestApi.Commons | |
| parent | bd523a6a7cac09fe580223c3d75e41e1e100f603 (diff) | |
| download | crupest-8243498d2a201616239c6f4c48fa68737175978c.tar.gz crupest-8243498d2a201616239c6f4c48fa68737175978c.tar.bz2 crupest-8243498d2a201616239c6f4c48fa68737175978c.zip  | |
Develop secret api. v27
Diffstat (limited to 'docker/crupest-api/CrupestApi/CrupestApi.Commons')
5 files changed, 36 insertions, 26 deletions
diff --git a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/ColumnInfo.cs b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/ColumnInfo.cs index 800594d..4a594bb 100644 --- a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/ColumnInfo.cs +++ b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/ColumnInfo.cs @@ -6,10 +6,7 @@ namespace CrupestApi.Commons.Crud;  public class ColumnHooks  { -    /// <summary> -    /// If value is null, then it might because the column does not designated a value or it is designated null. -    /// </summary> -    public delegate void ColumnHookAction(ColumnInfo column, ref object? value); +    public delegate void ColumnHookAction(ColumnInfo column, ref object? value, bool specified);      public ColumnHooks(ColumnHookAction afterSelect, ColumnHookAction beforeInsert, ColumnHookAction beforeUpdate)      { @@ -133,18 +130,18 @@ public class ColumnInfo      private void TryCoerceStringFromNullToEmpty(ref object? value)      { -        if (ColumnType.ClrType == typeof(string) && (Metadata.GetValueOrDefault<bool?>(ColumnMetadataKeys.DefaultEmptyForString) ?? false) && value is null) +        if (ColumnType.ClrType == typeof(string) && (Metadata.GetValueOrDefault<bool?>(ColumnMetadataKeys.DefaultEmptyForString) is true) && (value is null || value is DbNullValue))          {              value = "";          }      } -    protected void OnAfterSelect(ColumnInfo column, ref object? value) +    protected void OnAfterSelect(ColumnInfo column, ref object? value, bool specified)      {          TryCoerceStringFromNullToEmpty(ref value);      } -    protected void OnBeforeInsert(ColumnInfo column, ref object? value) +    protected void OnBeforeInsert(ColumnInfo column, ref object? value, bool specified)      {          if (column.IsClientGenerate && value is not null)          { @@ -156,18 +153,13 @@ public class ColumnInfo          OnBeforeSet(column, ref value);      } -    protected void OnBeforeUpdate(ColumnInfo column, ref object? value) +    protected void OnBeforeUpdate(ColumnInfo column, ref object? value, bool specified)      {          if (column.IsNoUpdate)          {              throw new UserException($"'{column.ColumnName}' is not updatable.");          } -        if ((column.UpdateBehavior & UpdateBehavior.NullIsSetNull) != 0 && value is null) -        { -            value = DbNullValue.Instance; -        } -          OnBeforeSet(column, ref value);      } @@ -175,7 +167,7 @@ public class ColumnInfo      {          TryCoerceStringFromNullToEmpty(ref value); -        if (value is null && column.IsNotNull) +        if ((value is null || value is DbNullValue) && column.IsNotNull)          {              throw new UserException($"{column.ColumnName} can't be null.");          } diff --git a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/InsertClause.cs b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/InsertClause.cs index 7f248cf..7645b09 100644 --- a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/InsertClause.cs +++ b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/InsertClause.cs @@ -1,10 +1,12 @@  using System.Text; -using Dapper;  namespace CrupestApi.Commons.Crud;  public class InsertItem  { +    /// <summary> +    /// Null means use default value. Use <see cref="DbNullValue"/>. +    /// </summary>      public InsertItem(string columnName, object? value)      {          ColumnName = columnName; @@ -54,7 +56,7 @@ public class InsertClause : IInsertClause      public string GenerateColumnListSql(string? dbProviderId = null)      { -        return string.Join(", ", Items.Select(i => i.ColumnName)); +        return string.Join(", ", Items.Where(i => i.Value is not null).Select(i => i.ColumnName));      }      public (string sql, ParamList parameters) GenerateValueListSql(string? dbProviderId = null) @@ -64,6 +66,7 @@ public class InsertClause : IInsertClause          for (var i = 0; i < Items.Count; i++)          {              var item = Items[i]; +            if (item.Value is null) continue;              var parameterName = parameters.AddRandomNameParameter(item.Value, item.ColumnName);              sb.Append($"@{parameterName}");              if (i != Items.Count - 1) diff --git a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/OrderByClause.cs b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/OrderByClause.cs index a1aaa45..0a43c67 100644 --- a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/OrderByClause.cs +++ b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/OrderByClause.cs @@ -1,5 +1,3 @@ -using Dapper; -  namespace CrupestApi.Commons.Crud;  public class OrderByItem diff --git a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/ParamMap.cs b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/ParamMap.cs index 4b253b7..fe8d2a0 100644 --- a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/ParamMap.cs +++ b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/ParamMap.cs @@ -3,6 +3,9 @@ using System.Diagnostics;  namespace CrupestApi.Commons.Crud; +/// <summary> +/// Null value will be thrown. Please use <see cref="DbNullValue.Instance"/>. +/// </summary>  public record ParamInfo(string Name, object? Value, string? ColumnName = null);  public class ParamList : List<ParamInfo> diff --git a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs index 93d02fd..d2f48c6 100644 --- a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs +++ b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs @@ -1,5 +1,4 @@  using System.Data; -using System.Diagnostics;  using System.Reflection;  using System.Text;  using Dapper; @@ -368,7 +367,12 @@ CREATE TABLE {tableName}(          var result = new DynamicParameters();          foreach (var param in parameters)          { -            if (param.Value is null || param.Value is DbNullValue) +            if (param.Value is null) +            { +                continue; +            } + +            if (param.Value is DbNullValue)              {                  result.Add(param.Name, null);                  continue; @@ -418,10 +422,17 @@ CREATE TABLE {tableName}(              {                  object? value = null;                  var dynamicProperty = dynamicType.GetProperty(column.ColumnName); -                if (dynamicProperty is not null) value = dynamicProperty.GetValue(d); -                if (value is not null) -                    value = column.ColumnType.ConvertFromDatabase(value); -                column.Hooks.AfterSelect(column, ref value); +                if (dynamicProperty is null) +                { +                    column.Hooks.AfterSelect(column, ref value, false); +                } +                else +                { +                    value = dynamicProperty.GetValue(d); +                    if (value is not null) +                        value = column.ColumnType.ConvertFromDatabase(value); +                    column.Hooks.AfterSelect(column, ref value, true); +                }                  var propertyInfo = column.PropertyInfo;                  if (propertyInfo is not null)                  { @@ -443,8 +454,11 @@ CREATE TABLE {tableName}(          foreach (var column in ColumnInfos)          {              InsertItem? item = insert.Items.FirstOrDefault(i => i.ColumnName == column.ColumnName); -            var value = item?.Value; -            column.Hooks.BeforeInsert(column, ref value); +            object? value = null; +            if (item is null || item.Value is null) +            { +                column.Hooks.BeforeInsert(column, , ); +            }              if (item is null)              {                  item = new InsertItem(column.ColumnName, value);  | 
