This commit is contained in:
John Guo
2025-01-09 13:59:38 +08:00
parent 0083153268
commit 7d79aea621
3 changed files with 22 additions and 3 deletions

View File

@ -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,

View File

@ -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.

View File

@ -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()"