From 7d79aea6217f5893639addc8260fa49987d492be Mon Sep 17 00:00:00 2001 From: John Guo Date: Thu, 9 Jan 2025 13:59:38 +0800 Subject: [PATCH] up --- database/gdb/gdb.go | 2 ++ database/gdb/gdb_core.go | 7 +++++-- database/gdb/gdb_core_underlying.go | 16 +++++++++++++++- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/database/gdb/gdb.go b/database/gdb/gdb.go index e34197192..c522b09e6 100644 --- a/database/gdb/gdb.go +++ b/database/gdb/gdb.go @@ -517,6 +517,7 @@ type Core struct { links *gmap.Map // links caches all created links by node. logger glog.ILogger // Logger for logging functionality. config *ConfigNode // Current config node. + localTypeMap *gmap.StrAnyMap // Local type map for database field type conversion. dynamicConfig dynamicConfig // Dynamic configurations, which can be changed in runtime. innerMemCache *gcache.Cache // Internal memory cache for storing temporary data. } @@ -926,6 +927,7 @@ func newDBByConfigNode(node *ConfigNode, group string) (db DB, err error) { links: gmap.New(true), logger: glog.New(), config: node, + localTypeMap: gmap.NewStrAnyMap(true), innerMemCache: gcache.New(), dynamicConfig: dynamicConfig{ MaxIdleConnCount: node.MaxIdleConnCount, diff --git a/database/gdb/gdb_core.go b/database/gdb/gdb_core.go index 12ff302fb..c4a0bde58 100644 --- a/database/gdb/gdb_core.go +++ b/database/gdb/gdb_core.go @@ -222,6 +222,9 @@ func (c *Core) GetScan(ctx context.Context, pointer interface{}, sql string, arg case reflect.Struct: return c.db.GetCore().doGetStruct(ctx, pointer, sql, args...) + + default: + } return gerror.NewCodef( gcode.CodeInvalidParameter, @@ -236,12 +239,12 @@ func (c *Core) GetScan(ctx context.Context, pointer interface{}, sql string, arg func (c *Core) GetValue(ctx context.Context, sql string, args ...interface{}) (Value, error) { one, err := c.db.GetOne(ctx, sql, args...) if err != nil { - return nil, err + return NewValue(nil), err } for _, v := range one { return v, nil } - return nil, nil + return NewValue(nil), nil } // GetCount queries and returns the count from database. diff --git a/database/gdb/gdb_core_underlying.go b/database/gdb/gdb_core_underlying.go index 815076583..40d40c7d2 100644 --- a/database/gdb/gdb_core_underlying.go +++ b/database/gdb/gdb_core_underlying.go @@ -466,7 +466,7 @@ func (c *Core) RowsToResult(ctx context.Context, rows *sql.Rows) (Result, error) if convertedValue, err = c.columnValueToLocalValue(ctx, value, columnType); err != nil { return nil, err } - localType, err = c.db.CheckLocalTypeForField(ctx, columnType.DatabaseTypeName(), value) + localType, err = c.getLocalTypeForFieldWithCache(ctx, columnType.DatabaseTypeName()) if err != nil { return nil, err } @@ -481,6 +481,20 @@ func (c *Core) RowsToResult(ctx context.Context, rows *sql.Rows) (Result, error) return result, nil } +func (c *Core) getLocalTypeForFieldWithCache(ctx context.Context, fieldType string) (localType LocalType, err error) { + v := c.localTypeMap.GetOrSetFuncLock(fieldType, func() interface{} { + localType, err = c.db.CheckLocalTypeForField(ctx, fieldType, nil) + if err != nil { + return nil + } + return localType + }) + if err != nil { + return LocalTypeUndefined, err + } + return v.(LocalType), nil +} + // OrderRandomFunction returns the SQL function for random ordering. func (c *Core) OrderRandomFunction() string { return "RAND()"