package main // ============================================================ // db-history.go - Schema 版本声明与字段映射 // ============================================================ type SchemaVersionDef struct { Version string TableName string Columns map[string]ColumnDef } type ColumnDef struct { Type string NotNull bool Default string Primary bool } var schemaHistory = []SchemaVersionDef{ // v1:初始版本 { Version: "v1", TableName: "proxies", Columns: map[string]ColumnDef{ "id": {Type: "INTEGER", Primary: true}, "name": {Type: "TEXT", NotNull: true}, "type": {Type: "TEXT", NotNull: true, Default: "'tcp'"}, "local_ip": {Type: "TEXT", NotNull: true}, "local_port": {Type: "INTEGER", NotNull: true}, "remote_port": {Type: "INTEGER", NotNull: true}, "enabled": {Type: "INTEGER", NotNull: true, Default: "1"}, "created_at": {Type: "DATETIME", Default: "CURRENT_TIMESTAMP"}, "updated_at": {Type: "DATETIME", Default: "CURRENT_TIMESTAMP"}, }, }, // v2:当前版本(frpc-console 2.0 LTS) { Version: "v2", TableName: "proxies", Columns: map[string]ColumnDef{ "id": {Type: "INTEGER", Primary: true}, "name": {Type: "TEXT", NotNull: true}, "type": {Type: "TEXT", NotNull: true, Default: "'tcp'"}, "local_ip": {Type: "TEXT", NotNull: true}, "local_port": {Type: "INTEGER", NotNull: true}, "remote_port": {Type: "INTEGER", NotNull: true}, "enabled": {Type: "INTEGER", NotNull: true, Default: "1"}, "created_at": {Type: "DATETIME", Default: "CURRENT_TIMESTAMP"}, "updated_at": {Type: "DATETIME", Default: "CURRENT_TIMESTAMP"}, }, }, } func getSchemaDef(version string) *SchemaVersionDef { for _, def := range schemaHistory { if def.Version == version { return &def } } return nil } func getLatestSchemaDef() *SchemaVersionDef { if len(schemaHistory) == 0 { return nil } return &schemaHistory[len(schemaHistory)-1] } func schemaVersionsEqual(v1, v2 *SchemaVersionDef) bool { if v1 == nil || v2 == nil { return false } if v1.TableName != v2.TableName { return false } if len(v1.Columns) != len(v2.Columns) { return false } for name, col1 := range v1.Columns { col2, ok := v2.Columns[name] if !ok { return false } if col1.Type != col2.Type || col1.NotNull != col2.NotNull || col1.Default != col2.Default { return false } } return true }