From f359598109d8119b477a9f44eb4e0bbec7596c0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E8=8C=B6=E6=B8=85=E6=AC=A2?= Date: Fri, 23 Aug 2024 17:29:11 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=81=E4=BA=BA=E5=B7=A5=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E8=A1=A8=E7=BB=93=E6=9E=84=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- abstract/wrapper_db_client.go | 4 ++- define/api2sql.go | 11 -------- define/table.go | 11 ++++++++ wrapper_db_client.go | 47 +++++++++++++++++++++++++++++++---- 4 files changed, 56 insertions(+), 17 deletions(-) diff --git a/abstract/wrapper_db_client.go b/abstract/wrapper_db_client.go index 104646f..4ab2bb6 100644 --- a/abstract/wrapper_db_client.go +++ b/abstract/wrapper_db_client.go @@ -31,5 +31,7 @@ type IWrapperDatabaseClient interface { // CacheDataTableStructureConfig 缓存数据表结构的配置 CacheDataTableStructureConfig() *define.CacheTableStructureConfig // GetTableFieldList 获取指定表数据字段列表 - GetTableFieldList(tableName string) ([]*define.ColumnInfo, error) + GetTableFieldList(tableName string) ([]*define.ColumnConfig, error) + // SetTableStructure 设置数据表结构 + SetTableStructure(tableConfigTable map[string][]*define.ColumnConfig) } diff --git a/define/api2sql.go b/define/api2sql.go index 0e20c28..989388f 100644 --- a/define/api2sql.go +++ b/define/api2sql.go @@ -70,14 +70,3 @@ type SqlCondition struct { Operate string `json:"operate"` // 操作 : == / !== / in / not in / like / not like Value any `json:"value"` // 数据值 } - -// ColumnConfig ... -// -// Author : go_developer@163.com<白茶清欢> -// -// Date : 16:42 2024/8/23 -type ColumnConfig struct { - Column string `json:"column"` // 字段名 - Alias string `json:"alias"` // 字段别名 - Type string `json:"type"` // 字段类型 -} diff --git a/define/table.go b/define/table.go index 91edc05..32138b9 100644 --- a/define/table.go +++ b/define/table.go @@ -16,3 +16,14 @@ type CacheTableStructureConfig struct { Enable bool `json:"enable"` // 是否启用表结构缓存 SyncTimeInterval int `json:"sync_time_interval"` // 开启的情况向, 多久同步一次表结构, 默认值 3600, 单位 : s } + +// ColumnConfig ... +// +// Author : go_developer@163.com<白茶清欢> +// +// Date : 16:42 2024/8/23 +type ColumnConfig struct { + Column string `json:"column"` // 字段名 + Alias string `json:"alias"` // 字段别名 + Type string `json:"type"` // 字段类型 +} diff --git a/wrapper_db_client.go b/wrapper_db_client.go index ee0885d..5bc1c8c 100644 --- a/wrapper_db_client.go +++ b/wrapper_db_client.go @@ -19,6 +19,7 @@ import ( "gorm.io/driver/sqlite" "gorm.io/gorm" gormLogger "gorm.io/gorm/logger" + "strings" "sync" "time" ) @@ -37,7 +38,7 @@ type DBClient struct { Cfg define.Driver // 数据库配置 cacheTableStructureConfig *define.CacheTableStructureConfig // 缓存配置 lock *sync.RWMutex // 操作锁 - tableStructureCache map[string][]*define.ColumnInfo // 表结构缓存 + tableStructureCache map[string][]*define.ColumnConfig // 表结构缓存 } // Init 初始化客户端 @@ -179,10 +180,10 @@ func (dc *DBClient) CacheDataTableStructureConfig() *define.CacheTableStructureC // Author : go_developer@163.com<白茶清欢> // // Date : 15:07 2024/8/21 -func (dc *DBClient) GetTableFieldList(tableName string) ([]*define.ColumnInfo, error) { +func (dc *DBClient) GetTableFieldList(tableName string) ([]*define.ColumnConfig, error) { if !dc.CacheDataTableStructureConfig().Enable { // 未启用缓存, 返回空list - return make([]*define.ColumnInfo, 0), nil + return make([]*define.ColumnConfig, 0), nil } dc.lock.RLock() defer dc.lock.RUnlock() @@ -198,6 +199,10 @@ func (dc *DBClient) GetTableFieldList(tableName string) ([]*define.ColumnInfo, e // // Date : 15:17 2024/8/21 func (dc *DBClient) syncDbTableStructure(ignoreErr bool) error { + if !dc.CacheDataTableStructureConfig().Enable { + // 自动同步不可用 + return nil + } var ( err error tableList []string @@ -208,7 +213,7 @@ func (dc *DBClient) syncDbTableStructure(ignoreErr bool) error { if tableList, err = systemDao.GetTableList(c); nil != err { return err } - tableStructCache := make(map[string][]*define.ColumnInfo) + tableStructCache := make(map[string][]*define.ColumnConfig) for _, itemTableName := range tableList { fieldList, loadTableErr := systemDao.GetTableInfo(c, dc.Cfg.Database, itemTableName) if nil != loadTableErr { @@ -217,7 +222,22 @@ func (dc *DBClient) syncDbTableStructure(ignoreErr bool) error { } return loadTableErr } - tableStructCache[itemTableName] = fieldList + tableStructCache[itemTableName] = make([]*define.ColumnConfig, 0) + for _, itemColumn := range fieldList { + fieldType := "string" + if strings.Contains(itemColumn.ColumnType, "int") { + if strings.Contains(itemColumn.ColumnType, "unsigned") { + fieldType = "uint" + } else { + fieldType = "int" + } + } + tableStructCache[itemTableName] = append(tableStructCache[itemTableName], &define.ColumnConfig{ + Column: itemColumn.ColumnName, + Alias: itemColumn.ColumnName, + Type: fieldType, + }) + } } // 更新缓存结果 dc.lock.Lock() @@ -225,3 +245,20 @@ func (dc *DBClient) syncDbTableStructure(ignoreErr bool) error { dc.tableStructureCache = tableStructCache return nil } + +// SetTableStructure 设置表结构, 一旦调用人工设置, 则将终止自动同步 +// +// Author : go_developer@163.com<白茶清欢> +// +// Date : 17:06 2024/8/23 +func (dc *DBClient) SetTableStructure(tableConfigTable map[string][]*define.ColumnConfig) { + if nil != dc.cacheTableStructureConfig { + // 关闭自动同步 + dc.cacheTableStructureConfig.Enable = false + } + dc.lock.Lock() + for table, columnConfig := range tableConfigTable { + dc.tableStructureCache[table] = columnConfig + } + dc.lock.Unlock() +}