aboutsummaryrefslogtreecommitdiff
path: root/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/Migrations/DatabaseMigrator.cs
blob: 3d59c21d261a9675292715e667b16c560ad7b5c6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
using System.Data;

namespace CrupestApi.Commons.Crud.Migrations;

public class TableColumn : IEquatable<TableColumn>
{
    public TableColumn(string name, string type, bool isNullable, int primaryKey)
    {
        Name = name.ToLowerInvariant();
        Type = type.ToLowerInvariant();
        IsNullable = isNullable;
        PrimaryKey = primaryKey;
    }

    public string Name { get; set; }
    public string Type { get; set; }
    public bool IsNullable { get; set; }

    /// <summary>
    /// 0 if not primary key. 1-based index if in primary key.
    /// </summary>
    public int PrimaryKey { get; set; }

    bool IEquatable<TableColumn>.Equals(TableColumn? other)
    {
        if (other is null)
        {
            return false;
        }

        return Name == other.Name && Type == other.Type && IsNullable == other.IsNullable && PrimaryKey == other.PrimaryKey;
    }

    public override bool Equals(object? obj)
    {
        return Equals(obj as TableColumn);
    }

    public override int GetHashCode()
    {
        return HashCode.Combine(Name, Type, IsNullable, PrimaryKey);
    }
}

public class Table
{
    public Table(string name)
    {
        Name = name;
    }

    public string Name { get; set; }
    public List<TableColumn> Columns { get; set; } = new List<TableColumn>();
}

public interface IDatabaseMigrator
{
    Table GetTable(IDbConnection dbConnection, string name);
    Table ConvertTableInfoToTable(TableInfo tableInfo);
    string GenerateCreateTableColumnSqlSegment(TableColumn column);
    string GenerateCreateTableSql(string tableName, IEnumerable<TableColumn> columns);
    bool TableExists(IDbConnection connection, string tableName);
    bool NeedMigrate(IDbConnection dbConnection, TableInfo tableInfo);
    bool CanAutoMigrate(IDbConnection dbConnection, TableInfo tableInfo);
    void AutoMigrate(IDbConnection dbConnection, TableInfo tableInfo);
}