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 | c16159d9ef9e3b3f359966d17f3aa6eb420620f6 (patch) | |
tree | 0bbe4cfed805adc5306463dff4828bd9877f0269 | |
parent | 930269ad13bfd935a8d1c9a3cb90d92900dc1f94 (diff) | |
download | crupest-c16159d9ef9e3b3f359966d17f3aa6eb420620f6.tar.gz crupest-c16159d9ef9e3b3f359966d17f3aa6eb420620f6.tar.bz2 crupest-c16159d9ef9e3b3f359966d17f3aa6eb420620f6.zip |
Develop secret api. v15
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; } } |