diff options
| author | crupest <crupest@outlook.com> | 2022-12-06 19:10:48 +0800 | 
|---|---|---|
| committer | crupest <crupest@outlook.com> | 2022-12-20 20:32:52 +0800 | 
| commit | e7532ff541de35bb02fa6f8305453cfb77cfc538 (patch) | |
| tree | 0bbe4cfed805adc5306463dff4828bd9877f0269 /docker | |
| parent | dbef06668f4e8b81eb466faa11bb37709c79f09c (diff) | |
| download | crupest-e7532ff541de35bb02fa6f8305453cfb77cfc538.tar.gz crupest-e7532ff541de35bb02fa6f8305453cfb77cfc538.tar.bz2 crupest-e7532ff541de35bb02fa6f8305453cfb77cfc538.zip  | |
Develop secret api. v15
Diffstat (limited to 'docker')
3 files changed, 100 insertions, 45 deletions
diff --git a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/ColumnInfo.cs b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/ColumnInfo.cs index 1329c99..1754c8d 100644 --- a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/ColumnInfo.cs +++ b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/ColumnInfo.cs @@ -81,7 +81,7 @@ public class ColumnInfo              EntityPostGet += (entity, column, _, _) =>              {                  var pi = column.PropertyInfo; -                if (pi is not null && column.ColumnTypeInfo.GetDatabaseType() == typeof(string)) +                if (pi is not null && column.ColumnTypeInfo.GetUnderlineType() == typeof(string))                  {                      var value = pi.GetValue(entity);                      if (value is null) @@ -112,7 +112,7 @@ public class ColumnInfo      public event EntityPreSave? EntityPreSave;      public event EntityPostGet? EntityPostGet; -    public string SqlType => TypeRegistry.GetSqlType(ColumnTypeInfo); +    public string SqlType => TypeRegistry.GetSqlTypeRecursive(ColumnTypeInfo);      public string GenerateCreateTableColumnString()      { diff --git a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/ColumnTypeInfo.cs b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/ColumnTypeInfo.cs index d7adb33..e39be98 100644 --- a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/ColumnTypeInfo.cs +++ b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/ColumnTypeInfo.cs @@ -1,3 +1,4 @@ +using System.Data;  using System.Diagnostics;  using System.Text.Json;  using System.Text.Json.Serialization; @@ -11,10 +12,10 @@ public interface IColumnTypeInfo          return null;      } -    Type GetDataType(); -    Type GetDatabaseType(); -    object ConvertToDatabase(object data); -    object ConvertFromDatabase(object databaseData); +    Type GetPropertyType(); +    Type GetUnderlineType(); +    object ConvertToUnderline(object data); +    object ConvertFromUnderline(object databaseData);      void Validate(IReadOnlyDictionary<Type, IColumnTypeInfo> typeInfoMap)      { @@ -24,7 +25,7 @@ public interface IColumnTypeInfo          while (current is not IBuiltinColumnTypeInfo)          { -            var dataType = GetDataType(); +            var dataType = GetPropertyType();              if (typeSet.Contains(dataType))              { @@ -32,7 +33,7 @@ public interface IColumnTypeInfo              }              typeSet.Add(dataType); -            var databaseType = GetDatabaseType(); +            var databaseType = GetUnderlineType();              if (!typeInfoMap.ContainsKey(databaseType))              {                  throw new Exception("Broken type chain."); @@ -45,25 +46,29 @@ public interface IColumnTypeInfo  public interface IBuiltinColumnTypeInfo : IColumnTypeInfo  { -    /// To use for non-builtin type, use <see cref="ColumnTypeInfoRegistry.GetSqlType(IColumnTypeInfo)" /> because we need registry to query more information.  +    /// To use for non-builtin type, use <see cref="ColumnTypeInfoRegistry.GetSqlTypeRecursive(IColumnTypeInfo)" /> because we need registry to query more information.       string GetSqlType(); +    // To use for non-builtin type, use <see cref="ColumnTypeInfoRegistry.GetDbType(IColumnTypeInfo)" /> because we need registry to query more information. +    DbType GetDbType();  }  public class BuiltinColumnTypeInfo<T> : IBuiltinColumnTypeInfo  {      private readonly string _sqlType; +    private readonly DbType _dbType; -    public BuiltinColumnTypeInfo(string sqlType) +    public BuiltinColumnTypeInfo(string sqlType, DbType dbType)      {          _sqlType = sqlType; +        _dbType = dbType;      } -    public Type GetDataType() +    public Type GetPropertyType()      {          return typeof(T);      } -    public Type GetDatabaseType() +    public Type GetUnderlineType()      {          return typeof(T);      } @@ -73,6 +78,11 @@ public class BuiltinColumnTypeInfo<T> : IBuiltinColumnTypeInfo          return _sqlType;      } +    public DbType GetDbType() +    { +        return _dbType; +    } +      public T ConvertToDatabase(T data)      {          return data; @@ -83,12 +93,12 @@ public class BuiltinColumnTypeInfo<T> : IBuiltinColumnTypeInfo          return databaseData;      } -    object IColumnTypeInfo.ConvertToDatabase(object data) +    object IColumnTypeInfo.ConvertToUnderline(object data)      {          return data;      } -    object IColumnTypeInfo.ConvertFromDatabase(object databaseData) +    object IColumnTypeInfo.ConvertFromUnderline(object databaseData)      {          return databaseData;      } @@ -99,33 +109,33 @@ public interface ICustomColumnTypeInfo : IColumnTypeInfo  } -public abstract class CustomColumnTypeInfo<TDataType, TDatabaseType> : ICustomColumnTypeInfo - where TDataType : notnull where TDatabaseType : notnull +public abstract class CustomColumnTypeInfo<TPropertyType, TUnderlineType> : ICustomColumnTypeInfo + where TPropertyType : notnull where TUnderlineType : notnull  { -    public Type GetDataType() +    public Type GetPropertyType()      { -        return typeof(TDataType); +        return typeof(TPropertyType);      } -    public Type GetDatabaseType() +    public Type GetUnderlineType()      { -        return typeof(TDatabaseType); +        return typeof(TUnderlineType);      } -    public abstract TDatabaseType ConvertToDatabase(TDataType data); -    public abstract TDataType ConvertFromDatabase(TDatabaseType databaseData); +    public abstract TUnderlineType ConvertToUnderline(TPropertyType data); +    public abstract TPropertyType ConvertFromUnderline(TUnderlineType databaseData); -    object IColumnTypeInfo.ConvertToDatabase(object data) +    object IColumnTypeInfo.ConvertToUnderline(object data)      { -        Debug.Assert(data is TDataType); -        return ConvertToDatabase((TDataType)data); +        Debug.Assert(data is TPropertyType); +        return ConvertToUnderline((TPropertyType)data);      } -    object IColumnTypeInfo.ConvertFromDatabase(object databaseData) +    object IColumnTypeInfo.ConvertFromUnderline(object databaseData)      { -        Debug.Assert(databaseData is TDatabaseType); -        return ConvertFromDatabase((TDatabaseType)databaseData); +        Debug.Assert(databaseData is TUnderlineType); +        return ConvertFromUnderline((TUnderlineType)databaseData);      }  } @@ -138,12 +148,12 @@ public class DateTimeColumnTypeInfo : CustomColumnTypeInfo<DateTime, long>          return _jsonConverter;      } -    public override long ConvertToDatabase(DateTime data) +    public override long ConvertToUnderline(DateTime data)      {          return new DateTimeOffset(data).ToUnixTimeSeconds();      } -    public override DateTime ConvertFromDatabase(long databaseData) +    public override DateTime ConvertFromUnderline(long databaseData)      {          return DateTimeOffset.FromUnixTimeSeconds(databaseData).LocalDateTime;      } @@ -173,14 +183,14 @@ public class ColumnTypeInfoRegistry  {      public static IReadOnlyList<IColumnTypeInfo> BuiltinList = new List<IColumnTypeInfo>()      { -        new BuiltinColumnTypeInfo<char>("INTEGER"), -        new BuiltinColumnTypeInfo<short>("INTEGER"), -        new BuiltinColumnTypeInfo<int>("INTEGER"), -        new BuiltinColumnTypeInfo<long>("INTEGER"), -        new BuiltinColumnTypeInfo<float>("REAL"), -        new BuiltinColumnTypeInfo<double>("REAL"), -        new BuiltinColumnTypeInfo<string>("TEXT"), -        new BuiltinColumnTypeInfo<byte[]>("BLOB"), +        new BuiltinColumnTypeInfo<char>("INTEGER", DbType.Int32), +        new BuiltinColumnTypeInfo<short>("INTEGER", DbType.Int32), +        new BuiltinColumnTypeInfo<int>("INTEGER", DbType.Int32), +        new BuiltinColumnTypeInfo<long>("INTEGER", DbType.Int64), +        new BuiltinColumnTypeInfo<float>("REAL", DbType.Double), +        new BuiltinColumnTypeInfo<double>("REAL", DbType.Double), +        new BuiltinColumnTypeInfo<string>("TEXT", DbType.String), +        new BuiltinColumnTypeInfo<byte[]>("BLOB", DbType.Binary),      }; @@ -222,7 +232,7 @@ public class ColumnTypeInfoRegistry      {          Debug.Assert(!_list.Contains(columnTypeInfo));          _list.Add(columnTypeInfo); -        _map.Add(columnTypeInfo.GetDataType(), columnTypeInfo); +        _map.Add(columnTypeInfo.GetPropertyType(), columnTypeInfo);          _dirty = true;      } @@ -236,28 +246,72 @@ public class ColumnTypeInfoRegistry          return GetByDataType(type) ?? throw new Exception("Unsupported type.");      } -    public string GetSqlType(IColumnTypeInfo columnTypeInfo) +    public string GetSqlTypeRecursive(IColumnTypeInfo columnTypeInfo)      {          EnsureValidity();          IColumnTypeInfo? current = columnTypeInfo; +        while (current is not IBuiltinColumnTypeInfo) +        { +            current = GetByDataType(current.GetUnderlineType()); +            Debug.Assert(current is not null); +        } + +        return ((IBuiltinColumnTypeInfo)current).GetSqlType(); +    } + +    public DbType GetDbTypeRecursive(IColumnTypeInfo columnTypeInfo) +    { +        EnsureValidity(); + +        IColumnTypeInfo? current = columnTypeInfo; +        if (current is not IBuiltinColumnTypeInfo) +        { +            current = GetByDataType(current.GetUnderlineType()); +            Debug.Assert(current is not null); +        } + +        return ((IBuiltinColumnTypeInfo)current).GetDbType(); +    } + +    public object? ConvertToUnderlineRecursive(object? value) +    { +        EnsureValidity(); + +        if (value is null) +        { +            return null; +        } + +        IColumnTypeInfo? current = GetByDataType(value.GetType());          if (current is null)          { -            throw new Exception("Unsupported type for sql."); +            return value;          }          while (current is not IBuiltinColumnTypeInfo)          { -            current = GetByDataType(current.GetDatabaseType()); +            value = current.ConvertToUnderline(value); +            current = GetByDataType(current.GetUnderlineType());              Debug.Assert(current is not null);          } -        return ((IBuiltinColumnTypeInfo)current).GetSqlType(); +        return value;      }      public string GetSqlType(Type type)      { -        return GetSqlType(GetRequiredByDataType(type)); +        return GetSqlTypeRecursive(GetRequiredByDataType(type)); +    } + +    public DbType GetDbType(Type type) +    { +        return GetDbTypeRecursive(GetRequiredByDataType(type)); +    } + +    public object? ConvertToUnderline(object? value) +    { +        return ConvertToUnderlineRecursive(value);      }      public void Validate() diff --git a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/WhereClause.cs b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/WhereClause.cs index 2352e7e..ba1a28c 100644 --- a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/WhereClause.cs +++ b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/WhereClause.cs @@ -1,3 +1,4 @@ +using System.Data;  using System.Diagnostics;  using Dapper; @@ -56,7 +57,7 @@ public static class DynamicParametersExtensions      public static string AddRandomNameParameter(this DynamicParameters parameters, object? value)      {          var parameterName = IWhereClause.GenerateRandomParameterName(parameters); -        parameters.Add(parameterName, value); +        parameters.Add(parameterName, ColumnTypeInfoRegistry.Singleton.ConvertToUnderlineRecursive(value));          return parameterName;      }  }  | 
