diff options
Diffstat (limited to 'docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs')
-rw-r--r-- | docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs | 130 |
1 files changed, 67 insertions, 63 deletions
diff --git a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs index 498529c..93d02fd 100644 --- a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs +++ b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs @@ -136,13 +136,19 @@ public class TableInfo { // Check if there is only one primary key. bool hasPrimaryKey = false; + bool hasKey = false; foreach (var column in ColumnInfos) { if (column.IsPrimaryKey) { - if (hasPrimaryKey) throw new Exception("Two columns are primary key."); + if (hasPrimaryKey) throw new Exception("More than one columns are primary key."); hasPrimaryKey = true; } + + if (column.IsSpecifiedAsKey) + { + if (hasKey) throw new Exception("More than one columns are specified as key column."); + } } if (!hasPrimaryKey) throw new Exception("No column is primary key."); @@ -231,22 +237,26 @@ CREATE TABLE {tableName}( } } - public (string sql, DynamicParameters parameters) GenerateSelectSql(string? what, IWhereClause? whereClause, IOrderByClause? orderByClause = null, int? skip = null, int? limit = null, string? dbProviderId = null) + /// <summary> + /// If you call this manually, it's your duty to call hooks. + /// </summary> + /// <seealso cref="Select"/> + public (string sql, ParamList parameters) GenerateSelectSql(string? selectWhat, IWhereClause? whereClause, IOrderByClause? orderByClause = null, int? skip = null, int? limit = null, string? dbProviderId = null) { CheckRelatedColumns(whereClause); CheckRelatedColumns(orderByClause); - var parameters = new DynamicParameters(); + var parameters = new ParamList(); StringBuilder result = new StringBuilder() - .Append($"SELECT {what ?? "*"} FROM ") + .Append($"SELECT {selectWhat ?? "*"} FROM ") .Append(TableName); if (whereClause is not null) { result.Append(' '); var (whereSql, whereParameters) = whereClause.GenerateSql(dbProviderId); - parameters.AddDynamicParams(whereParameters); + parameters.AddRange(whereParameters); result.Append(whereSql); } @@ -254,7 +264,7 @@ CREATE TABLE {tableName}( { result.Append(' '); var (orderBySql, orderByParameters) = orderByClause.GenerateSql(dbProviderId); - parameters.AddDynamicParams(orderByClause); + parameters.AddRange(orderByParameters); result.Append(orderBySql); } @@ -275,49 +285,15 @@ CREATE TABLE {tableName}( return (result.ToString(), parameters); } - public InsertClause GenerateInsertClauseFromEntity(object entity) - { - Debug.Assert(EntityType.IsInstanceOfType(entity)); - - var insertClause = InsertClause.Create(); - - foreach (var column in ColumnInfos) - { - var propertyInfo = column.PropertyInfo; - if (propertyInfo is null) - { - if (column.IsAutoIncrement) - { - continue; - } - else - { - throw new Exception($"Property {column.ColumnName} not found."); - } - } - - var propertyValue = propertyInfo.GetValue(entity); - if (propertyValue is null) - { - if (column.IsAutoIncrement) - { - continue; - } - else - { - insertClause.Add(column.ColumnName, propertyValue); - } - } - } - - return insertClause; - } - - public (string sql, DynamicParameters parameters) GenerateInsertSql(IInsertClause insertClause, string? dbProviderId = null) + /// <summary> + /// If you call this manually, it's your duty to call hooks. + /// </summary> + /// <seealso cref="Insert"/> + public (string sql, ParamList parameters) GenerateInsertSql(IInsertClause insertClause, string? dbProviderId = null) { CheckRelatedColumns(insertClause); - var parameters = new DynamicParameters(); + var parameters = new ParamList(); var result = new StringBuilder() .Append("INSERT INTO ") @@ -329,41 +305,49 @@ CREATE TABLE {tableName}( var (valueSql, valueParameters) = insertClause.GenerateValueListSql(dbProviderId); result.Append(valueSql).Append(");"); - parameters.AddDynamicParams(valueParameters); + parameters.AddRange(valueParameters); return (result.ToString(), parameters); } - public (string sql, DynamicParameters parameters) GenerateUpdateSql(IWhereClause? whereClause, IUpdateClause updateClause) + /// <summary> + /// If you call this manually, it's your duty to call hooks. + /// </summary> + /// <seealso cref="Update"/> + public (string sql, ParamList parameters) GenerateUpdateSql(IWhereClause? whereClause, IUpdateClause updateClause) { CheckRelatedColumns(whereClause); CheckRelatedColumns(updateClause); - var parameters = new DynamicParameters(); + var parameters = new ParamList(); StringBuilder sb = new StringBuilder("UPDATE "); sb.Append(TableName); sb.Append(" SET "); var (updateSql, updateParameters) = updateClause.GenerateSql(); sb.Append(updateSql); - parameters.AddDynamicParams(updateParameters); + parameters.AddRange(updateParameters); if (whereClause is not null) { sb.Append(" WHERE "); var (whereSql, whereParameters) = whereClause.GenerateSql(); sb.Append(whereSql); - parameters.AddDynamicParams(whereParameters); + parameters.AddRange(whereParameters); } sb.Append(';'); return (sb.ToString(), parameters); } - public (string sql, DynamicParameters parameters) GenerateDeleteSql(IWhereClause? whereClause) + /// <summary> + /// If you call this manually, it's your duty to call hooks. + /// </summary> + /// <seealso cref="Delete"/> + public (string sql, ParamList parameters) GenerateDeleteSql(IWhereClause? whereClause) { CheckRelatedColumns(whereClause); - var parameters = new DynamicParameters(); + var parameters = new ParamList(); StringBuilder sb = new StringBuilder("DELETE FROM "); sb.Append(TableName); @@ -371,7 +355,7 @@ CREATE TABLE {tableName}( { sb.Append(" WHERE "); var (whereSql, whereParameters) = whereClause.GenerateSql(); - parameters.AddDynamicParams(whereParameters); + parameters.AddRange(whereParameters); sb.Append(whereSql); } sb.Append(';'); @@ -379,19 +363,29 @@ CREATE TABLE {tableName}( return (sb.ToString(), parameters); } - private DynamicParameters ConvertParameters(DynamicParameters parameters) + private DynamicParameters ConvertParameters(ParamList parameters) { var result = new DynamicParameters(); - foreach (var paramName in parameters.ParameterNames) + foreach (var param in parameters) { - var value = parameters.Get<object?>(paramName); - if (value is null) + if (param.Value is null || param.Value is DbNullValue) { - result.Add(paramName, null); + result.Add(param.Name, null); continue; } - var typeInfo = _columnTypeProvider.Get(value.GetType()); - result.Add(paramName, typeInfo.ConvertToDatabase(value)); + + var columnName = param.ColumnName; + IColumnTypeInfo typeInfo; + if (columnName is not null) + { + typeInfo = GetColumn(columnName).ColumnType; + } + else + { + typeInfo = _columnTypeProvider.Get(param.Value.GetType()); + } + + result.Add(param.Name, typeInfo.ConvertToDatabase(param.Value), typeInfo.DbType); } return result; } @@ -408,6 +402,9 @@ CREATE TABLE {tableName}( return Select<IEnumerable<object?>>(dbConnection, null, where, orderBy, skip, limit); } + /// <summary> + /// Select and call hooks. + /// </summary> public virtual IEnumerable<TResult> Select<TResult>(IDbConnection dbConnection, string? what, IWhereClause? where = null, IOrderByClause? orderBy = null, int? skip = null, int? limit = null) { var (sql, parameters) = GenerateSelectSql(what, where, orderBy, skip, limit); @@ -422,9 +419,9 @@ CREATE TABLE {tableName}( object? value = null; var dynamicProperty = dynamicType.GetProperty(column.ColumnName); if (dynamicProperty is not null) value = dynamicProperty.GetValue(d); - column.Hooks.AfterSelect(column, ref value); if (value is not null) value = column.ColumnType.ConvertFromDatabase(value); + column.Hooks.AfterSelect(column, ref value); var propertyInfo = column.PropertyInfo; if (propertyInfo is not null) { @@ -436,7 +433,10 @@ CREATE TABLE {tableName}( }); } - // Returns the insert entity's key. + /// <summary> + /// Insert a entity and call hooks. + /// </summary> + /// <returns>The key of insert entity.</returns> public object Insert(IDbConnection dbConnection, IInsertClause insert) { object? key = null; @@ -468,6 +468,10 @@ CREATE TABLE {tableName}( return key ?? throw new Exception("No key???"); } + /// <summary> + /// Upgrade a entity and call hooks. + /// </summary> + /// <returns>The key of insert entity.</returns> public virtual int Update(IDbConnection dbConnection, IWhereClause? where, IUpdateClause update) { var (sql, parameters) = GenerateUpdateSql(where, update); |