diff options
Diffstat (limited to 'docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud')
4 files changed, 36 insertions, 3 deletions
| diff --git a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/ColumnInfo.cs b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/ColumnInfo.cs index b76e1ae..c3d118c 100644 --- a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/ColumnInfo.cs +++ b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/ColumnInfo.cs @@ -16,7 +16,7 @@ public class ColumnInfo      }      // A column with no property. -    public ColumnInfo(Type entityType, string sqlColumnName, bool isPrimaryKey, bool isAutoIncrement, IColumnTypeInfo typeInfo, ColumnTypeInfoRegistry? typeRegistry = null) +    public ColumnInfo(Type entityType, string sqlColumnName, bool isPrimaryKey, bool isAutoIncrement, IColumnTypeInfo typeInfo, ColumnIndexType indexType = ColumnIndexType.None, ColumnTypeInfoRegistry? typeRegistry = null)      {          if (typeRegistry is null)          { @@ -33,6 +33,7 @@ public class ColumnInfo          IsPrimaryKey = isPrimaryKey;          IsAutoIncrement = isAutoIncrement;          TypeRegistry = typeRegistry; +        IndexType = indexType;      }      public ColumnInfo(Type entityType, string entityPropertyName, ColumnTypeInfoRegistry? typeRegistry = null) @@ -58,11 +59,13 @@ public class ColumnInfo          {              SqlColumnName = PropertyName;              Nullable = true; +            IndexType = ColumnIndexType.None;          }          else          {              SqlColumnName = columnAttribute.DatabaseName ?? PropertyName;              Nullable = !columnAttribute.NonNullable; +            IndexType = columnAttribute.IndexType;          }          ColumnTypeInfo = typeRegistry.GetRequiredByDataType(PropertyRealType); @@ -80,6 +83,7 @@ public class ColumnInfo      public bool Nullable { get; }      public bool IsPrimaryKey { get; }      public bool IsAutoIncrement { get; } +    public ColumnIndexType IndexType { get; }      public string SqlType => TypeRegistry.GetSqlType(ColumnTypeInfo); diff --git a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/ColumnMetadata.cs b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/ColumnMetadata.cs index cbf38f7..6f46cd5 100644 --- a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/ColumnMetadata.cs +++ b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/ColumnMetadata.cs @@ -5,6 +5,13 @@ public interface IColumnMetadata  } +public enum ColumnIndexType +{ +    None, +    Unique, +    NonUnique +} +  [AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]  public class ColumnAttribute : Attribute, IColumnMetadata  { @@ -17,5 +24,8 @@ public class ColumnAttribute : Attribute, IColumnMetadata      // default false      public bool IsPrimaryKey { get; set; } +    // default false      public bool IsAutoIncrement { get; set; } + +    public ColumnIndexType IndexType { get; set; } = ColumnIndexType.None;  } diff --git a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/CrudService.cs b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/CrudService.cs index 63a247b..acb05f8 100644 --- a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/CrudService.cs +++ b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/CrudService.cs @@ -1,4 +1,3 @@ -using System.Data;  using Dapper;  using Microsoft.Data.Sqlite;  using Microsoft.Extensions.Options; diff --git a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs index 660cd4d..38daa3f 100644 --- a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs +++ b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs @@ -1,3 +1,4 @@ +using System.Text;  using Dapper;  using Microsoft.Data.Sqlite; @@ -78,7 +79,21 @@ public class TableInfo          }      } -    public string GenerateCreateTableSql() +    public string GenerateCreateIndexSql() +    { +        var sb = new StringBuilder(); + +        foreach (var column in ColumnInfos) +        { +            if (column.IndexType == ColumnIndexType.None) continue; + +            sb.Append($"CREATE {(column.IndexType == ColumnIndexType.Unique ? "UNIQUE" : "")} INDEX {TableName}_{column.SqlColumnName}_index ON {TableName} ({column.SqlColumnName});\n"); +        } + +        return sb.ToString(); +    } + +    public string GenerateCreateTableSql(bool createIndex = true)      {          var tableName = TableName;          var columnSql = string.Join(",\n", ColumnInfos.Select(c => c.GenerateCreateTableColumnString())); @@ -89,6 +104,11 @@ CREATE TABLE {tableName}(  );          "; +        if (createIndex) +        { +            sql += GenerateCreateIndexSql(); +        } +          return sql;      } | 
