mirror of
https://gitee.com/johng/gf
synced 2026-06-06 16:21:40 +08:00
up
This commit is contained in:
@ -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,
|
||||
|
||||
@ -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.
|
||||
|
||||
@ -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()"
|
||||
|
||||
Reference in New Issue
Block a user