diff --git a/cmd/gf/go.sum b/cmd/gf/go.sum index 1451be4ef..47a75885b 100644 --- a/cmd/gf/go.sum +++ b/cmd/gf/go.sum @@ -39,20 +39,20 @@ github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiU github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI= github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= -github.com/gogf/gf/contrib/drivers/clickhouse/v2 v2.8.2 h1:4g5n8QdJA7ZEuDfWFeVQKMhul6RtOT89ObYAgVnxN+U= -github.com/gogf/gf/contrib/drivers/clickhouse/v2 v2.8.2/go.mod h1:xW1mgNK0vTLfRSCnO0No8G4lCGNpXx1Jlhs6B1vzD+8= -github.com/gogf/gf/contrib/drivers/mssql/v2 v2.8.2 h1:aNscErx5mcC28Q1L0MsZFFXybzLY/IJhskyiPAbxB78= -github.com/gogf/gf/contrib/drivers/mssql/v2 v2.8.2/go.mod h1:yj6+Ds2BGzYcHthPvMnxhDRzq0o28HyO9E1Fsko0Lf8= -github.com/gogf/gf/contrib/drivers/mysql/v2 v2.8.2 h1:thK4DZT0irDrnhIxkap5JqBuBIJaXQ0IMvlIzuRGgVQ= -github.com/gogf/gf/contrib/drivers/mysql/v2 v2.8.2/go.mod h1:Vg7XaiwsQ27YmpDqzwCQ+yt10KntTvcP9iOoFL5DF40= -github.com/gogf/gf/contrib/drivers/oracle/v2 v2.8.2 h1:ZukTXB9drVDmSdrFjCYHVzHj0kAvGKISrrW3WKU1xTg= -github.com/gogf/gf/contrib/drivers/oracle/v2 v2.8.2/go.mod h1:wr+KA5h3+aJQk5XiA1qSNKxWBVrzlu8MVYKl1NqcQj4= -github.com/gogf/gf/contrib/drivers/pgsql/v2 v2.8.2 h1:BsEBGoVfa4SPJ8GhNkH9PPtoSLydXK+VgcbpxyGF9Ps= -github.com/gogf/gf/contrib/drivers/pgsql/v2 v2.8.2/go.mod h1:OSlAQeO7fZMbscxZomMCBcZWHSxpfeXIi6ELeKszSPU= -github.com/gogf/gf/contrib/drivers/sqlite/v2 v2.8.2 h1:144IdPDn6xyHVQ5aP4qsstFvNOLqvWyz+GtH3JD1rWg= -github.com/gogf/gf/contrib/drivers/sqlite/v2 v2.8.2/go.mod h1:xOgOp3SSdWHIEqviYC1kd3p6mJtfFkrcinBWdpgVUxc= -github.com/gogf/gf/v2 v2.8.2 h1:4k641rn+hV1COAKygqsqcTm8+lDTkcO8HQ4iBv/uTFs= -github.com/gogf/gf/v2 v2.8.2/go.mod h1:n++xPYGUUMadw6IygLEgGZqc6y6DRLrJKg5kqCrPLWY= +github.com/gogf/gf/contrib/drivers/clickhouse/v2 v2.8.3 h1:b/AQMTxiHKPHsidEdk471AC5pkfoK88a5cPmKnzE53U= +github.com/gogf/gf/contrib/drivers/clickhouse/v2 v2.8.3/go.mod h1:qYrF+x5urXLhce3pMcUAyccIsw3Oec0htynoDE4Boi4= +github.com/gogf/gf/contrib/drivers/mssql/v2 v2.8.3 h1:F7Gt1y6YsYOIvgrUlRK07H29BL77dEgLPXilTqqVC80= +github.com/gogf/gf/contrib/drivers/mssql/v2 v2.8.3/go.mod h1:K5prIMZwHANSZrqZbfm6PoEIMfLtd0PwR7u+hZD9HFs= +github.com/gogf/gf/contrib/drivers/mysql/v2 v2.8.3 h1:RtoBg5HWACFrgIrFkpzH94kxSd5EWefNAq5k6olNY6c= +github.com/gogf/gf/contrib/drivers/mysql/v2 v2.8.3/go.mod h1:elZjckHRCejwml5Kdx2zfhOUDiAV3r5i4BgXcKAeH00= +github.com/gogf/gf/contrib/drivers/oracle/v2 v2.8.3 h1:10/RCoWmvQ6PSm+leoS6CsKijH4dB38HOXLgP5+aScQ= +github.com/gogf/gf/contrib/drivers/oracle/v2 v2.8.3/go.mod h1:XSaHf3/vTlzj/zioUbzKmaffPuoKvPV639fT91caheM= +github.com/gogf/gf/contrib/drivers/pgsql/v2 v2.8.3 h1:DvpoiVac1cwGVDTqC6wzFbDb+gXNzcceRgZUIcuTmaI= +github.com/gogf/gf/contrib/drivers/pgsql/v2 v2.8.3/go.mod h1:zugvYVb6c/X9rJ8Gb6b5WkMe+bFz2BsxQ5OLf4RSZos= +github.com/gogf/gf/contrib/drivers/sqlite/v2 v2.8.3 h1:3pdibfm4UOiTGGh6UD8jfMyGZBGH9ikrrIMU8i/XANA= +github.com/gogf/gf/contrib/drivers/sqlite/v2 v2.8.3/go.mod h1:G5rfcFkBhtmZT4+CU7A3fJH3sNmP4WRIaJ+4JFeVE08= +github.com/gogf/gf/v2 v2.8.3 h1:h9Px3lqJnnH6It0AqHRz4/1hx0JmvaSf1IvUir5x1rA= +github.com/gogf/gf/v2 v2.8.3/go.mod h1:n++xPYGUUMadw6IygLEgGZqc6y6DRLrJKg5kqCrPLWY= github.com/gogf/selfupdate v0.0.0-20231215043001-5c48c528462f h1:7xfXR/BhG3JDqO1s45n65Oyx9t4E/UqDOXep6jXdLCM= github.com/gogf/selfupdate v0.0.0-20231215043001-5c48c528462f/go.mod h1:HnYoio6S7VaFJdryKcD/r9HgX+4QzYfr00XiXUo/xz0= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= diff --git a/container/gvar/gvar.go b/container/gvar/gvar.go index 3f7781421..99e13134f 100644 --- a/container/gvar/gvar.go +++ b/container/gvar/gvar.go @@ -8,198 +8,48 @@ package gvar import ( - "time" - - "github.com/gogf/gf/v2/container/gtype" - "github.com/gogf/gf/v2/internal/deepcopy" - "github.com/gogf/gf/v2/internal/json" - "github.com/gogf/gf/v2/os/gtime" - "github.com/gogf/gf/v2/util/gconv" - "github.com/gogf/gf/v2/util/gutil" + "github.com/gogf/gf/v2/container/gtype" + "github.com/gogf/gf/v2/internal/json" ) // Var is an universal variable type implementer. type Var struct { - value interface{} // Underlying value. - safe bool // Concurrent safe or not. + value interface{} // Underlying value. + safe bool // Concurrent safe or not. } // New creates and returns a new Var with given `value`. // The optional parameter `safe` specifies whether Var is used in concurrent-safety, // which is false in default. func New(value interface{}, safe ...bool) *Var { - if len(safe) > 0 && safe[0] { - return &Var{ - value: gtype.NewInterface(value), - safe: true, - } - } - return &Var{ - value: value, - } -} - -// Copy does a deep copy of current Var and returns a pointer to this Var. -func (v *Var) Copy() *Var { - return New(gutil.Copy(v.Val()), v.safe) -} - -// Clone does a shallow copy of current Var and returns a pointer to this Var. -func (v *Var) Clone() *Var { - return New(v.Val(), v.safe) -} - -// Set sets `value` to `v`, and returns the old value. -func (v *Var) Set(value interface{}) (old interface{}) { - if v.safe { - if t, ok := v.value.(*gtype.Interface); ok { - old = t.Set(value) - return - } - } - old = v.value - v.value = value - return -} - -// Val returns the current value of `v`. -func (v *Var) Val() interface{} { - if v == nil { - return nil - } - if v.safe { - if t, ok := v.value.(*gtype.Interface); ok { - return t.Val() - } - } - return v.value -} - -// Interface is alias of Val. -func (v *Var) Interface() interface{} { - return v.Val() -} - -// Bytes converts and returns `v` as []byte. -func (v *Var) Bytes() []byte { - return gconv.Bytes(v.Val()) -} - -// String converts and returns `v` as string. -func (v *Var) String() string { - return gconv.String(v.Val()) -} - -// Bool converts and returns `v` as bool. -func (v *Var) Bool() bool { - return gconv.Bool(v.Val()) -} - -// Int converts and returns `v` as int. -func (v *Var) Int() int { - return gconv.Int(v.Val()) -} - -// Int8 converts and returns `v` as int8. -func (v *Var) Int8() int8 { - return gconv.Int8(v.Val()) -} - -// Int16 converts and returns `v` as int16. -func (v *Var) Int16() int16 { - return gconv.Int16(v.Val()) -} - -// Int32 converts and returns `v` as int32. -func (v *Var) Int32() int32 { - return gconv.Int32(v.Val()) -} - -// Int64 converts and returns `v` as int64. -func (v *Var) Int64() int64 { - return gconv.Int64(v.Val()) -} - -// Uint converts and returns `v` as uint. -func (v *Var) Uint() uint { - return gconv.Uint(v.Val()) -} - -// Uint8 converts and returns `v` as uint8. -func (v *Var) Uint8() uint8 { - return gconv.Uint8(v.Val()) -} - -// Uint16 converts and returns `v` as uint16. -func (v *Var) Uint16() uint16 { - return gconv.Uint16(v.Val()) -} - -// Uint32 converts and returns `v` as uint32. -func (v *Var) Uint32() uint32 { - return gconv.Uint32(v.Val()) -} - -// Uint64 converts and returns `v` as uint64. -func (v *Var) Uint64() uint64 { - return gconv.Uint64(v.Val()) -} - -// Float32 converts and returns `v` as float32. -func (v *Var) Float32() float32 { - return gconv.Float32(v.Val()) -} - -// Float64 converts and returns `v` as float64. -func (v *Var) Float64() float64 { - return gconv.Float64(v.Val()) -} - -// Time converts and returns `v` as time.Time. -// The parameter `format` specifies the format of the time string using gtime, -// eg: Y-m-d H:i:s. -func (v *Var) Time(format ...string) time.Time { - return gconv.Time(v.Val(), format...) -} - -// Duration converts and returns `v` as time.Duration. -// If value of `v` is string, then it uses time.ParseDuration for conversion. -func (v *Var) Duration() time.Duration { - return gconv.Duration(v.Val()) -} - -// GTime converts and returns `v` as *gtime.Time. -// The parameter `format` specifies the format of the time string using gtime, -// eg: Y-m-d H:i:s. -func (v *Var) GTime(format ...string) *gtime.Time { - return gconv.GTime(v.Val(), format...) + if len(safe) > 0 && safe[0] { + return &Var{ + value: gtype.NewInterface(value), + safe: true, + } + } + return &Var{ + value: value, + } } // MarshalJSON implements the interface MarshalJSON for json.Marshal. -func (v Var) MarshalJSON() ([]byte, error) { - return json.Marshal(v.Val()) +func (v *Var) MarshalJSON() ([]byte, error) { + return json.Marshal(v.Val()) } // UnmarshalJSON implements the interface UnmarshalJSON for json.Unmarshal. func (v *Var) UnmarshalJSON(b []byte) error { - var i interface{} - if err := json.UnmarshalUseNumber(b, &i); err != nil { - return err - } - v.Set(i) - return nil + var i interface{} + if err := json.UnmarshalUseNumber(b, &i); err != nil { + return err + } + v.Set(i) + return nil } // UnmarshalValue is an interface implement which sets any type of value for Var. func (v *Var) UnmarshalValue(value interface{}) error { - v.Set(value) - return nil -} - -// DeepCopy implements interface for deep copy of current type. -func (v *Var) DeepCopy() interface{} { - if v == nil { - return nil - } - return New(deepcopy.Copy(v.Val()), v.safe) + v.Set(value) + return nil } diff --git a/container/gvar/gvar_basic.go b/container/gvar/gvar_basic.go new file mode 100644 index 000000000..9bd87ece7 --- /dev/null +++ b/container/gvar/gvar_basic.go @@ -0,0 +1,105 @@ +// Copyright GoFrame Author(https://goframe.org). All Rights Reserved. +// +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, +// You can obtain one at https://github.com/gogf/gf. + +package gvar + +import ( + "github.com/gogf/gf/v2/container/gtype" + "github.com/gogf/gf/v2/util/gconv" +) + +// Val returns the current value of `v`. +func (v *Var) Val() interface{} { + if v == nil { + return nil + } + if v.safe { + if t, ok := v.value.(*gtype.Interface); ok { + return t.Val() + } + } + return v.value +} + +// Interface is alias of Val. +func (v *Var) Interface() interface{} { + return v.Val() +} + +// Bytes converts and returns `v` as []byte. +func (v *Var) Bytes() []byte { + return gconv.Bytes(v.Val()) +} + +// String converts and returns `v` as string. +func (v *Var) String() string { + return gconv.String(v.Val()) +} + +// Bool converts and returns `v` as bool. +func (v *Var) Bool() bool { + return gconv.Bool(v.Val()) +} + +// Int converts and returns `v` as int. +func (v *Var) Int() int { + return gconv.Int(v.Val()) +} + +// Int8 converts and returns `v` as int8. +func (v *Var) Int8() int8 { + return gconv.Int8(v.Val()) +} + +// Int16 converts and returns `v` as int16. +func (v *Var) Int16() int16 { + return gconv.Int16(v.Val()) +} + +// Int32 converts and returns `v` as int32. +func (v *Var) Int32() int32 { + return gconv.Int32(v.Val()) +} + +// Int64 converts and returns `v` as int64. +func (v *Var) Int64() int64 { + return gconv.Int64(v.Val()) +} + +// Uint converts and returns `v` as uint. +func (v *Var) Uint() uint { + return gconv.Uint(v.Val()) +} + +// Uint8 converts and returns `v` as uint8. +func (v *Var) Uint8() uint8 { + return gconv.Uint8(v.Val()) +} + +// Uint16 converts and returns `v` as uint16. +func (v *Var) Uint16() uint16 { + return gconv.Uint16(v.Val()) +} + +// Uint32 converts and returns `v` as uint32. +func (v *Var) Uint32() uint32 { + return gconv.Uint32(v.Val()) +} + +// Uint64 converts and returns `v` as uint64. +func (v *Var) Uint64() uint64 { + return gconv.Uint64(v.Val()) +} + +// Float32 converts and returns `v` as float32. +func (v *Var) Float32() float32 { + return gconv.Float32(v.Val()) +} + +// Float64 converts and returns `v` as float64. +func (v *Var) Float64() float64 { + return gconv.Float64(v.Val()) +} diff --git a/container/gvar/gvar_copy.go b/container/gvar/gvar_copy.go new file mode 100644 index 000000000..2bb99919c --- /dev/null +++ b/container/gvar/gvar_copy.go @@ -0,0 +1,30 @@ +// Copyright GoFrame Author(https://goframe.org). All Rights Reserved. +// +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, +// You can obtain one at https://github.com/gogf/gf. + +package gvar + +import ( + "github.com/gogf/gf/v2/internal/deepcopy" + "github.com/gogf/gf/v2/util/gutil" +) + +// Copy does a deep copy of current Var and returns a pointer to this Var. +func (v *Var) Copy() *Var { + return New(gutil.Copy(v.Val()), v.safe) +} + +// Clone does a shallow copy of current Var and returns a pointer to this Var. +func (v *Var) Clone() *Var { + return New(v.Val(), v.safe) +} + +// DeepCopy implements interface for deep copy of current type. +func (v *Var) DeepCopy() interface{} { + if v == nil { + return nil + } + return New(deepcopy.Copy(v.Val()), v.safe) +} diff --git a/container/gvar/gvar_scan.go b/container/gvar/gvar_scan.go index 469005b50..9d47a22f2 100644 --- a/container/gvar/gvar_scan.go +++ b/container/gvar/gvar_scan.go @@ -7,13 +7,12 @@ package gvar import ( - "github.com/gogf/gf/v2/util/gconv" + "github.com/gogf/gf/v2/util/gconv" ) -// Scan automatically checks the type of `pointer` and converts `params` to `pointer`. It supports `pointer` -// with type of `*map/*[]map/*[]*map/*struct/**struct/*[]struct/*[]*struct` for converting. +// Scan automatically checks the type of `pointer` and converts value of Var to `pointer`. // // See gconv.Scan. func (v *Var) Scan(pointer interface{}, mapping ...map[string]string) error { - return gconv.Scan(v.Val(), pointer, mapping...) + return gconv.Scan(v.Val(), pointer, mapping...) } diff --git a/container/gvar/gvar_set.go b/container/gvar/gvar_set.go new file mode 100644 index 000000000..57ac97ae5 --- /dev/null +++ b/container/gvar/gvar_set.go @@ -0,0 +1,24 @@ +// Copyright GoFrame Author(https://goframe.org). All Rights Reserved. +// +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, +// You can obtain one at https://github.com/gogf/gf. + +package gvar + +import ( + "github.com/gogf/gf/v2/container/gtype" +) + +// Set sets `value` to `v`, and returns the old value. +func (v *Var) Set(value interface{}) (old interface{}) { + if v.safe { + if t, ok := v.value.(*gtype.Interface); ok { + old = t.Set(value) + return + } + } + old = v.value + v.value = value + return +} diff --git a/container/gvar/gvar_time.go b/container/gvar/gvar_time.go new file mode 100644 index 000000000..d709ce89f --- /dev/null +++ b/container/gvar/gvar_time.go @@ -0,0 +1,34 @@ +// Copyright GoFrame Author(https://goframe.org). All Rights Reserved. +// +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, +// You can obtain one at https://github.com/gogf/gf. + +package gvar + +import ( + "time" + + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gconv" +) + +// Time converts and returns `v` as time.Time. +// The parameter `format` specifies the format of the time string using gtime, +// eg: Y-m-d H:i:s. +func (v *Var) Time(format ...string) time.Time { + return gconv.Time(v.Val(), format...) +} + +// Duration converts and returns `v` as time.Duration. +// If value of `v` is string, then it uses time.ParseDuration for conversion. +func (v *Var) Duration() time.Duration { + return gconv.Duration(v.Val()) +} + +// GTime converts and returns `v` as *gtime.Time. +// The parameter `format` specifies the format of the time string using gtime, +// eg: Y-m-d H:i:s. +func (v *Var) GTime(format ...string) *gtime.Time { + return gconv.GTime(v.Val(), format...) +} diff --git a/contrib/config/apollo/go.mod b/contrib/config/apollo/go.mod index 5080c2b14..5c8aa52f7 100644 --- a/contrib/config/apollo/go.mod +++ b/contrib/config/apollo/go.mod @@ -1,6 +1,8 @@ module github.com/gogf/gf/contrib/config/apollo/v2 -go 1.20 +go 1.22 + +toolchain go1.22.0 require ( github.com/apolloconfig/agollo/v4 v4.3.1 @@ -15,6 +17,7 @@ require ( github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/gorilla/websocket v1.5.3 // indirect github.com/grokify/html-strip-tags-go v0.1.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect @@ -32,10 +35,10 @@ require ( github.com/spf13/pflag v1.0.5 // indirect github.com/spf13/viper v1.8.1 // indirect github.com/subosito/gotenv v1.2.0 // indirect - go.opentelemetry.io/otel v1.24.0 // indirect - go.opentelemetry.io/otel/metric v1.24.0 // indirect - go.opentelemetry.io/otel/sdk v1.24.0 // indirect - go.opentelemetry.io/otel/trace v1.24.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect golang.org/x/net v0.32.0 // indirect golang.org/x/sys v0.28.0 // indirect golang.org/x/text v0.21.0 // indirect diff --git a/contrib/config/apollo/go.sum b/contrib/config/apollo/go.sum index ea5fb99d0..6c1ae549b 100644 --- a/contrib/config/apollo/go.sum +++ b/contrib/config/apollo/go.sum @@ -133,6 +133,7 @@ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= @@ -150,6 +151,8 @@ github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= @@ -190,8 +193,9 @@ github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfV github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= @@ -237,6 +241,8 @@ github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= @@ -260,7 +266,8 @@ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81P github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/tevid/gohamcrest v1.1.1 h1:ou+xSqlIw1xfGTg1uq1nif/htZ2S3EzRqLm2BP+tYU0= @@ -280,14 +287,14 @@ go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= -go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= -go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= -go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= -go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw= -go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg= -go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= -go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= @@ -610,8 +617,9 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/ini.v1 v1.62.0 h1:duBzk771uxoUuOlyRLkHsygud9+5lrlGjdFBb4mSKDU= gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= diff --git a/contrib/config/consul/go.mod b/contrib/config/consul/go.mod index 06fdbe40d..8fc085975 100644 --- a/contrib/config/consul/go.mod +++ b/contrib/config/consul/go.mod @@ -1,6 +1,8 @@ module github.com/gogf/gf/contrib/config/consul/v2 -go 1.20 +go 1.22 + +toolchain go1.22.0 require ( github.com/gogf/gf/v2 v2.8.3 @@ -17,6 +19,7 @@ require ( github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/gorilla/websocket v1.5.3 // indirect github.com/grokify/html-strip-tags-go v0.1.0 // indirect github.com/hashicorp/go-hclog v1.5.0 // indirect @@ -32,10 +35,10 @@ require ( github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect github.com/rivo/uniseg v0.4.7 // indirect - go.opentelemetry.io/otel v1.24.0 // indirect - go.opentelemetry.io/otel/metric v1.24.0 // indirect - go.opentelemetry.io/otel/sdk v1.24.0 // indirect - go.opentelemetry.io/otel/trace v1.24.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 // indirect golang.org/x/net v0.32.0 // indirect golang.org/x/sys v0.28.0 // indirect diff --git a/contrib/config/consul/go.sum b/contrib/config/consul/go.sum index 65a46cfbe..ad79d6148 100644 --- a/contrib/config/consul/go.sum +++ b/contrib/config/consul/go.sum @@ -23,6 +23,7 @@ github.com/clbanning/mxj/v2 v2.7.0/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= @@ -48,10 +49,14 @@ github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5y github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4= +github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grokify/html-strip-tags-go v0.1.0 h1:03UrQLjAny8xci+R+qjCce/MYnpNXCtgzltlQbOBae4= @@ -59,8 +64,10 @@ github.com/grokify/html-strip-tags-go v0.1.0/go.mod h1:ZdzgfHEzAfz9X6Xe5eBLVblWI github.com/hashicorp/consul/api v1.24.0 h1:u2XyStA2j0jnCiVUU7Qyrt8idjRn4ORhK6DlvZ3bWhA= github.com/hashicorp/consul/api v1.24.0/go.mod h1:NZJGRFYruc/80wYowkPFCp1LbGmJC9L8izrwfyVx/Wg= github.com/hashicorp/consul/sdk v0.14.1 h1:ZiwE2bKb+zro68sWzZ1SgHF3kRMBZ94TwOCFRF4ylPs= +github.com/hashicorp/consul/sdk v0.14.1/go.mod h1:vFt03juSzocLRFo59NkeQHHmQa6+g7oU0pfzdI1mUhg= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= @@ -71,19 +78,24 @@ github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJ github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI= +github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= github.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc= +github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= +github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI= +github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= @@ -98,11 +110,13 @@ github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/u github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/magiconair/properties v1.8.9 h1:nWcCbLq1N2v/cpNsy5WvQ37Fb+YElfq20WJ/a8RkpQM= github.com/magiconair/properties v1.8.9/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= @@ -146,8 +160,10 @@ github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144T github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= @@ -164,6 +180,8 @@ github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+Gx github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= @@ -172,20 +190,22 @@ github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6Mwd github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= -go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= -go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= -go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= -go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= -go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw= -go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg= -go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= -go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= @@ -241,8 +261,9 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/contrib/config/kubecm/go.mod b/contrib/config/kubecm/go.mod index 262b1bf7e..c4c93b0a5 100644 --- a/contrib/config/kubecm/go.mod +++ b/contrib/config/kubecm/go.mod @@ -1,6 +1,8 @@ module github.com/gogf/gf/contrib/config/kubecm/v2 -go 1.20 +go 1.22 + +toolchain go1.22.0 require ( github.com/gogf/gf/v2 v2.8.3 @@ -27,7 +29,7 @@ require ( github.com/google/gnostic v0.5.7-v3refs // indirect github.com/google/go-cmp v0.6.0 // indirect github.com/google/gofuzz v1.1.0 // indirect - github.com/google/uuid v1.3.0 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/gorilla/websocket v1.5.3 // indirect github.com/grokify/html-strip-tags-go v0.1.0 // indirect github.com/imdario/mergo v0.3.6 // indirect @@ -44,10 +46,10 @@ require ( github.com/olekukonko/tablewriter v0.0.5 // indirect github.com/rivo/uniseg v0.4.7 // indirect github.com/spf13/pflag v1.0.5 // indirect - go.opentelemetry.io/otel v1.24.0 // indirect - go.opentelemetry.io/otel/metric v1.24.0 // indirect - go.opentelemetry.io/otel/sdk v1.24.0 // indirect - go.opentelemetry.io/otel/trace v1.24.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect golang.org/x/net v0.32.0 // indirect golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b // indirect golang.org/x/sys v0.28.0 // indirect diff --git a/contrib/config/kubecm/go.sum b/contrib/config/kubecm/go.sum index 42d6e64aa..2d10f9e12 100644 --- a/contrib/config/kubecm/go.sum +++ b/contrib/config/kubecm/go.sum @@ -76,6 +76,7 @@ github.com/go-openapi/jsonreference v0.20.1/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= @@ -133,9 +134,10 @@ github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= @@ -158,7 +160,8 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -185,7 +188,9 @@ github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8m github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo/v2 v2.9.1 h1:zie5Ly042PD3bsCvsSOPvRnFwyo3rKe64TJlD6nu0mk= +github.com/onsi/ginkgo/v2 v2.9.1/go.mod h1:FEcmzVcCHl+4o9bQZVab+4dC9+j+91t2FHSzmGAPfuo= github.com/onsi/gomega v1.27.4 h1:Z2AnStgsdSayCMDiCU42qIz+HLqEPcgiOCXjAU/w+8E= +github.com/onsi/gomega v1.27.4/go.mod h1:riYq/GJKh8hhoM01HN6Vmuy93AarCXCBGpvFDK3q3fQ= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -193,7 +198,8 @@ github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJ github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= @@ -206,7 +212,8 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -216,14 +223,14 @@ go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= -go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= -go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= -go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= -go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw= -go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg= -go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= -go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -396,6 +403,7 @@ golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/contrib/config/nacos/go.mod b/contrib/config/nacos/go.mod index 1af537fd7..21cfc5061 100644 --- a/contrib/config/nacos/go.mod +++ b/contrib/config/nacos/go.mod @@ -1,6 +1,8 @@ module github.com/gogf/gf/contrib/config/nacos/v2 -go 1.20 +go 1.22 + +toolchain go1.22.0 require ( github.com/gogf/gf/v2 v2.8.3 @@ -26,6 +28,7 @@ require ( github.com/go-logr/stdr v1.2.2 // indirect github.com/golang/mock v1.6.0 // indirect github.com/golang/protobuf v1.5.3 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/gorilla/websocket v1.5.3 // indirect github.com/grokify/html-strip-tags-go v0.1.0 // indirect github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af // indirect @@ -45,10 +48,10 @@ require ( github.com/prometheus/common v0.32.1 // indirect github.com/prometheus/procfs v0.7.3 // indirect github.com/rivo/uniseg v0.4.7 // indirect - go.opentelemetry.io/otel v1.24.0 // indirect - go.opentelemetry.io/otel/metric v1.24.0 // indirect - go.opentelemetry.io/otel/sdk v1.24.0 // indirect - go.opentelemetry.io/otel/trace v1.24.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/atomic v1.10.0 // indirect go.uber.org/multierr v1.6.0 // indirect go.uber.org/zap v1.21.0 // indirect diff --git a/contrib/config/nacos/go.sum b/contrib/config/nacos/go.sum index f2af4b1f1..04293714c 100644 --- a/contrib/config/nacos/go.sum +++ b/contrib/config/nacos/go.sum @@ -152,6 +152,7 @@ github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= @@ -163,6 +164,8 @@ github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= @@ -191,6 +194,8 @@ github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxv github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -218,7 +223,6 @@ github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRW github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/nacos-group/nacos-sdk-go/v2 v2.2.5 h1:r0wwT7PayEjvEHzWXwr1ROi/JSqzujM4w+1L5ikThzQ= github.com/nacos-group/nacos-sdk-go/v2 v2.2.5/go.mod h1:OObBon0prVJVPoIbSZxpEkFiBfL0d1LcBtuAMiNn+8c= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= @@ -256,6 +260,8 @@ github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJ github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= @@ -266,7 +272,8 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/uber/jaeger-client-go v2.30.0+incompatible h1:D6wyKGCecFaSRUpo8lCVbaOOb6ThwMmTEbhRwtKR97o= github.com/uber/jaeger-client-go v2.30.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/uber/jaeger-lib v2.4.1+incompatible h1:td4jdvLcExb4cBISKIpHuGoVXh+dVKhn2Um6rjCsSsg= @@ -280,14 +287,14 @@ go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= -go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= -go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= -go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= -go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw= -go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg= -go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= -go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= @@ -585,8 +592,9 @@ gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLks gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/ini.v1 v1.66.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= diff --git a/contrib/config/polaris/go.mod b/contrib/config/polaris/go.mod index b5ab5eab0..29b2bba97 100644 --- a/contrib/config/polaris/go.mod +++ b/contrib/config/polaris/go.mod @@ -1,6 +1,8 @@ module github.com/gogf/gf/contrib/config/polaris/v2 -go 1.20 +go 1.22 + +toolchain go1.22.0 require ( github.com/gogf/gf/v2 v2.8.3 @@ -19,7 +21,7 @@ require ( github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/golang/protobuf v1.5.4 // indirect - github.com/google/uuid v1.3.1 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/gorilla/websocket v1.5.3 // indirect github.com/grokify/html-strip-tags-go v0.1.0 // indirect github.com/hashicorp/errwrap v1.0.0 // indirect @@ -41,10 +43,10 @@ require ( github.com/prometheus/procfs v0.7.3 // indirect github.com/rivo/uniseg v0.4.7 // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect - go.opentelemetry.io/otel v1.24.0 // indirect - go.opentelemetry.io/otel/metric v1.24.0 // indirect - go.opentelemetry.io/otel/sdk v1.24.0 // indirect - go.opentelemetry.io/otel/trace v1.24.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/atomic v1.7.0 // indirect go.uber.org/multierr v1.6.0 // indirect go.uber.org/zap v1.21.0 // indirect diff --git a/contrib/config/polaris/go.sum b/contrib/config/polaris/go.sum index 703e77923..e5a9f0216 100644 --- a/contrib/config/polaris/go.sum +++ b/contrib/config/polaris/go.sum @@ -302,6 +302,7 @@ github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= @@ -324,8 +325,8 @@ github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLe github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= -github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= @@ -368,8 +369,9 @@ github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxv github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= @@ -436,6 +438,8 @@ github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= @@ -459,7 +463,8 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -473,14 +478,14 @@ go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= -go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= -go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= -go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= -go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw= -go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg= -go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= -go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= diff --git a/contrib/drivers/clickhouse/go.mod b/contrib/drivers/clickhouse/go.mod index c5b0f724f..06b845256 100644 --- a/contrib/drivers/clickhouse/go.mod +++ b/contrib/drivers/clickhouse/go.mod @@ -1,11 +1,13 @@ module github.com/gogf/gf/contrib/drivers/clickhouse/v2 -go 1.20 +go 1.22 + +toolchain go1.22.0 require ( github.com/ClickHouse/clickhouse-go/v2 v2.0.15 github.com/gogf/gf/v2 v2.8.3 - github.com/google/uuid v1.3.0 + github.com/google/uuid v1.6.0 github.com/shopspring/decimal v1.3.1 ) @@ -19,6 +21,7 @@ require ( github.com/go-logr/stdr v1.2.2 // indirect github.com/gorilla/websocket v1.5.3 // indirect github.com/grokify/html-strip-tags-go v0.1.0 // indirect + github.com/kr/text v0.2.0 // indirect github.com/magiconair/properties v1.8.9 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect @@ -27,10 +30,10 @@ require ( github.com/paulmach/orb v0.7.1 // indirect github.com/pierrec/lz4/v4 v4.1.14 // indirect github.com/rivo/uniseg v0.4.7 // indirect - go.opentelemetry.io/otel v1.24.0 // indirect - go.opentelemetry.io/otel/metric v1.24.0 // indirect - go.opentelemetry.io/otel/sdk v1.24.0 // indirect - go.opentelemetry.io/otel/trace v1.24.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect golang.org/x/net v0.32.0 // indirect golang.org/x/sys v0.28.0 // indirect golang.org/x/text v0.21.0 // indirect diff --git a/contrib/drivers/clickhouse/go.sum b/contrib/drivers/clickhouse/go.sum index f6ef4d1c4..dc4fbd1c5 100644 --- a/contrib/drivers/clickhouse/go.sum +++ b/contrib/drivers/clickhouse/go.sum @@ -6,8 +6,10 @@ github.com/bkaradzic/go-lz4 v1.0.0/go.mod h1:0YdlkowM3VswSROI7qDxhRvJ3sLhlFrRRwj github.com/clbanning/mxj/v2 v2.7.0 h1:WA/La7UGCanFe5NpHF0Q3DNtnCsVoxbPKuyBNHWRyME= github.com/clbanning/mxj/v2 v2.7.0/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn/Qo+ve2s= github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58/go.mod h1:EOBUe0h4xcZ5GoxqC5SDxFQ8gwyZPKQoEzownBlhI80= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= @@ -30,8 +32,10 @@ github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaS github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/handlers v1.4.2/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= @@ -41,6 +45,10 @@ github.com/grokify/html-strip-tags-go v0.1.0/go.mod h1:ZdzgfHEzAfz9X6Xe5eBLVblWI github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/magiconair/properties v1.8.9 h1:nWcCbLq1N2v/cpNsy5WvQ37Fb+YElfq20WJ/a8RkpQM= github.com/magiconair/properties v1.8.9/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= @@ -67,6 +75,8 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/shirou/gopsutil v2.19.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc= @@ -77,22 +87,23 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/tklauser/go-sysconf v0.3.10/go.mod h1:C8XykCvCb+Gn0oNCWPIlcb0RuglQTYaQ2hGm7jmxEFk= github.com/tklauser/numcpus v0.4.0/go.mod h1:1+UI3pD8NW14VMwdgJNJ1ESk2UnwhAnz5hMwiKKqXCQ= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= go.opentelemetry.io/otel v1.7.0/go.mod h1:5BdUoMIz5WEs0vt0CUEMtSSaTSHBBVwrhnz7+nrD5xk= -go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= -go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= -go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= -go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= -go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw= -go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= go.opentelemetry.io/otel/trace v1.7.0/go.mod h1:fzLSB9nqR2eXzxPXb2JW9IKE+ScyXA48yyE4TNvoHqU= -go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= -go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -132,8 +143,9 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= diff --git a/contrib/drivers/dm/go.mod b/contrib/drivers/dm/go.mod index ececa192f..5182d9399 100644 --- a/contrib/drivers/dm/go.mod +++ b/contrib/drivers/dm/go.mod @@ -1,6 +1,8 @@ module github.com/gogf/gf/contrib/drivers/dm/v2 -go 1.20 +go 1.22 + +toolchain go1.22.0 replace github.com/gogf/gf/v2 => ../../../ @@ -18,18 +20,20 @@ require ( github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/golang/snappy v0.0.1 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/gorilla/websocket v1.5.3 // indirect github.com/grokify/html-strip-tags-go v0.1.0 // indirect + github.com/kr/text v0.2.0 // indirect github.com/magiconair/properties v1.8.9 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.16 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect github.com/rivo/uniseg v0.4.7 // indirect - go.opentelemetry.io/otel v1.24.0 // indirect - go.opentelemetry.io/otel/metric v1.24.0 // indirect - go.opentelemetry.io/otel/sdk v1.24.0 // indirect - go.opentelemetry.io/otel/trace v1.24.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect golang.org/x/net v0.32.0 // indirect golang.org/x/sys v0.28.0 // indirect golang.org/x/text v0.21.0 // indirect diff --git a/contrib/drivers/dm/go.sum b/contrib/drivers/dm/go.sum index 1b0ff9aff..78ab28889 100644 --- a/contrib/drivers/dm/go.sum +++ b/contrib/drivers/dm/go.sum @@ -4,7 +4,9 @@ github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0 github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= github.com/clbanning/mxj/v2 v2.7.0 h1:WA/La7UGCanFe5NpHF0Q3DNtnCsVoxbPKuyBNHWRyME= github.com/clbanning/mxj/v2 v2.7.0/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn/Qo+ve2s= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= @@ -19,10 +21,17 @@ github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grokify/html-strip-tags-go v0.1.0 h1:03UrQLjAny8xci+R+qjCce/MYnpNXCtgzltlQbOBae4= github.com/grokify/html-strip-tags-go v0.1.0/go.mod h1:ZdzgfHEzAfz9X6Xe5eBLVblWIxXfYSQ40S/VKrAOGpc= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/magiconair/properties v1.8.9 h1:nWcCbLq1N2v/cpNsy5WvQ37Fb+YElfq20WJ/a8RkpQM= github.com/magiconair/properties v1.8.9/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= @@ -36,18 +45,22 @@ github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= -go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= -go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= -go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= -go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw= -go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg= -go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= -go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI= golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -58,7 +71,8 @@ golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/contrib/drivers/mssql/go.mod b/contrib/drivers/mssql/go.mod index aff47d8fd..80b7e8a0b 100644 --- a/contrib/drivers/mssql/go.mod +++ b/contrib/drivers/mssql/go.mod @@ -1,6 +1,8 @@ module github.com/gogf/gf/contrib/drivers/mssql/v2 -go 1.20 +go 1.22 + +toolchain go1.22.0 require ( github.com/gogf/gf/v2 v2.8.3 @@ -17,18 +19,20 @@ require ( github.com/go-logr/stdr v1.2.2 // indirect github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 // indirect github.com/golang-sql/sqlexp v0.1.0 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/gorilla/websocket v1.5.3 // indirect github.com/grokify/html-strip-tags-go v0.1.0 // indirect + github.com/kr/text v0.2.0 // indirect github.com/magiconair/properties v1.8.9 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.16 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect github.com/rivo/uniseg v0.4.7 // indirect - go.opentelemetry.io/otel v1.24.0 // indirect - go.opentelemetry.io/otel/metric v1.24.0 // indirect - go.opentelemetry.io/otel/sdk v1.24.0 // indirect - go.opentelemetry.io/otel/trace v1.24.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect golang.org/x/crypto v0.30.0 // indirect golang.org/x/net v0.32.0 // indirect golang.org/x/sys v0.28.0 // indirect diff --git a/contrib/drivers/mssql/go.sum b/contrib/drivers/mssql/go.sum index 5c588f2f8..c385394c4 100644 --- a/contrib/drivers/mssql/go.sum +++ b/contrib/drivers/mssql/go.sum @@ -1,14 +1,22 @@ github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.1 h1:lGlwhPtrX6EVml1hO0ivjkUxsSyl4dsiw9qcA1k/3IQ= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.1/go.mod h1:RKUqNu35KJYcVG/fqTRqmuXJZYNhYkBrnC/hX7yGbTA= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.1 h1:sO0/P7g68FrryJzljemN+6GTssUXdANk6aJ7T1ZxnsQ= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.1/go.mod h1:h8hyGFDsU5HMivxiS2iYFZsgDbU9OnnJ163x5UGVKYo= github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.1 h1:6oNBlSdi1QqM1PNW7FPA6xOGA5UNsXnkaYZz9vdPGhA= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.1/go.mod h1:s4kgfzA0covAXNicZHDMN58jExvcng2mC/DepXiF1EI= github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.0.1 h1:MyVTgWR8qd/Jw1Le0NZebGBUCLbtak3bJ3z1OlqZBpw= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.0.1/go.mod h1:GpPjLhVR9dnUoJMyHWSPy71xY9/lcmpzIPZXmF0FCVY= github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.0.0 h1:D3occbWoio4EBLkbkevetNMAVX197GkzbUMtqjGWn80= +github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.0.0/go.mod h1:bTSOgj05NGRuHHhQwAdPnYr9TOdNmKlZTgGLL6nyAdI= github.com/AzureAD/microsoft-authentication-library-for-go v1.2.1 h1:DzHpqpoJVaCgOUdVHxE8QB52S6NiVdDQvGlny1qvPqA= +github.com/AzureAD/microsoft-authentication-library-for-go v1.2.1/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0= github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= github.com/clbanning/mxj/v2 v2.7.0 h1:WA/La7UGCanFe5NpHF0Q3DNtnCsVoxbPKuyBNHWRyME= github.com/clbanning/mxj/v2 v2.7.0/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn/Qo+ve2s= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= @@ -21,17 +29,25 @@ github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ4 github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/golang-jwt/jwt/v5 v5.2.0 h1:d/ix8ftRUorsN+5eMIlF4T6J8CAt9rch3My2winC1Jw= +github.com/golang-jwt/jwt/v5 v5.2.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA= github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A= github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grokify/html-strip-tags-go v0.1.0 h1:03UrQLjAny8xci+R+qjCce/MYnpNXCtgzltlQbOBae4= github.com/grokify/html-strip-tags-go v0.1.0/go.mod h1:ZdzgfHEzAfz9X6Xe5eBLVblWIxXfYSQ40S/VKrAOGpc= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/magiconair/properties v1.8.9 h1:nWcCbLq1N2v/cpNsy5WvQ37Fb+YElfq20WJ/a8RkpQM= github.com/magiconair/properties v1.8.9/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= @@ -47,19 +63,24 @@ github.com/microsoft/go-mssqldb v1.7.1/go.mod h1:kOvZKUdrhhFQmxLZqbwUV0rHkNkZpth github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= +github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= -go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= -go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= -go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= -go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw= -go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg= -go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= -go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= golang.org/x/crypto v0.30.0 h1:RwoQn3GkWiMkzlX562cLB7OxWvjH1L8xutO2WoJcRoY= golang.org/x/crypto v0.30.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI= @@ -70,7 +91,8 @@ golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/contrib/drivers/mysql/go.mod b/contrib/drivers/mysql/go.mod index 132558238..39f0c0f60 100644 --- a/contrib/drivers/mysql/go.mod +++ b/contrib/drivers/mysql/go.mod @@ -1,6 +1,8 @@ module github.com/gogf/gf/contrib/drivers/mysql/v2 -go 1.20 +go 1.22 + +toolchain go1.22.0 require ( github.com/go-sql-driver/mysql v1.7.1 @@ -15,18 +17,20 @@ require ( github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/gorilla/websocket v1.5.3 // indirect github.com/grokify/html-strip-tags-go v0.1.0 // indirect + github.com/kr/text v0.2.0 // indirect github.com/magiconair/properties v1.8.9 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.16 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect github.com/rivo/uniseg v0.4.7 // indirect - go.opentelemetry.io/otel v1.24.0 // indirect - go.opentelemetry.io/otel/metric v1.24.0 // indirect - go.opentelemetry.io/otel/sdk v1.24.0 // indirect - go.opentelemetry.io/otel/trace v1.24.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect golang.org/x/net v0.32.0 // indirect golang.org/x/sys v0.28.0 // indirect golang.org/x/text v0.21.0 // indirect diff --git a/contrib/drivers/mysql/go.sum b/contrib/drivers/mysql/go.sum index 3857f838d..43343e254 100644 --- a/contrib/drivers/mysql/go.sum +++ b/contrib/drivers/mysql/go.sum @@ -2,7 +2,9 @@ github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0 github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= github.com/clbanning/mxj/v2 v2.7.0 h1:WA/La7UGCanFe5NpHF0Q3DNtnCsVoxbPKuyBNHWRyME= github.com/clbanning/mxj/v2 v2.7.0/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn/Qo+ve2s= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= @@ -17,10 +19,17 @@ github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI= github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grokify/html-strip-tags-go v0.1.0 h1:03UrQLjAny8xci+R+qjCce/MYnpNXCtgzltlQbOBae4= github.com/grokify/html-strip-tags-go v0.1.0/go.mod h1:ZdzgfHEzAfz9X6Xe5eBLVblWIxXfYSQ40S/VKrAOGpc= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/magiconair/properties v1.8.9 h1:nWcCbLq1N2v/cpNsy5WvQ37Fb+YElfq20WJ/a8RkpQM= github.com/magiconair/properties v1.8.9/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= @@ -34,18 +43,22 @@ github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= -go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= -go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= -go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= -go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw= -go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg= -go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= -go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI= golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -54,7 +67,8 @@ golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/contrib/drivers/mysql/mysql_z_unit_feature_hook_test.go b/contrib/drivers/mysql/mysql_z_unit_feature_hook_test.go index 1330c158c..4c97ab83c 100644 --- a/contrib/drivers/mysql/mysql_z_unit_feature_hook_test.go +++ b/contrib/drivers/mysql/mysql_z_unit_feature_hook_test.go @@ -7,130 +7,129 @@ package mysql_test import ( - "context" - "database/sql" - "fmt" - "testing" + "context" + "database/sql" + "fmt" + "testing" - "github.com/gogf/gf/v2/container/gvar" - "github.com/gogf/gf/v2/database/gdb" - "github.com/gogf/gf/v2/frame/g" - "github.com/gogf/gf/v2/test/gtest" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/test/gtest" ) func Test_Model_Hook_Select(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - m := db.Model(table).Hook(gdb.HookHandler{ - Select: func(ctx context.Context, in *gdb.HookSelectInput) (result gdb.Result, err error) { - result, err = in.Next(ctx) - if err != nil { - return - } - for i, record := range result { - record["test"] = gvar.New(100 + record["id"].Int()) - result[i] = record - } - return - }, - }) - all, err := m.Where(`id > 6`).OrderAsc(`id`).All() - t.AssertNil(err) - t.Assert(len(all), 4) - t.Assert(all[0]["id"].Int(), 7) - t.Assert(all[0]["test"].Int(), 107) - t.Assert(all[1]["test"].Int(), 108) - t.Assert(all[2]["test"].Int(), 109) - t.Assert(all[3]["test"].Int(), 110) - }) + gtest.C(t, func(t *gtest.T) { + m := db.Model(table).Hook(gdb.HookHandler{ + Select: func(ctx context.Context, in *gdb.HookSelectInput) (result gdb.Result, err error) { + result, err = in.Next(ctx) + if err != nil { + return + } + for i, record := range result { + record["test"] = gdb.NewValue(100 + record["id"].Int()) + result[i] = record + } + return + }, + }) + all, err := m.Where(`id > 6`).OrderAsc(`id`).All() + t.AssertNil(err) + t.Assert(len(all), 4) + t.Assert(all[0]["id"].Int(), 7) + t.Assert(all[0]["test"].Int(), 107) + t.Assert(all[1]["test"].Int(), 108) + t.Assert(all[2]["test"].Int(), 109) + t.Assert(all[3]["test"].Int(), 110) + }) } func Test_Model_Hook_Insert(t *testing.T) { - table := createTable() - defer dropTable(table) + table := createTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - m := db.Model(table).Hook(gdb.HookHandler{ - Insert: func(ctx context.Context, in *gdb.HookInsertInput) (result sql.Result, err error) { - for i, item := range in.Data { - item["passport"] = fmt.Sprintf(`test_port_%d`, item["id"]) - item["nickname"] = fmt.Sprintf(`test_name_%d`, item["id"]) - in.Data[i] = item - } - return in.Next(ctx) - }, - }) - _, err := m.Insert(g.Map{ - "id": 1, - "nickname": "name_1", - }) - t.AssertNil(err) - one, err := m.One() - t.AssertNil(err) - t.Assert(one["id"].Int(), 1) - t.Assert(one["passport"], `test_port_1`) - t.Assert(one["nickname"], `test_name_1`) - }) + gtest.C(t, func(t *gtest.T) { + m := db.Model(table).Hook(gdb.HookHandler{ + Insert: func(ctx context.Context, in *gdb.HookInsertInput) (result sql.Result, err error) { + for i, item := range in.Data { + item["passport"] = fmt.Sprintf(`test_port_%d`, item["id"]) + item["nickname"] = fmt.Sprintf(`test_name_%d`, item["id"]) + in.Data[i] = item + } + return in.Next(ctx) + }, + }) + _, err := m.Insert(g.Map{ + "id": 1, + "nickname": "name_1", + }) + t.AssertNil(err) + one, err := m.One() + t.AssertNil(err) + t.Assert(one["id"].Int(), 1) + t.Assert(one["passport"], `test_port_1`) + t.Assert(one["nickname"], `test_name_1`) + }) } func Test_Model_Hook_Update(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - m := db.Model(table).Hook(gdb.HookHandler{ - Update: func(ctx context.Context, in *gdb.HookUpdateInput) (result sql.Result, err error) { - switch value := in.Data.(type) { - case gdb.List: - for i, data := range value { - data["passport"] = `port` - data["nickname"] = `name` - value[i] = data - } - in.Data = value + gtest.C(t, func(t *gtest.T) { + m := db.Model(table).Hook(gdb.HookHandler{ + Update: func(ctx context.Context, in *gdb.HookUpdateInput) (result sql.Result, err error) { + switch value := in.Data.(type) { + case gdb.List: + for i, data := range value { + data["passport"] = `port` + data["nickname"] = `name` + value[i] = data + } + in.Data = value - case gdb.Map: - value["passport"] = `port` - value["nickname"] = `name` - in.Data = value - } - return in.Next(ctx) - }, - }) - _, err := m.Data(g.Map{ - "nickname": "name_1", - }).WherePri(1).Update() - t.AssertNil(err) + case gdb.Map: + value["passport"] = `port` + value["nickname"] = `name` + in.Data = value + } + return in.Next(ctx) + }, + }) + _, err := m.Data(g.Map{ + "nickname": "name_1", + }).WherePri(1).Update() + t.AssertNil(err) - one, err := m.One() - t.AssertNil(err) - t.Assert(one["id"].Int(), 1) - t.Assert(one["passport"], `port`) - t.Assert(one["nickname"], `name`) - }) + one, err := m.One() + t.AssertNil(err) + t.Assert(one["id"].Int(), 1) + t.Assert(one["passport"], `port`) + t.Assert(one["nickname"], `name`) + }) } func Test_Model_Hook_Delete(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - m := db.Model(table).Hook(gdb.HookHandler{ - Delete: func(ctx context.Context, in *gdb.HookDeleteInput) (result sql.Result, err error) { - return db.Model(table).Data(g.Map{ - "nickname": `deleted`, - }).Where(in.Condition).Update() - }, - }) - _, err := m.Where(1).Delete() - t.AssertNil(err) + gtest.C(t, func(t *gtest.T) { + m := db.Model(table).Hook(gdb.HookHandler{ + Delete: func(ctx context.Context, in *gdb.HookDeleteInput) (result sql.Result, err error) { + return db.Model(table).Data(g.Map{ + "nickname": `deleted`, + }).Where(in.Condition).Update() + }, + }) + _, err := m.Where(1).Delete() + t.AssertNil(err) - all, err := m.All() - t.AssertNil(err) - for _, item := range all { - t.Assert(item["nickname"].String(), `deleted`) - } - }) + all, err := m.All() + t.AssertNil(err) + for _, item := range all { + t.Assert(item["nickname"].String(), `deleted`) + } + }) } diff --git a/contrib/drivers/mysql/mysql_z_unit_feature_model_struct_test.go b/contrib/drivers/mysql/mysql_z_unit_feature_model_struct_test.go index 7d9902c79..edf594d96 100644 --- a/contrib/drivers/mysql/mysql_z_unit_feature_model_struct_test.go +++ b/contrib/drivers/mysql/mysql_z_unit_feature_model_struct_test.go @@ -7,591 +7,476 @@ package mysql_test import ( - "database/sql" - "reflect" - "testing" + "database/sql" + "reflect" + "testing" - "github.com/gogf/gf/v2/database/gdb" - "github.com/gogf/gf/v2/errors/gcode" - "github.com/gogf/gf/v2/errors/gerror" - "github.com/gogf/gf/v2/frame/g" - "github.com/gogf/gf/v2/os/gtime" - "github.com/gogf/gf/v2/test/gtest" - "github.com/gogf/gf/v2/text/gstr" - "github.com/gogf/gf/v2/util/gconv" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/errors/gcode" + "github.com/gogf/gf/v2/errors/gerror" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/test/gtest" + "github.com/gogf/gf/v2/util/gconv" ) func Test_Model_Embedded_Insert(t *testing.T) { - table := createTable() - defer dropTable(table) + table := createTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - type Base struct { - Id int `json:"id"` - Uid int `json:"uid"` - CreateTime string `json:"create_time"` - } - type User struct { - Base - Passport string `json:"passport"` - Password string `json:"password"` - Nickname string `json:"nickname"` - } - result, err := db.Model(table).Data(User{ - Passport: "john-test", - Password: "123456", - Nickname: "John", - Base: Base{ - Id: 100, - Uid: 100, - CreateTime: gtime.Now().String(), - }, - }).Insert() - t.AssertNil(err) - n, _ := result.RowsAffected() - t.Assert(n, 1) - value, err := db.Model(table).Fields("passport").Where("id=100").Value() - t.AssertNil(err) - t.Assert(value.String(), "john-test") - }) + gtest.C(t, func(t *gtest.T) { + type Base struct { + Id int `json:"id"` + Uid int `json:"uid"` + CreateTime string `json:"create_time"` + } + type User struct { + Base + Passport string `json:"passport"` + Password string `json:"password"` + Nickname string `json:"nickname"` + } + result, err := db.Model(table).Data(User{ + Passport: "john-test", + Password: "123456", + Nickname: "John", + Base: Base{ + Id: 100, + Uid: 100, + CreateTime: gtime.Now().String(), + }, + }).Insert() + t.AssertNil(err) + n, _ := result.RowsAffected() + t.Assert(n, 1) + value, err := db.Model(table).Fields("passport").Where("id=100").Value() + t.AssertNil(err) + t.Assert(value.String(), "john-test") + }) } func Test_Model_Embedded_MapToStruct(t *testing.T) { - table := createTable() - defer dropTable(table) + table := createTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - type Ids struct { - Id int `json:"id"` - Uid int `json:"uid"` - } - type Base struct { - Ids - CreateTime string `json:"create_time"` - } - type User struct { - Base - Passport string `json:"passport"` - Password string `json:"password"` - Nickname string `json:"nickname"` - } - data := g.Map{ - "id": 100, - "uid": 101, - "passport": "t1", - "password": "123456", - "nickname": "T1", - "create_time": gtime.Now().String(), - } - result, err := db.Model(table).Data(data).Insert() - t.AssertNil(err) - n, _ := result.RowsAffected() - t.Assert(n, 1) + gtest.C(t, func(t *gtest.T) { + type Ids struct { + Id int `json:"id"` + Uid int `json:"uid"` + } + type Base struct { + Ids + CreateTime string `json:"create_time"` + } + type User struct { + Base + Passport string `json:"passport"` + Password string `json:"password"` + Nickname string `json:"nickname"` + } + data := g.Map{ + "id": 100, + "uid": 101, + "passport": "t1", + "password": "123456", + "nickname": "T1", + "create_time": gtime.Now().String(), + } + result, err := db.Model(table).Data(data).Insert() + t.AssertNil(err) + n, _ := result.RowsAffected() + t.Assert(n, 1) - one, err := db.Model(table).Where("id=100").One() - t.AssertNil(err) + one, err := db.Model(table).Where("id=100").One() + t.AssertNil(err) - user := new(User) + user := new(User) - t.Assert(one.Struct(user), nil) - t.Assert(user.Id, data["id"]) - t.Assert(user.Passport, data["passport"]) - t.Assert(user.Password, data["password"]) - t.Assert(user.Nickname, data["nickname"]) - t.Assert(user.CreateTime, data["create_time"]) - }) + t.Assert(one.Struct(user), nil) + t.Assert(user.Id, data["id"]) + t.Assert(user.Passport, data["passport"]) + t.Assert(user.Password, data["password"]) + t.Assert(user.Nickname, data["nickname"]) + t.Assert(user.CreateTime, data["create_time"]) + }) } func Test_Struct_Pointer_Attribute(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - type User struct { - Id *int - Passport *string - Password *string - Nickname string - } + type User struct { + Id *int + Passport *string + Password *string + Nickname string + } - gtest.C(t, func(t *gtest.T) { - one, err := db.Model(table).WherePri(1).One() - t.AssertNil(err) - user := new(User) - err = one.Struct(user) - t.AssertNil(err) - t.Assert(*user.Id, 1) - t.Assert(*user.Passport, "user_1") - t.Assert(*user.Password, "pass_1") - t.Assert(user.Nickname, "name_1") - }) - gtest.C(t, func(t *gtest.T) { - user := new(User) - err := db.Model(table).Scan(user, "id=1") - t.AssertNil(err) - t.Assert(*user.Id, 1) - t.Assert(*user.Passport, "user_1") - t.Assert(*user.Password, "pass_1") - t.Assert(user.Nickname, "name_1") - }) - gtest.C(t, func(t *gtest.T) { - var user *User - err := db.Model(table).Scan(&user, "id=1") - t.AssertNil(err) - t.Assert(*user.Id, 1) - t.Assert(*user.Passport, "user_1") - t.Assert(*user.Password, "pass_1") - t.Assert(user.Nickname, "name_1") - }) + gtest.C(t, func(t *gtest.T) { + one, err := db.Model(table).WherePri(1).One() + t.AssertNil(err) + user := new(User) + err = one.Struct(user) + t.AssertNil(err) + t.Assert(*user.Id, 1) + t.Assert(*user.Passport, "user_1") + t.Assert(*user.Password, "pass_1") + t.Assert(user.Nickname, "name_1") + }) + gtest.C(t, func(t *gtest.T) { + user := new(User) + err := db.Model(table).Scan(user, "id=1") + t.AssertNil(err) + t.Assert(*user.Id, 1) + t.Assert(*user.Passport, "user_1") + t.Assert(*user.Password, "pass_1") + t.Assert(user.Nickname, "name_1") + }) + gtest.C(t, func(t *gtest.T) { + var user *User + err := db.Model(table).Scan(&user, "id=1") + t.AssertNil(err) + t.Assert(*user.Id, 1) + t.Assert(*user.Passport, "user_1") + t.Assert(*user.Password, "pass_1") + t.Assert(user.Nickname, "name_1") + }) } func Test_Structs_Pointer_Attribute(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - type User struct { - Id *int - Passport *string - Password *string - Nickname string - } - // All - gtest.C(t, func(t *gtest.T) { - one, err := db.Model(table).All("id < 3") - t.AssertNil(err) - users := make([]User, 0) - err = one.Structs(&users) - t.AssertNil(err) - t.Assert(len(users), 2) - t.Assert(*users[0].Id, 1) - t.Assert(*users[0].Passport, "user_1") - t.Assert(*users[0].Password, "pass_1") - t.Assert(users[0].Nickname, "name_1") - }) - gtest.C(t, func(t *gtest.T) { - one, err := db.Model(table).All("id < 3") - t.AssertNil(err) - users := make([]*User, 0) - err = one.Structs(&users) - t.AssertNil(err) - t.Assert(len(users), 2) - t.Assert(*users[0].Id, 1) - t.Assert(*users[0].Passport, "user_1") - t.Assert(*users[0].Password, "pass_1") - t.Assert(users[0].Nickname, "name_1") - }) - gtest.C(t, func(t *gtest.T) { - var users []User - one, err := db.Model(table).All("id < 3") - t.AssertNil(err) - err = one.Structs(&users) - t.AssertNil(err) - t.Assert(len(users), 2) - t.Assert(*users[0].Id, 1) - t.Assert(*users[0].Passport, "user_1") - t.Assert(*users[0].Password, "pass_1") - t.Assert(users[0].Nickname, "name_1") - }) - gtest.C(t, func(t *gtest.T) { - var users []*User - one, err := db.Model(table).All("id < 3") - t.AssertNil(err) - err = one.Structs(&users) - t.AssertNil(err) - t.Assert(len(users), 2) - t.Assert(*users[0].Id, 1) - t.Assert(*users[0].Passport, "user_1") - t.Assert(*users[0].Password, "pass_1") - t.Assert(users[0].Nickname, "name_1") - }) - // Structs - gtest.C(t, func(t *gtest.T) { - users := make([]User, 0) - err := db.Model(table).Scan(&users, "id < 3") - t.AssertNil(err) - t.Assert(len(users), 2) - t.Assert(*users[0].Id, 1) - t.Assert(*users[0].Passport, "user_1") - t.Assert(*users[0].Password, "pass_1") - t.Assert(users[0].Nickname, "name_1") - }) - gtest.C(t, func(t *gtest.T) { - users := make([]*User, 0) - err := db.Model(table).Scan(&users, "id < 3") - t.AssertNil(err) - t.Assert(len(users), 2) - t.Assert(*users[0].Id, 1) - t.Assert(*users[0].Passport, "user_1") - t.Assert(*users[0].Password, "pass_1") - t.Assert(users[0].Nickname, "name_1") - }) - gtest.C(t, func(t *gtest.T) { - var users []User - err := db.Model(table).Scan(&users, "id < 3") - t.AssertNil(err) - t.Assert(len(users), 2) - t.Assert(*users[0].Id, 1) - t.Assert(*users[0].Passport, "user_1") - t.Assert(*users[0].Password, "pass_1") - t.Assert(users[0].Nickname, "name_1") - }) - gtest.C(t, func(t *gtest.T) { - var users []*User - err := db.Model(table).Scan(&users, "id < 3") - t.AssertNil(err) - t.Assert(len(users), 2) - t.Assert(*users[0].Id, 1) - t.Assert(*users[0].Passport, "user_1") - t.Assert(*users[0].Password, "pass_1") - t.Assert(users[0].Nickname, "name_1") - }) + type User struct { + Id *int + Passport *string + Password *string + Nickname string + } + // All + gtest.C(t, func(t *gtest.T) { + one, err := db.Model(table).All("id < 3") + t.AssertNil(err) + users := make([]User, 0) + err = one.Structs(&users) + t.AssertNil(err) + t.Assert(len(users), 2) + t.Assert(*users[0].Id, 1) + t.Assert(*users[0].Passport, "user_1") + t.Assert(*users[0].Password, "pass_1") + t.Assert(users[0].Nickname, "name_1") + }) + gtest.C(t, func(t *gtest.T) { + one, err := db.Model(table).All("id < 3") + t.AssertNil(err) + users := make([]*User, 0) + err = one.Structs(&users) + t.AssertNil(err) + t.Assert(len(users), 2) + t.Assert(*users[0].Id, 1) + t.Assert(*users[0].Passport, "user_1") + t.Assert(*users[0].Password, "pass_1") + t.Assert(users[0].Nickname, "name_1") + }) + gtest.C(t, func(t *gtest.T) { + var users []User + one, err := db.Model(table).All("id < 3") + t.AssertNil(err) + err = one.Structs(&users) + t.AssertNil(err) + t.Assert(len(users), 2) + t.Assert(*users[0].Id, 1) + t.Assert(*users[0].Passport, "user_1") + t.Assert(*users[0].Password, "pass_1") + t.Assert(users[0].Nickname, "name_1") + }) + gtest.C(t, func(t *gtest.T) { + var users []*User + one, err := db.Model(table).All("id < 3") + t.AssertNil(err) + err = one.Structs(&users) + t.AssertNil(err) + t.Assert(len(users), 2) + t.Assert(*users[0].Id, 1) + t.Assert(*users[0].Passport, "user_1") + t.Assert(*users[0].Password, "pass_1") + t.Assert(users[0].Nickname, "name_1") + }) + // Structs + gtest.C(t, func(t *gtest.T) { + users := make([]User, 0) + err := db.Model(table).Scan(&users, "id < 3") + t.AssertNil(err) + t.Assert(len(users), 2) + t.Assert(*users[0].Id, 1) + t.Assert(*users[0].Passport, "user_1") + t.Assert(*users[0].Password, "pass_1") + t.Assert(users[0].Nickname, "name_1") + }) + gtest.C(t, func(t *gtest.T) { + users := make([]*User, 0) + err := db.Model(table).Scan(&users, "id < 3") + t.AssertNil(err) + t.Assert(len(users), 2) + t.Assert(*users[0].Id, 1) + t.Assert(*users[0].Passport, "user_1") + t.Assert(*users[0].Password, "pass_1") + t.Assert(users[0].Nickname, "name_1") + }) + gtest.C(t, func(t *gtest.T) { + var users []User + err := db.Model(table).Scan(&users, "id < 3") + t.AssertNil(err) + t.Assert(len(users), 2) + t.Assert(*users[0].Id, 1) + t.Assert(*users[0].Passport, "user_1") + t.Assert(*users[0].Password, "pass_1") + t.Assert(users[0].Nickname, "name_1") + }) + gtest.C(t, func(t *gtest.T) { + var users []*User + err := db.Model(table).Scan(&users, "id < 3") + t.AssertNil(err) + t.Assert(len(users), 2) + t.Assert(*users[0].Id, 1) + t.Assert(*users[0].Passport, "user_1") + t.Assert(*users[0].Password, "pass_1") + t.Assert(users[0].Nickname, "name_1") + }) } func Test_Struct_Empty(t *testing.T) { - table := createTable() - defer dropTable(table) + table := createTable() + defer dropTable(table) - type User struct { - Id int - Passport string - Password string - Nickname string - } + type User struct { + Id int + Passport string + Password string + Nickname string + } - gtest.C(t, func(t *gtest.T) { - user := new(User) - err := db.Model(table).Where("id=100").Scan(user) - t.Assert(err, sql.ErrNoRows) - t.AssertNE(user, nil) - }) + gtest.C(t, func(t *gtest.T) { + user := new(User) + err := db.Model(table).Where("id=100").Scan(user) + t.Assert(err, sql.ErrNoRows) + t.AssertNE(user, nil) + }) - gtest.C(t, func(t *gtest.T) { - one, err := db.Model(table).Where("id=100").One() - t.AssertNil(err) - var user *User - t.Assert(one.Struct(&user), nil) - t.Assert(user, nil) - }) + gtest.C(t, func(t *gtest.T) { + one, err := db.Model(table).Where("id=100").One() + t.AssertNil(err) + var user *User + t.Assert(one.Struct(&user), nil) + t.Assert(user, nil) + }) - gtest.C(t, func(t *gtest.T) { - var user *User - err := db.Model(table).Where("id=100").Scan(&user) - t.AssertNil(err) - t.Assert(user, nil) - }) + gtest.C(t, func(t *gtest.T) { + var user *User + err := db.Model(table).Where("id=100").Scan(&user) + t.AssertNil(err) + t.Assert(user, nil) + }) } func Test_Structs_Empty(t *testing.T) { - table := createTable() - defer dropTable(table) + table := createTable() + defer dropTable(table) - type User struct { - Id int - Passport string - Password string - Nickname string - } + type User struct { + Id int + Passport string + Password string + Nickname string + } - gtest.C(t, func(t *gtest.T) { - all, err := db.Model(table).Where("id>100").All() - t.AssertNil(err) - users := make([]User, 0) - t.Assert(all.Structs(&users), nil) - }) - gtest.C(t, func(t *gtest.T) { - all, err := db.Model(table).Where("id>100").All() - t.AssertNil(err) - users := make([]User, 10) - t.Assert(all.Structs(&users), sql.ErrNoRows) - }) - gtest.C(t, func(t *gtest.T) { - all, err := db.Model(table).Where("id>100").All() - t.AssertNil(err) - var users []User - t.Assert(all.Structs(&users), nil) - }) + gtest.C(t, func(t *gtest.T) { + all, err := db.Model(table).Where("id>100").All() + t.AssertNil(err) + users := make([]User, 0) + t.Assert(all.Structs(&users), nil) + }) + gtest.C(t, func(t *gtest.T) { + all, err := db.Model(table).Where("id>100").All() + t.AssertNil(err) + users := make([]User, 10) + t.Assert(all.Structs(&users), sql.ErrNoRows) + }) + gtest.C(t, func(t *gtest.T) { + all, err := db.Model(table).Where("id>100").All() + t.AssertNil(err) + var users []User + t.Assert(all.Structs(&users), nil) + }) - gtest.C(t, func(t *gtest.T) { - all, err := db.Model(table).Where("id>100").All() - t.AssertNil(err) - users := make([]*User, 0) - t.Assert(all.Structs(&users), nil) - }) - gtest.C(t, func(t *gtest.T) { - all, err := db.Model(table).Where("id>100").All() - t.AssertNil(err) - users := make([]*User, 10) - t.Assert(all.Structs(&users), sql.ErrNoRows) - }) - gtest.C(t, func(t *gtest.T) { - all, err := db.Model(table).Where("id>100").All() - t.AssertNil(err) - var users []*User - t.Assert(all.Structs(&users), nil) - }) + gtest.C(t, func(t *gtest.T) { + all, err := db.Model(table).Where("id>100").All() + t.AssertNil(err) + users := make([]*User, 0) + t.Assert(all.Structs(&users), nil) + }) + gtest.C(t, func(t *gtest.T) { + all, err := db.Model(table).Where("id>100").All() + t.AssertNil(err) + users := make([]*User, 10) + t.Assert(all.Structs(&users), sql.ErrNoRows) + }) + gtest.C(t, func(t *gtest.T) { + all, err := db.Model(table).Where("id>100").All() + t.AssertNil(err) + var users []*User + t.Assert(all.Structs(&users), nil) + }) } type MyTime struct { - gtime.Time + gtime.Time } type MyTimeSt struct { - CreateTime MyTime + CreateTime MyTime } func (st *MyTimeSt) UnmarshalValue(v interface{}) error { - m := gconv.Map(v) - t, err := gtime.StrToTime(gconv.String(m["create_time"])) - if err != nil { - return err - } - st.CreateTime = MyTime{*t} - return nil + m := gconv.Map(v) + t, err := gtime.StrToTime(gconv.String(m["create_time"])) + if err != nil { + return err + } + st.CreateTime = MyTime{*t} + return nil } func Test_Model_Scan_CustomType_Time(t *testing.T) { - table := createInitTable() - defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - st := new(MyTimeSt) - err := db.Model(table).Fields("create_time").Scan(st) - t.AssertNil(err) - t.Assert(st.CreateTime.String(), "2018-10-24 10:00:00") - }) - gtest.C(t, func(t *gtest.T) { - var stSlice []*MyTimeSt - err := db.Model(table).Fields("create_time").Scan(&stSlice) - t.AssertNil(err) - t.Assert(len(stSlice), TableSize) - t.Assert(stSlice[0].CreateTime.String(), "2018-10-24 10:00:00") - t.Assert(stSlice[9].CreateTime.String(), "2018-10-24 10:00:00") - }) + table := createInitTable() + defer dropTable(table) + gtest.C(t, func(t *gtest.T) { + st := new(MyTimeSt) + err := db.Model(table).Fields("create_time").Scan(st) + t.AssertNil(err) + t.Assert(st.CreateTime.String(), "2018-10-24 10:00:00") + }) + gtest.C(t, func(t *gtest.T) { + var stSlice []*MyTimeSt + err := db.Model(table).Fields("create_time").Scan(&stSlice) + t.AssertNil(err) + t.Assert(len(stSlice), TableSize) + t.Assert(stSlice[0].CreateTime.String(), "2018-10-24 10:00:00") + t.Assert(stSlice[9].CreateTime.String(), "2018-10-24 10:00:00") + }) } func Test_Model_Scan_CustomType_String(t *testing.T) { - type MyString string + type MyString string - type MyStringSt struct { - Passport MyString - } + type MyStringSt struct { + Passport MyString + } - table := createInitTable() - defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - st := new(MyStringSt) - err := db.Model(table).Fields("Passport").WherePri(1).Scan(st) - t.AssertNil(err) - t.Assert(st.Passport, "user_1") - }) - gtest.C(t, func(t *gtest.T) { - var sts []MyStringSt - err := db.Model(table).Fields("Passport").Order("id asc").Scan(&sts) - t.AssertNil(err) - t.Assert(len(sts), TableSize) - t.Assert(sts[0].Passport, "user_1") - }) + table := createInitTable() + defer dropTable(table) + gtest.C(t, func(t *gtest.T) { + st := new(MyStringSt) + err := db.Model(table).Fields("Passport").WherePri(1).Scan(st) + t.AssertNil(err) + t.Assert(st.Passport, "user_1") + }) + gtest.C(t, func(t *gtest.T) { + var sts []MyStringSt + err := db.Model(table).Fields("Passport").Order("id asc").Scan(&sts) + t.AssertNil(err) + t.Assert(len(sts), TableSize) + t.Assert(sts[0].Passport, "user_1") + }) } type User struct { - Id int - Passport string - Password string - Nickname string - CreateTime *gtime.Time + Id int + Passport string + Password string + Nickname string + CreateTime *gtime.Time } func (user *User) UnmarshalValue(value interface{}) error { - if record, ok := value.(gdb.Record); ok { - *user = User{ - Id: record["id"].Int(), - Passport: record["passport"].String(), - Password: "", - Nickname: record["nickname"].String(), - CreateTime: record["create_time"].GTime(), - } - return nil - } - return gerror.NewCodef(gcode.CodeInvalidParameter, `unsupported value type for UnmarshalValue: %v`, reflect.TypeOf(value)) + if record, ok := value.(gdb.Record); ok { + *user = User{ + Id: record["id"].Int(), + Passport: record["passport"].String(), + Password: "", + Nickname: record["nickname"].String(), + CreateTime: record["create_time"].GTime(), + } + return nil + } + return gerror.NewCodef(gcode.CodeInvalidParameter, `unsupported value type for UnmarshalValue: %v`, reflect.TypeOf(value)) } func Test_Model_Scan_UnmarshalValue(t *testing.T) { - table := createInitTable() - defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - var users []*User - err := db.Model(table).Order("id asc").Scan(&users) - t.AssertNil(err) - t.Assert(len(users), TableSize) - t.Assert(users[0].Id, 1) - t.Assert(users[0].Passport, "user_1") - t.Assert(users[0].Password, "") - t.Assert(users[0].Nickname, "name_1") - t.Assert(users[0].CreateTime.String(), CreateTime) + table := createInitTable() + defer dropTable(table) + gtest.C(t, func(t *gtest.T) { + var users []*User + err := db.Model(table).Order("id asc").Scan(&users) + t.AssertNil(err) + t.Assert(len(users), TableSize) + t.Assert(users[0].Id, 1) + t.Assert(users[0].Passport, "user_1") + t.Assert(users[0].Password, "") + t.Assert(users[0].Nickname, "name_1") + t.Assert(users[0].CreateTime.String(), CreateTime) - t.Assert(users[9].Id, 10) - t.Assert(users[9].Passport, "user_10") - t.Assert(users[9].Password, "") - t.Assert(users[9].Nickname, "name_10") - t.Assert(users[9].CreateTime.String(), CreateTime) - }) + t.Assert(users[9].Id, 10) + t.Assert(users[9].Passport, "user_10") + t.Assert(users[9].Password, "") + t.Assert(users[9].Nickname, "name_10") + t.Assert(users[9].CreateTime.String(), CreateTime) + }) } func Test_Model_Scan_Map(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - var users []*User - err := db.Model(table).Order("id asc").Scan(&users) - t.AssertNil(err) - t.Assert(len(users), TableSize) - t.Assert(users[0].Id, 1) - t.Assert(users[0].Passport, "user_1") - t.Assert(users[0].Password, "") - t.Assert(users[0].Nickname, "name_1") - t.Assert(users[0].CreateTime.String(), CreateTime) + gtest.C(t, func(t *gtest.T) { + var users []*User + err := db.Model(table).Order("id asc").Scan(&users) + t.AssertNil(err) + t.Assert(len(users), TableSize) + t.Assert(users[0].Id, 1) + t.Assert(users[0].Passport, "user_1") + t.Assert(users[0].Password, "") + t.Assert(users[0].Nickname, "name_1") + t.Assert(users[0].CreateTime.String(), CreateTime) - t.Assert(users[9].Id, 10) - t.Assert(users[9].Passport, "user_10") - t.Assert(users[9].Password, "") - t.Assert(users[9].Nickname, "name_10") - t.Assert(users[9].CreateTime.String(), CreateTime) - }) + t.Assert(users[9].Id, 10) + t.Assert(users[9].Passport, "user_10") + t.Assert(users[9].Password, "") + t.Assert(users[9].Nickname, "name_10") + t.Assert(users[9].CreateTime.String(), CreateTime) + }) } func Test_Scan_AutoFilteringByStructAttributes(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - type User struct { - Id int - Passport string - } - // db.SetDebug(true) - gtest.C(t, func(t *gtest.T) { - var user *User - err := db.Model(table).OrderAsc("id").Scan(&user) - t.AssertNil(err) - t.Assert(user.Id, 1) - }) - gtest.C(t, func(t *gtest.T) { - var users []User - err := db.Model(table).OrderAsc("id").Scan(&users) - t.AssertNil(err) - t.Assert(len(users), TableSize) - t.Assert(users[0].Id, 1) - }) -} - -func Test_Scan_JsonAttributes(t *testing.T) { - type GiftImage struct { - Uid string `json:"uid"` - Url string `json:"url"` - Status string `json:"status"` - Name string `json:"name"` - } - - type GiftComment struct { - Name string `json:"name"` - Field string `json:"field"` - Required bool `json:"required"` - } - - type Prop struct { - Name string `json:"name"` - Values []string `json:"values"` - } - - type Sku struct { - GiftId int64 `json:"gift_id"` - Name string `json:"name"` - ScorePrice int `json:"score_price"` - MarketPrice int `json:"market_price"` - CostPrice int `json:"cost_price"` - Stock int `json:"stock"` - } - - type Covers struct { - List []GiftImage `json:"list"` - } - - type GiftEntity struct { - Id int64 `json:"id"` - StoreId int64 `json:"store_id"` - GiftType int `json:"gift_type"` - GiftName string `json:"gift_name"` - Description string `json:"description"` - Covers Covers `json:"covers"` - Cover string `json:"cover"` - GiftCategoryId []int64 `json:"gift_category_id"` - HasProps bool `json:"has_props"` - OutSn string `json:"out_sn"` - IsLimitSell bool `json:"is_limit_sell"` - LimitSellType int `json:"limit_sell_type"` - LimitSellCycle string `json:"limit_sell_cycle"` - LimitSellCycleCount int `json:"limit_sell_cycle_count"` - LimitSellCustom bool `json:"limit_sell_custom"` // 只允许特定会员兑换 - LimitCustomerTags []int64 `json:"limit_customer_tags"` // 允许兑换的成员 - ScorePrice int `json:"score_price"` - MarketPrice float64 `json:"market_price"` - CostPrice int `json:"cost_price"` - Stock int `json:"stock"` - Props []Prop `json:"props"` - Skus []Sku `json:"skus"` - ExpressType []string `json:"express_type"` - Comments []GiftComment `json:"comments"` - Content string `json:"content"` - AtLeastRechargeCount int `json:"at_least_recharge_count"` - Status int `json:"status"` - } - - type User struct { - Id int - Passport string - } - - table := "jfy_gift" - array := gstr.SplitAndTrim(gtest.DataContent(`issue1380.sql`), ";") - for _, v := range array { - if _, err := db.Exec(ctx, v); err != nil { - gtest.Error(err) - } - } - defer dropTable(table) - - gtest.C(t, func(t *gtest.T) { - var ( - entity = new(GiftEntity) - err = db.Model(table).Where("id", 17).Scan(entity) - ) - t.AssertNil(err) - t.Assert(len(entity.Skus), 2) - - t.Assert(entity.Skus[0].Name, "red") - t.Assert(entity.Skus[0].Stock, 10) - t.Assert(entity.Skus[0].GiftId, 1) - t.Assert(entity.Skus[0].CostPrice, 80) - t.Assert(entity.Skus[0].ScorePrice, 188) - t.Assert(entity.Skus[0].MarketPrice, 388) - - t.Assert(entity.Skus[1].Name, "blue") - t.Assert(entity.Skus[1].Stock, 100) - t.Assert(entity.Skus[1].GiftId, 2) - t.Assert(entity.Skus[1].CostPrice, 81) - t.Assert(entity.Skus[1].ScorePrice, 200) - t.Assert(entity.Skus[1].MarketPrice, 288) - - t.Assert(entity.Id, 17) - t.Assert(entity.StoreId, 100004) - t.Assert(entity.GiftType, 1) - t.Assert(entity.GiftName, "GIFT") - t.Assert(entity.Description, "支持个性定制的父亲节老师长辈的专属礼物") - t.Assert(len(entity.Covers.List), 3) - t.Assert(entity.OutSn, "259402") - t.Assert(entity.LimitCustomerTags, "[]") - t.Assert(entity.ScorePrice, 10) - t.Assert(len(entity.Props), 1) - t.Assert(len(entity.Comments), 2) - t.Assert(entity.Status, 99) - t.Assert(entity.Content, `
礼品详情
`) - }) + type User struct { + Id int + Passport string + } + // db.SetDebug(true) + gtest.C(t, func(t *gtest.T) { + var user *User + err := db.Model(table).OrderAsc("id").Scan(&user) + t.AssertNil(err) + t.Assert(user.Id, 1) + }) + gtest.C(t, func(t *gtest.T) { + var users []User + err := db.Model(table).OrderAsc("id").Scan(&users) + t.AssertNil(err) + t.Assert(len(users), TableSize) + t.Assert(users[0].Id, 1) + }) } diff --git a/contrib/drivers/mysql/mysql_z_unit_issue_test.go b/contrib/drivers/mysql/mysql_z_unit_issue_test.go index af4e43b29..2b909c85f 100644 --- a/contrib/drivers/mysql/mysql_z_unit_issue_test.go +++ b/contrib/drivers/mysql/mysql_z_unit_issue_test.go @@ -7,65 +7,180 @@ package mysql_test import ( - "context" - "fmt" - "sync" - "testing" - "time" + "context" + "encoding/json" + "fmt" + "sync" + "testing" + "time" - "github.com/gogf/gf/v2/container/gvar" - "github.com/gogf/gf/v2/database/gdb" - "github.com/gogf/gf/v2/frame/g" - "github.com/gogf/gf/v2/os/gtime" - "github.com/gogf/gf/v2/test/gtest" - "github.com/gogf/gf/v2/text/gregex" - "github.com/gogf/gf/v2/text/gstr" - "github.com/gogf/gf/v2/util/gmeta" - "github.com/gogf/gf/v2/util/guid" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/test/gtest" + "github.com/gogf/gf/v2/text/gregex" + "github.com/gogf/gf/v2/text/gstr" + "github.com/gogf/gf/v2/util/gmeta" + "github.com/gogf/gf/v2/util/guid" ) +// https://github.com/gogf/gf/issues/1380 +func Test_Issue1380(t *testing.T) { + type GiftImage struct { + Uid string `json:"uid"` + Url string `json:"url"` + Status string `json:"status"` + Name string `json:"name"` + } + + type GiftComment struct { + Name string `json:"name"` + Field string `json:"field"` + Required bool `json:"required"` + } + + type Prop struct { + Name string `json:"name"` + Values []string `json:"values"` + } + + type Sku struct { + GiftId int64 `json:"gift_id"` + Name string `json:"name"` + ScorePrice int `json:"score_price"` + MarketPrice int `json:"market_price"` + CostPrice int `json:"cost_price"` + Stock int `json:"stock"` + } + + type Covers struct { + List []GiftImage `json:"list"` + } + + type GiftEntity struct { + Id int64 `json:"id"` + StoreId int64 `json:"store_id"` + GiftType int `json:"gift_type"` + GiftName string `json:"gift_name"` + Description string `json:"description"` + Covers Covers `json:"covers"` + Cover string `json:"cover"` + GiftCategoryId []int64 `json:"gift_category_id"` + HasProps bool `json:"has_props"` + OutSn string `json:"out_sn"` + IsLimitSell bool `json:"is_limit_sell"` + LimitSellType int `json:"limit_sell_type"` + LimitSellCycle string `json:"limit_sell_cycle"` + LimitSellCycleCount int `json:"limit_sell_cycle_count"` + LimitSellCustom bool `json:"limit_sell_custom"` // 只允许特定会员兑换 + LimitCustomerTags []int64 `json:"limit_customer_tags"` // 允许兑换的成员 + ScorePrice int `json:"score_price"` + MarketPrice float64 `json:"market_price"` + CostPrice int `json:"cost_price"` + Stock int `json:"stock"` + Props []Prop `json:"props"` + Skus []Sku `json:"skus"` + ExpressType []string `json:"express_type"` + Comments []GiftComment `json:"comments"` + Content string `json:"content"` + AtLeastRechargeCount int `json:"at_least_recharge_count"` + Status int `json:"status"` + } + + type User struct { + Id int + Passport string + } + + table := "jfy_gift" + array := gstr.SplitAndTrim(gtest.DataContent(`issues`, `1380.sql`), ";") + for _, v := range array { + if _, err := db.Exec(ctx, v); err != nil { + gtest.Error(err) + } + } + defer dropTable(table) + + gtest.C(t, func(t *gtest.T) { + var ( + entity = new(GiftEntity) + err = db.Model(table).Where("id", 17).Scan(entity) + ) + t.AssertNil(err) + t.Assert(len(entity.Skus), 2) + + t.Assert(entity.Skus[0].Name, "red") + t.Assert(entity.Skus[0].Stock, 10) + t.Assert(entity.Skus[0].GiftId, 1) + t.Assert(entity.Skus[0].CostPrice, 80) + t.Assert(entity.Skus[0].ScorePrice, 188) + t.Assert(entity.Skus[0].MarketPrice, 388) + + t.Assert(entity.Skus[1].Name, "blue") + t.Assert(entity.Skus[1].Stock, 100) + t.Assert(entity.Skus[1].GiftId, 2) + t.Assert(entity.Skus[1].CostPrice, 81) + t.Assert(entity.Skus[1].ScorePrice, 200) + t.Assert(entity.Skus[1].MarketPrice, 288) + + t.Assert(entity.Id, 17) + t.Assert(entity.StoreId, 100004) + t.Assert(entity.GiftType, 1) + t.Assert(entity.GiftName, "GIFT") + t.Assert(entity.Description, "支持个性定制的父亲节老师长辈的专属礼物") + t.Assert(len(entity.Covers.List), 3) + t.Assert(entity.OutSn, "259402") + t.Assert(entity.LimitCustomerTags, "[]") + t.Assert(entity.ScorePrice, 10) + t.Assert(len(entity.Props), 1) + t.Assert(len(entity.Comments), 2) + t.Assert(entity.Status, 99) + t.Assert(entity.Content, `礼品详情
`) + }) +} + // https://github.com/gogf/gf/issues/1934 func Test_Issue1934(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - one, err := db.Model(table).Where(" id ", 1).One() - t.AssertNil(err) - t.Assert(one["id"], 1) - }) + gtest.C(t, func(t *gtest.T) { + one, err := db.Model(table).Where(" id ", 1).One() + t.AssertNil(err) + t.Assert(one["id"], 1) + }) } // https://github.com/gogf/gf/issues/1570 func Test_Issue1570(t *testing.T) { - var ( - tableUser = "user_" + gtime.TimestampMicroStr() - tableUserDetail = "user_detail_" + gtime.TimestampMicroStr() - tableUserScores = "user_scores_" + gtime.TimestampMicroStr() - ) - if _, err := db.Exec(ctx, fmt.Sprintf(` + var ( + tableUser = "user_" + gtime.TimestampMicroStr() + tableUserDetail = "user_detail_" + gtime.TimestampMicroStr() + tableUserScores = "user_scores_" + gtime.TimestampMicroStr() + ) + if _, err := db.Exec(ctx, fmt.Sprintf(` CREATE TABLE %s ( uid int(10) unsigned NOT NULL AUTO_INCREMENT, name varchar(45) NOT NULL, PRIMARY KEY (uid) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; `, tableUser)); err != nil { - gtest.Error(err) - } - defer dropTable(tableUser) + gtest.Error(err) + } + defer dropTable(tableUser) - if _, err := db.Exec(ctx, fmt.Sprintf(` + if _, err := db.Exec(ctx, fmt.Sprintf(` CREATE TABLE %s ( uid int(10) unsigned NOT NULL AUTO_INCREMENT, address varchar(45) NOT NULL, PRIMARY KEY (uid) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; `, tableUserDetail)); err != nil { - gtest.Error(err) - } - defer dropTable(tableUserDetail) + gtest.Error(err) + } + defer dropTable(tableUserDetail) - if _, err := db.Exec(ctx, fmt.Sprintf(` + if _, err := db.Exec(ctx, fmt.Sprintf(` CREATE TABLE %s ( id int(10) unsigned NOT NULL AUTO_INCREMENT, uid int(10) unsigned NOT NULL, @@ -73,279 +188,279 @@ CREATE TABLE %s ( PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; `, tableUserScores)); err != nil { - gtest.Error(err) - } - defer dropTable(tableUserScores) + gtest.Error(err) + } + defer dropTable(tableUserScores) - type EntityUser struct { - Uid int `json:"uid"` - Name string `json:"name"` - } - type EntityUserDetail struct { - Uid int `json:"uid"` - Address string `json:"address"` - } - type EntityUserScores struct { - Id int `json:"id"` - Uid int `json:"uid"` - Score int `json:"score"` - } - type Entity struct { - User *EntityUser - UserDetail *EntityUserDetail - UserScores []*EntityUserScores - } + type EntityUser struct { + Uid int `json:"uid"` + Name string `json:"name"` + } + type EntityUserDetail struct { + Uid int `json:"uid"` + Address string `json:"address"` + } + type EntityUserScores struct { + Id int `json:"id"` + Uid int `json:"uid"` + Score int `json:"score"` + } + type Entity struct { + User *EntityUser + UserDetail *EntityUserDetail + UserScores []*EntityUserScores + } - // Initialize the data. - gtest.C(t, func(t *gtest.T) { - var err error - for i := 1; i <= 5; i++ { - // User. - _, err = db.Insert(ctx, tableUser, g.Map{ - "uid": i, - "name": fmt.Sprintf(`name_%d`, i), - }) - t.AssertNil(err) - // Detail. - _, err = db.Insert(ctx, tableUserDetail, g.Map{ - "uid": i, - "address": fmt.Sprintf(`address_%d`, i), - }) - t.AssertNil(err) - // Scores. - for j := 1; j <= 5; j++ { - _, err = db.Insert(ctx, tableUserScores, g.Map{ - "uid": i, - "score": j, - }) - t.AssertNil(err) - } - } - }) + // Initialize the data. + gtest.C(t, func(t *gtest.T) { + var err error + for i := 1; i <= 5; i++ { + // User. + _, err = db.Insert(ctx, tableUser, g.Map{ + "uid": i, + "name": fmt.Sprintf(`name_%d`, i), + }) + t.AssertNil(err) + // Detail. + _, err = db.Insert(ctx, tableUserDetail, g.Map{ + "uid": i, + "address": fmt.Sprintf(`address_%d`, i), + }) + t.AssertNil(err) + // Scores. + for j := 1; j <= 5; j++ { + _, err = db.Insert(ctx, tableUserScores, g.Map{ + "uid": i, + "score": j, + }) + t.AssertNil(err) + } + } + }) - // Result ScanList with struct elements and pointer attributes. - gtest.C(t, func(t *gtest.T) { - var users []Entity - // User - err := db.Model(tableUser). - Where("uid", g.Slice{3, 4}). - Fields("uid"). - Order("uid asc"). - ScanList(&users, "User") - t.AssertNil(err) - t.AssertNil(err) - t.Assert(len(users), 2) - t.Assert(users[0].User, &EntityUser{3, ""}) - t.Assert(users[1].User, &EntityUser{4, ""}) - // Detail - err = db.Model(tableUserDetail). - Where("uid", gdb.ListItemValues(users, "User", "Uid")). - Order("uid asc"). - ScanList(&users, "UserDetail", "User", "uid:Uid") - t.AssertNil(err) - t.AssertNil(err) - t.Assert(users[0].UserDetail, &EntityUserDetail{3, "address_3"}) - t.Assert(users[1].UserDetail, &EntityUserDetail{4, "address_4"}) - // Scores - err = db.Model(tableUserScores). - Where("uid", gdb.ListItemValues(users, "User", "Uid")). - Order("id asc"). - ScanList(&users, "UserScores", "User", "uid:Uid") - t.AssertNil(err) - t.AssertNil(err) - t.Assert(len(users[0].UserScores), 5) - t.Assert(len(users[1].UserScores), 5) - t.Assert(users[0].UserScores[0].Uid, 3) - t.Assert(users[0].UserScores[0].Score, 1) - t.Assert(users[0].UserScores[4].Score, 5) - t.Assert(users[1].UserScores[0].Uid, 4) - t.Assert(users[1].UserScores[0].Score, 1) - t.Assert(users[1].UserScores[4].Score, 5) - }) + // Result ScanList with struct elements and pointer attributes. + gtest.C(t, func(t *gtest.T) { + var users []Entity + // User + err := db.Model(tableUser). + Where("uid", g.Slice{3, 4}). + Fields("uid"). + Order("uid asc"). + ScanList(&users, "User") + t.AssertNil(err) + t.AssertNil(err) + t.Assert(len(users), 2) + t.Assert(users[0].User, &EntityUser{3, ""}) + t.Assert(users[1].User, &EntityUser{4, ""}) + // Detail + err = db.Model(tableUserDetail). + Where("uid", gdb.ListItemValues(users, "User", "Uid")). + Order("uid asc"). + ScanList(&users, "UserDetail", "User", "uid:Uid") + t.AssertNil(err) + t.AssertNil(err) + t.Assert(users[0].UserDetail, &EntityUserDetail{3, "address_3"}) + t.Assert(users[1].UserDetail, &EntityUserDetail{4, "address_4"}) + // Scores + err = db.Model(tableUserScores). + Where("uid", gdb.ListItemValues(users, "User", "Uid")). + Order("id asc"). + ScanList(&users, "UserScores", "User", "uid:Uid") + t.AssertNil(err) + t.AssertNil(err) + t.Assert(len(users[0].UserScores), 5) + t.Assert(len(users[1].UserScores), 5) + t.Assert(users[0].UserScores[0].Uid, 3) + t.Assert(users[0].UserScores[0].Score, 1) + t.Assert(users[0].UserScores[4].Score, 5) + t.Assert(users[1].UserScores[0].Uid, 4) + t.Assert(users[1].UserScores[0].Score, 1) + t.Assert(users[1].UserScores[4].Score, 5) + }) } // https://github.com/gogf/gf/issues/1401 func Test_Issue1401(t *testing.T) { - var ( - table1 = "parcels" - table2 = "parcel_items" - ) - array := gstr.SplitAndTrim(gtest.DataContent(`issue1401.sql`), ";") - for _, v := range array { - if _, err := db.Exec(ctx, v); err != nil { - gtest.Error(err) - } - } - defer dropTable(table1) - defer dropTable(table2) + var ( + table1 = "parcels" + table2 = "parcel_items" + ) + array := gstr.SplitAndTrim(gtest.DataContent(`issues`, `1401.sql`), ";") + for _, v := range array { + if _, err := db.Exec(ctx, v); err != nil { + gtest.Error(err) + } + } + defer dropTable(table1) + defer dropTable(table2) - gtest.C(t, func(t *gtest.T) { - type NItem struct { - Id int `json:"id"` - ParcelId int `json:"parcel_id"` - } + gtest.C(t, func(t *gtest.T) { + type NItem struct { + Id int `json:"id"` + ParcelId int `json:"parcel_id"` + } - type ParcelItem struct { - gmeta.Meta `orm:"table:parcel_items"` - NItem - } + type ParcelItem struct { + gmeta.Meta `orm:"table:parcel_items"` + NItem + } - type ParcelRsp struct { - gmeta.Meta `orm:"table:parcels"` - Id int `json:"id"` - Items []*ParcelItem `json:"items" orm:"with:parcel_id=Id"` - } + type ParcelRsp struct { + gmeta.Meta `orm:"table:parcels"` + Id int `json:"id"` + Items []*ParcelItem `json:"items" orm:"with:parcel_id=Id"` + } - parcelDetail := &ParcelRsp{} - err := db.Model(table1).With(parcelDetail.Items).Where("id", 3).Scan(&parcelDetail) - t.AssertNil(err) - t.Assert(parcelDetail.Id, 3) - t.Assert(len(parcelDetail.Items), 1) - t.Assert(parcelDetail.Items[0].Id, 2) - t.Assert(parcelDetail.Items[0].ParcelId, 3) - }) + parcelDetail := &ParcelRsp{} + err := db.Model(table1).With(parcelDetail.Items).Where("id", 3).Scan(&parcelDetail) + t.AssertNil(err) + t.Assert(parcelDetail.Id, 3) + t.Assert(len(parcelDetail.Items), 1) + t.Assert(parcelDetail.Items[0].Id, 2) + t.Assert(parcelDetail.Items[0].ParcelId, 3) + }) } // https://github.com/gogf/gf/issues/1412 func Test_Issue1412(t *testing.T) { - var ( - table1 = "parcels" - table2 = "items" - ) - array := gstr.SplitAndTrim(gtest.DataContent(`issue1412.sql`), ";") - for _, v := range array { - if _, err := db.Exec(ctx, v); err != nil { - gtest.Error(err) - } - } - defer dropTable(table1) - defer dropTable(table2) + var ( + table1 = "parcels" + table2 = "items" + ) + array := gstr.SplitAndTrim(gtest.DataContent(`issues`, `1412.sql`), ";") + for _, v := range array { + if _, err := db.Exec(ctx, v); err != nil { + gtest.Error(err) + } + } + defer dropTable(table1) + defer dropTable(table2) - gtest.C(t, func(t *gtest.T) { - type Items struct { - gmeta.Meta `orm:"table:items"` - Id int `json:"id"` - Name string `json:"name"` - } + gtest.C(t, func(t *gtest.T) { + type Items struct { + gmeta.Meta `orm:"table:items"` + Id int `json:"id"` + Name string `json:"name"` + } - type ParcelRsp struct { - gmeta.Meta `orm:"table:parcels"` - Id int `json:"id"` - ItemId int `json:"item_id"` - Items Items `json:"items" orm:"with:Id=ItemId"` - } + type ParcelRsp struct { + gmeta.Meta `orm:"table:parcels"` + Id int `json:"id"` + ItemId int `json:"item_id"` + Items Items `json:"items" orm:"with:Id=ItemId"` + } - entity := &ParcelRsp{} - err := db.Model("parcels").With(Items{}).Where("id=3").Scan(&entity) - t.AssertNil(err) - t.Assert(entity.Id, 3) - t.Assert(entity.ItemId, 0) - t.Assert(entity.Items.Id, 0) - t.Assert(entity.Items.Name, "") - }) + entity := &ParcelRsp{} + err := db.Model("parcels").With(Items{}).Where("id=3").Scan(&entity) + t.AssertNil(err) + t.Assert(entity.Id, 3) + t.Assert(entity.ItemId, 0) + t.Assert(entity.Items.Id, 0) + t.Assert(entity.Items.Name, "") + }) - gtest.C(t, func(t *gtest.T) { - type Items struct { - gmeta.Meta `orm:"table:items"` - Id int `json:"id"` - Name string `json:"name"` - } + gtest.C(t, func(t *gtest.T) { + type Items struct { + gmeta.Meta `orm:"table:items"` + Id int `json:"id"` + Name string `json:"name"` + } - type ParcelRsp struct { - gmeta.Meta `orm:"table:parcels"` - Id int `json:"id"` - ItemId int `json:"item_id"` - Items Items `json:"items" orm:"with:Id=ItemId"` - } + type ParcelRsp struct { + gmeta.Meta `orm:"table:parcels"` + Id int `json:"id"` + ItemId int `json:"item_id"` + Items Items `json:"items" orm:"with:Id=ItemId"` + } - entity := &ParcelRsp{} - err := db.Model("parcels").With(Items{}).Where("id=30000").Scan(&entity) - t.AssertNE(err, nil) - t.Assert(entity.Id, 0) - t.Assert(entity.ItemId, 0) - t.Assert(entity.Items.Id, 0) - t.Assert(entity.Items.Name, "") - }) + entity := &ParcelRsp{} + err := db.Model("parcels").With(Items{}).Where("id=30000").Scan(&entity) + t.AssertNE(err, nil) + t.Assert(entity.Id, 0) + t.Assert(entity.ItemId, 0) + t.Assert(entity.Items.Id, 0) + t.Assert(entity.Items.Name, "") + }) } // https://github.com/gogf/gf/issues/1002 func Test_Issue1002(t *testing.T) { - table := createTable() - defer dropTable(table) + table := createTable() + defer dropTable(table) - result, err := db.Model(table).Data(g.Map{ - "id": 1, - "passport": "port_1", - "password": "pass_1", - "nickname": "name_2", - "create_time": "2020-10-27 19:03:33", - }).Insert() - gtest.AssertNil(err) - n, _ := result.RowsAffected() - gtest.Assert(n, 1) + result, err := db.Model(table).Data(g.Map{ + "id": 1, + "passport": "port_1", + "password": "pass_1", + "nickname": "name_2", + "create_time": "2020-10-27 19:03:33", + }).Insert() + gtest.AssertNil(err) + n, _ := result.RowsAffected() + gtest.Assert(n, 1) - // where + string. - gtest.C(t, func(t *gtest.T) { - v, err := db.Model(table).Fields("id").Where("create_time>'2020-10-27 19:03:32' and create_time<'2020-10-27 19:03:34'").Value() - t.AssertNil(err) - t.Assert(v.Int(), 1) - }) - gtest.C(t, func(t *gtest.T) { - v, err := db.Model(table).Fields("id").Where("create_time>'2020-10-27 19:03:32' and create_time<'2020-10-27 19:03:34'").Value() - t.AssertNil(err) - t.Assert(v.Int(), 1) - }) - // where + string arguments. - gtest.C(t, func(t *gtest.T) { - v, err := db.Model(table).Fields("id").Where("create_time>? and create_time", "2020-10-27 19:03:32", "2020-10-27 19:03:34").Value() - t.AssertNil(err) - t.Assert(v.Int(), 1) - }) - // where + gtime.Time arguments. - gtest.C(t, func(t *gtest.T) { - v, err := db.Model(table).Fields("id").Where("create_time>? and create_time", gtime.New("2020-10-27 19:03:32"), gtime.New("2020-10-27 19:03:34")).Value() - t.AssertNil(err) - t.Assert(v.Int(), 1) - }) - // where + time.Time arguments, UTC. - gtest.C(t, func(t *gtest.T) { - t1, _ := time.Parse("2006-01-02 15:04:05", "2020-10-27 11:03:32") - t2, _ := time.Parse("2006-01-02 15:04:05", "2020-10-27 11:03:34") - { - v, err := db.Model(table).Fields("id").Where("create_time>? and create_time", t1, t2).Value() - t.AssertNil(err) - t.Assert(v.Int(), 1) - } - }) - // where + time.Time arguments, +8. - // gtest.C(t, func(t *gtest.T) { - // // Change current timezone to +8 zone. - // location, err := time.LoadLocation("Asia/Shanghai") - // t.AssertNil(err) - // t1, _ := time.ParseInLocation("2006-01-02 15:04:05", "2020-10-27 19:03:32", location) - // t2, _ := time.ParseInLocation("2006-01-02 15:04:05", "2020-10-27 19:03:34", location) - // { - // v, err := db.Model(table).Fields("id").Where("create_time>? and create_time", t1, t2).Value() - // t.AssertNil(err) - // t.Assert(v.Int(), 1) - // } - // { - // v, err := db.Model(table).Fields("id").Where("create_time>? and create_time", t1, t2).FindValue() - // t.AssertNil(err) - // t.Assert(v.Int(), 1) - // } - // { - // v, err := db.Model(table).Where("create_time>? and create_time", t1, t2).FindValue("id") - // t.AssertNil(err) - // t.Assert(v.Int(), 1) - // } - // }) + // where + string. + gtest.C(t, func(t *gtest.T) { + v, err := db.Model(table).Fields("id").Where("create_time>'2020-10-27 19:03:32' and create_time<'2020-10-27 19:03:34'").Value() + t.AssertNil(err) + t.Assert(v.Int(), 1) + }) + gtest.C(t, func(t *gtest.T) { + v, err := db.Model(table).Fields("id").Where("create_time>'2020-10-27 19:03:32' and create_time<'2020-10-27 19:03:34'").Value() + t.AssertNil(err) + t.Assert(v.Int(), 1) + }) + // where + string arguments. + gtest.C(t, func(t *gtest.T) { + v, err := db.Model(table).Fields("id").Where("create_time>? and create_time", "2020-10-27 19:03:32", "2020-10-27 19:03:34").Value() + t.AssertNil(err) + t.Assert(v.Int(), 1) + }) + // where + gtime.Time arguments. + gtest.C(t, func(t *gtest.T) { + v, err := db.Model(table).Fields("id").Where("create_time>? and create_time", gtime.New("2020-10-27 19:03:32"), gtime.New("2020-10-27 19:03:34")).Value() + t.AssertNil(err) + t.Assert(v.Int(), 1) + }) + // where + time.Time arguments, UTC. + gtest.C(t, func(t *gtest.T) { + t1, _ := time.Parse("2006-01-02 15:04:05", "2020-10-27 11:03:32") + t2, _ := time.Parse("2006-01-02 15:04:05", "2020-10-27 11:03:34") + { + v, err := db.Model(table).Fields("id").Where("create_time>? and create_time", t1, t2).Value() + t.AssertNil(err) + t.Assert(v.Int(), 1) + } + }) + // where + time.Time arguments, +8. + // gtest.C(t, func(t *gtest.T) { + // // Change current timezone to +8 zone. + // location, err := time.LoadLocation("Asia/Shanghai") + // t.AssertNil(err) + // t1, _ := time.ParseInLocation("2006-01-02 15:04:05", "2020-10-27 19:03:32", location) + // t2, _ := time.ParseInLocation("2006-01-02 15:04:05", "2020-10-27 19:03:34", location) + // { + // v, err := db.Model(table).Fields("id").Where("create_time>? and create_time", t1, t2).Value() + // t.AssertNil(err) + // t.Assert(v.Int(), 1) + // } + // { + // v, err := db.Model(table).Fields("id").Where("create_time>? and create_time", t1, t2).FindValue() + // t.AssertNil(err) + // t.Assert(v.Int(), 1) + // } + // { + // v, err := db.Model(table).Where("create_time>? and create_time", t1, t2).FindValue("id") + // t.AssertNil(err) + // t.Assert(v.Int(), 1) + // } + // }) } // https://github.com/gogf/gf/issues/1700 func Test_Issue1700(t *testing.T) { - table := "user_" + gtime.Now().TimestampNanoStr() - if _, err := db.Exec(ctx, fmt.Sprintf(` + table := "user_" + gtime.Now().TimestampNanoStr() + if _, err := db.Exec(ctx, fmt.Sprintf(` CREATE TABLE %s ( id int(10) unsigned NOT NULL AUTO_INCREMENT, user_id int(10) unsigned NOT NULL, @@ -353,224 +468,224 @@ func Test_Issue1700(t *testing.T) { PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; `, table, - )); err != nil { - gtest.AssertNil(err) - } - defer dropTable(table) + )); err != nil { + gtest.AssertNil(err) + } + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - type User struct { - Id int `orm:"id"` - Userid int `orm:"user_id"` - UserId int `orm:"UserId"` - } - _, err := db.Model(table).Data(User{ - Id: 1, - Userid: 2, - UserId: 3, - }).Insert() - t.AssertNil(err) + gtest.C(t, func(t *gtest.T) { + type User struct { + Id int `orm:"id"` + Userid int `orm:"user_id"` + UserId int `orm:"UserId"` + } + _, err := db.Model(table).Data(User{ + Id: 1, + Userid: 2, + UserId: 3, + }).Insert() + t.AssertNil(err) - one, err := db.Model(table).One() - t.AssertNil(err) - t.Assert(one, g.Map{ - "id": 1, - "user_id": 2, - "UserId": 3, - }) + one, err := db.Model(table).One() + t.AssertNil(err) + t.Assert(one, g.Map{ + "id": 1, + "user_id": 2, + "UserId": 3, + }) - for i := 0; i < 1000; i++ { - var user *User - err = db.Model(table).Scan(&user) - t.AssertNil(err) - t.Assert(user.Id, 1) - t.Assert(user.Userid, 2) - t.Assert(user.UserId, 3) - } - }) + for i := 0; i < 1000; i++ { + var user *User + err = db.Model(table).Scan(&user) + t.AssertNil(err) + t.Assert(user.Id, 1) + t.Assert(user.Userid, 2) + t.Assert(user.UserId, 3) + } + }) } // https://github.com/gogf/gf/issues/1701 func Test_Issue1701(t *testing.T) { - table := createInitTable() - defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - value, err := db.Model(table).Fields(gdb.Raw("if(id=1,100,null)")).WherePri(1).Value() - t.AssertNil(err) - t.Assert(value.String(), 100) - }) + table := createInitTable() + defer dropTable(table) + gtest.C(t, func(t *gtest.T) { + value, err := db.Model(table).Fields(gdb.Raw("if(id=1,100,null)")).WherePri(1).Value() + t.AssertNil(err) + t.Assert(value.String(), 100) + }) } // https://github.com/gogf/gf/issues/1733 func Test_Issue1733(t *testing.T) { - table := "user_" + guid.S() - if _, err := db.Exec(ctx, fmt.Sprintf(` + table := "user_" + guid.S() + if _, err := db.Exec(ctx, fmt.Sprintf(` CREATE TABLE %s ( id int(8) unsigned zerofill NOT NULL AUTO_INCREMENT, PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; `, table, - )); err != nil { - gtest.AssertNil(err) - } - defer dropTable(table) + )); err != nil { + gtest.AssertNil(err) + } + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - for i := 1; i <= 10; i++ { - _, err := db.Model(table).Data(g.Map{ - "id": i, - }).Insert() - t.AssertNil(err) - } + gtest.C(t, func(t *gtest.T) { + for i := 1; i <= 10; i++ { + _, err := db.Model(table).Data(g.Map{ + "id": i, + }).Insert() + t.AssertNil(err) + } - all, err := db.Model(table).OrderAsc("id").All() - t.AssertNil(err) - t.Assert(len(all), 10) - for i := 0; i < 10; i++ { - t.Assert(all[i]["id"].Int(), i+1) - } - }) + all, err := db.Model(table).OrderAsc("id").All() + t.AssertNil(err) + t.Assert(len(all), 10) + for i := 0; i < 10; i++ { + t.Assert(all[i]["id"].Int(), i+1) + } + }) } // https://github.com/gogf/gf/issues/2012 func Test_Issue2012(t *testing.T) { - table := "time_only_" + guid.S() - if _, err := db.Exec(ctx, fmt.Sprintf(` + table := "time_only_" + guid.S() + if _, err := db.Exec(ctx, fmt.Sprintf(` CREATE TABLE %s( id int(8) unsigned zerofill NOT NULL AUTO_INCREMENT, time_only time, PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; `, table, - )); err != nil { - gtest.AssertNil(err) - } - defer dropTable(table) + )); err != nil { + gtest.AssertNil(err) + } + defer dropTable(table) - type TimeOnly struct { - Id int `json:"id"` - TimeOnly *gtime.Time `json:"timeOnly"` - } + type TimeOnly struct { + Id int `json:"id"` + TimeOnly *gtime.Time `json:"timeOnly"` + } - gtest.C(t, func(t *gtest.T) { - timeOnly := gtime.New("15:04:05") - m := db.Model(table) + gtest.C(t, func(t *gtest.T) { + timeOnly := gtime.New("15:04:05") + m := db.Model(table) - _, err := m.Insert(TimeOnly{ - TimeOnly: gtime.New(timeOnly), - }) - t.AssertNil(err) + _, err := m.Insert(TimeOnly{ + TimeOnly: gtime.New(timeOnly), + }) + t.AssertNil(err) - _, err = m.Insert(g.Map{ - "time_only": timeOnly, - }) - t.AssertNil(err) + _, err = m.Insert(g.Map{ + "time_only": timeOnly, + }) + t.AssertNil(err) - _, err = m.Insert("time_only", timeOnly) - t.AssertNil(err) - }) + _, err = m.Insert("time_only", timeOnly) + t.AssertNil(err) + }) } // https://github.com/gogf/gf/issues/2105 func Test_Issue2105(t *testing.T) { - table := "issue2105" - array := gstr.SplitAndTrim(gtest.DataContent(`issue2105.sql`), ";") - for _, v := range array { - if _, err := db.Exec(ctx, v); err != nil { - gtest.Error(err) - } - } - defer dropTable(table) + table := "issue2105" + array := gstr.SplitAndTrim(gtest.DataContent(`issues`, `2105.sql`), ";") + for _, v := range array { + if _, err := db.Exec(ctx, v); err != nil { + gtest.Error(err) + } + } + defer dropTable(table) - type JsonItem struct { - Name string `json:"name,omitempty"` - Value string `json:"value,omitempty"` - } - type Test struct { - Id string `json:"id,omitempty"` - Json []*JsonItem `json:"json,omitempty"` - } + type JsonItem struct { + Name string `json:"name,omitempty"` + Value string `json:"value,omitempty"` + } + type Test struct { + Id string `json:"id,omitempty"` + Json []*JsonItem `json:"json,omitempty"` + } - gtest.C(t, func(t *gtest.T) { - var list []*Test - err := db.Model(table).Scan(&list) - t.AssertNil(err) - t.Assert(len(list), 2) - t.Assert(len(list[0].Json), 0) - t.Assert(len(list[1].Json), 3) - }) + gtest.C(t, func(t *gtest.T) { + var list []*Test + err := db.Model(table).Scan(&list) + t.AssertNil(err) + t.Assert(len(list), 2) + t.Assert(len(list[0].Json), 0) + t.Assert(len(list[1].Json), 3) + }) } // https://github.com/gogf/gf/issues/2231 func Test_Issue2231(t *testing.T) { - var ( - pattern = `(\w+):([\w\-]*):(.*?)@(\w+?)\((.+?)\)/{0,1}([^\?]*)\?{0,1}(.*)` - link = `mysql:root:12345678@tcp(127.0.0.1:3306)/a正bc式?loc=Local&parseTime=true` - ) - gtest.C(t, func(t *gtest.T) { - match, err := gregex.MatchString(pattern, link) - t.AssertNil(err) - t.Assert(match[1], "mysql") - t.Assert(match[2], "root") - t.Assert(match[3], "12345678") - t.Assert(match[4], "tcp") - t.Assert(match[5], "127.0.0.1:3306") - t.Assert(match[6], "a正bc式") - t.Assert(match[7], "loc=Local&parseTime=true") - }) + var ( + pattern = `(\w+):([\w\-]*):(.*?)@(\w+?)\((.+?)\)/{0,1}([^\?]*)\?{0,1}(.*)` + link = `mysql:root:12345678@tcp(127.0.0.1:3306)/a正bc式?loc=Local&parseTime=true` + ) + gtest.C(t, func(t *gtest.T) { + match, err := gregex.MatchString(pattern, link) + t.AssertNil(err) + t.Assert(match[1], "mysql") + t.Assert(match[2], "root") + t.Assert(match[3], "12345678") + t.Assert(match[4], "tcp") + t.Assert(match[5], "127.0.0.1:3306") + t.Assert(match[6], "a正bc式") + t.Assert(match[7], "loc=Local&parseTime=true") + }) } // https://github.com/gogf/gf/issues/2339 func Test_Issue2339(t *testing.T) { - table := createInitTable() - defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - model1 := db.Model(table, "u1").Where("id between ? and ?", 1, 9) - model2 := db.Model("? as u2", model1) - model3 := db.Model("? as u3", model2) - all2, err := model2.WhereGT("id", 6).OrderAsc("id").All() - t.AssertNil(err) - t.Assert(len(all2), 3) - t.Assert(all2[0]["id"], 7) + table := createInitTable() + defer dropTable(table) + gtest.C(t, func(t *gtest.T) { + model1 := db.Model(table, "u1").Where("id between ? and ?", 1, 9) + model2 := db.Model("? as u2", model1) + model3 := db.Model("? as u3", model2) + all2, err := model2.WhereGT("id", 6).OrderAsc("id").All() + t.AssertNil(err) + t.Assert(len(all2), 3) + t.Assert(all2[0]["id"], 7) - all3, err := model3.WhereGT("id", 7).OrderAsc("id").All() - t.AssertNil(err) - t.Assert(len(all3), 2) - t.Assert(all3[0]["id"], 8) - }) + all3, err := model3.WhereGT("id", 7).OrderAsc("id").All() + t.AssertNil(err) + t.Assert(len(all3), 2) + t.Assert(all3[0]["id"], 8) + }) } // https://github.com/gogf/gf/issues/2356 func Test_Issue2356(t *testing.T) { - gtest.C(t, func(t *gtest.T) { - table := "demo_" + guid.S() - if _, err := db.Exec(ctx, fmt.Sprintf(` + gtest.C(t, func(t *gtest.T) { + table := "demo_" + guid.S() + if _, err := db.Exec(ctx, fmt.Sprintf(` CREATE TABLE %s ( id BIGINT(20) UNSIGNED NOT NULL DEFAULT '0', PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; `, table, - )); err != nil { - t.AssertNil(err) - } - defer dropTable(table) + )); err != nil { + t.AssertNil(err) + } + defer dropTable(table) - if _, err := db.Exec(ctx, fmt.Sprintf(`INSERT INTO %s (id) VALUES (18446744073709551615);`, table)); err != nil { - t.AssertNil(err) - } + if _, err := db.Exec(ctx, fmt.Sprintf(`INSERT INTO %s (id) VALUES (18446744073709551615);`, table)); err != nil { + t.AssertNil(err) + } - one, err := db.Model(table).One() - t.AssertNil(err) - t.AssertEQ(one["id"].Val(), uint64(18446744073709551615)) - }) + one, err := db.Model(table).One() + t.AssertNil(err) + t.AssertEQ(one["id"].Val(), uint64(18446744073709551615)) + }) } // https://github.com/gogf/gf/issues/2338 func Test_Issue2338(t *testing.T) { - gtest.C(t, func(t *gtest.T) { - table1 := "demo_" + guid.S() - table2 := "demo_" + guid.S() - if _, err := db.Schema(TestSchema1).Exec(ctx, fmt.Sprintf(` + gtest.C(t, func(t *gtest.T) { + table1 := "demo_" + guid.S() + table2 := "demo_" + guid.S() + if _, err := db.Schema(TestSchema1).Exec(ctx, fmt.Sprintf(` CREATE TABLE %s ( id int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'User ID', nickname varchar(45) DEFAULT NULL COMMENT 'User Nickname', @@ -579,10 +694,10 @@ CREATE TABLE %s ( PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; `, table1, - )); err != nil { - t.AssertNil(err) - } - if _, err := db.Schema(TestSchema2).Exec(ctx, fmt.Sprintf(` + )); err != nil { + t.AssertNil(err) + } + if _, err := db.Schema(TestSchema2).Exec(ctx, fmt.Sprintf(` CREATE TABLE %s ( id int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'User ID', nickname varchar(45) DEFAULT NULL COMMENT 'User Nickname', @@ -591,39 +706,39 @@ CREATE TABLE %s ( PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; `, table2, - )); err != nil { - t.AssertNil(err) - } - defer dropTableWithDb(db.Schema(TestSchema1), table1) - defer dropTableWithDb(db.Schema(TestSchema2), table2) + )); err != nil { + t.AssertNil(err) + } + defer dropTableWithDb(db.Schema(TestSchema1), table1) + defer dropTableWithDb(db.Schema(TestSchema2), table2) - var err error - _, err = db.Schema(TestSchema1).Model(table1).Insert(g.Map{ - "id": 1, - "nickname": "name_1", - }) - t.AssertNil(err) + var err error + _, err = db.Schema(TestSchema1).Model(table1).Insert(g.Map{ + "id": 1, + "nickname": "name_1", + }) + t.AssertNil(err) - _, err = db.Schema(TestSchema2).Model(table2).Insert(g.Map{ - "id": 1, - "nickname": "name_2", - }) - t.AssertNil(err) + _, err = db.Schema(TestSchema2).Model(table2).Insert(g.Map{ + "id": 1, + "nickname": "name_2", + }) + t.AssertNil(err) - tableName1 := fmt.Sprintf(`%s.%s`, TestSchema1, table1) - tableName2 := fmt.Sprintf(`%s.%s`, TestSchema2, table2) - all, err := db.Model(tableName1).As(`a`). - LeftJoin(tableName2+" b", `a.id=b.id`). - Fields(`a.id`, `b.nickname`).All() - t.AssertNil(err) - t.Assert(len(all), 1) - t.Assert(all[0]["nickname"], "name_2") - }) + tableName1 := fmt.Sprintf(`%s.%s`, TestSchema1, table1) + tableName2 := fmt.Sprintf(`%s.%s`, TestSchema2, table2) + all, err := db.Model(tableName1).As(`a`). + LeftJoin(tableName2+" b", `a.id=b.id`). + Fields(`a.id`, `b.nickname`).All() + t.AssertNil(err) + t.Assert(len(all), 1) + t.Assert(all[0]["nickname"], "name_2") + }) - gtest.C(t, func(t *gtest.T) { - table1 := "demo_" + guid.S() - table2 := "demo_" + guid.S() - if _, err := db.Schema(TestSchema1).Exec(ctx, fmt.Sprintf(` + gtest.C(t, func(t *gtest.T) { + table1 := "demo_" + guid.S() + table2 := "demo_" + guid.S() + if _, err := db.Schema(TestSchema1).Exec(ctx, fmt.Sprintf(` CREATE TABLE %s ( id int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'User ID', nickname varchar(45) DEFAULT NULL COMMENT 'User Nickname', @@ -633,10 +748,10 @@ CREATE TABLE %s ( PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; `, table1, - )); err != nil { - t.AssertNil(err) - } - if _, err := db.Schema(TestSchema2).Exec(ctx, fmt.Sprintf(` + )); err != nil { + t.AssertNil(err) + } + if _, err := db.Schema(TestSchema2).Exec(ctx, fmt.Sprintf(` CREATE TABLE %s ( id int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'User ID', nickname varchar(45) DEFAULT NULL COMMENT 'User Nickname', @@ -646,41 +761,41 @@ CREATE TABLE %s ( PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; `, table2, - )); err != nil { - t.AssertNil(err) - } - defer dropTableWithDb(db.Schema(TestSchema1), table1) - defer dropTableWithDb(db.Schema(TestSchema2), table2) + )); err != nil { + t.AssertNil(err) + } + defer dropTableWithDb(db.Schema(TestSchema1), table1) + defer dropTableWithDb(db.Schema(TestSchema2), table2) - var err error - _, err = db.Schema(TestSchema1).Model(table1).Insert(g.Map{ - "id": 1, - "nickname": "name_1", - }) - t.AssertNil(err) + var err error + _, err = db.Schema(TestSchema1).Model(table1).Insert(g.Map{ + "id": 1, + "nickname": "name_1", + }) + t.AssertNil(err) - _, err = db.Schema(TestSchema2).Model(table2).Insert(g.Map{ - "id": 1, - "nickname": "name_2", - }) - t.AssertNil(err) + _, err = db.Schema(TestSchema2).Model(table2).Insert(g.Map{ + "id": 1, + "nickname": "name_2", + }) + t.AssertNil(err) - tableName1 := fmt.Sprintf(`%s.%s`, TestSchema1, table1) - tableName2 := fmt.Sprintf(`%s.%s`, TestSchema2, table2) - all, err := db.Model(tableName1).As(`a`). - LeftJoin(tableName2+" b", `a.id=b.id`). - Fields(`a.id`, `b.nickname`).All() - t.AssertNil(err) - t.Assert(len(all), 1) - t.Assert(all[0]["nickname"], "name_2") - }) + tableName1 := fmt.Sprintf(`%s.%s`, TestSchema1, table1) + tableName2 := fmt.Sprintf(`%s.%s`, TestSchema2, table2) + all, err := db.Model(tableName1).As(`a`). + LeftJoin(tableName2+" b", `a.id=b.id`). + Fields(`a.id`, `b.nickname`).All() + t.AssertNil(err) + t.Assert(len(all), 1) + t.Assert(all[0]["nickname"], "name_2") + }) } // https://github.com/gogf/gf/issues/2427 func Test_Issue2427(t *testing.T) { - gtest.C(t, func(t *gtest.T) { - table := "demo_" + guid.S() - if _, err := db.Exec(ctx, fmt.Sprintf(` + gtest.C(t, func(t *gtest.T) { + table := "demo_" + guid.S() + if _, err := db.Exec(ctx, fmt.Sprintf(` CREATE TABLE %s ( id int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'User ID', passport varchar(45) NOT NULL COMMENT 'User Passport', @@ -691,902 +806,1010 @@ CREATE TABLE %s ( PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; `, table, - )); err != nil { - t.AssertNil(err) - } - defer dropTable(table) + )); err != nil { + t.AssertNil(err) + } + defer dropTable(table) - _, err1 := db.Model(table).Delete() - t.Assert(err1, `there should be WHERE condition statement for DELETE operation`) + _, err1 := db.Model(table).Delete() + t.Assert(err1, `there should be WHERE condition statement for DELETE operation`) - _, err2 := db.Model(table).Where(g.Map{}).Delete() - t.Assert(err2, `there should be WHERE condition statement for DELETE operation`) + _, err2 := db.Model(table).Where(g.Map{}).Delete() + t.Assert(err2, `there should be WHERE condition statement for DELETE operation`) - _, err3 := db.Model(table).Where(1).Delete() - t.AssertNil(err3) - }) + _, err3 := db.Model(table).Where(1).Delete() + t.AssertNil(err3) + }) } // https://github.com/gogf/gf/issues/2561 func Test_Issue2561(t *testing.T) { - table := createTable() - defer dropTable(table) + table := createTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - type User struct { - g.Meta `orm:"do:true"` - Id interface{} - Passport interface{} - Password interface{} - Nickname interface{} - CreateTime interface{} - } - data := g.Slice{ - User{ - Id: 1, - Passport: "user_1", - }, - User{ - Id: 2, - Password: "pass_2", - }, - User{ - Id: 3, - Password: "pass_3", - }, - } - result, err := db.Model(table).Data(data).Insert() - t.AssertNil(err) - m, _ := result.LastInsertId() - t.Assert(m, 3) + gtest.C(t, func(t *gtest.T) { + type User struct { + g.Meta `orm:"do:true"` + Id interface{} + Passport interface{} + Password interface{} + Nickname interface{} + CreateTime interface{} + } + data := g.Slice{ + User{ + Id: 1, + Passport: "user_1", + }, + User{ + Id: 2, + Password: "pass_2", + }, + User{ + Id: 3, + Password: "pass_3", + }, + } + result, err := db.Model(table).Data(data).Insert() + t.AssertNil(err) + m, _ := result.LastInsertId() + t.Assert(m, 3) - n, _ := result.RowsAffected() - t.Assert(n, 3) + n, _ := result.RowsAffected() + t.Assert(n, 3) - one, err := db.Model(table).WherePri(1).One() - t.AssertNil(err) - t.Assert(one[`id`], `1`) - t.Assert(one[`passport`], `user_1`) - t.Assert(one[`password`], ``) - t.Assert(one[`nickname`], ``) - t.Assert(one[`create_time`], ``) + one, err := db.Model(table).WherePri(1).One() + t.AssertNil(err) + t.Assert(one[`id`], `1`) + t.Assert(one[`passport`], `user_1`) + t.Assert(one[`password`], ``) + t.Assert(one[`nickname`], ``) + t.Assert(one[`create_time`], ``) - one, err = db.Model(table).WherePri(2).One() - t.AssertNil(err) - t.Assert(one[`id`], `2`) - t.Assert(one[`passport`], ``) - t.Assert(one[`password`], `pass_2`) - t.Assert(one[`nickname`], ``) - t.Assert(one[`create_time`], ``) + one, err = db.Model(table).WherePri(2).One() + t.AssertNil(err) + t.Assert(one[`id`], `2`) + t.Assert(one[`passport`], ``) + t.Assert(one[`password`], `pass_2`) + t.Assert(one[`nickname`], ``) + t.Assert(one[`create_time`], ``) - one, err = db.Model(table).WherePri(3).One() - t.AssertNil(err) - t.Assert(one[`id`], `3`) - t.Assert(one[`passport`], ``) - t.Assert(one[`password`], `pass_3`) - t.Assert(one[`nickname`], ``) - t.Assert(one[`create_time`], ``) - }) + one, err = db.Model(table).WherePri(3).One() + t.AssertNil(err) + t.Assert(one[`id`], `3`) + t.Assert(one[`passport`], ``) + t.Assert(one[`password`], `pass_3`) + t.Assert(one[`nickname`], ``) + t.Assert(one[`create_time`], ``) + }) } // https://github.com/gogf/gf/issues/2439 func Test_Issue2439(t *testing.T) { - gtest.C(t, func(t *gtest.T) { - array := gstr.SplitAndTrim(gtest.DataContent(`issue2439.sql`), ";") - for _, v := range array { - if _, err := db.Exec(ctx, v); err != nil { - gtest.Error(err) - } - } - defer dropTable("a") - defer dropTable("b") - defer dropTable("c") + gtest.C(t, func(t *gtest.T) { + array := gstr.SplitAndTrim(gtest.DataContent(`issues`, `2439.sql`), ";") + for _, v := range array { + if _, err := db.Exec(ctx, v); err != nil { + gtest.Error(err) + } + } + defer dropTable("a") + defer dropTable("b") + defer dropTable("c") - orm := db.Model("a") - orm = orm.InnerJoin( - "c", "a.id=c.id", - ) - orm = orm.InnerJoinOnField("b", "id") - whereFormat := fmt.Sprintf( - "(`%s`.`%s` LIKE ?) ", - "b", "name", - ) - orm = orm.WhereOrf( - whereFormat, - "%a%", - ) - r, err := orm.All() - t.AssertNil(err) - t.Assert(len(r), 1) - t.Assert(r[0]["id"], 2) - t.Assert(r[0]["name"], "a") - }) + orm := db.Model("a") + orm = orm.InnerJoin( + "c", "a.id=c.id", + ) + orm = orm.InnerJoinOnField("b", "id") + whereFormat := fmt.Sprintf( + "(`%s`.`%s` LIKE ?) ", + "b", "name", + ) + orm = orm.WhereOrf( + whereFormat, + "%a%", + ) + r, err := orm.All() + t.AssertNil(err) + t.Assert(len(r), 1) + t.Assert(r[0]["id"], 2) + t.Assert(r[0]["name"], "a") + }) } // https://github.com/gogf/gf/issues/2782 func Test_Issue2787(t *testing.T) { - table := createTable() - defer dropTable(table) + table := createTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - m := db.Model("user") + gtest.C(t, func(t *gtest.T) { + m := db.Model("user") - condWhere, _ := m.Builder(). - Where("id", ""). - Where(m.Builder(). - Where("nickname", "foo"). - WhereOr("password", "abc123")). - Where("passport", "pp"). - Build() - t.Assert(condWhere, "(`id`=?) AND (((`nickname`=?) OR (`password`=?))) AND (`passport`=?)") + condWhere, _ := m.Builder(). + Where("id", ""). + Where(m.Builder(). + Where("nickname", "foo"). + WhereOr("password", "abc123")). + Where("passport", "pp"). + Build() + t.Assert(condWhere, "(`id`=?) AND (((`nickname`=?) OR (`password`=?))) AND (`passport`=?)") - condWhere, _ = m.OmitEmpty().Builder(). - Where("id", ""). - Where(m.Builder(). - Where("nickname", "foo"). - WhereOr("password", "abc123")). - Where("passport", "pp"). - Build() - t.Assert(condWhere, "((`nickname`=?) OR (`password`=?)) AND (`passport`=?)") + condWhere, _ = m.OmitEmpty().Builder(). + Where("id", ""). + Where(m.Builder(). + Where("nickname", "foo"). + WhereOr("password", "abc123")). + Where("passport", "pp"). + Build() + t.Assert(condWhere, "((`nickname`=?) OR (`password`=?)) AND (`passport`=?)") - condWhere, _ = m.OmitEmpty().Builder(). - Where(m.Builder(). - Where("nickname", "foo"). - WhereOr("password", "abc123")). - Where("id", ""). - Where("passport", "pp"). - Build() - t.Assert(condWhere, "((`nickname`=?) OR (`password`=?)) AND (`passport`=?)") - }) + condWhere, _ = m.OmitEmpty().Builder(). + Where(m.Builder(). + Where("nickname", "foo"). + WhereOr("password", "abc123")). + Where("id", ""). + Where("passport", "pp"). + Build() + t.Assert(condWhere, "((`nickname`=?) OR (`password`=?)) AND (`passport`=?)") + }) } // https://github.com/gogf/gf/issues/2907 func Test_Issue2907(t *testing.T) { - table := createInitTable() - defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - var ( - orm = db.Model(table) - err error - ) + table := createInitTable() + defer dropTable(table) + gtest.C(t, func(t *gtest.T) { + var ( + orm = db.Model(table) + err error + ) - orm = orm.WherePrefixNotIn( - table, - "id", - []int{ - 1, - 2, - }, - ) - all, err := orm.OrderAsc("id").All() - t.AssertNil(err) - t.Assert(len(all), TableSize-2) - t.Assert(all[0]["id"], 3) - }) + orm = orm.WherePrefixNotIn( + table, + "id", + []int{ + 1, + 2, + }, + ) + all, err := orm.OrderAsc("id").All() + t.AssertNil(err) + t.Assert(len(all), TableSize-2) + t.Assert(all[0]["id"], 3) + }) } // https://github.com/gogf/gf/issues/3086 func Test_Issue3086(t *testing.T) { - table := "issue3086_user" - array := gstr.SplitAndTrim(gtest.DataContent(`issue3086.sql`), ";") - for _, v := range array { - if _, err := db.Exec(ctx, v); err != nil { - gtest.Error(err) - } - } - defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - type User struct { - g.Meta `orm:"do:true"` - Id interface{} - Passport interface{} - Password interface{} - Nickname interface{} - CreateTime interface{} - } - data := g.Slice{ - User{ - Id: nil, - Passport: "user_1", - }, - User{ - Id: 2, - Passport: "user_2", - }, - } - _, err := db.Model(table).Data(data).Batch(10).Insert() - t.AssertNE(err, nil) - }) - gtest.C(t, func(t *gtest.T) { - type User struct { - g.Meta `orm:"do:true"` - Id interface{} - Passport interface{} - Password interface{} - Nickname interface{} - CreateTime interface{} - } - data := g.Slice{ - User{ - Id: 1, - Passport: "user_1", - }, - User{ - Id: 2, - Passport: "user_2", - }, - } - result, err := db.Model(table).Data(data).Batch(10).Insert() - t.AssertNil(err) - n, err := result.RowsAffected() - t.AssertNil(err) - t.Assert(n, 2) - }) + table := "issue3086_user" + array := gstr.SplitAndTrim(gtest.DataContent(`issues`, `3086.sql`), ";") + for _, v := range array { + if _, err := db.Exec(ctx, v); err != nil { + gtest.Error(err) + } + } + defer dropTable(table) + gtest.C(t, func(t *gtest.T) { + type User struct { + g.Meta `orm:"do:true"` + Id interface{} + Passport interface{} + Password interface{} + Nickname interface{} + CreateTime interface{} + } + data := g.Slice{ + User{ + Id: nil, + Passport: "user_1", + }, + User{ + Id: 2, + Passport: "user_2", + }, + } + _, err := db.Model(table).Data(data).Batch(10).Insert() + t.AssertNE(err, nil) + }) + gtest.C(t, func(t *gtest.T) { + type User struct { + g.Meta `orm:"do:true"` + Id interface{} + Passport interface{} + Password interface{} + Nickname interface{} + CreateTime interface{} + } + data := g.Slice{ + User{ + Id: 1, + Passport: "user_1", + }, + User{ + Id: 2, + Passport: "user_2", + }, + } + result, err := db.Model(table).Data(data).Batch(10).Insert() + t.AssertNil(err) + n, err := result.RowsAffected() + t.AssertNil(err) + t.Assert(n, 2) + }) } // https://github.com/gogf/gf/issues/3204 func Test_Issue3204(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - // where - gtest.C(t, func(t *gtest.T) { - type User struct { - g.Meta `orm:"do:true"` - Id interface{} `orm:"id,omitempty"` - Passport interface{} `orm:"passport,omitempty"` - Password interface{} `orm:"password,omitempty"` - Nickname interface{} `orm:"nickname,omitempty"` - CreateTime interface{} `orm:"create_time,omitempty"` - } - where := User{ - Id: 2, - Passport: "", - } - all, err := db.Model(table).Where(where).All() - t.AssertNil(err) - t.Assert(len(all), 1) - t.Assert(all[0]["id"], 2) - }) - // data - gtest.C(t, func(t *gtest.T) { - type User struct { - g.Meta `orm:"do:true"` - Id interface{} `orm:"id,omitempty"` - Passport interface{} `orm:"passport,omitempty"` - Password interface{} `orm:"password,omitempty"` - Nickname interface{} `orm:"nickname,omitempty"` - CreateTime interface{} `orm:"create_time,omitempty"` - } - var ( - err error - sqlArray []string - insertId int64 - data = User{ - Id: 20, - Passport: "passport_20", - Password: "", - } - ) - sqlArray, err = gdb.CatchSQL(ctx, func(ctx context.Context) error { - insertId, err = db.Ctx(ctx).Model(table).Data(data).InsertAndGetId() - return err - }) - t.AssertNil(err) - t.Assert(insertId, 20) - t.Assert( - gstr.Contains(sqlArray[len(sqlArray)-1], "(`id`,`passport`) VALUES(20,'passport_20')"), - true, - ) - }) - // update data - gtest.C(t, func(t *gtest.T) { - type User struct { - g.Meta `orm:"do:true"` - Id interface{} `orm:"id,omitempty"` - Passport interface{} `orm:"passport,omitempty"` - Password interface{} `orm:"password,omitempty"` - Nickname interface{} `orm:"nickname,omitempty"` - CreateTime interface{} `orm:"create_time,omitempty"` - } - var ( - err error - sqlArray []string - data = User{ - Passport: "passport_1", - Password: "", - Nickname: "", - } - ) - sqlArray, err = gdb.CatchSQL(ctx, func(ctx context.Context) error { - _, err = db.Ctx(ctx).Model(table).Data(data).WherePri(1).Update() - return err - }) - t.AssertNil(err) - t.Assert( - gstr.Contains(sqlArray[len(sqlArray)-1], "SET `passport`='passport_1' WHERE `id`=1"), - true, - ) - }) + // where + gtest.C(t, func(t *gtest.T) { + type User struct { + g.Meta `orm:"do:true"` + Id interface{} `orm:"id,omitempty"` + Passport interface{} `orm:"passport,omitempty"` + Password interface{} `orm:"password,omitempty"` + Nickname interface{} `orm:"nickname,omitempty"` + CreateTime interface{} `orm:"create_time,omitempty"` + } + where := User{ + Id: 2, + Passport: "", + } + all, err := db.Model(table).Where(where).All() + t.AssertNil(err) + t.Assert(len(all), 1) + t.Assert(all[0]["id"], 2) + }) + // data + gtest.C(t, func(t *gtest.T) { + type User struct { + g.Meta `orm:"do:true"` + Id interface{} `orm:"id,omitempty"` + Passport interface{} `orm:"passport,omitempty"` + Password interface{} `orm:"password,omitempty"` + Nickname interface{} `orm:"nickname,omitempty"` + CreateTime interface{} `orm:"create_time,omitempty"` + } + var ( + err error + sqlArray []string + insertId int64 + data = User{ + Id: 20, + Passport: "passport_20", + Password: "", + } + ) + sqlArray, err = gdb.CatchSQL(ctx, func(ctx context.Context) error { + insertId, err = db.Ctx(ctx).Model(table).Data(data).InsertAndGetId() + return err + }) + t.AssertNil(err) + t.Assert(insertId, 20) + t.Assert( + gstr.Contains(sqlArray[len(sqlArray)-1], "(`id`,`passport`) VALUES(20,'passport_20')"), + true, + ) + }) + // update data + gtest.C(t, func(t *gtest.T) { + type User struct { + g.Meta `orm:"do:true"` + Id interface{} `orm:"id,omitempty"` + Passport interface{} `orm:"passport,omitempty"` + Password interface{} `orm:"password,omitempty"` + Nickname interface{} `orm:"nickname,omitempty"` + CreateTime interface{} `orm:"create_time,omitempty"` + } + var ( + err error + sqlArray []string + data = User{ + Passport: "passport_1", + Password: "", + Nickname: "", + } + ) + sqlArray, err = gdb.CatchSQL(ctx, func(ctx context.Context) error { + _, err = db.Ctx(ctx).Model(table).Data(data).WherePri(1).Update() + return err + }) + t.AssertNil(err) + t.Assert( + gstr.Contains(sqlArray[len(sqlArray)-1], "SET `passport`='passport_1' WHERE `id`=1"), + true, + ) + }) } // https://github.com/gogf/gf/issues/3218 func Test_Issue3218(t *testing.T) { - table := "issue3218_sys_config" - array := gstr.SplitAndTrim(gtest.DataContent(`issue3218.sql`), ";") - for _, v := range array { - if _, err := db.Exec(ctx, v); err != nil { - gtest.Error(err) - } - } - defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - type SysConfigInfo struct { - Name string `json:"name"` - Value map[string]string `json:"value"` - } - var configData *SysConfigInfo - err := db.Model(table).Scan(&configData) - t.AssertNil(err) - t.Assert(configData, &SysConfigInfo{ - Name: "site", - Value: map[string]string{ - "fixed_page": "", - "site_name": "22", - "version": "22", - "banned_ip": "22", - "filings": "2222", - }, - }) - }) + table := "issue3218_sys_config" + array := gstr.SplitAndTrim(gtest.DataContent(`issues`, `3218.sql`), ";") + for _, v := range array { + if _, err := db.Exec(ctx, v); err != nil { + gtest.Error(err) + } + } + defer dropTable(table) + gtest.C(t, func(t *gtest.T) { + type SysConfigInfo struct { + Name string `json:"name"` + Value map[string]string `json:"value"` + } + var configData *SysConfigInfo + err := db.Model(table).Scan(&configData) + t.AssertNil(err) + t.Assert(configData, &SysConfigInfo{ + Name: "site", + Value: map[string]string{ + "fixed_page": "", + "site_name": "22", + "version": "22", + "banned_ip": "22", + "filings": "2222", + }, + }) + }) } // https://github.com/gogf/gf/issues/2552 func Test_Issue2552_ClearTableFieldsAll(t *testing.T) { - table := createTable() - defer dropTable(table) + table := createTable() + defer dropTable(table) - showTableKey := `SHOW FULL COLUMNS FROM` - gtest.C(t, func(t *gtest.T) { - ctx := context.Background() - sqlArray, err := gdb.CatchSQL(ctx, func(ctx context.Context) error { - _, err := db.Model(table).Ctx(ctx).Insert(g.Map{ - "passport": guid.S(), - "password": guid.S(), - "nickname": guid.S(), - "create_time": gtime.NewFromStr(CreateTime).String(), - }) - return err - }) - t.AssertNil(err) - t.Assert(gstr.Contains(gstr.Join(sqlArray, "|"), showTableKey), true) + showTableKey := `SHOW FULL COLUMNS FROM` + gtest.C(t, func(t *gtest.T) { + ctx := context.Background() + sqlArray, err := gdb.CatchSQL(ctx, func(ctx context.Context) error { + _, err := db.Model(table).Ctx(ctx).Insert(g.Map{ + "passport": guid.S(), + "password": guid.S(), + "nickname": guid.S(), + "create_time": gtime.NewFromStr(CreateTime).String(), + }) + return err + }) + t.AssertNil(err) + t.Assert(gstr.Contains(gstr.Join(sqlArray, "|"), showTableKey), true) - ctx = context.Background() - sqlArray, err = gdb.CatchSQL(ctx, func(ctx context.Context) error { - one, err := db.Model(table).Ctx(ctx).One() - t.Assert(len(one), 6) - return err - }) - t.AssertNil(err) - t.Assert(gstr.Contains(gstr.Join(sqlArray, "|"), showTableKey), false) + ctx = context.Background() + sqlArray, err = gdb.CatchSQL(ctx, func(ctx context.Context) error { + one, err := db.Model(table).Ctx(ctx).One() + t.Assert(len(one), 6) + return err + }) + t.AssertNil(err) + t.Assert(gstr.Contains(gstr.Join(sqlArray, "|"), showTableKey), false) - _, err = db.Exec(ctx, fmt.Sprintf("alter table %s drop column `nickname`", table)) - t.AssertNil(err) + _, err = db.Exec(ctx, fmt.Sprintf("alter table %s drop column `nickname`", table)) + t.AssertNil(err) - err = db.GetCore().ClearTableFieldsAll(ctx) - t.AssertNil(err) + err = db.GetCore().ClearTableFieldsAll(ctx) + t.AssertNil(err) - ctx = context.Background() - sqlArray, err = gdb.CatchSQL(ctx, func(ctx context.Context) error { - one, err := db.Model(table).Ctx(ctx).One() - t.Assert(len(one), 5) - return err - }) - t.AssertNil(err) - t.Assert(gstr.Contains(gstr.Join(sqlArray, "|"), showTableKey), true) - }) + ctx = context.Background() + sqlArray, err = gdb.CatchSQL(ctx, func(ctx context.Context) error { + one, err := db.Model(table).Ctx(ctx).One() + t.Assert(len(one), 5) + return err + }) + t.AssertNil(err) + t.Assert(gstr.Contains(gstr.Join(sqlArray, "|"), showTableKey), true) + }) } // https://github.com/gogf/gf/issues/2552 func Test_Issue2552_ClearTableFields(t *testing.T) { - table := createTable() - defer dropTable(table) + table := createTable() + defer dropTable(table) - showTableKey := `SHOW FULL COLUMNS FROM` - gtest.C(t, func(t *gtest.T) { - ctx := context.Background() - sqlArray, err := gdb.CatchSQL(ctx, func(ctx context.Context) error { - _, err := db.Model(table).Ctx(ctx).Insert(g.Map{ - "passport": guid.S(), - "password": guid.S(), - "nickname": guid.S(), - "create_time": gtime.NewFromStr(CreateTime).String(), - }) - return err - }) - t.AssertNil(err) - t.Assert(gstr.Contains(gstr.Join(sqlArray, "|"), showTableKey), true) + showTableKey := `SHOW FULL COLUMNS FROM` + gtest.C(t, func(t *gtest.T) { + ctx := context.Background() + sqlArray, err := gdb.CatchSQL(ctx, func(ctx context.Context) error { + _, err := db.Model(table).Ctx(ctx).Insert(g.Map{ + "passport": guid.S(), + "password": guid.S(), + "nickname": guid.S(), + "create_time": gtime.NewFromStr(CreateTime).String(), + }) + return err + }) + t.AssertNil(err) + t.Assert(gstr.Contains(gstr.Join(sqlArray, "|"), showTableKey), true) - ctx = context.Background() - sqlArray, err = gdb.CatchSQL(ctx, func(ctx context.Context) error { - one, err := db.Model(table).Ctx(ctx).One() - t.Assert(len(one), 6) - return err - }) - t.AssertNil(err) - t.Assert(gstr.Contains(gstr.Join(sqlArray, "|"), showTableKey), false) + ctx = context.Background() + sqlArray, err = gdb.CatchSQL(ctx, func(ctx context.Context) error { + one, err := db.Model(table).Ctx(ctx).One() + t.Assert(len(one), 6) + return err + }) + t.AssertNil(err) + t.Assert(gstr.Contains(gstr.Join(sqlArray, "|"), showTableKey), false) - _, err = db.Exec(ctx, fmt.Sprintf("alter table %s drop column `nickname`", table)) - t.AssertNil(err) + _, err = db.Exec(ctx, fmt.Sprintf("alter table %s drop column `nickname`", table)) + t.AssertNil(err) - err = db.GetCore().ClearTableFields(ctx, table) - t.AssertNil(err) + err = db.GetCore().ClearTableFields(ctx, table) + t.AssertNil(err) - ctx = context.Background() - sqlArray, err = gdb.CatchSQL(ctx, func(ctx context.Context) error { - one, err := db.Model(table).Ctx(ctx).One() - t.Assert(len(one), 5) - return err - }) - t.AssertNil(err) - t.Assert(gstr.Contains(gstr.Join(sqlArray, "|"), showTableKey), true) - }) + ctx = context.Background() + sqlArray, err = gdb.CatchSQL(ctx, func(ctx context.Context) error { + one, err := db.Model(table).Ctx(ctx).One() + t.Assert(len(one), 5) + return err + }) + t.AssertNil(err) + t.Assert(gstr.Contains(gstr.Join(sqlArray, "|"), showTableKey), true) + }) } // https://github.com/gogf/gf/issues/2643 func Test_Issue2643(t *testing.T) { - table := "issue2643" - array := gstr.SplitAndTrim(gtest.DataContent(`issue2643.sql`), ";") - for _, v := range array { - if _, err := db.Exec(ctx, v); err != nil { - gtest.Error(err) - } - } - defer dropTable(table) + table := "issue2643" + array := gstr.SplitAndTrim(gtest.DataContent(`issues`, `2643.sql`), ";") + for _, v := range array { + if _, err := db.Exec(ctx, v); err != nil { + gtest.Error(err) + } + } + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - var ( - expectKey1 = "SELECT s.name,replace(concat_ws(',',lpad(s.id, 6, '0'),s.name),',','') `code` FROM `issue2643` AS s" - expectKey2 = "SELECT CASE WHEN dept='物资部' THEN '物资部' ELSE '其他' END dept,sum(s.value) FROM `issue2643` AS s GROUP BY CASE WHEN dept='物资部' THEN '物资部' ELSE '其他' END" - ) - sqlArray, err := gdb.CatchSQL(ctx, func(ctx context.Context) error { - db.Ctx(ctx).Model(table).As("s").Fields( - "s.name", - "replace(concat_ws(',',lpad(s.id, 6, '0'),s.name),',','') `code`", - ).All() - db.Ctx(ctx).Model(table).As("s").Fields( - "CASE WHEN dept='物资部' THEN '物资部' ELSE '其他' END dept", - "sum(s.value)", - ).Group("CASE WHEN dept='物资部' THEN '物资部' ELSE '其他' END").All() - return nil - }) - t.AssertNil(err) - sqlContent := gstr.Join(sqlArray, "\n") - t.Assert(gstr.Contains(sqlContent, expectKey1), true) - t.Assert(gstr.Contains(sqlContent, expectKey2), true) - }) + gtest.C(t, func(t *gtest.T) { + var ( + expectKey1 = "SELECT s.name,replace(concat_ws(',',lpad(s.id, 6, '0'),s.name),',','') `code` FROM `issue2643` AS s" + expectKey2 = "SELECT CASE WHEN dept='物资部' THEN '物资部' ELSE '其他' END dept,sum(s.value) FROM `issue2643` AS s GROUP BY CASE WHEN dept='物资部' THEN '物资部' ELSE '其他' END" + ) + sqlArray, err := gdb.CatchSQL(ctx, func(ctx context.Context) error { + db.Ctx(ctx).Model(table).As("s").Fields( + "s.name", + "replace(concat_ws(',',lpad(s.id, 6, '0'),s.name),',','') `code`", + ).All() + db.Ctx(ctx).Model(table).As("s").Fields( + "CASE WHEN dept='物资部' THEN '物资部' ELSE '其他' END dept", + "sum(s.value)", + ).Group("CASE WHEN dept='物资部' THEN '物资部' ELSE '其他' END").All() + return nil + }) + t.AssertNil(err) + sqlContent := gstr.Join(sqlArray, "\n") + t.Assert(gstr.Contains(sqlContent, expectKey1), true) + t.Assert(gstr.Contains(sqlContent, expectKey2), true) + }) } // https://github.com/gogf/gf/issues/3238 func Test_Issue3238(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - for i := 0; i < 100; i++ { - _, err := db.Ctx(ctx).Model(table).Hook(gdb.HookHandler{ - Select: func(ctx context.Context, in *gdb.HookSelectInput) (result gdb.Result, err error) { - result, err = in.Next(ctx) - if err != nil { - return - } - var wg sync.WaitGroup - for _, record := range result { - wg.Add(1) - go func(record gdb.Record) { - defer wg.Done() - id, _ := db.Ctx(ctx).Model(table).WherePri(1).Value(`id`) - nickname, _ := db.Ctx(ctx).Model(table).WherePri(1).Value(`nickname`) - t.Assert(id.Int(), 1) - t.Assert(nickname.String(), "name_1") - }(record) - } - wg.Wait() - return - }, - }, - ).All() - t.AssertNil(err) - } - }) + gtest.C(t, func(t *gtest.T) { + for i := 0; i < 100; i++ { + _, err := db.Ctx(ctx).Model(table).Hook(gdb.HookHandler{ + Select: func(ctx context.Context, in *gdb.HookSelectInput) (result gdb.Result, err error) { + result, err = in.Next(ctx) + if err != nil { + return + } + var wg sync.WaitGroup + for _, record := range result { + wg.Add(1) + go func(record gdb.Record) { + defer wg.Done() + id, _ := db.Ctx(ctx).Model(table).WherePri(1).Value(`id`) + nickname, _ := db.Ctx(ctx).Model(table).WherePri(1).Value(`nickname`) + t.Assert(id.Int(), 1) + t.Assert(nickname.String(), "name_1") + }(record) + } + wg.Wait() + return + }, + }, + ).All() + t.AssertNil(err) + } + }) } // https://github.com/gogf/gf/issues/3649 func Test_Issue3649(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - sql, err := gdb.CatchSQL(context.Background(), func(ctx context.Context) (err error) { - user := db.Model(table).Ctx(ctx) - _, err = user.Where("create_time = ?", gdb.Raw("now()")).WhereLT("create_time", gdb.Raw("now()")).Count() - return - }) - t.AssertNil(err) - sqlStr := fmt.Sprintf("SELECT COUNT(1) FROM `%s` WHERE (create_time = now()) AND (`create_time` < now())", table) - t.Assert(sql[0], sqlStr) - }) + gtest.C(t, func(t *gtest.T) { + sql, err := gdb.CatchSQL(context.Background(), func(ctx context.Context) (err error) { + user := db.Model(table).Ctx(ctx) + _, err = user.Where("create_time = ?", gdb.Raw("now()")).WhereLT("create_time", gdb.Raw("now()")).Count() + return + }) + t.AssertNil(err) + sqlStr := fmt.Sprintf("SELECT COUNT(1) FROM `%s` WHERE (create_time = now()) AND (`create_time` < now())", table) + t.Assert(sql[0], sqlStr) + }) } // https://github.com/gogf/gf/issues/3754 func Test_Issue3754(t *testing.T) { - table := "issue3754" - array := gstr.SplitAndTrim(gtest.DataContent(`issue3754.sql`), ";") - for _, v := range array { - if _, err := db.Exec(ctx, v); err != nil { - gtest.Error(err) - } - } - defer dropTable(table) + table := "issue3754" + array := gstr.SplitAndTrim(gtest.DataContent(`issues`, `3754.sql`), ";") + for _, v := range array { + if _, err := db.Exec(ctx, v); err != nil { + gtest.Error(err) + } + } + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - fieldsEx := []string{"delete_at", "create_at", "update_at"} - // Insert. - dataInsert := g.Map{ - "id": 1, - "name": "name_1", - } - r, err := db.Model(table).Data(dataInsert).FieldsEx(fieldsEx).Insert() - t.AssertNil(err) - n, _ := r.RowsAffected() - t.Assert(n, 1) + gtest.C(t, func(t *gtest.T) { + fieldsEx := []string{"delete_at", "create_at", "update_at"} + // Insert. + dataInsert := g.Map{ + "id": 1, + "name": "name_1", + } + r, err := db.Model(table).Data(dataInsert).FieldsEx(fieldsEx).Insert() + t.AssertNil(err) + n, _ := r.RowsAffected() + t.Assert(n, 1) - oneInsert, err := db.Model(table).WherePri(1).One() - t.AssertNil(err) - t.Assert(oneInsert["id"].Int(), 1) - t.Assert(oneInsert["name"].String(), "name_1") - t.Assert(oneInsert["delete_at"].String(), "") - t.Assert(oneInsert["create_at"].String(), "") - t.Assert(oneInsert["update_at"].String(), "") + oneInsert, err := db.Model(table).WherePri(1).One() + t.AssertNil(err) + t.Assert(oneInsert["id"].Int(), 1) + t.Assert(oneInsert["name"].String(), "name_1") + t.Assert(oneInsert["delete_at"].String(), "") + t.Assert(oneInsert["create_at"].String(), "") + t.Assert(oneInsert["update_at"].String(), "") - // Update. - dataUpdate := g.Map{ - "name": "name_1000", - } - r, err = db.Model(table).Data(dataUpdate).FieldsEx(fieldsEx).WherePri(1).Update() - t.AssertNil(err) - n, _ = r.RowsAffected() - t.Assert(n, 1) + // Update. + dataUpdate := g.Map{ + "name": "name_1000", + } + r, err = db.Model(table).Data(dataUpdate).FieldsEx(fieldsEx).WherePri(1).Update() + t.AssertNil(err) + n, _ = r.RowsAffected() + t.Assert(n, 1) - oneUpdate, err := db.Model(table).WherePri(1).One() - t.AssertNil(err) - t.Assert(oneUpdate["id"].Int(), 1) - t.Assert(oneUpdate["name"].String(), "name_1000") - t.Assert(oneUpdate["delete_at"].String(), "") - t.Assert(oneUpdate["create_at"].String(), "") - t.Assert(oneUpdate["update_at"].String(), "") + oneUpdate, err := db.Model(table).WherePri(1).One() + t.AssertNil(err) + t.Assert(oneUpdate["id"].Int(), 1) + t.Assert(oneUpdate["name"].String(), "name_1000") + t.Assert(oneUpdate["delete_at"].String(), "") + t.Assert(oneUpdate["create_at"].String(), "") + t.Assert(oneUpdate["update_at"].String(), "") - // FieldsEx does not affect Delete operation. - r, err = db.Model(table).FieldsEx(fieldsEx).WherePri(1).Delete() - n, _ = r.RowsAffected() - t.Assert(n, 1) - oneDeleteUnscoped, err := db.Model(table).Unscoped().WherePri(1).One() - t.AssertNil(err) - t.Assert(oneDeleteUnscoped["id"].Int(), 1) - t.Assert(oneDeleteUnscoped["name"].String(), "name_1000") - t.AssertNE(oneDeleteUnscoped["delete_at"].String(), "") - t.Assert(oneDeleteUnscoped["create_at"].String(), "") - t.Assert(oneDeleteUnscoped["update_at"].String(), "") - }) + // FieldsEx does not affect Delete operation. + r, err = db.Model(table).FieldsEx(fieldsEx).WherePri(1).Delete() + n, _ = r.RowsAffected() + t.Assert(n, 1) + oneDeleteUnscoped, err := db.Model(table).Unscoped().WherePri(1).One() + t.AssertNil(err) + t.Assert(oneDeleteUnscoped["id"].Int(), 1) + t.Assert(oneDeleteUnscoped["name"].String(), "name_1000") + t.AssertNE(oneDeleteUnscoped["delete_at"].String(), "") + t.Assert(oneDeleteUnscoped["create_at"].String(), "") + t.Assert(oneDeleteUnscoped["update_at"].String(), "") + }) } // https://github.com/gogf/gf/issues/3626 func Test_Issue3626(t *testing.T) { - table := "issue3626" - array := gstr.SplitAndTrim(gtest.DataContent(`issue3626.sql`), ";") - defer dropTable(table) - for _, v := range array { - if _, err := db.Exec(ctx, v); err != nil { - gtest.Error(err) - } - } + table := "issue3626" + array := gstr.SplitAndTrim(gtest.DataContent(`issues`, `3626.sql`), ";") + defer dropTable(table) + for _, v := range array { + if _, err := db.Exec(ctx, v); err != nil { + gtest.Error(err) + } + } - // Insert. - gtest.C(t, func(t *gtest.T) { - dataInsert := g.Map{ - "id": 1, - "name": "name_1", - } - r, err := db.Model(table).Data(dataInsert).Insert() - t.AssertNil(err) - n, _ := r.RowsAffected() - t.Assert(n, 1) + // Insert. + gtest.C(t, func(t *gtest.T) { + dataInsert := g.Map{ + "id": 1, + "name": "name_1", + } + r, err := db.Model(table).Data(dataInsert).Insert() + t.AssertNil(err) + n, _ := r.RowsAffected() + t.Assert(n, 1) - oneInsert, err := db.Model(table).WherePri(1).One() - t.AssertNil(err) - t.Assert(oneInsert["id"].Int(), 1) - t.Assert(oneInsert["name"].String(), "name_1") - }) + oneInsert, err := db.Model(table).WherePri(1).One() + t.AssertNil(err) + t.Assert(oneInsert["id"].Int(), 1) + t.Assert(oneInsert["name"].String(), "name_1") + }) - var ( - cacheKey = guid.S() - cacheFunc = func(duration time.Duration) gdb.HookHandler { - return gdb.HookHandler{ - Select: func(ctx context.Context, in *gdb.HookSelectInput) (result gdb.Result, err error) { - get, err := db.GetCache().Get(ctx, cacheKey) - if err == nil && !get.IsEmpty() { - err = get.Scan(&result) - if err == nil { - return result, nil - } - } - result, err = in.Next(ctx) - if err != nil { - return nil, err - } - if result == nil || result.Len() < 1 { - result = make(gdb.Result, 0) - } - _ = db.GetCache().Set(ctx, cacheKey, result, duration) - return - }, - } - } - ) - gtest.C(t, func(t *gtest.T) { - defer db.GetCache().Clear(ctx) - count, err := db.Model(table).Count() - t.AssertNil(err) - t.Assert(count, 1) - count, err = db.Model(table).Hook(cacheFunc(time.Hour)).Count() - t.AssertNil(err) - t.Assert(count, 1) - count, err = db.Model(table).Hook(cacheFunc(time.Hour)).Count() - t.AssertNil(err) - t.Assert(count, 1) - }) + var ( + cacheKey = guid.S() + cacheFunc = func(duration time.Duration) gdb.HookHandler { + return gdb.HookHandler{ + Select: func(ctx context.Context, in *gdb.HookSelectInput) (result gdb.Result, err error) { + get, err := db.GetCache().Get(ctx, cacheKey) + if err == nil && !get.IsEmpty() { + err = get.Scan(&result) + if err == nil { + return result, nil + } + } + result, err = in.Next(ctx) + if err != nil { + return nil, err + } + if result == nil || result.Len() < 1 { + result = make(gdb.Result, 0) + } + _ = db.GetCache().Set(ctx, cacheKey, result, duration) + return + }, + } + } + ) + gtest.C(t, func(t *gtest.T) { + defer db.GetCache().Clear(ctx) + count, err := db.Model(table).Count() + t.AssertNil(err) + t.Assert(count, 1) + count, err = db.Model(table).Hook(cacheFunc(time.Hour)).Count() + t.AssertNil(err) + t.Assert(count, 1) + count, err = db.Model(table).Hook(cacheFunc(time.Hour)).Count() + t.AssertNil(err) + t.Assert(count, 1) + }) } // https://github.com/gogf/gf/issues/3932 func Test_Issue3932(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - one, err := db.Model(table).Order("id", "desc").One() - t.AssertNil(err) - t.Assert(one["id"], 10) - }) - gtest.C(t, func(t *gtest.T) { - one, err := db.Model(table).Order("id desc").One() - t.AssertNil(err) - t.Assert(one["id"], 10) - }) - gtest.C(t, func(t *gtest.T) { - one, err := db.Model(table).Order("id desc, nickname asc").One() - t.AssertNil(err) - t.Assert(one["id"], 10) - }) - gtest.C(t, func(t *gtest.T) { - one, err := db.Model(table).Order("id desc", "nickname asc").One() - t.AssertNil(err) - t.Assert(one["id"], 10) - }) - gtest.C(t, func(t *gtest.T) { - one, err := db.Model(table).Order("id desc").Order("nickname asc").One() - t.AssertNil(err) - t.Assert(one["id"], 10) - }) + gtest.C(t, func(t *gtest.T) { + one, err := db.Model(table).Order("id", "desc").One() + t.AssertNil(err) + t.Assert(one["id"], 10) + }) + gtest.C(t, func(t *gtest.T) { + one, err := db.Model(table).Order("id desc").One() + t.AssertNil(err) + t.Assert(one["id"], 10) + }) + gtest.C(t, func(t *gtest.T) { + one, err := db.Model(table).Order("id desc, nickname asc").One() + t.AssertNil(err) + t.Assert(one["id"], 10) + }) + gtest.C(t, func(t *gtest.T) { + one, err := db.Model(table).Order("id desc", "nickname asc").One() + t.AssertNil(err) + t.Assert(one["id"], 10) + }) + gtest.C(t, func(t *gtest.T) { + one, err := db.Model(table).Order("id desc").Order("nickname asc").One() + t.AssertNil(err) + t.Assert(one["id"], 10) + }) } // https://github.com/gogf/gf/issues/3968 func Test_Issue3968(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - var hook = gdb.HookHandler{ - Select: func(ctx context.Context, in *gdb.HookSelectInput) (result gdb.Result, err error) { - result, err = in.Next(ctx) - if err != nil { - return nil, err - } - if result != nil { - for i, _ := range result { - result[i]["location"] = gvar.New("ny") - } - } - return - }, - } - var ( - count int - result gdb.Result - ) - err := db.Model(table).Hook(hook).ScanAndCount(&result, &count, false) - t.AssertNil(err) - t.Assert(count, 10) - t.Assert(len(result), 10) - }) + gtest.C(t, func(t *gtest.T) { + var hook = gdb.HookHandler{ + Select: func(ctx context.Context, in *gdb.HookSelectInput) (result gdb.Result, err error) { + result, err = in.Next(ctx) + if err != nil { + return nil, err + } + if result != nil { + for i, _ := range result { + result[i]["location"] = gdb.NewValue("ny") + } + } + return + }, + } + var ( + count int + result gdb.Result + ) + err := db.Model(table).Hook(hook).ScanAndCount(&result, &count, false) + t.AssertNil(err) + t.Assert(count, 10) + t.Assert(len(result), 10) + }) } // https://github.com/gogf/gf/issues/3915 func Test_Issue3915(t *testing.T) { - table := "issue3915" - array := gstr.SplitAndTrim(gtest.DataContent(`issue3915.sql`), ";") - for _, v := range array { - if _, err := db.Exec(ctx, v); err != nil { - gtest.Error(err) - } - } - defer dropTable(table) + table := "issue3915" + array := gstr.SplitAndTrim(gtest.DataContent(`issues`, `3915.sql`), ";") + for _, v := range array { + if _, err := db.Exec(ctx, v); err != nil { + gtest.Error(err) + } + } + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - //db.SetDebug(true) - all, err := db.Model(table).Where("a < b").All() - t.AssertNil(err) - t.Assert(len(all), 1) - t.Assert(all[0]["id"], 1) + gtest.C(t, func(t *gtest.T) { + //db.SetDebug(true) + all, err := db.Model(table).Where("a < b").All() + t.AssertNil(err) + t.Assert(len(all), 1) + t.Assert(all[0]["id"], 1) - all, err = db.Model(table).Where(gdb.Raw("a < b")).All() - t.AssertNil(err) - t.Assert(len(all), 1) - t.Assert(all[0]["id"], 1) + all, err = db.Model(table).Where(gdb.Raw("a < b")).All() + t.AssertNil(err) + t.Assert(len(all), 1) + t.Assert(all[0]["id"], 1) - all, err = db.Model(table).WhereLT("a", gdb.Raw("`b`")).All() - t.AssertNil(err) - t.Assert(len(all), 1) - t.Assert(all[0]["id"], 1) - }) + all, err = db.Model(table).WhereLT("a", gdb.Raw("`b`")).All() + t.AssertNil(err) + t.Assert(len(all), 1) + t.Assert(all[0]["id"], 1) + }) - gtest.C(t, func(t *gtest.T) { - //db.SetDebug(true) - all, err := db.Model(table).Where("a > b").All() - t.AssertNil(err) - t.Assert(len(all), 1) - t.Assert(all[0]["id"], 2) + gtest.C(t, func(t *gtest.T) { + //db.SetDebug(true) + all, err := db.Model(table).Where("a > b").All() + t.AssertNil(err) + t.Assert(len(all), 1) + t.Assert(all[0]["id"], 2) - all, err = db.Model(table).Where(gdb.Raw("a > b")).All() - t.AssertNil(err) - t.Assert(len(all), 1) - t.Assert(all[0]["id"], 2) + all, err = db.Model(table).Where(gdb.Raw("a > b")).All() + t.AssertNil(err) + t.Assert(len(all), 1) + t.Assert(all[0]["id"], 2) - all, err = db.Model(table).WhereGT("a", gdb.Raw("`b`")).All() - t.AssertNil(err) - t.Assert(len(all), 1) - t.Assert(all[0]["id"], 2) - }) + all, err = db.Model(table).WhereGT("a", gdb.Raw("`b`")).All() + t.AssertNil(err) + t.Assert(len(all), 1) + t.Assert(all[0]["id"], 2) + }) } type RoleBase struct { - gmeta.Meta `orm:"table:sys_role"` - Name string `json:"name" description:"角色名称" ` - Code string `json:"code" description:"角色 code" ` - Description string `json:"description" description:"描述信息" ` - Weight int `json:"weight" description:"排序" ` - StatusId int `json:"statusId" description:"发布状态" ` - CreatedAt *gtime.Time `json:"createdAt" description:"" ` - UpdatedAt *gtime.Time `json:"updatedAt" description:"" ` + gmeta.Meta `orm:"table:sys_role"` + Name string `json:"name" description:"角色名称" ` + Code string `json:"code" description:"角色 code" ` + Description string `json:"description" description:"描述信息" ` + Weight int `json:"weight" description:"排序" ` + StatusId int `json:"statusId" description:"发布状态" ` + CreatedAt *gtime.Time `json:"createdAt" description:"" ` + UpdatedAt *gtime.Time `json:"updatedAt" description:"" ` } type Role struct { - gmeta.Meta `orm:"table:sys_role"` - RoleBase - Id uint `json:"id" description:""` - Status *Status `json:"status" description:"发布状态" orm:"with:id=status_id" ` + gmeta.Meta `orm:"table:sys_role"` + RoleBase + Id uint `json:"id" description:""` + Status *Status `json:"status" description:"发布状态" orm:"with:id=status_id" ` } type StatusBase struct { - gmeta.Meta `orm:"table:sys_status"` - En string `json:"en" description:"英文名称" ` - Cn string `json:"cn" description:"中文名称" ` - Weight int `json:"weight" description:"排序权重" ` + gmeta.Meta `orm:"table:sys_status"` + En string `json:"en" description:"英文名称" ` + Cn string `json:"cn" description:"中文名称" ` + Weight int `json:"weight" description:"排序权重" ` } type Status struct { - gmeta.Meta `orm:"table:sys_status"` - StatusBase - Id uint `json:"id" description:""` + gmeta.Meta `orm:"table:sys_status"` + StatusBase + Id uint `json:"id" description:""` } // https://github.com/gogf/gf/issues/2119 func Test_Issue2119(t *testing.T) { - gtest.C(t, func(t *gtest.T) { - tables := []string{ - "sys_role", - "sys_status", - } + gtest.C(t, func(t *gtest.T) { + tables := []string{ + "sys_role", + "sys_status", + } - defer dropTable(tables[0]) - defer dropTable(tables[1]) - _ = tables - array := gstr.SplitAndTrim(gtest.DataContent(`issue2119.sql`), ";") - for _, v := range array { - _, err := db.Exec(ctx, v) - t.AssertNil(err) - } - roles := make([]*Role, 0) - err := db.Ctx(context.Background()).Model(&Role{}).WithAll().Scan(&roles) - t.AssertNil(err) - expectStatus := []*Status{ - { - StatusBase: StatusBase{ - En: "undecided", - Cn: "未决定", - Weight: 800, - }, - Id: 2, - }, - { - StatusBase: StatusBase{ - En: "on line", - Cn: "上线", - Weight: 900, - }, - Id: 1, - }, - { - StatusBase: StatusBase{ - En: "on line", - Cn: "上线", - Weight: 900, - }, - Id: 1, - }, - { - StatusBase: StatusBase{ - En: "on line", - Cn: "上线", - Weight: 900, - }, - Id: 1, - }, - { - StatusBase: StatusBase{ - En: "on line", - Cn: "上线", - Weight: 900, - }, - Id: 1, - }, - } + defer dropTable(tables[0]) + defer dropTable(tables[1]) + _ = tables + array := gstr.SplitAndTrim(gtest.DataContent(`issues`, `2119.sql`), ";") + for _, v := range array { + _, err := db.Exec(ctx, v) + t.AssertNil(err) + } + roles := make([]*Role, 0) + err := db.Ctx(context.Background()).Model(&Role{}).WithAll().Scan(&roles) + t.AssertNil(err) + expectStatus := []*Status{ + { + StatusBase: StatusBase{ + En: "undecided", + Cn: "未决定", + Weight: 800, + }, + Id: 2, + }, + { + StatusBase: StatusBase{ + En: "on line", + Cn: "上线", + Weight: 900, + }, + Id: 1, + }, + { + StatusBase: StatusBase{ + En: "on line", + Cn: "上线", + Weight: 900, + }, + Id: 1, + }, + { + StatusBase: StatusBase{ + En: "on line", + Cn: "上线", + Weight: 900, + }, + Id: 1, + }, + { + StatusBase: StatusBase{ + En: "on line", + Cn: "上线", + Weight: 900, + }, + Id: 1, + }, + } - for i := 0; i < len(roles); i++ { - t.Assert(roles[i].Status, expectStatus[i]) - } - }) + for i := 0; i < len(roles); i++ { + t.Assert(roles[i].Status, expectStatus[i]) + } + }) } // https://github.com/gogf/gf/issues/4034 func Test_Issue4034(t *testing.T) { - gtest.C(t, func(t *gtest.T) { - table := "issue4034" - array := gstr.SplitAndTrim(gtest.DataContent(`issue4034.sql`), ";") - for _, v := range array { - _, err := db.Exec(ctx, v) - t.AssertNil(err) - } - defer dropTable(table) + gtest.C(t, func(t *gtest.T) { + table := "issue4034" + array := gstr.SplitAndTrim(gtest.DataContent(`issues`, `4034.sql`), ";") + for _, v := range array { + _, err := db.Exec(ctx, v) + t.AssertNil(err) + } + defer dropTable(table) - err := issue4034SaveDeviceAndToken(ctx, table) - t.AssertNil(err) - }) + err := issue4034SaveDeviceAndToken(ctx, table) + t.AssertNil(err) + }) } func issue4034SaveDeviceAndToken(ctx context.Context, table string) error { - return db.Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { - if err := issue4034SaveAppDevice(ctx, table, tx); err != nil { - return err - } - return nil - }) + return db.Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + if err := issue4034SaveAppDevice(ctx, table, tx); err != nil { + return err + } + return nil + }) } func issue4034SaveAppDevice(ctx context.Context, table string, tx gdb.TX) error { - _, err := db.Model(table).Safe().Ctx(ctx).TX(tx).Data(g.Map{ - "passport": "111", - "password": "222", - "nickname": "333", - }).Save() - return err + _, err := db.Model(table).Safe().Ctx(ctx).TX(tx).Data(g.Map{ + "passport": "111", + "password": "222", + "nickname": "333", + }).Save() + return err +} + +// https://github.com/gogf/gf/issues/4086 +func Test_Issue4086(t *testing.T) { + table := "issue4086" + defer dropTable(table) + array := gstr.SplitAndTrim(gtest.DataContent(`issues`, `4086.sql`), ";") + for _, v := range array { + _, err := db.Exec(ctx, v) + gtest.AssertNil(err) + } + + gtest.C(t, func(t *gtest.T) { + type ProxyParam struct { + ProxyId int64 `json:"proxyId" orm:"proxy_id"` + RecommendIds []int64 `json:"recommendIds" orm:"recommend_ids"` + Photos []string `json:"photos" orm:"photos"` + } + + var proxyParamList []*ProxyParam + err := db.Model(table).Ctx(ctx).Scan(&proxyParamList) + t.AssertNil(err) + t.Assert(len(proxyParamList), 2) + t.Assert(proxyParamList, []*ProxyParam{ + { + ProxyId: 1, + RecommendIds: []int64{584, 585}, + Photos: nil, + }, + { + ProxyId: 2, + RecommendIds: []int64{}, + Photos: nil, + }, + }) + }) + gtest.C(t, func(t *gtest.T) { + type ProxyParam struct { + ProxyId int64 `json:"proxyId" orm:"proxy_id"` + RecommendIds []int64 `json:"recommendIds" orm:"recommend_ids"` + Photos []any `json:"photos" orm:"photos"` + } + + var proxyParamList []*ProxyParam + err := db.Model(table).Ctx(ctx).Scan(&proxyParamList) + t.AssertNil(err) + t.Assert(len(proxyParamList), 2) + t.Assert(proxyParamList, []*ProxyParam{ + { + ProxyId: 1, + RecommendIds: []int64{584, 585}, + Photos: nil, + }, + { + ProxyId: 2, + RecommendIds: []int64{}, + Photos: nil, + }, + }) + }) + gtest.C(t, func(t *gtest.T) { + type ProxyParam struct { + ProxyId int64 `json:"proxyId" orm:"proxy_id"` + RecommendIds []int64 `json:"recommendIds" orm:"recommend_ids"` + Photos string `json:"photos" orm:"photos"` + } + + var proxyParamList []*ProxyParam + err := db.Model(table).Ctx(ctx).Scan(&proxyParamList) + t.AssertNil(err) + t.Assert(len(proxyParamList), 2) + t.Assert(proxyParamList, []*ProxyParam{ + { + ProxyId: 1, + RecommendIds: []int64{584, 585}, + Photos: "null", + }, + { + ProxyId: 2, + RecommendIds: []int64{}, + Photos: "", + }, + }) + }) + gtest.C(t, func(t *gtest.T) { + type ProxyParam struct { + ProxyId int64 `json:"proxyId" orm:"proxy_id"` + RecommendIds string `json:"recommendIds" orm:"recommend_ids"` + Photos json.RawMessage `json:"photos" orm:"photos"` + } + + var proxyParamList []*ProxyParam + err := db.Model(table).Ctx(ctx).Scan(&proxyParamList) + t.AssertNil(err) + t.Assert(len(proxyParamList), 2) + t.Assert(proxyParamList, []*ProxyParam{ + { + ProxyId: 1, + RecommendIds: "[584, 585]", + Photos: json.RawMessage("null"), + }, + { + ProxyId: 2, + RecommendIds: "[]", + Photos: json.RawMessage("null"), + }, + }) + }) } diff --git a/contrib/drivers/mysql/mysql_z_unit_model_test.go b/contrib/drivers/mysql/mysql_z_unit_model_test.go index 9be10ff13..9ae609d73 100644 --- a/contrib/drivers/mysql/mysql_z_unit_model_test.go +++ b/contrib/drivers/mysql/mysql_z_unit_model_test.go @@ -7,585 +7,584 @@ package mysql_test import ( - "bytes" - "context" - "database/sql" - "fmt" - "os" - "strings" - "testing" - "time" + "bytes" + "context" + "database/sql" + "fmt" + "os" + "strings" + "testing" + "time" - "github.com/gogf/gf/v2/container/garray" - "github.com/gogf/gf/v2/container/gvar" - "github.com/gogf/gf/v2/database/gdb" - "github.com/gogf/gf/v2/encoding/gjson" - "github.com/gogf/gf/v2/frame/g" - "github.com/gogf/gf/v2/os/gfile" - "github.com/gogf/gf/v2/os/glog" - "github.com/gogf/gf/v2/os/gtime" - "github.com/gogf/gf/v2/test/gtest" - "github.com/gogf/gf/v2/text/gstr" - "github.com/gogf/gf/v2/util/guid" + "github.com/gogf/gf/v2/container/garray" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/encoding/gjson" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gfile" + "github.com/gogf/gf/v2/os/glog" + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/test/gtest" + "github.com/gogf/gf/v2/text/gstr" + "github.com/gogf/gf/v2/util/guid" ) func Test_Model_Insert(t *testing.T) { - table := createTable() - defer dropTable(table) + table := createTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - user := db.Model(table) - result, err := user.Data(g.Map{ - "id": 1, - "uid": 1, - "passport": "t1", - "password": "25d55ad283aa400af464c76d713c07ad", - "nickname": "name_1", - "create_time": gtime.Now().String(), - }).Insert() - t.AssertNil(err) - n, _ := result.LastInsertId() - t.Assert(n, 1) + gtest.C(t, func(t *gtest.T) { + user := db.Model(table) + result, err := user.Data(g.Map{ + "id": 1, + "uid": 1, + "passport": "t1", + "password": "25d55ad283aa400af464c76d713c07ad", + "nickname": "name_1", + "create_time": gtime.Now().String(), + }).Insert() + t.AssertNil(err) + n, _ := result.LastInsertId() + t.Assert(n, 1) - result, err = db.Model(table).Data(g.Map{ - "id": "2", - "uid": "2", - "passport": "t2", - "password": "25d55ad283aa400af464c76d713c07ad", - "nickname": "name_2", - "create_time": gtime.Now().String(), - }).Insert() - t.AssertNil(err) - n, _ = result.RowsAffected() - t.Assert(n, 1) + result, err = db.Model(table).Data(g.Map{ + "id": "2", + "uid": "2", + "passport": "t2", + "password": "25d55ad283aa400af464c76d713c07ad", + "nickname": "name_2", + "create_time": gtime.Now().String(), + }).Insert() + t.AssertNil(err) + n, _ = result.RowsAffected() + t.Assert(n, 1) - type User struct { - Id int `gconv:"id"` - Uid int `gconv:"uid"` - Passport string `json:"passport"` - Password string `gconv:"password"` - Nickname string `gconv:"nickname"` - CreateTime *gtime.Time `json:"create_time"` - } - // Model inserting. - result, err = db.Model(table).Data(User{ - Id: 3, - Uid: 3, - Passport: "t3", - Password: "25d55ad283aa400af464c76d713c07ad", - Nickname: "name_3", - }).Insert() - t.AssertNil(err) - n, _ = result.RowsAffected() - t.Assert(n, 1) - value, err := db.Model(table).Fields("passport").Where("id=3").Value() - t.AssertNil(err) - t.Assert(value.String(), "t3") + type User struct { + Id int `gconv:"id"` + Uid int `gconv:"uid"` + Passport string `json:"passport"` + Password string `gconv:"password"` + Nickname string `gconv:"nickname"` + CreateTime *gtime.Time `json:"create_time"` + } + // Model inserting. + result, err = db.Model(table).Data(User{ + Id: 3, + Uid: 3, + Passport: "t3", + Password: "25d55ad283aa400af464c76d713c07ad", + Nickname: "name_3", + }).Insert() + t.AssertNil(err) + n, _ = result.RowsAffected() + t.Assert(n, 1) + value, err := db.Model(table).Fields("passport").Where("id=3").Value() + t.AssertNil(err) + t.Assert(value.String(), "t3") - result, err = db.Model(table).Data(&User{ - Id: 4, - Uid: 4, - Passport: "t4", - Password: "25d55ad283aa400af464c76d713c07ad", - Nickname: "T4", - CreateTime: gtime.Now(), - }).Insert() - t.AssertNil(err) - n, _ = result.RowsAffected() - t.Assert(n, 1) - value, err = db.Model(table).Fields("passport").Where("id=4").Value() - t.AssertNil(err) - t.Assert(value.String(), "t4") + result, err = db.Model(table).Data(&User{ + Id: 4, + Uid: 4, + Passport: "t4", + Password: "25d55ad283aa400af464c76d713c07ad", + Nickname: "T4", + CreateTime: gtime.Now(), + }).Insert() + t.AssertNil(err) + n, _ = result.RowsAffected() + t.Assert(n, 1) + value, err = db.Model(table).Fields("passport").Where("id=4").Value() + t.AssertNil(err) + t.Assert(value.String(), "t4") - result, err = db.Model(table).Where("id>?", 1).Delete() - t.AssertNil(err) - n, _ = result.RowsAffected() - t.Assert(n, 3) - }) + result, err = db.Model(table).Where("id>?", 1).Delete() + t.AssertNil(err) + n, _ = result.RowsAffected() + t.Assert(n, 3) + }) } // Fix issue: https://github.com/gogf/gf/issues/819 func Test_Model_Insert_WithStructAndSliceAttribute(t *testing.T) { - table := createTable() - defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - type Password struct { - Salt string `json:"salt"` - Pass string `json:"pass"` - } - data := g.Map{ - "id": 1, - "passport": "t1", - "password": &Password{"123", "456"}, - "nickname": []string{"A", "B", "C"}, - "create_time": gtime.Now().String(), - } - _, err := db.Model(table).Data(data).Insert() - t.AssertNil(err) + table := createTable() + defer dropTable(table) + gtest.C(t, func(t *gtest.T) { + type Password struct { + Salt string `json:"salt"` + Pass string `json:"pass"` + } + data := g.Map{ + "id": 1, + "passport": "t1", + "password": &Password{"123", "456"}, + "nickname": []string{"A", "B", "C"}, + "create_time": gtime.Now().String(), + } + _, err := db.Model(table).Data(data).Insert() + t.AssertNil(err) - one, err := db.Model(table).One("id", 1) - t.AssertNil(err) - t.Assert(one["passport"], data["passport"]) - t.Assert(one["create_time"], data["create_time"]) - t.Assert(one["nickname"], gjson.New(data["nickname"]).MustToJson()) - }) + one, err := db.Model(table).One("id", 1) + t.AssertNil(err) + t.Assert(one["passport"], data["passport"]) + t.Assert(one["create_time"], data["create_time"]) + t.Assert(one["nickname"], gjson.New(data["nickname"]).MustToJson()) + }) } func Test_Model_Insert_KeyFieldNameMapping(t *testing.T) { - table := createTable() - defer dropTable(table) + table := createTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - type User struct { - Id int - Passport string - Password string - Nickname string - CreateTime string - } - data := User{ - Id: 1, - Passport: "user_1", - Password: "pass_1", - Nickname: "name_1", - CreateTime: "2020-10-10 12:00:01", - } - _, err := db.Model(table).Data(data).Insert() - t.AssertNil(err) + gtest.C(t, func(t *gtest.T) { + type User struct { + Id int + Passport string + Password string + Nickname string + CreateTime string + } + data := User{ + Id: 1, + Passport: "user_1", + Password: "pass_1", + Nickname: "name_1", + CreateTime: "2020-10-10 12:00:01", + } + _, err := db.Model(table).Data(data).Insert() + t.AssertNil(err) - one, err := db.Model(table).WherePri(1).One() - t.AssertNil(err) - t.Assert(one["passport"], data.Passport) - t.Assert(one["create_time"], data.CreateTime) - t.Assert(one["nickname"], data.Nickname) - }) + one, err := db.Model(table).WherePri(1).One() + t.AssertNil(err) + t.Assert(one["passport"], data.Passport) + t.Assert(one["create_time"], data.CreateTime) + t.Assert(one["nickname"], data.Nickname) + }) } func Test_Model_Update_KeyFieldNameMapping(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - type User struct { - Id int - Passport string - Password string - Nickname string - CreateTime string - } - data := User{ - Id: 1, - Passport: "user_10", - Password: "pass_10", - Nickname: "name_10", - CreateTime: "2020-10-10 12:00:01", - } - _, err := db.Model(table).Data(data).WherePri(1).Update() - t.AssertNil(err) + gtest.C(t, func(t *gtest.T) { + type User struct { + Id int + Passport string + Password string + Nickname string + CreateTime string + } + data := User{ + Id: 1, + Passport: "user_10", + Password: "pass_10", + Nickname: "name_10", + CreateTime: "2020-10-10 12:00:01", + } + _, err := db.Model(table).Data(data).WherePri(1).Update() + t.AssertNil(err) - one, err := db.Model(table).WherePri(1).One() - t.AssertNil(err) - t.Assert(one["passport"], data.Passport) - t.Assert(one["create_time"], data.CreateTime) - t.Assert(one["nickname"], data.Nickname) - }) + one, err := db.Model(table).WherePri(1).One() + t.AssertNil(err) + t.Assert(one["passport"], data.Passport) + t.Assert(one["create_time"], data.CreateTime) + t.Assert(one["nickname"], data.Nickname) + }) } func Test_Model_Insert_Time(t *testing.T) { - table := createTable() - defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - data := g.Map{ - "id": 1, - "passport": "t1", - "password": "p1", - "nickname": "n1", - "create_time": "2020-10-10 20:09:18.334", - } - _, err := db.Model(table).Data(data).Insert() - t.AssertNil(err) + table := createTable() + defer dropTable(table) + gtest.C(t, func(t *gtest.T) { + data := g.Map{ + "id": 1, + "passport": "t1", + "password": "p1", + "nickname": "n1", + "create_time": "2020-10-10 20:09:18.334", + } + _, err := db.Model(table).Data(data).Insert() + t.AssertNil(err) - one, err := db.Model(table).One("id", 1) - t.AssertNil(err) - t.Assert(one["passport"], data["passport"]) - t.Assert(one["create_time"], "2020-10-10 20:09:18") - t.Assert(one["nickname"], data["nickname"]) - }) + one, err := db.Model(table).One("id", 1) + t.AssertNil(err) + t.Assert(one["passport"], data["passport"]) + t.Assert(one["create_time"], "2020-10-10 20:09:18") + t.Assert(one["nickname"], data["nickname"]) + }) } func Test_Model_BatchInsertWithArrayStruct(t *testing.T) { - table := createTable() - defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - user := db.Model(table) - array := garray.New() - for i := 1; i <= TableSize; i++ { - array.Append(g.Map{ - "id": i, - "uid": i, - "passport": fmt.Sprintf("t%d", i), - "password": "25d55ad283aa400af464c76d713c07ad", - "nickname": fmt.Sprintf("name_%d", i), - "create_time": gtime.Now().String(), - }) - } + table := createTable() + defer dropTable(table) + gtest.C(t, func(t *gtest.T) { + user := db.Model(table) + array := garray.New() + for i := 1; i <= TableSize; i++ { + array.Append(g.Map{ + "id": i, + "uid": i, + "passport": fmt.Sprintf("t%d", i), + "password": "25d55ad283aa400af464c76d713c07ad", + "nickname": fmt.Sprintf("name_%d", i), + "create_time": gtime.Now().String(), + }) + } - result, err := user.Data(array).Insert() - t.AssertNil(err) - n, _ := result.LastInsertId() - t.Assert(n, TableSize) - }) + result, err := user.Data(array).Insert() + t.AssertNil(err) + n, _ := result.LastInsertId() + t.Assert(n, TableSize) + }) } func Test_Model_InsertIgnore(t *testing.T) { - table := createInitTable() - defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - _, err := db.Model(table).Data(g.Map{ - "id": 1, - "uid": 1, - "passport": "t1", - "password": "25d55ad283aa400af464c76d713c07ad", - "nickname": "name_1", - "create_time": gtime.Now().String(), - }).Insert() - t.AssertNE(err, nil) - }) - gtest.C(t, func(t *gtest.T) { - _, err := db.Model(table).Data(g.Map{ - "id": 1, - "uid": 1, - "passport": "t1", - "password": "25d55ad283aa400af464c76d713c07ad", - "nickname": "name_1", - "create_time": gtime.Now().String(), - }).InsertIgnore() - t.AssertNil(err) - }) + table := createInitTable() + defer dropTable(table) + gtest.C(t, func(t *gtest.T) { + _, err := db.Model(table).Data(g.Map{ + "id": 1, + "uid": 1, + "passport": "t1", + "password": "25d55ad283aa400af464c76d713c07ad", + "nickname": "name_1", + "create_time": gtime.Now().String(), + }).Insert() + t.AssertNE(err, nil) + }) + gtest.C(t, func(t *gtest.T) { + _, err := db.Model(table).Data(g.Map{ + "id": 1, + "uid": 1, + "passport": "t1", + "password": "25d55ad283aa400af464c76d713c07ad", + "nickname": "name_1", + "create_time": gtime.Now().String(), + }).InsertIgnore() + t.AssertNil(err) + }) } func Test_Model_Batch(t *testing.T) { - // batch insert - gtest.C(t, func(t *gtest.T) { - table := createTable() - defer dropTable(table) - result, err := db.Model(table).Data(g.List{ - { - "id": 2, - "uid": 2, - "passport": "t2", - "password": "25d55ad283aa400af464c76d713c07ad", - "nickname": "name_2", - "create_time": gtime.Now().String(), - }, - { - "id": 3, - "uid": 3, - "passport": "t3", - "password": "25d55ad283aa400af464c76d713c07ad", - "nickname": "name_3", - "create_time": gtime.Now().String(), - }, - }).Batch(1).Insert() - if err != nil { - gtest.Error(err) - } - n, _ := result.RowsAffected() - t.Assert(n, 2) - }) + // batch insert + gtest.C(t, func(t *gtest.T) { + table := createTable() + defer dropTable(table) + result, err := db.Model(table).Data(g.List{ + { + "id": 2, + "uid": 2, + "passport": "t2", + "password": "25d55ad283aa400af464c76d713c07ad", + "nickname": "name_2", + "create_time": gtime.Now().String(), + }, + { + "id": 3, + "uid": 3, + "passport": "t3", + "password": "25d55ad283aa400af464c76d713c07ad", + "nickname": "name_3", + "create_time": gtime.Now().String(), + }, + }).Batch(1).Insert() + if err != nil { + gtest.Error(err) + } + n, _ := result.RowsAffected() + t.Assert(n, 2) + }) - // batch insert, retrieving last insert auto-increment id. - gtest.C(t, func(t *gtest.T) { - table := createTable() - defer dropTable(table) - result, err := db.Model(table).Data(g.List{ - {"passport": "t1"}, - {"passport": "t2"}, - {"passport": "t3"}, - {"passport": "t4"}, - {"passport": "t5"}, - }).Batch(2).Insert() - if err != nil { - gtest.Error(err) - } - n, _ := result.RowsAffected() - t.Assert(n, 5) - }) + // batch insert, retrieving last insert auto-increment id. + gtest.C(t, func(t *gtest.T) { + table := createTable() + defer dropTable(table) + result, err := db.Model(table).Data(g.List{ + {"passport": "t1"}, + {"passport": "t2"}, + {"passport": "t3"}, + {"passport": "t4"}, + {"passport": "t5"}, + }).Batch(2).Insert() + if err != nil { + gtest.Error(err) + } + n, _ := result.RowsAffected() + t.Assert(n, 5) + }) - // batch save - gtest.C(t, func(t *gtest.T) { - table := createInitTable() - defer dropTable(table) - result, err := db.Model(table).All() - t.AssertNil(err) - t.Assert(len(result), TableSize) - for _, v := range result { - v["nickname"].Set(v["nickname"].String() + v["id"].String()) - } - r, e := db.Model(table).Data(result).Save() - t.Assert(e, nil) - n, e := r.RowsAffected() - t.Assert(e, nil) - t.Assert(n, TableSize*2) - }) + // batch save + gtest.C(t, func(t *gtest.T) { + table := createInitTable() + defer dropTable(table) + result, err := db.Model(table).All() + t.AssertNil(err) + t.Assert(len(result), TableSize) + for _, v := range result { + v["nickname"].Set(v["nickname"].String() + v["id"].String()) + } + r, e := db.Model(table).Data(result).Save() + t.Assert(e, nil) + n, e := r.RowsAffected() + t.Assert(e, nil) + t.Assert(n, TableSize*2) + }) - // batch replace - gtest.C(t, func(t *gtest.T) { - table := createInitTable() - defer dropTable(table) - result, err := db.Model(table).All() - t.AssertNil(err) - t.Assert(len(result), TableSize) - for _, v := range result { - v["nickname"].Set(v["nickname"].String() + v["id"].String()) - } - r, e := db.Model(table).Data(result).Replace() - t.Assert(e, nil) - n, e := r.RowsAffected() - t.Assert(e, nil) - t.Assert(n, TableSize*2) - }) + // batch replace + gtest.C(t, func(t *gtest.T) { + table := createInitTable() + defer dropTable(table) + result, err := db.Model(table).All() + t.AssertNil(err) + t.Assert(len(result), TableSize) + for _, v := range result { + v["nickname"].Set(v["nickname"].String() + v["id"].String()) + } + r, e := db.Model(table).Data(result).Replace() + t.Assert(e, nil) + n, e := r.RowsAffected() + t.Assert(e, nil) + t.Assert(n, TableSize*2) + }) } func Test_Model_Replace(t *testing.T) { - table := createTable() - defer dropTable(table) + table := createTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).Data(g.Map{ - "id": 1, - "passport": "t11", - "password": "25d55ad283aa400af464c76d713c07ad", - "nickname": "T11", - "create_time": "2018-10-24 10:00:00", - }).Replace() - t.AssertNil(err) - n, _ := result.RowsAffected() - t.Assert(n, 1) - }) + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).Data(g.Map{ + "id": 1, + "passport": "t11", + "password": "25d55ad283aa400af464c76d713c07ad", + "nickname": "T11", + "create_time": "2018-10-24 10:00:00", + }).Replace() + t.AssertNil(err) + n, _ := result.RowsAffected() + t.Assert(n, 1) + }) } func Test_Model_Save(t *testing.T) { - table := createTable() - defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).Data(g.Map{ - "id": 1, - "passport": "t111", - "password": "25d55ad283aa400af464c76d713c07ad", - "nickname": "T111", - "create_time": "2018-10-24 10:00:00", - }).Save() - t.AssertNil(err) - n, _ := result.RowsAffected() - t.Assert(n, 1) - }) + table := createTable() + defer dropTable(table) + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).Data(g.Map{ + "id": 1, + "passport": "t111", + "password": "25d55ad283aa400af464c76d713c07ad", + "nickname": "T111", + "create_time": "2018-10-24 10:00:00", + }).Save() + t.AssertNil(err) + n, _ := result.RowsAffected() + t.Assert(n, 1) + }) } func Test_Model_Update(t *testing.T) { - table := createInitTable() - defer dropTable(table) - // UPDATE...LIMIT - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).Data("nickname", "T100").Where(1).Order("id desc").Limit(2).Update() - t.AssertNil(err) - n, _ := result.RowsAffected() - t.Assert(n, 2) + table := createInitTable() + defer dropTable(table) + // UPDATE...LIMIT + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).Data("nickname", "T100").Where(1).Order("id desc").Limit(2).Update() + t.AssertNil(err) + n, _ := result.RowsAffected() + t.Assert(n, 2) - v1, err := db.Model(table).Fields("nickname").Where("id", 10).Value() - t.AssertNil(err) - t.Assert(v1.String(), "T100") + v1, err := db.Model(table).Fields("nickname").Where("id", 10).Value() + t.AssertNil(err) + t.Assert(v1.String(), "T100") - v2, err := db.Model(table).Fields("nickname").Where("id", 8).Value() - t.AssertNil(err) - t.Assert(v2.String(), "name_8") - }) + v2, err := db.Model(table).Fields("nickname").Where("id", 8).Value() + t.AssertNil(err) + t.Assert(v2.String(), "name_8") + }) - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).Data("passport", "user_22").Where("passport=?", "user_2").Update() - t.AssertNil(err) - n, _ := result.RowsAffected() - t.Assert(n, 1) - }) + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).Data("passport", "user_22").Where("passport=?", "user_2").Update() + t.AssertNil(err) + n, _ := result.RowsAffected() + t.Assert(n, 1) + }) - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).Data("passport", "user_2").Where("passport='user_22'").Update() - t.AssertNil(err) - n, _ := result.RowsAffected() - t.Assert(n, 1) - }) + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).Data("passport", "user_2").Where("passport='user_22'").Update() + t.AssertNil(err) + n, _ := result.RowsAffected() + t.Assert(n, 1) + }) - // Update + Data(string) - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).Data("passport='user_33'").Where("passport='user_3'").Update() - t.AssertNil(err) - n, _ := result.RowsAffected() - t.Assert(n, 1) - }) - // Update + Fields(string) - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).Fields("passport").Data(g.Map{ - "passport": "user_44", - "none": "none", - }).Where("passport='user_4'").Update() - t.AssertNil(err) - n, _ := result.RowsAffected() - t.Assert(n, 1) - }) + // Update + Data(string) + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).Data("passport='user_33'").Where("passport='user_3'").Update() + t.AssertNil(err) + n, _ := result.RowsAffected() + t.Assert(n, 1) + }) + // Update + Fields(string) + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).Fields("passport").Data(g.Map{ + "passport": "user_44", + "none": "none", + }).Where("passport='user_4'").Update() + t.AssertNil(err) + n, _ := result.RowsAffected() + t.Assert(n, 1) + }) } func Test_Model_UpdateAndGetAffected(t *testing.T) { - table := createInitTable() - defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - n, err := db.Model(table).Data("nickname", "T100"). - Where(1).Order("id desc").Limit(2). - UpdateAndGetAffected() - t.AssertNil(err) - t.Assert(n, 2) - }) + table := createInitTable() + defer dropTable(table) + gtest.C(t, func(t *gtest.T) { + n, err := db.Model(table).Data("nickname", "T100"). + Where(1).Order("id desc").Limit(2). + UpdateAndGetAffected() + t.AssertNil(err) + t.Assert(n, 2) + }) } func Test_Model_Clone(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - md := db.Model(table).Safe(true).Where("id IN(?)", g.Slice{1, 3}) - count, err := md.Count() - t.AssertNil(err) + gtest.C(t, func(t *gtest.T) { + md := db.Model(table).Safe(true).Where("id IN(?)", g.Slice{1, 3}) + count, err := md.Count() + t.AssertNil(err) - record, err := md.Safe(true).Order("id DESC").One() - t.AssertNil(err) + record, err := md.Safe(true).Order("id DESC").One() + t.AssertNil(err) - result, err := md.Safe(true).Order("id ASC").All() - t.AssertNil(err) + result, err := md.Safe(true).Order("id ASC").All() + t.AssertNil(err) - t.Assert(count, int64(2)) - t.Assert(record["id"].Int(), 3) - t.Assert(len(result), 2) - t.Assert(result[0]["id"].Int(), 1) - t.Assert(result[1]["id"].Int(), 3) - }) + t.Assert(count, int64(2)) + t.Assert(record["id"].Int(), 3) + t.Assert(len(result), 2) + t.Assert(result[0]["id"].Int(), 1) + t.Assert(result[1]["id"].Int(), 3) + }) } func Test_Model_Safe(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - md := db.Model(table).Safe(false).Where("id IN(?)", g.Slice{1, 3}) - count, err := md.Count() - t.AssertNil(err) - t.Assert(count, int64(2)) + gtest.C(t, func(t *gtest.T) { + md := db.Model(table).Safe(false).Where("id IN(?)", g.Slice{1, 3}) + count, err := md.Count() + t.AssertNil(err) + t.Assert(count, int64(2)) - md.Where("id = ?", 1) - count, err = md.Count() - t.AssertNil(err) - t.Assert(count, int64(1)) - }) - gtest.C(t, func(t *gtest.T) { - md := db.Model(table).Safe(true).Where("id IN(?)", g.Slice{1, 3}) - count, err := md.Count() - t.AssertNil(err) - t.Assert(count, int64(2)) + md.Where("id = ?", 1) + count, err = md.Count() + t.AssertNil(err) + t.Assert(count, int64(1)) + }) + gtest.C(t, func(t *gtest.T) { + md := db.Model(table).Safe(true).Where("id IN(?)", g.Slice{1, 3}) + count, err := md.Count() + t.AssertNil(err) + t.Assert(count, int64(2)) - md.Where("id = ?", 1) - count, err = md.Count() - t.AssertNil(err) - t.Assert(count, int64(2)) - }) + md.Where("id = ?", 1) + count, err = md.Count() + t.AssertNil(err) + t.Assert(count, int64(2)) + }) - gtest.C(t, func(t *gtest.T) { - md := db.Model(table).Safe().Where("id IN(?)", g.Slice{1, 3}) - count, err := md.Count() - t.AssertNil(err) - t.Assert(count, int64(2)) + gtest.C(t, func(t *gtest.T) { + md := db.Model(table).Safe().Where("id IN(?)", g.Slice{1, 3}) + count, err := md.Count() + t.AssertNil(err) + t.Assert(count, int64(2)) - md.Where("id = ?", 1) - count, err = md.Count() - t.AssertNil(err) - t.Assert(count, int64(2)) - }) - gtest.C(t, func(t *gtest.T) { - md1 := db.Model(table).Safe() - md2 := md1.Where("id in (?)", g.Slice{1, 3}) - count, err := md2.Count() - t.AssertNil(err) - t.Assert(count, int64(2)) + md.Where("id = ?", 1) + count, err = md.Count() + t.AssertNil(err) + t.Assert(count, int64(2)) + }) + gtest.C(t, func(t *gtest.T) { + md1 := db.Model(table).Safe() + md2 := md1.Where("id in (?)", g.Slice{1, 3}) + count, err := md2.Count() + t.AssertNil(err) + t.Assert(count, int64(2)) - all, err := md2.All() - t.AssertNil(err) - t.Assert(len(all), 2) + all, err := md2.All() + t.AssertNil(err) + t.Assert(len(all), 2) - all, err = md2.Page(1, 10).All() - t.AssertNil(err) - t.Assert(len(all), 2) - }) + all, err = md2.Page(1, 10).All() + t.AssertNil(err) + t.Assert(len(all), 2) + }) - gtest.C(t, func(t *gtest.T) { - table := createInitTable() - defer dropTable(table) + gtest.C(t, func(t *gtest.T) { + table := createInitTable() + defer dropTable(table) - md1 := db.Model(table).Where("id>", 0).Safe() - md2 := md1.Where("id in (?)", g.Slice{1, 3}) - md3 := md1.Where("id in (?)", g.Slice{4, 5, 6}) + md1 := db.Model(table).Where("id>", 0).Safe() + md2 := md1.Where("id in (?)", g.Slice{1, 3}) + md3 := md1.Where("id in (?)", g.Slice{4, 5, 6}) - // 1,3 - count, err := md2.Count() - t.AssertNil(err) - t.Assert(count, int64(2)) + // 1,3 + count, err := md2.Count() + t.AssertNil(err) + t.Assert(count, int64(2)) - all, err := md2.Order("id asc").All() - t.AssertNil(err) - t.Assert(len(all), 2) - t.Assert(all[0]["id"].Int(), 1) - t.Assert(all[1]["id"].Int(), 3) + all, err := md2.Order("id asc").All() + t.AssertNil(err) + t.Assert(len(all), 2) + t.Assert(all[0]["id"].Int(), 1) + t.Assert(all[1]["id"].Int(), 3) - all, err = md2.Page(1, 10).All() - t.AssertNil(err) - t.Assert(len(all), 2) + all, err = md2.Page(1, 10).All() + t.AssertNil(err) + t.Assert(len(all), 2) - // 4,5,6 - count, err = md3.Count() - t.AssertNil(err) - t.Assert(count, int64(3)) + // 4,5,6 + count, err = md3.Count() + t.AssertNil(err) + t.Assert(count, int64(3)) - all, err = md3.Order("id asc").All() - t.AssertNil(err) - t.Assert(len(all), 3) - t.Assert(all[0]["id"].Int(), 4) - t.Assert(all[1]["id"].Int(), 5) - t.Assert(all[2]["id"].Int(), 6) + all, err = md3.Order("id asc").All() + t.AssertNil(err) + t.Assert(len(all), 3) + t.Assert(all[0]["id"].Int(), 4) + t.Assert(all[1]["id"].Int(), 5) + t.Assert(all[2]["id"].Int(), 6) - all, err = md3.Page(1, 10).All() - t.AssertNil(err) - t.Assert(len(all), 3) - }) + all, err = md3.Page(1, 10).All() + t.AssertNil(err) + t.Assert(len(all), 3) + }) } func Test_Model_All(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).All() - t.AssertNil(err) - t.Assert(len(result), TableSize) - }) - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).Where("id<0").All() - t.Assert(result, nil) - t.AssertNil(err) - }) + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).All() + t.AssertNil(err) + t.Assert(len(result), TableSize) + }) + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).Where("id<0").All() + t.Assert(result, nil) + t.AssertNil(err) + }) } func Test_Model_Fields(t *testing.T) { - tableName1 := createInitTable() - defer dropTable(tableName1) + tableName1 := createInitTable() + defer dropTable(tableName1) - tableName2 := "user_" + gtime.Now().TimestampNanoStr() - if _, err := db.Exec(ctx, fmt.Sprintf(` + tableName2 := "user_" + gtime.Now().TimestampNanoStr() + if _, err := db.Exec(ctx, fmt.Sprintf(` CREATE TABLE %s ( id int(10) unsigned NOT NULL AUTO_INCREMENT, name varchar(45) NULL, @@ -593,1921 +592,1924 @@ func Test_Model_Fields(t *testing.T) { PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; `, tableName2, - )); err != nil { - gtest.AssertNil(err) - } - defer dropTable(tableName2) + )); err != nil { + gtest.AssertNil(err) + } + defer dropTable(tableName2) - r, err := db.Insert(ctx, tableName2, g.Map{ - "id": 1, - "name": "table2_1", - "age": 18, - }) - gtest.AssertNil(err) - n, _ := r.RowsAffected() - gtest.Assert(n, 1) + r, err := db.Insert(ctx, tableName2, g.Map{ + "id": 1, + "name": "table2_1", + "age": 18, + }) + gtest.AssertNil(err) + n, _ := r.RowsAffected() + gtest.Assert(n, 1) - gtest.C(t, func(t *gtest.T) { - all, err := db.Model(tableName1).As("u").Fields("u.passport,u.id").Where("u.id<2").All() - t.AssertNil(err) - t.Assert(len(all), 1) - t.Assert(len(all[0]), 2) - }) - gtest.C(t, func(t *gtest.T) { - all, err := db.Model(tableName1).As("u1"). - LeftJoin(tableName1, "u2", "u2.id=u1.id"). - Fields("u1.passport,u1.id,u2.id AS u2id"). - Where("u1.id<2"). - All() - t.AssertNil(err) - t.Assert(len(all), 1) - t.Assert(len(all[0]), 3) - }) - gtest.C(t, func(t *gtest.T) { - all, err := db.Model(tableName1).As("u1"). - LeftJoin(tableName2, "u2", "u2.id=u1.id"). - Fields("u1.passport,u1.id,u2.name,u2.age"). - Where("u1.id<2"). - All() - t.AssertNil(err) - t.Assert(len(all), 1) - t.Assert(len(all[0]), 4) - t.Assert(all[0]["id"], 1) - t.Assert(all[0]["age"], 18) - t.Assert(all[0]["name"], "table2_1") - t.Assert(all[0]["passport"], "user_1") - }) + gtest.C(t, func(t *gtest.T) { + all, err := db.Model(tableName1).As("u").Fields("u.passport,u.id").Where("u.id<2").All() + t.AssertNil(err) + t.Assert(len(all), 1) + t.Assert(len(all[0]), 2) + }) + gtest.C(t, func(t *gtest.T) { + all, err := db.Model(tableName1).As("u1"). + LeftJoin(tableName1, "u2", "u2.id=u1.id"). + Fields("u1.passport,u1.id,u2.id AS u2id"). + Where("u1.id<2"). + All() + t.AssertNil(err) + t.Assert(len(all), 1) + t.Assert(len(all[0]), 3) + }) + gtest.C(t, func(t *gtest.T) { + all, err := db.Model(tableName1).As("u1"). + LeftJoin(tableName2, "u2", "u2.id=u1.id"). + Fields("u1.passport,u1.id,u2.name,u2.age"). + Where("u1.id<2"). + All() + t.AssertNil(err) + t.Assert(len(all), 1) + t.Assert(len(all[0]), 4) + t.Assert(all[0]["id"], 1) + t.Assert(all[0]["age"], 18) + t.Assert(all[0]["name"], "table2_1") + t.Assert(all[0]["passport"], "user_1") + }) } func Test_Model_One(t *testing.T) { - table := createInitTable() - defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - record, err := db.Model(table).Where("id", 1).One() - t.AssertNil(err) - t.Assert(record["nickname"].String(), "name_1") - }) + table := createInitTable() + defer dropTable(table) + gtest.C(t, func(t *gtest.T) { + record, err := db.Model(table).Where("id", 1).One() + t.AssertNil(err) + t.Assert(record["nickname"].String(), "name_1") + }) - gtest.C(t, func(t *gtest.T) { - record, err := db.Model(table).Where("id", 0).One() - t.AssertNil(err) - t.Assert(record, nil) - }) + gtest.C(t, func(t *gtest.T) { + record, err := db.Model(table).Where("id", 0).One() + t.AssertNil(err) + t.Assert(record, nil) + }) } func Test_Model_Value(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - value, err := db.Model(table).Fields("nickname").Where("id", 1).Value() - t.AssertNil(err) - t.Assert(value.String(), "name_1") - }) + gtest.C(t, func(t *gtest.T) { + value, err := db.Model(table).Fields("nickname").Where("id", 1).Value() + t.AssertNil(err) + t.Assert(value.String(), "name_1") + }) - gtest.C(t, func(t *gtest.T) { - value, err := db.Model(table).Fields("nickname").Where("id", 0).Value() - t.AssertNil(err) - t.Assert(value, nil) - }) + gtest.C(t, func(t *gtest.T) { + value, err := db.Model(table).Fields("nickname").Where("id", 0).Value() + t.AssertNil(err) + t.Assert(value, nil) + }) } func Test_Model_Array(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - all, err := db.Model(table).Where("id", g.Slice{1, 2, 3}).All() - t.AssertNil(err) - t.Assert(all.Array("id"), g.Slice{1, 2, 3}) - t.Assert(all.Array("nickname"), g.Slice{"name_1", "name_2", "name_3"}) - }) - gtest.C(t, func(t *gtest.T) { - array, err := db.Model(table).Fields("nickname").Where("id", g.Slice{1, 2, 3}).Array() - t.AssertNil(err) - t.Assert(array, g.Slice{"name_1", "name_2", "name_3"}) - }) - gtest.C(t, func(t *gtest.T) { - array, err := db.Model(table).Array("nickname", "id", g.Slice{1, 2, 3}) - t.AssertNil(err) - t.Assert(array, g.Slice{"name_1", "name_2", "name_3"}) - }) + gtest.C(t, func(t *gtest.T) { + all, err := db.Model(table).Where("id", g.Slice{1, 2, 3}).All() + t.AssertNil(err) + t.Assert(all.Array("id"), g.Slice{1, 2, 3}) + t.Assert(all.Array("nickname"), g.Slice{"name_1", "name_2", "name_3"}) + }) + + gtest.C(t, func(t *gtest.T) { + array, err := db.Model(table).Fields("nickname").Where("id", g.Slice{1, 2, 3}).Array() + t.AssertNil(err) + t.Assert(array, g.Slice{"name_1", "name_2", "name_3"}) + }) + gtest.C(t, func(t *gtest.T) { + array, err := db.Model(table).Array("nickname", "id", g.Slice{1, 2, 3}) + t.AssertNil(err) + t.Assert(array, g.Slice{"name_1", "name_2", "name_3"}) + }) } func Test_Model_Count(t *testing.T) { - table := createInitTable() - defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - count, err := db.Model(table).Count() - t.AssertNil(err) - t.Assert(count, int64(TableSize)) - }) - // Count with cache, check internal ctx data feature. - gtest.C(t, func(t *gtest.T) { - for i := 0; i < 10; i++ { - count, err := db.Model(table).Cache(gdb.CacheOption{ - Duration: time.Second * 10, - Name: guid.S(), - Force: false, - }).Count() - t.AssertNil(err) - t.Assert(count, int64(TableSize)) - } - }) - gtest.C(t, func(t *gtest.T) { - count, err := db.Model(table).FieldsEx("id").Where("id>8").Count() - t.AssertNil(err) - t.Assert(count, int64(2)) - }) - gtest.C(t, func(t *gtest.T) { - count, err := db.Model(table).Fields("distinct id,nickname").Where("id>8").Count() - t.AssertNil(err) - t.Assert(count, int64(2)) - }) - // COUNT...LIMIT... - gtest.C(t, func(t *gtest.T) { - count, err := db.Model(table).Page(1, 2).Count() - t.AssertNil(err) - t.Assert(count, int64(TableSize)) - }) + table := createInitTable() + defer dropTable(table) + gtest.C(t, func(t *gtest.T) { + count, err := db.Model(table).Count() + t.AssertNil(err) + t.Assert(count, int64(TableSize)) + }) + // Count with cache, check internal ctx data feature. + gtest.C(t, func(t *gtest.T) { + for i := 0; i < 10; i++ { + count, err := db.Model(table).Cache(gdb.CacheOption{ + Duration: time.Second * 10, + Name: guid.S(), + Force: false, + }).Count() + t.AssertNil(err) + t.Assert(count, int64(TableSize)) + } + }) + gtest.C(t, func(t *gtest.T) { + count, err := db.Model(table).FieldsEx("id").Where("id>8").Count() + t.AssertNil(err) + t.Assert(count, int64(2)) + }) + gtest.C(t, func(t *gtest.T) { + count, err := db.Model(table).Fields("distinct id,nickname").Where("id>8").Count() + t.AssertNil(err) + t.Assert(count, int64(2)) + }) + // COUNT...LIMIT... + gtest.C(t, func(t *gtest.T) { + count, err := db.Model(table).Page(1, 2).Count() + t.AssertNil(err) + t.Assert(count, int64(TableSize)) + }) } func Test_Model_Exist(t *testing.T) { - table := createInitTable() - defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - exist, err := db.Model(table).Exist() - t.AssertNil(err) - t.Assert(exist, TableSize > 0) - exist, err = db.Model(table).Where("id", -1).Exist() - t.AssertNil(err) - t.Assert(exist, false) - }) + table := createInitTable() + defer dropTable(table) + gtest.C(t, func(t *gtest.T) { + exist, err := db.Model(table).Exist() + t.AssertNil(err) + t.Assert(exist, TableSize > 0) + exist, err = db.Model(table).Where("id", -1).Exist() + t.AssertNil(err) + t.Assert(exist, false) + }) } func Test_Model_Value_WithCache(t *testing.T) { - table := createTable() - defer dropTable(table) + table := createTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - value, err := db.Model(table).Where("id", 1).Cache(gdb.CacheOption{ - Duration: time.Second * 10, - Force: false, - }).Value() - t.AssertNil(err) - t.Assert(value.Int(), 0) - }) - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).Data(g.MapStrAny{ - "id": 1, - "passport": fmt.Sprintf(`passport_%d`, 1), - "password": fmt.Sprintf(`password_%d`, 1), - "nickname": fmt.Sprintf(`nickname_%d`, 1), - }).Insert() - t.AssertNil(err) - n, _ := result.RowsAffected() - t.Assert(n, 1) - }) - gtest.C(t, func(t *gtest.T) { - value, err := db.Model(table).Where("id", 1).Cache(gdb.CacheOption{ - Duration: time.Second * 10, - Force: false, - }).Value("id") - t.AssertNil(err) - t.Assert(value.Int(), 1) - }) + gtest.C(t, func(t *gtest.T) { + value, err := db.Model(table).Where("id", 1).Cache(gdb.CacheOption{ + Duration: time.Second * 10, + Force: false, + }).Value() + t.AssertNil(err) + t.Assert(value.Int(), 0) + }) + return + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).Data(g.MapStrAny{ + "id": 1, + "passport": fmt.Sprintf(`passport_%d`, 1), + "password": fmt.Sprintf(`password_%d`, 1), + "nickname": fmt.Sprintf(`nickname_%d`, 1), + }).Insert() + t.AssertNil(err) + n, _ := result.RowsAffected() + t.Assert(n, 1) + }) + gtest.C(t, func(t *gtest.T) { + value, err := db.Model(table).Where("id", 1).Cache(gdb.CacheOption{ + Duration: time.Second * 10, + Force: false, + }).Value("id") + t.AssertNil(err) + t.Assert(value.Int(), 1) + }) } func Test_Model_Count_WithCache(t *testing.T) { - table := createTable() - defer dropTable(table) + table := createTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - count, err := db.Model(table).Where("id", 1).Cache(gdb.CacheOption{ - Duration: time.Second * 10, - Force: false, - }).Count() - t.AssertNil(err) - t.Assert(count, int64(0)) - }) - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).Data(g.MapStrAny{ - "id": 1, - "passport": fmt.Sprintf(`passport_%d`, 1), - "password": fmt.Sprintf(`password_%d`, 1), - "nickname": fmt.Sprintf(`nickname_%d`, 1), - }).Insert() - t.AssertNil(err) - n, _ := result.RowsAffected() - t.Assert(n, 1) - }) - gtest.C(t, func(t *gtest.T) { - count, err := db.Model(table).Where("id", 1).Cache(gdb.CacheOption{ - Duration: time.Second * 10, - Force: false, - }).Count() - t.AssertNil(err) - t.Assert(count, int64(1)) - }) + gtest.C(t, func(t *gtest.T) { + count, err := db.Model(table).Where("id", 1).Cache(gdb.CacheOption{ + Duration: time.Second * 10, + Force: false, + }).Count() + t.AssertNil(err) + t.Assert(count, int64(0)) + }) + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).Data(g.MapStrAny{ + "id": 1, + "passport": fmt.Sprintf(`passport_%d`, 1), + "password": fmt.Sprintf(`password_%d`, 1), + "nickname": fmt.Sprintf(`nickname_%d`, 1), + }).Insert() + t.AssertNil(err) + n, _ := result.RowsAffected() + t.Assert(n, 1) + }) + gtest.C(t, func(t *gtest.T) { + count, err := db.Model(table).Where("id", 1).Cache(gdb.CacheOption{ + Duration: time.Second * 10, + Force: false, + }).Count() + t.AssertNil(err) + t.Assert(count, int64(1)) + }) } func Test_Model_Count_All_WithCache(t *testing.T) { - table := createTable() - defer dropTable(table) + table := createTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - count, err := db.Model(table).Cache(gdb.CacheOption{ - Duration: time.Second * 10, - Force: false, - }).Count() - t.AssertNil(err) - t.Assert(count, int64(0)) - }) - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).Data(g.MapStrAny{ - "id": 1, - "passport": fmt.Sprintf(`passport_%d`, 1), - "password": fmt.Sprintf(`password_%d`, 1), - "nickname": fmt.Sprintf(`nickname_%d`, 1), - }).Insert() - t.AssertNil(err) - n, _ := result.RowsAffected() - t.Assert(n, 1) - }) - gtest.C(t, func(t *gtest.T) { - count, err := db.Model(table).Cache(gdb.CacheOption{ - Duration: time.Second * 10, - Force: false, - }).Count() - t.AssertNil(err) - t.Assert(count, int64(1)) - }) - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).Data(g.MapStrAny{ - "id": 2, - "passport": fmt.Sprintf(`passport_%d`, 2), - "password": fmt.Sprintf(`password_%d`, 2), - "nickname": fmt.Sprintf(`nickname_%d`, 2), - }).Insert() - t.AssertNil(err) - n, _ := result.RowsAffected() - t.Assert(n, 1) - }) - gtest.C(t, func(t *gtest.T) { - count, err := db.Model(table).Cache(gdb.CacheOption{ - Duration: time.Second * 10, - Force: false, - }).Count() - t.AssertNil(err) - t.Assert(count, int64(1)) - }) + gtest.C(t, func(t *gtest.T) { + count, err := db.Model(table).Cache(gdb.CacheOption{ + Duration: time.Second * 10, + Force: false, + }).Count() + t.AssertNil(err) + t.Assert(count, int64(0)) + }) + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).Data(g.MapStrAny{ + "id": 1, + "passport": fmt.Sprintf(`passport_%d`, 1), + "password": fmt.Sprintf(`password_%d`, 1), + "nickname": fmt.Sprintf(`nickname_%d`, 1), + }).Insert() + t.AssertNil(err) + n, _ := result.RowsAffected() + t.Assert(n, 1) + }) + gtest.C(t, func(t *gtest.T) { + count, err := db.Model(table).Cache(gdb.CacheOption{ + Duration: time.Second * 10, + Force: false, + }).Count() + t.AssertNil(err) + t.Assert(count, int64(1)) + }) + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).Data(g.MapStrAny{ + "id": 2, + "passport": fmt.Sprintf(`passport_%d`, 2), + "password": fmt.Sprintf(`password_%d`, 2), + "nickname": fmt.Sprintf(`nickname_%d`, 2), + }).Insert() + t.AssertNil(err) + n, _ := result.RowsAffected() + t.Assert(n, 1) + }) + gtest.C(t, func(t *gtest.T) { + count, err := db.Model(table).Cache(gdb.CacheOption{ + Duration: time.Second * 10, + Force: false, + }).Count() + t.AssertNil(err) + t.Assert(count, int64(1)) + }) } func Test_Model_CountColumn_WithCache(t *testing.T) { - table := createTable() - defer dropTable(table) + table := createTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - count, err := db.Model(table).Where("id", 1).Cache(gdb.CacheOption{ - Duration: time.Second * 10, - Force: false, - }).CountColumn("id") - t.AssertNil(err) - t.Assert(count, int64(0)) - }) - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).Data(g.MapStrAny{ - "id": 1, - "passport": fmt.Sprintf(`passport_%d`, 1), - "password": fmt.Sprintf(`password_%d`, 1), - "nickname": fmt.Sprintf(`nickname_%d`, 1), - }).Insert() - t.AssertNil(err) - n, _ := result.RowsAffected() - t.Assert(n, 1) - }) - gtest.C(t, func(t *gtest.T) { - count, err := db.Model(table).Where("id", 1).Cache(gdb.CacheOption{ - Duration: time.Second * 10, - Force: false, - }).CountColumn("id") - t.AssertNil(err) - t.Assert(count, int64(1)) - }) + gtest.C(t, func(t *gtest.T) { + count, err := db.Model(table).Where("id", 1).Cache(gdb.CacheOption{ + Duration: time.Second * 10, + Force: false, + }).CountColumn("id") + t.AssertNil(err) + t.Assert(count, int64(0)) + }) + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).Data(g.MapStrAny{ + "id": 1, + "passport": fmt.Sprintf(`passport_%d`, 1), + "password": fmt.Sprintf(`password_%d`, 1), + "nickname": fmt.Sprintf(`nickname_%d`, 1), + }).Insert() + t.AssertNil(err) + n, _ := result.RowsAffected() + t.Assert(n, 1) + }) + gtest.C(t, func(t *gtest.T) { + count, err := db.Model(table).Where("id", 1).Cache(gdb.CacheOption{ + Duration: time.Second * 10, + Force: false, + }).CountColumn("id") + t.AssertNil(err) + t.Assert(count, int64(1)) + }) } func Test_Model_Select(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - type User struct { - Id int - Passport string - Password string - NickName string - CreateTime gtime.Time - } - gtest.C(t, func(t *gtest.T) { - var users []User - err := db.Model(table).Scan(&users) - t.AssertNil(err) - t.Assert(len(users), TableSize) - }) + type User struct { + Id int + Passport string + Password string + NickName string + CreateTime gtime.Time + } + gtest.C(t, func(t *gtest.T) { + var users []User + err := db.Model(table).Scan(&users) + t.AssertNil(err) + t.Assert(len(users), TableSize) + }) } func Test_Model_Struct(t *testing.T) { - table := createInitTable() - defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - type User struct { - Id int - Passport string - Password string - NickName string - CreateTime gtime.Time - } - user := new(User) - err := db.Model(table).Where("id=1").Scan(user) - t.AssertNil(err) - t.Assert(user.NickName, "name_1") - t.Assert(user.CreateTime.String(), "2018-10-24 10:00:00") - }) - gtest.C(t, func(t *gtest.T) { - type User struct { - Id int - Passport string - Password string - NickName string - CreateTime *gtime.Time - } - user := new(User) - err := db.Model(table).Where("id=1").Scan(user) - t.AssertNil(err) - t.Assert(user.NickName, "name_1") - t.Assert(user.CreateTime.String(), "2018-10-24 10:00:00") - }) - // Auto creating struct object. - gtest.C(t, func(t *gtest.T) { - type User struct { - Id int - Passport string - Password string - NickName string - CreateTime *gtime.Time - } - user := (*User)(nil) - err := db.Model(table).Where("id=1").Scan(&user) - t.AssertNil(err) - t.Assert(user.NickName, "name_1") - t.Assert(user.CreateTime.String(), "2018-10-24 10:00:00") - }) - // Just using Scan. - gtest.C(t, func(t *gtest.T) { - type User struct { - Id int - Passport string - Password string - NickName string - CreateTime *gtime.Time - } - user := (*User)(nil) - err := db.Model(table).Where("id=1").Scan(&user) - if err != nil { - gtest.Error(err) - } - t.Assert(user.NickName, "name_1") - t.Assert(user.CreateTime.String(), "2018-10-24 10:00:00") - }) - // sql.ErrNoRows - gtest.C(t, func(t *gtest.T) { - type User struct { - Id int - Passport string - Password string - NickName string - CreateTime *gtime.Time - } - user := new(User) - err := db.Model(table).Where("id=-1").Scan(user) - t.Assert(err, sql.ErrNoRows) - }) - gtest.C(t, func(t *gtest.T) { - type User struct { - Id int - Passport string - Password string - NickName string - CreateTime *gtime.Time - } - var user *User - err := db.Model(table).Where("id=-1").Scan(&user) - t.AssertNil(err) - }) + table := createInitTable() + defer dropTable(table) + gtest.C(t, func(t *gtest.T) { + type User struct { + Id int + Passport string + Password string + NickName string + CreateTime gtime.Time + } + user := new(User) + err := db.Model(table).Where("id=1").Scan(user) + t.AssertNil(err) + t.Assert(user.NickName, "name_1") + t.Assert(user.CreateTime.String(), "2018-10-24 10:00:00") + }) + gtest.C(t, func(t *gtest.T) { + type User struct { + Id int + Passport string + Password string + NickName string + CreateTime *gtime.Time + } + user := new(User) + err := db.Model(table).Where("id=1").Scan(user) + t.AssertNil(err) + t.Assert(user.NickName, "name_1") + t.Assert(user.CreateTime.String(), "2018-10-24 10:00:00") + }) + // Auto creating struct object. + gtest.C(t, func(t *gtest.T) { + type User struct { + Id int + Passport string + Password string + NickName string + CreateTime *gtime.Time + } + user := (*User)(nil) + err := db.Model(table).Where("id=1").Scan(&user) + t.AssertNil(err) + t.Assert(user.NickName, "name_1") + t.Assert(user.CreateTime.String(), "2018-10-24 10:00:00") + }) + // Just using Scan. + gtest.C(t, func(t *gtest.T) { + type User struct { + Id int + Passport string + Password string + NickName string + CreateTime *gtime.Time + } + user := (*User)(nil) + err := db.Model(table).Where("id=1").Scan(&user) + if err != nil { + gtest.Error(err) + } + t.Assert(user.NickName, "name_1") + t.Assert(user.CreateTime.String(), "2018-10-24 10:00:00") + }) + // sql.ErrNoRows + gtest.C(t, func(t *gtest.T) { + type User struct { + Id int + Passport string + Password string + NickName string + CreateTime *gtime.Time + } + user := new(User) + err := db.Model(table).Where("id=-1").Scan(user) + t.Assert(err, sql.ErrNoRows) + }) + gtest.C(t, func(t *gtest.T) { + type User struct { + Id int + Passport string + Password string + NickName string + CreateTime *gtime.Time + } + var user *User + err := db.Model(table).Where("id=-1").Scan(&user) + t.AssertNil(err) + }) } func Test_Model_Struct_CustomType(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - type MyInt int + type MyInt int - gtest.C(t, func(t *gtest.T) { - type User struct { - Id MyInt - Passport string - Password string - NickName string - CreateTime gtime.Time - } - user := new(User) - err := db.Model(table).Where("id=1").Scan(user) - t.AssertNil(err) - t.Assert(user.NickName, "name_1") - t.Assert(user.CreateTime.String(), "2018-10-24 10:00:00") - }) + gtest.C(t, func(t *gtest.T) { + type User struct { + Id MyInt + Passport string + Password string + NickName string + CreateTime gtime.Time + } + user := new(User) + err := db.Model(table).Where("id=1").Scan(user) + t.AssertNil(err) + t.Assert(user.NickName, "name_1") + t.Assert(user.CreateTime.String(), "2018-10-24 10:00:00") + }) } func Test_Model_Structs(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - type User struct { - Id int - Passport string - Password string - NickName string - CreateTime gtime.Time - } - var users []User - err := db.Model(table).Order("id asc").Scan(&users) - if err != nil { - gtest.Error(err) - } - t.Assert(len(users), TableSize) - t.Assert(users[0].Id, 1) - t.Assert(users[1].Id, 2) - t.Assert(users[2].Id, 3) - t.Assert(users[0].NickName, "name_1") - t.Assert(users[1].NickName, "name_2") - t.Assert(users[2].NickName, "name_3") - t.Assert(users[0].CreateTime.String(), "2018-10-24 10:00:00") - }) - // Auto create struct slice. - gtest.C(t, func(t *gtest.T) { - type User struct { - Id int - Passport string - Password string - NickName string - CreateTime *gtime.Time - } - var users []*User - err := db.Model(table).Order("id asc").Scan(&users) - if err != nil { - gtest.Error(err) - } - t.Assert(len(users), TableSize) - t.Assert(users[0].Id, 1) - t.Assert(users[1].Id, 2) - t.Assert(users[2].Id, 3) - t.Assert(users[0].NickName, "name_1") - t.Assert(users[1].NickName, "name_2") - t.Assert(users[2].NickName, "name_3") - t.Assert(users[0].CreateTime.String(), "2018-10-24 10:00:00") - }) - // Just using Scan. - gtest.C(t, func(t *gtest.T) { - type User struct { - Id int - Passport string - Password string - NickName string - CreateTime *gtime.Time - } - var users []*User - err := db.Model(table).Order("id asc").Scan(&users) - if err != nil { - gtest.Error(err) - } - t.Assert(len(users), TableSize) - t.Assert(users[0].Id, 1) - t.Assert(users[1].Id, 2) - t.Assert(users[2].Id, 3) - t.Assert(users[0].NickName, "name_1") - t.Assert(users[1].NickName, "name_2") - t.Assert(users[2].NickName, "name_3") - t.Assert(users[0].CreateTime.String(), "2018-10-24 10:00:00") - }) - // sql.ErrNoRows - gtest.C(t, func(t *gtest.T) { - type User struct { - Id int - Passport string - Password string - NickName string - CreateTime *gtime.Time - } - var users []*User - err := db.Model(table).Where("id<0").Scan(&users) - t.AssertNil(err) - }) + gtest.C(t, func(t *gtest.T) { + type User struct { + Id int + Passport string + Password string + NickName string + CreateTime gtime.Time + } + var users []User + err := db.Model(table).Order("id asc").Scan(&users) + if err != nil { + gtest.Error(err) + } + t.Assert(len(users), TableSize) + t.Assert(users[0].Id, 1) + t.Assert(users[1].Id, 2) + t.Assert(users[2].Id, 3) + t.Assert(users[0].NickName, "name_1") + t.Assert(users[1].NickName, "name_2") + t.Assert(users[2].NickName, "name_3") + t.Assert(users[0].CreateTime.String(), "2018-10-24 10:00:00") + }) + // Auto create struct slice. + gtest.C(t, func(t *gtest.T) { + type User struct { + Id int + Passport string + Password string + NickName string + CreateTime *gtime.Time + } + var users []*User + err := db.Model(table).Order("id asc").Scan(&users) + if err != nil { + gtest.Error(err) + } + t.Assert(len(users), TableSize) + t.Assert(users[0].Id, 1) + t.Assert(users[1].Id, 2) + t.Assert(users[2].Id, 3) + t.Assert(users[0].NickName, "name_1") + t.Assert(users[1].NickName, "name_2") + t.Assert(users[2].NickName, "name_3") + t.Assert(users[0].CreateTime.String(), "2018-10-24 10:00:00") + }) + // Just using Scan. + gtest.C(t, func(t *gtest.T) { + type User struct { + Id int + Passport string + Password string + NickName string + CreateTime *gtime.Time + } + var users []*User + err := db.Model(table).Order("id asc").Scan(&users) + if err != nil { + gtest.Error(err) + } + t.Assert(len(users), TableSize) + t.Assert(users[0].Id, 1) + t.Assert(users[1].Id, 2) + t.Assert(users[2].Id, 3) + t.Assert(users[0].NickName, "name_1") + t.Assert(users[1].NickName, "name_2") + t.Assert(users[2].NickName, "name_3") + t.Assert(users[0].CreateTime.String(), "2018-10-24 10:00:00") + }) + // sql.ErrNoRows + gtest.C(t, func(t *gtest.T) { + type User struct { + Id int + Passport string + Password string + NickName string + CreateTime *gtime.Time + } + var users []*User + err := db.Model(table).Where("id<0").Scan(&users) + t.AssertNil(err) + }) } func Test_Model_StructsWithOrmTag(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - dbInvalid.SetDebug(true) - defer dbInvalid.SetDebug(false) - gtest.C(t, func(t *gtest.T) { - type User struct { - Uid int `orm:"id"` - Passport string - Password string `orm:"password"` - Name string `orm:"nick_name"` - Time gtime.Time `orm:"create_time"` - } - var ( - users []User - buffer = bytes.NewBuffer(nil) - ) - dbInvalid.GetLogger().(*glog.Logger).SetWriter(buffer) - defer dbInvalid.GetLogger().(*glog.Logger).SetWriter(os.Stdout) - dbInvalid.Model(table).Order("id asc").Scan(&users) - // fmt.Println(buffer.String()) - t.Assert( - gstr.Contains( - buffer.String(), - "SELECT `id`,`Passport`,`password`,`nick_name`,`create_time` FROM `user", - ), - true, - ) - }) + dbInvalid.SetDebug(true) + defer dbInvalid.SetDebug(false) + gtest.C(t, func(t *gtest.T) { + type User struct { + Uid int `orm:"id"` + Passport string + Password string `orm:"password"` + Name string `orm:"nick_name"` + Time gtime.Time `orm:"create_time"` + } + var ( + users []User + buffer = bytes.NewBuffer(nil) + ) + dbInvalid.GetLogger().(*glog.Logger).SetWriter(buffer) + defer dbInvalid.GetLogger().(*glog.Logger).SetWriter(os.Stdout) + dbInvalid.Model(table).Order("id asc").Scan(&users) + // fmt.Println(buffer.String()) + t.Assert( + gstr.Contains( + buffer.String(), + "SELECT `id`,`Passport`,`password`,`nick_name`,`create_time` FROM `user", + ), + true, + ) + }) - // db.SetDebug(true) - // defer db.SetDebug(false) - gtest.C(t, func(t *gtest.T) { - type A struct { - Passport string - Password string - } - type B struct { - A - NickName string - } - one, err := db.Model(table).Fields(&B{}).Where("id", 2).One() - t.AssertNil(err) - t.Assert(len(one), 3) - t.Assert(one["nickname"], "name_2") - t.Assert(one["passport"], "user_2") - t.Assert(one["password"], "pass_2") - }) + // db.SetDebug(true) + // defer db.SetDebug(false) + gtest.C(t, func(t *gtest.T) { + type A struct { + Passport string + Password string + } + type B struct { + A + NickName string + } + one, err := db.Model(table).Fields(&B{}).Where("id", 2).One() + t.AssertNil(err) + t.Assert(len(one), 3) + t.Assert(one["nickname"], "name_2") + t.Assert(one["passport"], "user_2") + t.Assert(one["password"], "pass_2") + }) } func Test_Model_Scan(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - type User struct { - Id int - Passport string - Password string - NickName string - CreateTime gtime.Time - } - user := new(User) - err := db.Model(table).Where("id=1").Scan(user) - t.AssertNil(err) - t.Assert(user.NickName, "name_1") - t.Assert(user.CreateTime.String(), "2018-10-24 10:00:00") - }) - gtest.C(t, func(t *gtest.T) { - type User struct { - Id int - Passport string - Password string - NickName string - CreateTime *gtime.Time - } - user := new(User) - err := db.Model(table).Where("id=1").Scan(user) - t.AssertNil(err) - t.Assert(user.NickName, "name_1") - t.Assert(user.CreateTime.String(), "2018-10-24 10:00:00") - }) - gtest.C(t, func(t *gtest.T) { - type User struct { - Id int - Passport string - Password string - NickName string - CreateTime gtime.Time - } - var users []User - err := db.Model(table).Order("id asc").Scan(&users) - t.AssertNil(err) - t.Assert(len(users), TableSize) - t.Assert(users[0].Id, 1) - t.Assert(users[1].Id, 2) - t.Assert(users[2].Id, 3) - t.Assert(users[0].NickName, "name_1") - t.Assert(users[1].NickName, "name_2") - t.Assert(users[2].NickName, "name_3") - t.Assert(users[0].CreateTime.String(), "2018-10-24 10:00:00") - }) - gtest.C(t, func(t *gtest.T) { - type User struct { - Id int - Passport string - Password string - NickName string - CreateTime *gtime.Time - } - var users []*User - err := db.Model(table).Order("id asc").Scan(&users) - t.AssertNil(err) - t.Assert(len(users), TableSize) - t.Assert(users[0].Id, 1) - t.Assert(users[1].Id, 2) - t.Assert(users[2].Id, 3) - t.Assert(users[0].NickName, "name_1") - t.Assert(users[1].NickName, "name_2") - t.Assert(users[2].NickName, "name_3") - t.Assert(users[0].CreateTime.String(), "2018-10-24 10:00:00") - }) - // sql.ErrNoRows - gtest.C(t, func(t *gtest.T) { - type User struct { - Id int - Passport string - Password string - NickName string - CreateTime *gtime.Time - } - var ( - user = new(User) - users = new([]*User) - ) - err1 := db.Model(table).Where("id < 0").Scan(user) - err2 := db.Model(table).Where("id < 0").Scan(users) - t.Assert(err1, sql.ErrNoRows) - t.Assert(err2, nil) - }) + gtest.C(t, func(t *gtest.T) { + type User struct { + Id int + Passport string + Password string + NickName string + CreateTime gtime.Time + } + user := new(User) + err := db.Model(table).Where("id=1").Scan(user) + t.AssertNil(err) + t.Assert(user.NickName, "name_1") + t.Assert(user.CreateTime.String(), "2018-10-24 10:00:00") + }) + gtest.C(t, func(t *gtest.T) { + type User struct { + Id int + Passport string + Password string + NickName string + CreateTime *gtime.Time + } + user := new(User) + err := db.Model(table).Where("id=1").Scan(user) + t.AssertNil(err) + t.Assert(user.NickName, "name_1") + t.Assert(user.CreateTime.String(), "2018-10-24 10:00:00") + }) + gtest.C(t, func(t *gtest.T) { + type User struct { + Id int + Passport string + Password string + NickName string + CreateTime gtime.Time + } + var users []User + err := db.Model(table).Order("id asc").Scan(&users) + t.AssertNil(err) + t.Assert(len(users), TableSize) + t.Assert(users[0].Id, 1) + t.Assert(users[1].Id, 2) + t.Assert(users[2].Id, 3) + t.Assert(users[0].NickName, "name_1") + t.Assert(users[1].NickName, "name_2") + t.Assert(users[2].NickName, "name_3") + t.Assert(users[0].CreateTime.String(), "2018-10-24 10:00:00") + }) + gtest.C(t, func(t *gtest.T) { + type User struct { + Id int + Passport string + Password string + NickName string + CreateTime *gtime.Time + } + var users []*User + err := db.Model(table).Order("id asc").Scan(&users) + t.AssertNil(err) + t.Assert(len(users), TableSize) + t.Assert(users[0].Id, 1) + t.Assert(users[1].Id, 2) + t.Assert(users[2].Id, 3) + t.Assert(users[0].NickName, "name_1") + t.Assert(users[1].NickName, "name_2") + t.Assert(users[2].NickName, "name_3") + t.Assert(users[0].CreateTime.String(), "2018-10-24 10:00:00") + }) + // sql.ErrNoRows + gtest.C(t, func(t *gtest.T) { + type User struct { + Id int + Passport string + Password string + NickName string + CreateTime *gtime.Time + } + var ( + user = new(User) + users = new([]*User) + ) + err1 := db.Model(table).Where("id < 0").Scan(user) + err2 := db.Model(table).Where("id < 0").Scan(users) + t.Assert(err1, sql.ErrNoRows) + t.Assert(err2, nil) + }) } func Test_Model_Scan_NilSliceAttrWhenNoRecordsFound(t *testing.T) { - table := createTable() - defer dropTable(table) + table := createTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - type User struct { - Id int - Passport string - Password string - NickName string - CreateTime gtime.Time - } - type Response struct { - Users []User `json:"users"` - } - var res Response - err := db.Model(table).Scan(&res.Users) - t.AssertNil(err) - t.Assert(res.Users, nil) - }) + gtest.C(t, func(t *gtest.T) { + type User struct { + Id int + Passport string + Password string + NickName string + CreateTime gtime.Time + } + type Response struct { + Users []User `json:"users"` + } + var res Response + err := db.Model(table).Scan(&res.Users) + t.AssertNil(err) + t.Assert(res.Users, nil) + }) } func Test_Model_OrderBy(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).Order("id DESC").All() - t.AssertNil(err) - t.Assert(len(result), TableSize) - t.Assert(result[0]["nickname"].String(), fmt.Sprintf("name_%d", TableSize)) - }) + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).Order("id DESC").All() + t.AssertNil(err) + t.Assert(len(result), TableSize) + t.Assert(result[0]["nickname"].String(), fmt.Sprintf("name_%d", TableSize)) + }) - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).Order(gdb.Raw("NULL")).All() - t.AssertNil(err) - t.Assert(len(result), TableSize) - t.Assert(result[0]["nickname"].String(), "name_1") - }) + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).Order(gdb.Raw("NULL")).All() + t.AssertNil(err) + t.Assert(len(result), TableSize) + t.Assert(result[0]["nickname"].String(), "name_1") + }) - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).Order(gdb.Raw("field(id, 10,1,2,3,4,5,6,7,8,9)")).All() - t.AssertNil(err) - t.Assert(len(result), TableSize) - t.Assert(result[0]["nickname"].String(), "name_10") - t.Assert(result[1]["nickname"].String(), "name_1") - t.Assert(result[2]["nickname"].String(), "name_2") - }) + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).Order(gdb.Raw("field(id, 10,1,2,3,4,5,6,7,8,9)")).All() + t.AssertNil(err) + t.Assert(len(result), TableSize) + t.Assert(result[0]["nickname"].String(), "name_10") + t.Assert(result[1]["nickname"].String(), "name_1") + t.Assert(result[2]["nickname"].String(), "name_2") + }) } func Test_Model_GroupBy(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).Group("id").All() - t.AssertNil(err) - t.Assert(len(result), TableSize) - t.Assert(result[0]["nickname"].String(), "name_1") - }) + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).Group("id").All() + t.AssertNil(err) + t.Assert(len(result), TableSize) + t.Assert(result[0]["nickname"].String(), "name_1") + }) } func Test_Model_Data(t *testing.T) { - gtest.C(t, func(t *gtest.T) { - table := createInitTable() - defer dropTable(table) - result, err := db.Model(table).Data("nickname=?", "test").Where("id=?", 3).Update() - t.AssertNil(err) - n, _ := result.RowsAffected() - t.Assert(n, 1) - }) - gtest.C(t, func(t *gtest.T) { - table := createTable() - defer dropTable(table) - users := make([]g.MapStrAny, 0) - for i := 1; i <= 10; i++ { - users = append(users, g.MapStrAny{ - "id": i, - "passport": fmt.Sprintf(`passport_%d`, i), - "password": fmt.Sprintf(`password_%d`, i), - "nickname": fmt.Sprintf(`nickname_%d`, i), - }) - } - result, err := db.Model(table).Data(users).Batch(2).Insert() - t.AssertNil(err) - n, _ := result.RowsAffected() - t.Assert(n, 10) - }) - gtest.C(t, func(t *gtest.T) { - table := createTable() - defer dropTable(table) - users := garray.New() - for i := 1; i <= 10; i++ { - users.Append(g.MapStrAny{ - "id": i, - "passport": fmt.Sprintf(`passport_%d`, i), - "password": fmt.Sprintf(`password_%d`, i), - "nickname": fmt.Sprintf(`nickname_%d`, i), - }) - } - result, err := db.Model(table).Data(users).Batch(2).Insert() - t.AssertNil(err) - n, _ := result.RowsAffected() - t.Assert(n, 10) - }) + gtest.C(t, func(t *gtest.T) { + table := createInitTable() + defer dropTable(table) + result, err := db.Model(table).Data("nickname=?", "test").Where("id=?", 3).Update() + t.AssertNil(err) + n, _ := result.RowsAffected() + t.Assert(n, 1) + }) + gtest.C(t, func(t *gtest.T) { + table := createTable() + defer dropTable(table) + users := make([]g.MapStrAny, 0) + for i := 1; i <= 10; i++ { + users = append(users, g.MapStrAny{ + "id": i, + "passport": fmt.Sprintf(`passport_%d`, i), + "password": fmt.Sprintf(`password_%d`, i), + "nickname": fmt.Sprintf(`nickname_%d`, i), + }) + } + result, err := db.Model(table).Data(users).Batch(2).Insert() + t.AssertNil(err) + n, _ := result.RowsAffected() + t.Assert(n, 10) + }) + gtest.C(t, func(t *gtest.T) { + table := createTable() + defer dropTable(table) + users := garray.New() + for i := 1; i <= 10; i++ { + users.Append(g.MapStrAny{ + "id": i, + "passport": fmt.Sprintf(`passport_%d`, i), + "password": fmt.Sprintf(`password_%d`, i), + "nickname": fmt.Sprintf(`nickname_%d`, i), + }) + } + result, err := db.Model(table).Data(users).Batch(2).Insert() + t.AssertNil(err) + n, _ := result.RowsAffected() + t.Assert(n, 10) + }) } func Test_Model_Delete(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - // DELETE...LIMIT - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).Where(1).Limit(2).Delete() - t.AssertNil(err) - n, _ := result.RowsAffected() - t.Assert(n, 2) - }) + // DELETE...LIMIT + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).Where(1).Limit(2).Delete() + t.AssertNil(err) + n, _ := result.RowsAffected() + t.Assert(n, 2) + }) - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).Where(1).Delete() - t.AssertNil(err) - n, _ := result.RowsAffected() - t.Assert(n, TableSize-2) - }) + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).Where(1).Delete() + t.AssertNil(err) + n, _ := result.RowsAffected() + t.Assert(n, TableSize-2) + }) } func Test_Model_Offset(t *testing.T) { - table := createInitTable() - defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).Limit(2).Offset(5).Order("id").All() - t.AssertNil(err) - t.Assert(len(result), 2) - t.Assert(result[0]["id"], 6) - t.Assert(result[1]["id"], 7) - }) + table := createInitTable() + defer dropTable(table) + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).Limit(2).Offset(5).Order("id").All() + t.AssertNil(err) + t.Assert(len(result), 2) + t.Assert(result[0]["id"], 6) + t.Assert(result[1]["id"], 7) + }) } func Test_Model_Page(t *testing.T) { - table := createInitTable() - defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).Page(3, 3).Order("id").All() - t.AssertNil(err) - t.Assert(len(result), 3) - t.Assert(result[0]["id"], 7) - t.Assert(result[1]["id"], 8) - }) - gtest.C(t, func(t *gtest.T) { - model := db.Model(table).Safe().Order("id") - all, err := model.Page(3, 3).All() - count, err := model.Count() - t.AssertNil(err) - t.Assert(len(all), 3) - t.Assert(all[0]["id"], "7") - t.Assert(count, int64(TableSize)) - }) + table := createInitTable() + defer dropTable(table) + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).Page(3, 3).Order("id").All() + t.AssertNil(err) + t.Assert(len(result), 3) + t.Assert(result[0]["id"], 7) + t.Assert(result[1]["id"], 8) + }) + gtest.C(t, func(t *gtest.T) { + model := db.Model(table).Safe().Order("id") + all, err := model.Page(3, 3).All() + count, err := model.Count() + t.AssertNil(err) + t.Assert(len(all), 3) + t.Assert(all[0]["id"], "7") + t.Assert(count, int64(TableSize)) + }) } func Test_Model_Option_Map(t *testing.T) { - // Insert - gtest.C(t, func(t *gtest.T) { - table := createTable() - defer dropTable(table) - r, err := db.Model(table).Fields("id, passport").Data(g.Map{ - "id": 1, - "passport": "1", - "password": "1", - "nickname": "1", - }).Insert() - t.AssertNil(err) - n, _ := r.RowsAffected() - t.Assert(n, 1) - one, err := db.Model(table).Where("id", 1).One() - t.AssertNil(err) - t.AssertNE(one["password"].String(), "1") - t.AssertNE(one["nickname"].String(), "1") - t.Assert(one["passport"].String(), "1") - }) - gtest.C(t, func(t *gtest.T) { - table := createTable() - defer dropTable(table) - r, err := db.Model(table).OmitEmptyData().Data(g.Map{ - "id": 1, - "passport": 0, - "password": 0, - "nickname": "1", - }).Insert() - t.AssertNil(err) - n, _ := r.RowsAffected() - t.Assert(n, 1) - one, err := db.Model(table).Where("id", 1).One() - t.AssertNil(err) - t.AssertNE(one["passport"].String(), "0") - t.AssertNE(one["password"].String(), "0") - t.Assert(one["nickname"].String(), "1") - }) + // Insert + gtest.C(t, func(t *gtest.T) { + table := createTable() + defer dropTable(table) + r, err := db.Model(table).Fields("id, passport").Data(g.Map{ + "id": 1, + "passport": "1", + "password": "1", + "nickname": "1", + }).Insert() + t.AssertNil(err) + n, _ := r.RowsAffected() + t.Assert(n, 1) + one, err := db.Model(table).Where("id", 1).One() + t.AssertNil(err) + t.AssertNE(one["password"].String(), "1") + t.AssertNE(one["nickname"].String(), "1") + t.Assert(one["passport"].String(), "1") + }) - // Replace - gtest.C(t, func(t *gtest.T) { - table := createInitTable() - defer dropTable(table) - _, err := db.Model(table).OmitEmptyData().Data(g.Map{ - "id": 1, - "passport": 0, - "password": 0, - "nickname": "1", - }).Replace() - t.AssertNil(err) - one, err := db.Model(table).Where("id", 1).One() - t.AssertNil(err) - t.AssertNE(one["passport"].String(), "0") - t.AssertNE(one["password"].String(), "0") - t.Assert(one["nickname"].String(), "1") - }) + gtest.C(t, func(t *gtest.T) { + table := createTable() + defer dropTable(table) + r, err := db.Model(table).OmitEmptyData().Data(g.Map{ + "id": 1, + "passport": 0, + "password": 0, + "nickname": "1", + }).Insert() + t.AssertNil(err) + n, _ := r.RowsAffected() + t.Assert(n, 1) + one, err := db.Model(table).Where("id", 1).One() + t.AssertNil(err) + t.AssertNE(one["passport"].String(), "0") + t.AssertNE(one["password"].String(), "0") + t.Assert(one["nickname"].String(), "1") + }) - // Save - gtest.C(t, func(t *gtest.T) { - table := createTable() - defer dropTable(table) - r, err := db.Model(table).Fields("id, passport").Data(g.Map{ - "id": 1, - "passport": "1", - "password": "1", - "nickname": "1", - }).Save() - t.AssertNil(err) - n, _ := r.RowsAffected() - t.Assert(n, 1) - one, err := db.Model(table).Where("id", 1).One() - t.AssertNil(err) - t.AssertNE(one["password"].String(), "1") - t.AssertNE(one["nickname"].String(), "1") - t.Assert(one["passport"].String(), "1") - }) - gtest.C(t, func(t *gtest.T) { - table := createTable() - defer dropTable(table) - _, err := db.Model(table).OmitEmptyData().Data(g.Map{ - "id": 1, - "passport": 0, - "password": 0, - "nickname": "1", - }).Save() - t.AssertNil(err) - one, err := db.Model(table).Where("id", 1).One() - t.AssertNil(err) - t.AssertNE(one["passport"].String(), "0") - t.AssertNE(one["password"].String(), "0") - t.Assert(one["nickname"].String(), "1") + // Replace + gtest.C(t, func(t *gtest.T) { + table := createInitTable() + defer dropTable(table) + _, err := db.Model(table).OmitEmptyData().Data(g.Map{ + "id": 1, + "passport": 0, + "password": 0, + "nickname": "1", + }).Replace() + t.AssertNil(err) + one, err := db.Model(table).Where("id", 1).One() + t.AssertNil(err) + t.AssertNE(one["passport"].String(), "0") + t.AssertNE(one["password"].String(), "0") + t.Assert(one["nickname"].String(), "1") + }) - _, err = db.Model(table).Data(g.Map{ - "id": 1, - "passport": 0, - "password": 0, - "nickname": "1", - }).Save() - t.AssertNil(err) - one, err = db.Model(table).Where("id", 1).One() - t.AssertNil(err) - t.Assert(one["passport"].String(), "0") - t.Assert(one["password"].String(), "0") - t.Assert(one["nickname"].String(), "1") - }) + // Save + gtest.C(t, func(t *gtest.T) { + table := createTable() + defer dropTable(table) + r, err := db.Model(table).Fields("id, passport").Data(g.Map{ + "id": 1, + "passport": "1", + "password": "1", + "nickname": "1", + }).Save() + t.AssertNil(err) + n, _ := r.RowsAffected() + t.Assert(n, 1) + one, err := db.Model(table).Where("id", 1).One() + t.AssertNil(err) + t.AssertNE(one["password"].String(), "1") + t.AssertNE(one["nickname"].String(), "1") + t.Assert(one["passport"].String(), "1") + }) + gtest.C(t, func(t *gtest.T) { + table := createTable() + defer dropTable(table) + _, err := db.Model(table).OmitEmptyData().Data(g.Map{ + "id": 1, + "passport": 0, + "password": 0, + "nickname": "1", + }).Save() + t.AssertNil(err) + one, err := db.Model(table).Where("id", 1).One() + t.AssertNil(err) + t.AssertNE(one["passport"].String(), "0") + t.AssertNE(one["password"].String(), "0") + t.Assert(one["nickname"].String(), "1") - // Update - gtest.C(t, func(t *gtest.T) { - table := createInitTable() - defer dropTable(table) + _, err = db.Model(table).Data(g.Map{ + "id": 1, + "passport": 0, + "password": 0, + "nickname": "1", + }).Save() + t.AssertNil(err) + one, err = db.Model(table).Where("id", 1).One() + t.AssertNil(err) + t.Assert(one["passport"].String(), "0") + t.Assert(one["password"].String(), "0") + t.Assert(one["nickname"].String(), "1") + }) - r, err := db.Model(table).Data(g.Map{"nickname": ""}).Where("id", 1).Update() - t.AssertNil(err) - n, _ := r.RowsAffected() - t.Assert(n, 1) + // Update + gtest.C(t, func(t *gtest.T) { + table := createInitTable() + defer dropTable(table) - _, err = db.Model(table).OmitEmptyData().Data(g.Map{"nickname": ""}).Where("id", 2).Update() - t.AssertNE(err, nil) + r, err := db.Model(table).Data(g.Map{"nickname": ""}).Where("id", 1).Update() + t.AssertNil(err) + n, _ := r.RowsAffected() + t.Assert(n, 1) - r, err = db.Model(table).OmitEmpty().Data(g.Map{"nickname": "", "password": "123"}).Where("id", 3).Update() - t.AssertNil(err) - n, _ = r.RowsAffected() - t.Assert(n, 1) + _, err = db.Model(table).OmitEmptyData().Data(g.Map{"nickname": ""}).Where("id", 2).Update() + t.AssertNE(err, nil) - _, err = db.Model(table).OmitEmpty().Fields("nickname").Data(g.Map{"nickname": "", "password": "123"}).Where("id", 4).Update() - t.AssertNE(err, nil) + r, err = db.Model(table).OmitEmpty().Data(g.Map{"nickname": "", "password": "123"}).Where("id", 3).Update() + t.AssertNil(err) + n, _ = r.RowsAffected() + t.Assert(n, 1) - r, err = db.Model(table).OmitEmpty(). - Fields("password").Data(g.Map{ - "nickname": "", - "passport": "123", - "password": "456", - }).Where("id", 5).Update() - t.AssertNil(err) - n, _ = r.RowsAffected() - t.Assert(n, 1) + _, err = db.Model(table).OmitEmpty().Fields("nickname").Data(g.Map{"nickname": "", "password": "123"}).Where("id", 4).Update() + t.AssertNE(err, nil) - one, err := db.Model(table).Where("id", 5).One() - t.AssertNil(err) - t.Assert(one["password"], "456") - t.AssertNE(one["passport"].String(), "") - t.AssertNE(one["passport"].String(), "123") - }) + r, err = db.Model(table).OmitEmpty(). + Fields("password").Data(g.Map{ + "nickname": "", + "passport": "123", + "password": "456", + }).Where("id", 5).Update() + t.AssertNil(err) + n, _ = r.RowsAffected() + t.Assert(n, 1) + + one, err := db.Model(table).Where("id", 5).One() + t.AssertNil(err) + t.Assert(one["password"], "456") + t.AssertNE(one["passport"].String(), "") + t.AssertNE(one["passport"].String(), "123") + }) } func Test_Model_Option_List(t *testing.T) { - gtest.C(t, func(t *gtest.T) { - table := createTable() - defer dropTable(table) - r, err := db.Model(table).Fields("id, password").Data(g.List{ - g.Map{ - "id": 1, - "passport": "1", - "password": "1", - "nickname": "1", - }, - g.Map{ - "id": 2, - "passport": "2", - "password": "2", - "nickname": "2", - }, - }).Save() - t.AssertNil(err) - n, _ := r.RowsAffected() - t.Assert(n, 2) - list, err := db.Model(table).Order("id asc").All() - t.AssertNil(err) - t.Assert(len(list), 2) - t.Assert(list[0]["id"].String(), "1") - t.Assert(list[0]["nickname"].String(), "") - t.Assert(list[0]["passport"].String(), "") - t.Assert(list[0]["password"].String(), "1") + gtest.C(t, func(t *gtest.T) { + table := createTable() + defer dropTable(table) + r, err := db.Model(table).Fields("id, password").Data(g.List{ + g.Map{ + "id": 1, + "passport": "1", + "password": "1", + "nickname": "1", + }, + g.Map{ + "id": 2, + "passport": "2", + "password": "2", + "nickname": "2", + }, + }).Save() + t.AssertNil(err) + n, _ := r.RowsAffected() + t.Assert(n, 2) + list, err := db.Model(table).Order("id asc").All() + t.AssertNil(err) + t.Assert(len(list), 2) + t.Assert(list[0]["id"].String(), "1") + t.Assert(list[0]["nickname"].String(), "") + t.Assert(list[0]["passport"].String(), "") + t.Assert(list[0]["password"].String(), "1") - t.Assert(list[1]["id"].String(), "2") - t.Assert(list[1]["nickname"].String(), "") - t.Assert(list[1]["passport"].String(), "") - t.Assert(list[1]["password"].String(), "2") - }) + t.Assert(list[1]["id"].String(), "2") + t.Assert(list[1]["nickname"].String(), "") + t.Assert(list[1]["passport"].String(), "") + t.Assert(list[1]["password"].String(), "2") + }) - gtest.C(t, func(t *gtest.T) { - table := createTable() - defer dropTable(table) - r, err := db.Model(table).OmitEmpty().Fields("id, password").Data(g.List{ - g.Map{ - "id": 1, - "passport": "1", - "password": 0, - "nickname": "1", - }, - g.Map{ - "id": 2, - "passport": "2", - "password": "2", - "nickname": "2", - }, - }).Save() - t.AssertNil(err) - n, _ := r.RowsAffected() - t.Assert(n, 2) - list, err := db.Model(table).Order("id asc").All() - t.AssertNil(err) - t.Assert(len(list), 2) - t.Assert(list[0]["id"].String(), "1") - t.Assert(list[0]["nickname"].String(), "") - t.Assert(list[0]["passport"].String(), "") - t.Assert(list[0]["password"].String(), "0") + gtest.C(t, func(t *gtest.T) { + table := createTable() + defer dropTable(table) + r, err := db.Model(table).OmitEmpty().Fields("id, password").Data(g.List{ + g.Map{ + "id": 1, + "passport": "1", + "password": 0, + "nickname": "1", + }, + g.Map{ + "id": 2, + "passport": "2", + "password": "2", + "nickname": "2", + }, + }).Save() + t.AssertNil(err) + n, _ := r.RowsAffected() + t.Assert(n, 2) + list, err := db.Model(table).Order("id asc").All() + t.AssertNil(err) + t.Assert(len(list), 2) + t.Assert(list[0]["id"].String(), "1") + t.Assert(list[0]["nickname"].String(), "") + t.Assert(list[0]["passport"].String(), "") + t.Assert(list[0]["password"].String(), "0") - t.Assert(list[1]["id"].String(), "2") - t.Assert(list[1]["nickname"].String(), "") - t.Assert(list[1]["passport"].String(), "") - t.Assert(list[1]["password"].String(), "2") - }) + t.Assert(list[1]["id"].String(), "2") + t.Assert(list[1]["nickname"].String(), "") + t.Assert(list[1]["passport"].String(), "") + t.Assert(list[1]["password"].String(), "2") + }) } func Test_Model_OmitEmpty(t *testing.T) { - table := fmt.Sprintf(`table_%s`, gtime.TimestampNanoStr()) - if _, err := db.Exec(ctx, fmt.Sprintf(` + table := fmt.Sprintf(`table_%s`, gtime.TimestampNanoStr()) + if _, err := db.Exec(ctx, fmt.Sprintf(` CREATE TABLE IF NOT EXISTS %s ( id int(10) unsigned NOT NULL AUTO_INCREMENT, name varchar(45) NOT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; `, table)); err != nil { - gtest.Error(err) - } - defer dropTable(table) + gtest.Error(err) + } + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - _, err := db.Model(table).OmitEmpty().Data(g.Map{ - "id": 1, - "name": "", - }).Save() - t.AssertNE(err, nil) - }) - gtest.C(t, func(t *gtest.T) { - _, err := db.Model(table).OmitEmptyData().Data(g.Map{ - "id": 1, - "name": "", - }).Save() - t.AssertNE(err, nil) - }) - gtest.C(t, func(t *gtest.T) { - _, err := db.Model(table).OmitEmptyWhere().Data(g.Map{ - "id": 1, - "name": "", - }).Save() - t.AssertNil(err) - }) + gtest.C(t, func(t *gtest.T) { + _, err := db.Model(table).OmitEmpty().Data(g.Map{ + "id": 1, + "name": "", + }).Save() + t.AssertNE(err, nil) + }) + gtest.C(t, func(t *gtest.T) { + _, err := db.Model(table).OmitEmptyData().Data(g.Map{ + "id": 1, + "name": "", + }).Save() + t.AssertNE(err, nil) + }) + gtest.C(t, func(t *gtest.T) { + _, err := db.Model(table).OmitEmptyWhere().Data(g.Map{ + "id": 1, + "name": "", + }).Save() + t.AssertNil(err) + }) } func Test_Model_OmitNil(t *testing.T) { - table := fmt.Sprintf(`table_%s`, gtime.TimestampNanoStr()) - if _, err := db.Exec(ctx, fmt.Sprintf(` + table := fmt.Sprintf(`table_%s`, gtime.TimestampNanoStr()) + if _, err := db.Exec(ctx, fmt.Sprintf(` CREATE TABLE IF NOT EXISTS %s ( id int(10) unsigned NOT NULL AUTO_INCREMENT, name varchar(45) NOT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; `, table)); err != nil { - gtest.Error(err) - } - defer dropTable(table) + gtest.Error(err) + } + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - _, err := db.Model(table).OmitNil().Data(g.Map{ - "id": 1, - "name": nil, - }).Save() - t.AssertNE(err, nil) - }) - gtest.C(t, func(t *gtest.T) { - _, err := db.Model(table).OmitNil().Data(g.Map{ - "id": 1, - "name": "", - }).Save() - t.AssertNil(err) - }) - gtest.C(t, func(t *gtest.T) { - _, err := db.Model(table).OmitNilWhere().Data(g.Map{ - "id": 1, - "name": "", - }).Save() - t.AssertNil(err) - }) + gtest.C(t, func(t *gtest.T) { + _, err := db.Model(table).OmitNil().Data(g.Map{ + "id": 1, + "name": nil, + }).Save() + t.AssertNE(err, nil) + }) + gtest.C(t, func(t *gtest.T) { + _, err := db.Model(table).OmitNil().Data(g.Map{ + "id": 1, + "name": "", + }).Save() + t.AssertNil(err) + }) + gtest.C(t, func(t *gtest.T) { + _, err := db.Model(table).OmitNilWhere().Data(g.Map{ + "id": 1, + "name": "", + }).Save() + t.AssertNil(err) + }) } func Test_Model_FieldsEx(t *testing.T) { - table := createInitTable() - defer dropTable(table) - // Select. - gtest.C(t, func(t *gtest.T) { - r, err := db.Model(table).FieldsEx("create_time, id").Where("id in (?)", g.Slice{1, 2}).Order("id asc").All() - t.AssertNil(err) - t.Assert(len(r), 2) - t.Assert(len(r[0]), 4) - t.Assert(r[0]["id"], "") - t.Assert(r[0]["passport"], "user_1") - t.Assert(r[0]["password"], "pass_1") - t.Assert(r[0]["nickname"], "name_1") - t.Assert(r[0]["create_time"], "") - t.Assert(r[1]["id"], "") - t.Assert(r[1]["passport"], "user_2") - t.Assert(r[1]["password"], "pass_2") - t.Assert(r[1]["nickname"], "name_2") - t.Assert(r[1]["create_time"], "") - }) - // Update. - gtest.C(t, func(t *gtest.T) { - r, err := db.Model(table).FieldsEx("password").Data(g.Map{"nickname": "123", "password": "456"}).Where("id", 3).Update() - t.AssertNil(err) - n, _ := r.RowsAffected() - t.Assert(n, 1) + table := createInitTable() + defer dropTable(table) + // Select. + gtest.C(t, func(t *gtest.T) { + r, err := db.Model(table).FieldsEx("create_time, id").Where("id in (?)", g.Slice{1, 2}).Order("id asc").All() + t.AssertNil(err) + t.Assert(len(r), 2) + t.Assert(len(r[0]), 4) + t.Assert(r[0]["id"], "") + t.Assert(r[0]["passport"], "user_1") + t.Assert(r[0]["password"], "pass_1") + t.Assert(r[0]["nickname"], "name_1") + t.Assert(r[0]["create_time"], "") + t.Assert(r[1]["id"], "") + t.Assert(r[1]["passport"], "user_2") + t.Assert(r[1]["password"], "pass_2") + t.Assert(r[1]["nickname"], "name_2") + t.Assert(r[1]["create_time"], "") + }) + // Update. + gtest.C(t, func(t *gtest.T) { + r, err := db.Model(table).FieldsEx("password").Data(g.Map{"nickname": "123", "password": "456"}).Where("id", 3).Update() + t.AssertNil(err) + n, _ := r.RowsAffected() + t.Assert(n, 1) - one, err := db.Model(table).Where("id", 3).One() - t.AssertNil(err) - t.Assert(one["nickname"], "123") - t.AssertNE(one["password"], "456") - }) + one, err := db.Model(table).Where("id", 3).One() + t.AssertNil(err) + t.Assert(one["nickname"], "123") + t.AssertNE(one["password"], "456") + }) } func Test_Model_FieldsEx_WithReservedWords(t *testing.T) { - gtest.C(t, func(t *gtest.T) { - var ( - table = "fieldsex_test_table" - sqlTpcPath = gtest.DataPath("reservedwords_table_tpl.sql") - sqlContent = gfile.GetContents(sqlTpcPath) - ) - t.AssertNE(sqlContent, "") - if _, err := db.Exec(ctx, fmt.Sprintf(sqlContent, table)); err != nil { - t.AssertNil(err) - } - defer dropTable(table) - _, err := db.Model(table).FieldsEx("content").One() - t.AssertNil(err) - }) + gtest.C(t, func(t *gtest.T) { + var ( + table = "fieldsex_test_table" + sqlTpcPath = gtest.DataPath("reservedwords_table_tpl.sql") + sqlContent = gfile.GetContents(sqlTpcPath) + ) + t.AssertNE(sqlContent, "") + if _, err := db.Exec(ctx, fmt.Sprintf(sqlContent, table)); err != nil { + t.AssertNil(err) + } + defer dropTable(table) + _, err := db.Model(table).FieldsEx("content").One() + t.AssertNil(err) + }) } func Test_Model_Prefix(t *testing.T) { - db := dbPrefix - table := fmt.Sprintf(`%s_%d`, TableName, gtime.TimestampNano()) - createInitTableWithDb(db, TableNamePrefix1+table) - defer dropTable(TableNamePrefix1 + table) - // Select. - gtest.C(t, func(t *gtest.T) { - r, err := db.Model(table).Where("id in (?)", g.Slice{1, 2}).Order("id asc").All() - t.AssertNil(err) - t.Assert(len(r), 2) - t.Assert(r[0]["id"], "1") - t.Assert(r[1]["id"], "2") - }) - // Select with alias. - gtest.C(t, func(t *gtest.T) { - r, err := db.Model(table+" as u").Where("u.id in (?)", g.Slice{1, 2}).Order("u.id asc").All() - t.AssertNil(err) - t.Assert(len(r), 2) - t.Assert(r[0]["id"], "1") - t.Assert(r[1]["id"], "2") - }) - // Select with alias to struct. - gtest.C(t, func(t *gtest.T) { - type User struct { - Id int - Passport string - Password string - NickName string - } - var users []User - err := db.Model(table+" u").Where("u.id in (?)", g.Slice{1, 5}).Order("u.id asc").Scan(&users) - t.AssertNil(err) - t.Assert(len(users), 2) - t.Assert(users[0].Id, 1) - t.Assert(users[1].Id, 5) - }) - // Select with alias and join statement. - gtest.C(t, func(t *gtest.T) { - r, err := db.Model(table+" as u1").LeftJoin(table+" as u2", "u2.id=u1.id").Where("u1.id in (?)", g.Slice{1, 2}).Order("u1.id asc").All() - t.AssertNil(err) - t.Assert(len(r), 2) - t.Assert(r[0]["id"], "1") - t.Assert(r[1]["id"], "2") - }) - gtest.C(t, func(t *gtest.T) { - r, err := db.Model(table).As("u1").LeftJoin(table+" as u2", "u2.id=u1.id").Where("u1.id in (?)", g.Slice{1, 2}).Order("u1.id asc").All() - t.AssertNil(err) - t.Assert(len(r), 2) - t.Assert(r[0]["id"], "1") - t.Assert(r[1]["id"], "2") - }) + db := dbPrefix + table := fmt.Sprintf(`%s_%d`, TableName, gtime.TimestampNano()) + createInitTableWithDb(db, TableNamePrefix1+table) + defer dropTable(TableNamePrefix1 + table) + // Select. + gtest.C(t, func(t *gtest.T) { + r, err := db.Model(table).Where("id in (?)", g.Slice{1, 2}).Order("id asc").All() + t.AssertNil(err) + t.Assert(len(r), 2) + t.Assert(r[0]["id"], "1") + t.Assert(r[1]["id"], "2") + }) + // Select with alias. + gtest.C(t, func(t *gtest.T) { + r, err := db.Model(table+" as u").Where("u.id in (?)", g.Slice{1, 2}).Order("u.id asc").All() + t.AssertNil(err) + t.Assert(len(r), 2) + t.Assert(r[0]["id"], "1") + t.Assert(r[1]["id"], "2") + }) + // Select with alias to struct. + gtest.C(t, func(t *gtest.T) { + type User struct { + Id int + Passport string + Password string + NickName string + } + var users []User + err := db.Model(table+" u").Where("u.id in (?)", g.Slice{1, 5}).Order("u.id asc").Scan(&users) + t.AssertNil(err) + t.Assert(len(users), 2) + t.Assert(users[0].Id, 1) + t.Assert(users[1].Id, 5) + }) + // Select with alias and join statement. + gtest.C(t, func(t *gtest.T) { + r, err := db.Model(table+" as u1").LeftJoin(table+" as u2", "u2.id=u1.id").Where("u1.id in (?)", g.Slice{1, 2}).Order("u1.id asc").All() + t.AssertNil(err) + t.Assert(len(r), 2) + t.Assert(r[0]["id"], "1") + t.Assert(r[1]["id"], "2") + }) + gtest.C(t, func(t *gtest.T) { + r, err := db.Model(table).As("u1").LeftJoin(table+" as u2", "u2.id=u1.id").Where("u1.id in (?)", g.Slice{1, 2}).Order("u1.id asc").All() + t.AssertNil(err) + t.Assert(len(r), 2) + t.Assert(r[0]["id"], "1") + t.Assert(r[1]["id"], "2") + }) } func Test_Model_Schema1(t *testing.T) { - // db.SetDebug(true) + // db.SetDebug(true) - db = db.Schema(TestSchema1) - table := fmt.Sprintf(`%s_%s`, TableName, gtime.TimestampNanoStr()) - createInitTableWithDb(db, table) - db = db.Schema(TestSchema2) - createInitTableWithDb(db, table) - defer func() { - db = db.Schema(TestSchema1) - dropTableWithDb(db, table) - db = db.Schema(TestSchema2) - dropTableWithDb(db, table) - db = db.Schema(TestSchema1) - }() - // Method. - gtest.C(t, func(t *gtest.T) { - db = db.Schema(TestSchema1) - r, err := db.Model(table).Update(g.Map{"nickname": "name_100"}, "id=1") - t.AssertNil(err) - n, _ := r.RowsAffected() - t.Assert(n, 1) + db = db.Schema(TestSchema1) + table := fmt.Sprintf(`%s_%s`, TableName, gtime.TimestampNanoStr()) + createInitTableWithDb(db, table) + db = db.Schema(TestSchema2) + createInitTableWithDb(db, table) + defer func() { + db = db.Schema(TestSchema1) + dropTableWithDb(db, table) + db = db.Schema(TestSchema2) + dropTableWithDb(db, table) + db = db.Schema(TestSchema1) + }() + // Method. + gtest.C(t, func(t *gtest.T) { + db = db.Schema(TestSchema1) + r, err := db.Model(table).Update(g.Map{"nickname": "name_100"}, "id=1") + t.AssertNil(err) + n, _ := r.RowsAffected() + t.Assert(n, 1) - v, err := db.Model(table).Value("nickname", "id=1") - t.AssertNil(err) - t.Assert(v.String(), "name_100") + v, err := db.Model(table).Value("nickname", "id=1") + t.AssertNil(err) + t.Assert(v.String(), "name_100") - db = db.Schema(TestSchema2) - v, err = db.Model(table).Value("nickname", "id=1") - t.AssertNil(err) - t.Assert(v.String(), "name_1") - }) - // Model. - gtest.C(t, func(t *gtest.T) { - v, err := db.Model(table).Schema(TestSchema1).Value("nickname", "id=2") - t.AssertNil(err) - t.Assert(v.String(), "name_2") + db = db.Schema(TestSchema2) + v, err = db.Model(table).Value("nickname", "id=1") + t.AssertNil(err) + t.Assert(v.String(), "name_1") + }) + // Model. + gtest.C(t, func(t *gtest.T) { + v, err := db.Model(table).Schema(TestSchema1).Value("nickname", "id=2") + t.AssertNil(err) + t.Assert(v.String(), "name_2") - r, err := db.Model(table).Schema(TestSchema1).Update(g.Map{"nickname": "name_200"}, "id=2") - t.AssertNil(err) - n, _ := r.RowsAffected() - t.Assert(n, 1) + r, err := db.Model(table).Schema(TestSchema1).Update(g.Map{"nickname": "name_200"}, "id=2") + t.AssertNil(err) + n, _ := r.RowsAffected() + t.Assert(n, 1) - v, err = db.Model(table).Schema(TestSchema1).Value("nickname", "id=2") - t.AssertNil(err) - t.Assert(v.String(), "name_200") + v, err = db.Model(table).Schema(TestSchema1).Value("nickname", "id=2") + t.AssertNil(err) + t.Assert(v.String(), "name_200") - v, err = db.Model(table).Schema(TestSchema2).Value("nickname", "id=2") - t.AssertNil(err) - t.Assert(v.String(), "name_2") + v, err = db.Model(table).Schema(TestSchema2).Value("nickname", "id=2") + t.AssertNil(err) + t.Assert(v.String(), "name_2") - v, err = db.Model(table).Schema(TestSchema1).Value("nickname", "id=2") - t.AssertNil(err) - t.Assert(v.String(), "name_200") - }) - // Model. - gtest.C(t, func(t *gtest.T) { - i := 1000 - _, err := db.Model(table).Schema(TestSchema1).Insert(g.Map{ - "id": i, - "passport": fmt.Sprintf(`user_%d`, i), - "password": fmt.Sprintf(`pass_%d`, i), - "nickname": fmt.Sprintf(`name_%d`, i), - "create_time": gtime.NewFromStr("2018-10-24 10:00:00").String(), - "none-exist-field": 1, - }) - t.AssertNil(err) + v, err = db.Model(table).Schema(TestSchema1).Value("nickname", "id=2") + t.AssertNil(err) + t.Assert(v.String(), "name_200") + }) + // Model. + gtest.C(t, func(t *gtest.T) { + i := 1000 + _, err := db.Model(table).Schema(TestSchema1).Insert(g.Map{ + "id": i, + "passport": fmt.Sprintf(`user_%d`, i), + "password": fmt.Sprintf(`pass_%d`, i), + "nickname": fmt.Sprintf(`name_%d`, i), + "create_time": gtime.NewFromStr("2018-10-24 10:00:00").String(), + "none-exist-field": 1, + }) + t.AssertNil(err) - v, err := db.Model(table).Schema(TestSchema1).Value("nickname", "id=?", i) - t.AssertNil(err) - t.Assert(v.String(), "name_1000") + v, err := db.Model(table).Schema(TestSchema1).Value("nickname", "id=?", i) + t.AssertNil(err) + t.Assert(v.String(), "name_1000") - v, err = db.Model(table).Schema(TestSchema2).Value("nickname", "id=?", i) - t.AssertNil(err) - t.Assert(v.String(), "") - }) + v, err = db.Model(table).Schema(TestSchema2).Value("nickname", "id=?", i) + t.AssertNil(err) + t.Assert(v.String(), "") + }) } func Test_Model_Schema2(t *testing.T) { - // db.SetDebug(true) + // db.SetDebug(true) - db = db.Schema(TestSchema1) - table := fmt.Sprintf(`%s_%s`, TableName, gtime.TimestampNanoStr()) - createInitTableWithDb(db, table) - db = db.Schema(TestSchema2) - createInitTableWithDb(db, table) - defer func() { - db = db.Schema(TestSchema1) - dropTableWithDb(db, table) - db = db.Schema(TestSchema2) - dropTableWithDb(db, table) + db = db.Schema(TestSchema1) + table := fmt.Sprintf(`%s_%s`, TableName, gtime.TimestampNanoStr()) + createInitTableWithDb(db, table) + db = db.Schema(TestSchema2) + createInitTableWithDb(db, table) + defer func() { + db = db.Schema(TestSchema1) + dropTableWithDb(db, table) + db = db.Schema(TestSchema2) + dropTableWithDb(db, table) - db = db.Schema(TestSchema1) - }() - // Schema. - gtest.C(t, func(t *gtest.T) { - v, err := db.Schema(TestSchema1).Model(table).Value("nickname", "id=2") - t.AssertNil(err) - t.Assert(v.String(), "name_2") + db = db.Schema(TestSchema1) + }() + // Schema. + gtest.C(t, func(t *gtest.T) { + v, err := db.Schema(TestSchema1).Model(table).Value("nickname", "id=2") + t.AssertNil(err) + t.Assert(v.String(), "name_2") - r, err := db.Schema(TestSchema1).Model(table).Update(g.Map{"nickname": "name_200"}, "id=2") - t.AssertNil(err) - n, _ := r.RowsAffected() - t.Assert(n, 1) + r, err := db.Schema(TestSchema1).Model(table).Update(g.Map{"nickname": "name_200"}, "id=2") + t.AssertNil(err) + n, _ := r.RowsAffected() + t.Assert(n, 1) - v, err = db.Schema(TestSchema1).Model(table).Value("nickname", "id=2") - t.AssertNil(err) - t.Assert(v.String(), "name_200") + v, err = db.Schema(TestSchema1).Model(table).Value("nickname", "id=2") + t.AssertNil(err) + t.Assert(v.String(), "name_200") - v, err = db.Schema(TestSchema2).Model(table).Value("nickname", "id=2") - t.AssertNil(err) - t.Assert(v.String(), "name_2") + v, err = db.Schema(TestSchema2).Model(table).Value("nickname", "id=2") + t.AssertNil(err) + t.Assert(v.String(), "name_2") - v, err = db.Schema(TestSchema1).Model(table).Value("nickname", "id=2") - t.AssertNil(err) - t.Assert(v.String(), "name_200") - }) - // Schema. - gtest.C(t, func(t *gtest.T) { - i := 1000 - _, err := db.Schema(TestSchema1).Model(table).Insert(g.Map{ - "id": i, - "passport": fmt.Sprintf(`user_%d`, i), - "password": fmt.Sprintf(`pass_%d`, i), - "nickname": fmt.Sprintf(`name_%d`, i), - "create_time": gtime.NewFromStr("2018-10-24 10:00:00").String(), - "none-exist-field": 1, - }) - t.AssertNil(err) + v, err = db.Schema(TestSchema1).Model(table).Value("nickname", "id=2") + t.AssertNil(err) + t.Assert(v.String(), "name_200") + }) + // Schema. + gtest.C(t, func(t *gtest.T) { + i := 1000 + _, err := db.Schema(TestSchema1).Model(table).Insert(g.Map{ + "id": i, + "passport": fmt.Sprintf(`user_%d`, i), + "password": fmt.Sprintf(`pass_%d`, i), + "nickname": fmt.Sprintf(`name_%d`, i), + "create_time": gtime.NewFromStr("2018-10-24 10:00:00").String(), + "none-exist-field": 1, + }) + t.AssertNil(err) - v, err := db.Schema(TestSchema1).Model(table).Value("nickname", "id=?", i) - t.AssertNil(err) - t.Assert(v.String(), "name_1000") + v, err := db.Schema(TestSchema1).Model(table).Value("nickname", "id=?", i) + t.AssertNil(err) + t.Assert(v.String(), "name_1000") - v, err = db.Schema(TestSchema2).Model(table).Value("nickname", "id=?", i) - t.AssertNil(err) - t.Assert(v.String(), "") - }) + v, err = db.Schema(TestSchema2).Model(table).Value("nickname", "id=?", i) + t.AssertNil(err) + t.Assert(v.String(), "") + }) } func Test_Model_FieldsExStruct(t *testing.T) { - table := createTable() - defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - type User struct { - Id int `orm:"id" json:"id"` - Passport string `orm:"password" json:"pass_port"` - Password string `orm:"password" json:"password"` - NickName string `orm:"nickname" json:"nick__name"` - } - user := &User{ - Id: 1, - Passport: "111", - Password: "222", - NickName: "333", - } - r, err := db.Model(table).FieldsEx("create_time, password").OmitEmpty().Data(user).Insert() - t.AssertNil(err) - n, err := r.RowsAffected() - t.AssertNil(err) - t.Assert(n, 1) - }) - gtest.C(t, func(t *gtest.T) { - type User struct { - Id int `orm:"id" json:"id"` - Passport string `orm:"password" json:"pass_port"` - Password string `orm:"password" json:"password"` - NickName string `orm:"nickname" json:"nick__name"` - } - users := make([]*User, 0) - for i := 100; i < 110; i++ { - users = append(users, &User{ - Id: i, - Passport: fmt.Sprintf(`passport_%d`, i), - Password: fmt.Sprintf(`password_%d`, i), - NickName: fmt.Sprintf(`nickname_%d`, i), - }) - } - r, err := db.Model(table).FieldsEx("create_time, password"). - OmitEmpty(). - Batch(2). - Data(users). - Insert() - t.AssertNil(err) - n, err := r.RowsAffected() - t.AssertNil(err) - t.Assert(n, 10) - }) + table := createTable() + defer dropTable(table) + gtest.C(t, func(t *gtest.T) { + type User struct { + Id int `orm:"id" json:"id"` + Passport string `orm:"password" json:"pass_port"` + Password string `orm:"password" json:"password"` + NickName string `orm:"nickname" json:"nick__name"` + } + user := &User{ + Id: 1, + Passport: "111", + Password: "222", + NickName: "333", + } + r, err := db.Model(table).FieldsEx("create_time, password").OmitEmpty().Data(user).Insert() + t.AssertNil(err) + n, err := r.RowsAffected() + t.AssertNil(err) + t.Assert(n, 1) + }) + gtest.C(t, func(t *gtest.T) { + type User struct { + Id int `orm:"id" json:"id"` + Passport string `orm:"password" json:"pass_port"` + Password string `orm:"password" json:"password"` + NickName string `orm:"nickname" json:"nick__name"` + } + users := make([]*User, 0) + for i := 100; i < 110; i++ { + users = append(users, &User{ + Id: i, + Passport: fmt.Sprintf(`passport_%d`, i), + Password: fmt.Sprintf(`password_%d`, i), + NickName: fmt.Sprintf(`nickname_%d`, i), + }) + } + r, err := db.Model(table).FieldsEx("create_time, password"). + OmitEmpty(). + Batch(2). + Data(users). + Insert() + t.AssertNil(err) + n, err := r.RowsAffected() + t.AssertNil(err) + t.Assert(n, 10) + }) } func Test_Model_OmitEmpty_Time(t *testing.T) { - table := createInitTable() - defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - type User struct { - Id int `orm:"id" json:"id"` - Passport string `orm:"password" json:"pass_port"` - Password string `orm:"password" json:"password"` - Time time.Time `orm:"create_time" ` - } - user := &User{ - Id: 1, - Passport: "111", - Password: "222", - Time: time.Time{}, - } - r, err := db.Model(table).OmitEmpty().Data(user).WherePri(1).Update() - t.AssertNil(err) - n, err := r.RowsAffected() - t.AssertNil(err) - t.Assert(n, 1) - }) + table := createInitTable() + defer dropTable(table) + gtest.C(t, func(t *gtest.T) { + type User struct { + Id int `orm:"id" json:"id"` + Passport string `orm:"password" json:"pass_port"` + Password string `orm:"password" json:"password"` + Time time.Time `orm:"create_time" ` + } + user := &User{ + Id: 1, + Passport: "111", + Password: "222", + Time: time.Time{}, + } + r, err := db.Model(table).OmitEmpty().Data(user).WherePri(1).Update() + t.AssertNil(err) + n, err := r.RowsAffected() + t.AssertNil(err) + t.Assert(n, 1) + }) } func Test_Result_Chunk(t *testing.T) { - table := createInitTable() - defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - r, err := db.Model(table).Order("id asc").All() - t.AssertNil(err) - chunks := r.Chunk(3) - t.Assert(len(chunks), 4) - t.Assert(chunks[0][0]["id"].Int(), 1) - t.Assert(chunks[1][0]["id"].Int(), 4) - t.Assert(chunks[2][0]["id"].Int(), 7) - t.Assert(chunks[3][0]["id"].Int(), 10) - }) + table := createInitTable() + defer dropTable(table) + gtest.C(t, func(t *gtest.T) { + r, err := db.Model(table).Order("id asc").All() + t.AssertNil(err) + chunks := r.Chunk(3) + t.Assert(len(chunks), 4) + t.Assert(chunks[0][0]["id"].Int(), 1) + t.Assert(chunks[1][0]["id"].Int(), 4) + t.Assert(chunks[2][0]["id"].Int(), 7) + t.Assert(chunks[3][0]["id"].Int(), 10) + }) } func Test_Model_DryRun(t *testing.T) { - table := createInitTable() - defer dropTable(table) - db.SetDryRun(true) - defer db.SetDryRun(false) + table := createInitTable() + defer dropTable(table) + db.SetDryRun(true) + defer db.SetDryRun(false) - gtest.C(t, func(t *gtest.T) { - one, err := db.Model(table).WherePri(1).One() - t.AssertNil(err) - t.Assert(one["id"], 1) - }) - gtest.C(t, func(t *gtest.T) { - r, err := db.Model(table).Data("passport", "port_1").WherePri(1).Update() - t.AssertNil(err) - n, err := r.RowsAffected() - t.AssertNil(err) - t.Assert(n, 0) - }) + gtest.C(t, func(t *gtest.T) { + one, err := db.Model(table).WherePri(1).One() + t.AssertNil(err) + t.Assert(one["id"], 1) + }) + gtest.C(t, func(t *gtest.T) { + r, err := db.Model(table).Data("passport", "port_1").WherePri(1).Update() + t.AssertNil(err) + n, err := r.RowsAffected() + t.AssertNil(err) + t.Assert(n, 0) + }) } func Test_Model_Join_SubQuery(t *testing.T) { - table := createInitTable() - defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - subQuery := fmt.Sprintf("select * from `%s`", table) - r, err := db.Model(table, "t1").Fields("t2.id").LeftJoin(subQuery, "t2", "t2.id=t1.id").Array() - t.AssertNil(err) - t.Assert(len(r), TableSize) - t.Assert(r[0], "1") - t.Assert(r[TableSize-1], TableSize) - }) + table := createInitTable() + defer dropTable(table) + gtest.C(t, func(t *gtest.T) { + subQuery := fmt.Sprintf("select * from `%s`", table) + r, err := db.Model(table, "t1").Fields("t2.id").LeftJoin(subQuery, "t2", "t2.id=t1.id").Array() + t.AssertNil(err) + t.Assert(len(r), TableSize) + t.Assert(r[0], "1") + t.Assert(r[TableSize-1], TableSize) + }) } func Test_Model_Cache(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - one, err := db.Model(table).Cache(gdb.CacheOption{ - Duration: time.Second, - Name: "test1", - Force: false, - }).WherePri(1).One() - t.AssertNil(err) - t.Assert(one["passport"], "user_1") + gtest.C(t, func(t *gtest.T) { + one, err := db.Model(table).Cache(gdb.CacheOption{ + Duration: time.Second, + Name: "test1", + Force: false, + }).WherePri(1).One() + t.AssertNil(err) + t.Assert(one["passport"], "user_1") - r, err := db.Model(table).Data("passport", "user_100").WherePri(1).Update() - t.AssertNil(err) - n, err := r.RowsAffected() - t.AssertNil(err) - t.Assert(n, 1) + r, err := db.Model(table).Data("passport", "user_100").WherePri(1).Update() + t.AssertNil(err) + n, err := r.RowsAffected() + t.AssertNil(err) + t.Assert(n, 1) - one, err = db.Model(table).Cache(gdb.CacheOption{ - Duration: time.Second, - Name: "test1", - Force: false, - }).WherePri(1).One() - t.AssertNil(err) - t.Assert(one["passport"], "user_1") + one, err = db.Model(table).Cache(gdb.CacheOption{ + Duration: time.Second, + Name: "test1", + Force: false, + }).WherePri(1).One() + t.AssertNil(err) + t.Assert(one["passport"], "user_1") - time.Sleep(time.Second * 2) + time.Sleep(time.Second * 2) - one, err = db.Model(table).Cache(gdb.CacheOption{ - Duration: time.Second, - Name: "test1", - Force: false, - }).WherePri(1).One() - t.AssertNil(err) - t.Assert(one["passport"], "user_100") - }) - gtest.C(t, func(t *gtest.T) { - one, err := db.Model(table).Cache(gdb.CacheOption{ - Duration: time.Second, - Name: "test2", - Force: false, - }).WherePri(2).One() - t.AssertNil(err) - t.Assert(one["passport"], "user_2") + one, err = db.Model(table).Cache(gdb.CacheOption{ + Duration: time.Second, + Name: "test1", + Force: false, + }).WherePri(1).One() + t.AssertNil(err) + t.Assert(one["passport"], "user_100") + }) + gtest.C(t, func(t *gtest.T) { + one, err := db.Model(table).Cache(gdb.CacheOption{ + Duration: time.Second, + Name: "test2", + Force: false, + }).WherePri(2).One() + t.AssertNil(err) + t.Assert(one["passport"], "user_2") - r, err := db.Model(table).Data("passport", "user_200").Cache(gdb.CacheOption{ - Duration: -1, - Name: "test2", - Force: false, - }).WherePri(2).Update() - t.AssertNil(err) - n, err := r.RowsAffected() - t.AssertNil(err) - t.Assert(n, 1) + r, err := db.Model(table).Data("passport", "user_200").Cache(gdb.CacheOption{ + Duration: -1, + Name: "test2", + Force: false, + }).WherePri(2).Update() + t.AssertNil(err) + n, err := r.RowsAffected() + t.AssertNil(err) + t.Assert(n, 1) - one, err = db.Model(table).Cache(gdb.CacheOption{ - Duration: time.Second, - Name: "test2", - Force: false, - }).WherePri(2).One() - t.AssertNil(err) - t.Assert(one["passport"], "user_200") - }) - // transaction. - gtest.C(t, func(t *gtest.T) { - // make cache for id 3 - one, err := db.Model(table).Cache(gdb.CacheOption{ - Duration: time.Second, - Name: "test3", - Force: false, - }).WherePri(3).One() - t.AssertNil(err) - t.Assert(one["passport"], "user_3") + one, err = db.Model(table).Cache(gdb.CacheOption{ + Duration: time.Second, + Name: "test2", + Force: false, + }).WherePri(2).One() + t.AssertNil(err) + t.Assert(one["passport"], "user_200") + }) + // transaction. + gtest.C(t, func(t *gtest.T) { + // make cache for id 3 + one, err := db.Model(table).Cache(gdb.CacheOption{ + Duration: time.Second, + Name: "test3", + Force: false, + }).WherePri(3).One() + t.AssertNil(err) + t.Assert(one["passport"], "user_3") - r, err := db.Model(table).Data("passport", "user_300").Cache(gdb.CacheOption{ - Duration: time.Second, - Name: "test3", - Force: false, - }).WherePri(3).Update() - t.AssertNil(err) - n, err := r.RowsAffected() - t.AssertNil(err) - t.Assert(n, 1) + r, err := db.Model(table).Data("passport", "user_300").Cache(gdb.CacheOption{ + Duration: time.Second, + Name: "test3", + Force: false, + }).WherePri(3).Update() + t.AssertNil(err) + n, err := r.RowsAffected() + t.AssertNil(err) + t.Assert(n, 1) - err = db.Transaction(context.TODO(), func(ctx context.Context, tx gdb.TX) error { - one, err := tx.Model(table).Cache(gdb.CacheOption{ - Duration: time.Second, - Name: "test3", - Force: false, - }).WherePri(3).One() - t.AssertNil(err) - t.Assert(one["passport"], "user_300") - return nil - }) - t.AssertNil(err) + err = db.Transaction(context.TODO(), func(ctx context.Context, tx gdb.TX) error { + one, err := tx.Model(table).Cache(gdb.CacheOption{ + Duration: time.Second, + Name: "test3", + Force: false, + }).WherePri(3).One() + t.AssertNil(err) + t.Assert(one["passport"], "user_300") + return nil + }) + t.AssertNil(err) - one, err = db.Model(table).Cache(gdb.CacheOption{ - Duration: time.Second, - Name: "test3", - Force: false, - }).WherePri(3).One() - t.AssertNil(err) - t.Assert(one["passport"], "user_3") - }) - gtest.C(t, func(t *gtest.T) { - // make cache for id 4 - one, err := db.Model(table).Cache(gdb.CacheOption{ - Duration: time.Second, - Name: "test4", - Force: false, - }).WherePri(4).One() - t.AssertNil(err) - t.Assert(one["passport"], "user_4") + one, err = db.Model(table).Cache(gdb.CacheOption{ + Duration: time.Second, + Name: "test3", + Force: false, + }).WherePri(3).One() + t.AssertNil(err) + t.Assert(one["passport"], "user_3") + }) + gtest.C(t, func(t *gtest.T) { + // make cache for id 4 + one, err := db.Model(table).Cache(gdb.CacheOption{ + Duration: time.Second, + Name: "test4", + Force: false, + }).WherePri(4).One() + t.AssertNil(err) + t.Assert(one["passport"], "user_4") - r, err := db.Model(table).Data("passport", "user_400").Cache(gdb.CacheOption{ - Duration: time.Second, - Name: "test3", - Force: false, - }).WherePri(4).Update() - t.AssertNil(err) - n, err := r.RowsAffected() - t.AssertNil(err) - t.Assert(n, 1) + r, err := db.Model(table).Data("passport", "user_400").Cache(gdb.CacheOption{ + Duration: time.Second, + Name: "test3", + Force: false, + }).WherePri(4).Update() + t.AssertNil(err) + n, err := r.RowsAffected() + t.AssertNil(err) + t.Assert(n, 1) - err = db.Transaction(context.TODO(), func(ctx context.Context, tx gdb.TX) error { - // Cache feature disabled. - one, err := tx.Model(table).Cache(gdb.CacheOption{ - Duration: time.Second, - Name: "test4", - Force: false, - }).WherePri(4).One() - t.AssertNil(err) - t.Assert(one["passport"], "user_400") - // Update the cache. - r, err := tx.Model(table).Data("passport", "user_4000"). - Cache(gdb.CacheOption{ - Duration: -1, - Name: "test4", - Force: false, - }).WherePri(4).Update() - t.AssertNil(err) - n, err := r.RowsAffected() - t.AssertNil(err) - t.Assert(n, 1) - return nil - }) - t.AssertNil(err) - // Read from db. - one, err = db.Model(table).Cache(gdb.CacheOption{ - Duration: time.Second, - Name: "test4", - Force: false, - }).WherePri(4).One() - t.AssertNil(err) - t.Assert(one["passport"], "user_4000") - }) + err = db.Transaction(context.TODO(), func(ctx context.Context, tx gdb.TX) error { + // Cache feature disabled. + one, err := tx.Model(table).Cache(gdb.CacheOption{ + Duration: time.Second, + Name: "test4", + Force: false, + }).WherePri(4).One() + t.AssertNil(err) + t.Assert(one["passport"], "user_400") + // Update the cache. + r, err := tx.Model(table).Data("passport", "user_4000"). + Cache(gdb.CacheOption{ + Duration: -1, + Name: "test4", + Force: false, + }).WherePri(4).Update() + t.AssertNil(err) + n, err := r.RowsAffected() + t.AssertNil(err) + t.Assert(n, 1) + return nil + }) + t.AssertNil(err) + // Read from db. + one, err = db.Model(table).Cache(gdb.CacheOption{ + Duration: time.Second, + Name: "test4", + Force: false, + }).WherePri(4).One() + t.AssertNil(err) + t.Assert(one["passport"], "user_4000") + }) } func Test_Model_Having(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - all, err := db.Model(table).Where("id > 1").Having("id > 8").All() - t.AssertNil(err) - t.Assert(len(all), 2) - }) - gtest.C(t, func(t *gtest.T) { - all, err := db.Model(table).Where("id > 1").Having("id > ?", 8).All() - t.AssertNil(err) - t.Assert(len(all), 2) - }) - gtest.C(t, func(t *gtest.T) { - all, err := db.Model(table).Where("id > ?", 1).Having("id > ?", 8).All() - t.AssertNil(err) - t.Assert(len(all), 2) - }) - gtest.C(t, func(t *gtest.T) { - all, err := db.Model(table).Where("id > ?", 1).Having("id", 8).All() - t.AssertNil(err) - t.Assert(len(all), 1) - }) + gtest.C(t, func(t *gtest.T) { + all, err := db.Model(table).Where("id > 1").Having("id > 8").All() + t.AssertNil(err) + t.Assert(len(all), 2) + }) + gtest.C(t, func(t *gtest.T) { + all, err := db.Model(table).Where("id > 1").Having("id > ?", 8).All() + t.AssertNil(err) + t.Assert(len(all), 2) + }) + gtest.C(t, func(t *gtest.T) { + all, err := db.Model(table).Where("id > ?", 1).Having("id > ?", 8).All() + t.AssertNil(err) + t.Assert(len(all), 2) + }) + gtest.C(t, func(t *gtest.T) { + all, err := db.Model(table).Where("id > ?", 1).Having("id", 8).All() + t.AssertNil(err) + t.Assert(len(all), 1) + }) } func Test_Model_Distinct(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - all, err := db.Model(table, "t").Fields("distinct t.id").Where("id > 1").Having("id > 8").All() - t.AssertNil(err) - t.Assert(len(all), 2) - }) - gtest.C(t, func(t *gtest.T) { - count, err := db.Model(table).Where("id > 1").Distinct().Count() - t.AssertNil(err) - t.Assert(count, int64(9)) - }) + gtest.C(t, func(t *gtest.T) { + all, err := db.Model(table, "t").Fields("distinct t.id").Where("id > 1").Having("id > 8").All() + t.AssertNil(err) + t.Assert(len(all), 2) + }) + gtest.C(t, func(t *gtest.T) { + count, err := db.Model(table).Where("id > 1").Distinct().Count() + t.AssertNil(err) + t.Assert(count, int64(9)) + }) } func Test_Model_Min_Max(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - value, err := db.Model(table, "t").Fields("min(t.id)").Where("id > 1").Value() - t.AssertNil(err) - t.Assert(value.Int(), 2) - }) - gtest.C(t, func(t *gtest.T) { - value, err := db.Model(table, "t").Fields("max(t.id)").Where("id > 1").Value() - t.AssertNil(err) - t.Assert(value.Int(), 10) - }) + gtest.C(t, func(t *gtest.T) { + value, err := db.Model(table, "t").Fields("min(t.id)").Where("id > 1").Value() + t.AssertNil(err) + t.Assert(value.Int(), 2) + }) + gtest.C(t, func(t *gtest.T) { + value, err := db.Model(table, "t").Fields("max(t.id)").Where("id > 1").Value() + t.AssertNil(err) + t.Assert(value.Int(), 10) + }) } func Test_Model_Fields_AutoMapping(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - value, err := db.Model(table).Fields("ID").Where("id", 2).Value() - t.AssertNil(err) - t.Assert(value.Int(), 2) - }) + gtest.C(t, func(t *gtest.T) { + value, err := db.Model(table).Fields("ID").Where("id", 2).Value() + t.AssertNil(err) + t.Assert(value.Int(), 2) + }) - gtest.C(t, func(t *gtest.T) { - value, err := db.Model(table).Fields("NICK_NAME").Where("id", 2).Value() - t.AssertNil(err) - t.Assert(value.String(), "name_2") - }) - // Map - gtest.C(t, func(t *gtest.T) { - one, err := db.Model(table).Fields(g.Map{ - "ID": 1, - "NICK_NAME": 1, - }).Where("id", 2).One() - t.AssertNil(err) - t.Assert(len(one), 2) - t.Assert(one["id"], 2) - t.Assert(one["nickname"], "name_2") - }) - // Struct - gtest.C(t, func(t *gtest.T) { - type T struct { - ID int - NICKNAME int - } - one, err := db.Model(table).Fields(&T{ - ID: 0, - NICKNAME: 0, - }).Where("id", 2).One() - t.AssertNil(err) - t.Assert(len(one), 2) - t.Assert(one["id"], 2) - t.Assert(one["nickname"], "name_2") - }) + gtest.C(t, func(t *gtest.T) { + value, err := db.Model(table).Fields("NICK_NAME").Where("id", 2).Value() + t.AssertNil(err) + t.Assert(value.String(), "name_2") + }) + // Map + gtest.C(t, func(t *gtest.T) { + one, err := db.Model(table).Fields(g.Map{ + "ID": 1, + "NICK_NAME": 1, + }).Where("id", 2).One() + t.AssertNil(err) + t.Assert(len(one), 2) + t.Assert(one["id"], 2) + t.Assert(one["nickname"], "name_2") + }) + // Struct + gtest.C(t, func(t *gtest.T) { + type T struct { + ID int + NICKNAME int + } + one, err := db.Model(table).Fields(&T{ + ID: 0, + NICKNAME: 0, + }).Where("id", 2).One() + t.AssertNil(err) + t.Assert(len(one), 2) + t.Assert(one["id"], 2) + t.Assert(one["nickname"], "name_2") + }) } func Test_Model_FieldsEx_AutoMapping(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - // "id": i, - // "passport": fmt.Sprintf(`user_%d`, i), - // "password": fmt.Sprintf(`pass_%d`, i), - // "nickname": fmt.Sprintf(`name_%d`, i), - // "create_time": gtime.NewFromStr("2018-10-24 10:00:00").String(), + // "id": i, + // "passport": fmt.Sprintf(`user_%d`, i), + // "password": fmt.Sprintf(`pass_%d`, i), + // "nickname": fmt.Sprintf(`name_%d`, i), + // "create_time": gtime.NewFromStr("2018-10-24 10:00:00").String(), - gtest.C(t, func(t *gtest.T) { - value, err := db.Model(table).FieldsEx("create_date, Passport, Password, NickName, CreateTime").Where("id", 2).Value() - t.AssertNil(err) - t.Assert(value.Int(), 2) - }) + gtest.C(t, func(t *gtest.T) { + value, err := db.Model(table).FieldsEx("create_date, Passport, Password, NickName, CreateTime").Where("id", 2).Value() + t.AssertNil(err) + t.Assert(value.Int(), 2) + }) - gtest.C(t, func(t *gtest.T) { - value, err := db.Model(table).FieldsEx("create_date, ID, Passport, Password, CreateTime").Where("id", 2).Value() - t.AssertNil(err) - t.Assert(value.String(), "name_2") - }) - // Map - gtest.C(t, func(t *gtest.T) { - one, err := db.Model(table).FieldsEx(g.Map{ - "Passport": 1, - "Password": 1, - "CreateTime": 1, - }).Where("id", 2).One() - t.AssertNil(err) - t.Assert(len(one), 3) - t.Assert(one["id"], 2) - t.Assert(one["nickname"], "name_2") - }) - // Struct - gtest.C(t, func(t *gtest.T) { - type T struct { - Passport int - Password int - CreateTime int - } - one, err := db.Model(table).FieldsEx(&T{ - Passport: 0, - Password: 0, - CreateTime: 0, - }).Where("id", 2).One() - t.AssertNil(err) - t.Assert(len(one), 3) - t.Assert(one["id"], 2) - t.Assert(one["nickname"], "name_2") - }) + gtest.C(t, func(t *gtest.T) { + value, err := db.Model(table).FieldsEx("create_date, ID, Passport, Password, CreateTime").Where("id", 2).Value() + t.AssertNil(err) + t.Assert(value.String(), "name_2") + }) + // Map + gtest.C(t, func(t *gtest.T) { + one, err := db.Model(table).FieldsEx(g.Map{ + "Passport": 1, + "Password": 1, + "CreateTime": 1, + }).Where("id", 2).One() + t.AssertNil(err) + t.Assert(len(one), 3) + t.Assert(one["id"], 2) + t.Assert(one["nickname"], "name_2") + }) + // Struct + gtest.C(t, func(t *gtest.T) { + type T struct { + Passport int + Password int + CreateTime int + } + one, err := db.Model(table).FieldsEx(&T{ + Passport: 0, + Password: 0, + CreateTime: 0, + }).Where("id", 2).One() + t.AssertNil(err) + t.Assert(len(one), 3) + t.Assert(one["id"], 2) + t.Assert(one["nickname"], "name_2") + }) } func Test_Model_Fields_Struct(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - type A struct { - Passport string - Password string - } - type B struct { - A - NickName string - } - gtest.C(t, func(t *gtest.T) { - one, err := db.Model(table).Fields(A{}).Where("id", 2).One() - t.AssertNil(err) - t.Assert(len(one), 2) - t.Assert(one["passport"], "user_2") - t.Assert(one["password"], "pass_2") - }) - gtest.C(t, func(t *gtest.T) { - one, err := db.Model(table).Fields(&A{}).Where("id", 2).One() - t.AssertNil(err) - t.Assert(len(one), 2) - t.Assert(one["passport"], "user_2") - t.Assert(one["password"], "pass_2") - }) - gtest.C(t, func(t *gtest.T) { - one, err := db.Model(table).Fields(B{}).Where("id", 2).One() - t.AssertNil(err) - t.Assert(len(one), 3) - t.Assert(one["passport"], "user_2") - t.Assert(one["password"], "pass_2") - t.Assert(one["nickname"], "name_2") - }) - gtest.C(t, func(t *gtest.T) { - one, err := db.Model(table).Fields(&B{}).Where("id", 2).One() - t.AssertNil(err) - t.Assert(len(one), 3) - t.Assert(one["passport"], "user_2") - t.Assert(one["password"], "pass_2") - t.Assert(one["nickname"], "name_2") - }) + type A struct { + Passport string + Password string + } + type B struct { + A + NickName string + } + gtest.C(t, func(t *gtest.T) { + one, err := db.Model(table).Fields(A{}).Where("id", 2).One() + t.AssertNil(err) + t.Assert(len(one), 2) + t.Assert(one["passport"], "user_2") + t.Assert(one["password"], "pass_2") + }) + gtest.C(t, func(t *gtest.T) { + one, err := db.Model(table).Fields(&A{}).Where("id", 2).One() + t.AssertNil(err) + t.Assert(len(one), 2) + t.Assert(one["passport"], "user_2") + t.Assert(one["password"], "pass_2") + }) + gtest.C(t, func(t *gtest.T) { + one, err := db.Model(table).Fields(B{}).Where("id", 2).One() + t.AssertNil(err) + t.Assert(len(one), 3) + t.Assert(one["passport"], "user_2") + t.Assert(one["password"], "pass_2") + t.Assert(one["nickname"], "name_2") + }) + gtest.C(t, func(t *gtest.T) { + one, err := db.Model(table).Fields(&B{}).Where("id", 2).One() + t.AssertNil(err) + t.Assert(len(one), 3) + t.Assert(one["passport"], "user_2") + t.Assert(one["password"], "pass_2") + t.Assert(one["nickname"], "name_2") + }) } func Test_Model_NullField(t *testing.T) { - table := createTable() - defer dropTable(table) + table := createTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - type User struct { - Id int - Passport *string - } - data := g.Map{ - "id": 1, - "passport": nil, - } - result, err := db.Model(table).Data(data).Insert() - t.AssertNil(err) - n, _ := result.RowsAffected() - t.Assert(n, 1) - one, err := db.Model(table).WherePri(1).One() - t.AssertNil(err) + gtest.C(t, func(t *gtest.T) { + type User struct { + Id int + Passport *string + } + data := g.Map{ + "id": 1, + "passport": nil, + } + result, err := db.Model(table).Data(data).Insert() + t.AssertNil(err) + n, _ := result.RowsAffected() + t.Assert(n, 1) + one, err := db.Model(table).WherePri(1).One() + t.AssertNil(err) - var user *User - err = one.Struct(&user) - t.AssertNil(err) - t.Assert(user.Id, data["id"]) - t.Assert(user.Passport, data["passport"]) - }) + var user *User + err = one.Struct(&user) + t.AssertNil(err) + t.Assert(user.Id, data["id"]) + t.Assert(user.Passport, data["passport"]) + }) } func Test_Model_Empty_Slice_Argument(t *testing.T) { - table := createInitTable() - defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).Where(`id`, g.Slice{}).All() - t.AssertNil(err) - t.Assert(len(result), 0) - }) - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).Where(`id in(?)`, g.Slice{}).All() - t.AssertNil(err) - t.Assert(len(result), 0) - }) + table := createInitTable() + defer dropTable(table) + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).Where(`id`, g.Slice{}).All() + t.AssertNil(err) + t.Assert(len(result), 0) + }) + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).Where(`id in(?)`, g.Slice{}).All() + t.AssertNil(err) + t.Assert(len(result), 0) + }) } func Test_Model_HasTable(t *testing.T) { - table := createTable() - defer dropTable(table) + table := createTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - t.AssertNil(db.GetCore().ClearCacheAll(ctx)) - result, err := db.GetCore().HasTable(table) - t.Assert(result, true) - t.AssertNil(err) - }) + gtest.C(t, func(t *gtest.T) { + t.AssertNil(db.GetCore().ClearCacheAll(ctx)) + result, err := db.GetCore().HasTable(table) + t.Assert(result, true) + t.AssertNil(err) + }) - gtest.C(t, func(t *gtest.T) { - t.AssertNil(db.GetCore().ClearCacheAll(ctx)) - result, err := db.GetCore().HasTable("table12321") - t.Assert(result, false) - t.AssertNil(err) - }) + gtest.C(t, func(t *gtest.T) { + t.AssertNil(db.GetCore().ClearCacheAll(ctx)) + result, err := db.GetCore().HasTable("table12321") + t.Assert(result, false) + t.AssertNil(err) + }) } func Test_Model_HasField(t *testing.T) { - table := createTable() - defer dropTable(table) + table := createTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).HasField("id") - t.Assert(result, true) - t.AssertNil(err) - }) + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).HasField("id") + t.Assert(result, true) + t.AssertNil(err) + }) - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).HasField("id123") - t.Assert(result, false) - t.AssertNil(err) - }) + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).HasField("id123") + t.Assert(result, false) + t.AssertNil(err) + }) } func createTableForTimeZoneTest() string { - tableName := "user_" + gtime.Now().TimestampNanoStr() - if _, err := db.Exec(ctx, fmt.Sprintf(` + tableName := "user_" + gtime.Now().TimestampNanoStr() + if _, err := db.Exec(ctx, fmt.Sprintf(` CREATE TABLE %s ( id int(10) unsigned NOT NULL AUTO_INCREMENT, passport varchar(45) NULL, @@ -2519,698 +2521,698 @@ func createTableForTimeZoneTest() string { PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; `, tableName, - )); err != nil { - gtest.Fatal(err) - } - return tableName + )); err != nil { + gtest.Fatal(err) + } + return tableName } // https://github.com/gogf/gf/issues/1012 func Test_TimeZoneInsert(t *testing.T) { - tableName := createTableForTimeZoneTest() - defer dropTable(tableName) + tableName := createTableForTimeZoneTest() + defer dropTable(tableName) - tokyoLoc, err := time.LoadLocation("Asia/Tokyo") - gtest.AssertNil(err) + tokyoLoc, err := time.LoadLocation("Asia/Tokyo") + gtest.AssertNil(err) - CreateTime := "2020-11-22 12:23:45" - UpdateTime := "2020-11-22 13:23:46" - DeleteTime := "2020-11-22 14:23:47" - type User struct { - Id int `json:"id"` - CreatedAt *gtime.Time `json:"created_at"` - UpdatedAt gtime.Time `json:"updated_at"` - DeletedAt time.Time `json:"deleted_at"` - } - t1, _ := time.ParseInLocation("2006-01-02 15:04:05", CreateTime, tokyoLoc) - t2, _ := time.ParseInLocation("2006-01-02 15:04:05", UpdateTime, tokyoLoc) - t3, _ := time.ParseInLocation("2006-01-02 15:04:05", DeleteTime, tokyoLoc) - u := &User{ - Id: 1, - CreatedAt: gtime.New(t1.UTC()), - UpdatedAt: *gtime.New(t2.UTC()), - DeletedAt: t3.UTC(), - } + CreateTime := "2020-11-22 12:23:45" + UpdateTime := "2020-11-22 13:23:46" + DeleteTime := "2020-11-22 14:23:47" + type User struct { + Id int `json:"id"` + CreatedAt *gtime.Time `json:"created_at"` + UpdatedAt gtime.Time `json:"updated_at"` + DeletedAt time.Time `json:"deleted_at"` + } + t1, _ := time.ParseInLocation("2006-01-02 15:04:05", CreateTime, tokyoLoc) + t2, _ := time.ParseInLocation("2006-01-02 15:04:05", UpdateTime, tokyoLoc) + t3, _ := time.ParseInLocation("2006-01-02 15:04:05", DeleteTime, tokyoLoc) + u := &User{ + Id: 1, + CreatedAt: gtime.New(t1.UTC()), + UpdatedAt: *gtime.New(t2.UTC()), + DeletedAt: t3.UTC(), + } - gtest.C(t, func(t *gtest.T) { - _, err = db.Model(tableName).Unscoped().Insert(u) - t.AssertNil(err) - userEntity := &User{} - err = db.Model(tableName).Where("id", 1).Unscoped().Scan(&userEntity) - t.AssertNil(err) - t.Assert(userEntity.CreatedAt.String(), "2020-11-22 11:23:45") - t.Assert(userEntity.UpdatedAt.String(), "2020-11-22 12:23:46") - t.Assert(gtime.NewFromTime(userEntity.DeletedAt).String(), "2020-11-22 13:23:47") - }) + gtest.C(t, func(t *gtest.T) { + _, err = db.Model(tableName).Unscoped().Insert(u) + t.AssertNil(err) + userEntity := &User{} + err = db.Model(tableName).Where("id", 1).Unscoped().Scan(&userEntity) + t.AssertNil(err) + t.Assert(userEntity.CreatedAt.String(), "2020-11-22 11:23:45") + t.Assert(userEntity.UpdatedAt.String(), "2020-11-22 12:23:46") + t.Assert(gtime.NewFromTime(userEntity.DeletedAt).String(), "2020-11-22 13:23:47") + }) } func Test_Model_Fields_Map_Struct(t *testing.T) { - table := createInitTable() - defer dropTable(table) - // map - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).Fields(g.Map{ - "ID": 1, - "PASSPORT": 1, - "NONE_EXIST": 1, - }).Where("id", 1).One() - t.AssertNil(err) - t.Assert(len(result), 2) - t.Assert(result["id"], 1) - t.Assert(result["passport"], "user_1") - }) - // struct - gtest.C(t, func(t *gtest.T) { - type A struct { - ID int - PASSPORT string - XXX_TYPE int - } - a := A{} - err := db.Model(table).Fields(a).Where("id", 1).Scan(&a) - t.AssertNil(err) - t.Assert(a.ID, 1) - t.Assert(a.PASSPORT, "user_1") - t.Assert(a.XXX_TYPE, 0) - }) - // *struct - gtest.C(t, func(t *gtest.T) { - type A struct { - ID int - PASSPORT string - XXX_TYPE int - } - var a *A - err := db.Model(table).Fields(a).Where("id", 1).Scan(&a) - t.AssertNil(err) - t.Assert(a.ID, 1) - t.Assert(a.PASSPORT, "user_1") - t.Assert(a.XXX_TYPE, 0) - }) - // **struct - gtest.C(t, func(t *gtest.T) { - type A struct { - ID int - PASSPORT string - XXX_TYPE int - } - var a *A - err := db.Model(table).Fields(&a).Where("id", 1).Scan(&a) - t.AssertNil(err) - t.Assert(a.ID, 1) - t.Assert(a.PASSPORT, "user_1") - t.Assert(a.XXX_TYPE, 0) - }) + table := createInitTable() + defer dropTable(table) + // map + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).Fields(g.Map{ + "ID": 1, + "PASSPORT": 1, + "NONE_EXIST": 1, + }).Where("id", 1).One() + t.AssertNil(err) + t.Assert(len(result), 2) + t.Assert(result["id"], 1) + t.Assert(result["passport"], "user_1") + }) + // struct + gtest.C(t, func(t *gtest.T) { + type A struct { + ID int + PASSPORT string + XXX_TYPE int + } + a := A{} + err := db.Model(table).Fields(a).Where("id", 1).Scan(&a) + t.AssertNil(err) + t.Assert(a.ID, 1) + t.Assert(a.PASSPORT, "user_1") + t.Assert(a.XXX_TYPE, 0) + }) + // *struct + gtest.C(t, func(t *gtest.T) { + type A struct { + ID int + PASSPORT string + XXX_TYPE int + } + var a *A + err := db.Model(table).Fields(a).Where("id", 1).Scan(&a) + t.AssertNil(err) + t.Assert(a.ID, 1) + t.Assert(a.PASSPORT, "user_1") + t.Assert(a.XXX_TYPE, 0) + }) + // **struct + gtest.C(t, func(t *gtest.T) { + type A struct { + ID int + PASSPORT string + XXX_TYPE int + } + var a *A + err := db.Model(table).Fields(&a).Where("id", 1).Scan(&a) + t.AssertNil(err) + t.Assert(a.ID, 1) + t.Assert(a.PASSPORT, "user_1") + t.Assert(a.XXX_TYPE, 0) + }) } func Test_Model_Min_Max_Avg_Sum(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).Min("id") - t.AssertNil(err) - t.Assert(result, 1) - }) - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).Max("id") - t.AssertNil(err) - t.Assert(result, TableSize) - }) - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).Avg("id") - t.AssertNil(err) - t.Assert(result, 5.5) - }) - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).Sum("id") - t.AssertNil(err) - t.Assert(result, 55) - }) + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).Min("id") + t.AssertNil(err) + t.Assert(result, 1) + }) + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).Max("id") + t.AssertNil(err) + t.Assert(result, TableSize) + }) + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).Avg("id") + t.AssertNil(err) + t.Assert(result, 5.5) + }) + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).Sum("id") + t.AssertNil(err) + t.Assert(result, 55) + }) } func Test_Model_CountColumn(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).CountColumn("id") - t.AssertNil(err) - t.Assert(result, TableSize) - }) - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).WhereIn("id", g.Slice{1, 2, 3}).CountColumn("id") - t.AssertNil(err) - t.Assert(result, 3) - }) + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).CountColumn("id") + t.AssertNil(err) + t.Assert(result, TableSize) + }) + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).WhereIn("id", g.Slice{1, 2, 3}).CountColumn("id") + t.AssertNil(err) + t.Assert(result, 3) + }) } func Test_Model_InsertAndGetId(t *testing.T) { - table := createTable() - defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - id, err := db.Model(table).Data(g.Map{ - "id": 1, - "passport": "user_1", - "password": "pass_1", - "nickname": "name_1", - }).InsertAndGetId() - t.AssertNil(err) - t.Assert(id, 1) - }) - gtest.C(t, func(t *gtest.T) { - id, err := db.Model(table).Data(g.Map{ - "passport": "user_2", - "password": "pass_2", - "nickname": "name_2", - }).InsertAndGetId() - t.AssertNil(err) - t.Assert(id, 2) - }) + table := createTable() + defer dropTable(table) + gtest.C(t, func(t *gtest.T) { + id, err := db.Model(table).Data(g.Map{ + "id": 1, + "passport": "user_1", + "password": "pass_1", + "nickname": "name_1", + }).InsertAndGetId() + t.AssertNil(err) + t.Assert(id, 1) + }) + gtest.C(t, func(t *gtest.T) { + id, err := db.Model(table).Data(g.Map{ + "passport": "user_2", + "password": "pass_2", + "nickname": "name_2", + }).InsertAndGetId() + t.AssertNil(err) + t.Assert(id, 2) + }) } func Test_Model_Increment_Decrement(t *testing.T) { - table := createInitTable() - defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).Where("id", 1).Increment("id", 100) - t.AssertNil(err) - rows, _ := result.RowsAffected() - t.Assert(rows, 1) - }) - gtest.C(t, func(t *gtest.T) { - result, err := db.Model(table).Where("id", 101).Decrement("id", 10) - t.AssertNil(err) - rows, _ := result.RowsAffected() - t.Assert(rows, 1) - }) - gtest.C(t, func(t *gtest.T) { - count, err := db.Model(table).Where("id", 91).Count() - t.AssertNil(err) - t.Assert(count, int64(1)) - }) + table := createInitTable() + defer dropTable(table) + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).Where("id", 1).Increment("id", 100) + t.AssertNil(err) + rows, _ := result.RowsAffected() + t.Assert(rows, 1) + }) + gtest.C(t, func(t *gtest.T) { + result, err := db.Model(table).Where("id", 101).Decrement("id", 10) + t.AssertNil(err) + rows, _ := result.RowsAffected() + t.Assert(rows, 1) + }) + gtest.C(t, func(t *gtest.T) { + count, err := db.Model(table).Where("id", 91).Count() + t.AssertNil(err) + t.Assert(count, int64(1)) + }) } func Test_Model_OnDuplicate(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - // string type 1. - gtest.C(t, func(t *gtest.T) { - data := g.Map{ - "id": 1, - "passport": "pp1", - "password": "pw1", - "nickname": "n1", - "create_time": "2016-06-06", - } - _, err := db.Model(table).OnDuplicate("passport,password").Data(data).Save() - t.AssertNil(err) - one, err := db.Model(table).WherePri(1).One() - t.AssertNil(err) - t.Assert(one["passport"], data["passport"]) - t.Assert(one["password"], data["password"]) - t.Assert(one["nickname"], "name_1") - }) + // string type 1. + gtest.C(t, func(t *gtest.T) { + data := g.Map{ + "id": 1, + "passport": "pp1", + "password": "pw1", + "nickname": "n1", + "create_time": "2016-06-06", + } + _, err := db.Model(table).OnDuplicate("passport,password").Data(data).Save() + t.AssertNil(err) + one, err := db.Model(table).WherePri(1).One() + t.AssertNil(err) + t.Assert(one["passport"], data["passport"]) + t.Assert(one["password"], data["password"]) + t.Assert(one["nickname"], "name_1") + }) - // string type 2. - gtest.C(t, func(t *gtest.T) { - data := g.Map{ - "id": 1, - "passport": "pp1", - "password": "pw1", - "nickname": "n1", - "create_time": "2016-06-06", - } - _, err := db.Model(table).OnDuplicate("passport", "password").Data(data).Save() - t.AssertNil(err) - one, err := db.Model(table).WherePri(1).One() - t.AssertNil(err) - t.Assert(one["passport"], data["passport"]) - t.Assert(one["password"], data["password"]) - t.Assert(one["nickname"], "name_1") - }) + // string type 2. + gtest.C(t, func(t *gtest.T) { + data := g.Map{ + "id": 1, + "passport": "pp1", + "password": "pw1", + "nickname": "n1", + "create_time": "2016-06-06", + } + _, err := db.Model(table).OnDuplicate("passport", "password").Data(data).Save() + t.AssertNil(err) + one, err := db.Model(table).WherePri(1).One() + t.AssertNil(err) + t.Assert(one["passport"], data["passport"]) + t.Assert(one["password"], data["password"]) + t.Assert(one["nickname"], "name_1") + }) - // slice. - gtest.C(t, func(t *gtest.T) { - data := g.Map{ - "id": 1, - "passport": "pp1", - "password": "pw1", - "nickname": "n1", - "create_time": "2016-06-06", - } - _, err := db.Model(table).OnDuplicate(g.Slice{"passport", "password"}).Data(data).Save() - t.AssertNil(err) - one, err := db.Model(table).WherePri(1).One() - t.AssertNil(err) - t.Assert(one["passport"], data["passport"]) - t.Assert(one["password"], data["password"]) - t.Assert(one["nickname"], "name_1") - }) + // slice. + gtest.C(t, func(t *gtest.T) { + data := g.Map{ + "id": 1, + "passport": "pp1", + "password": "pw1", + "nickname": "n1", + "create_time": "2016-06-06", + } + _, err := db.Model(table).OnDuplicate(g.Slice{"passport", "password"}).Data(data).Save() + t.AssertNil(err) + one, err := db.Model(table).WherePri(1).One() + t.AssertNil(err) + t.Assert(one["passport"], data["passport"]) + t.Assert(one["password"], data["password"]) + t.Assert(one["nickname"], "name_1") + }) - // map. - gtest.C(t, func(t *gtest.T) { - data := g.Map{ - "id": 1, - "passport": "pp1", - "password": "pw1", - "nickname": "n1", - "create_time": "2016-06-06", - } - _, err := db.Model(table).OnDuplicate(g.Map{ - "passport": "nickname", - "password": "nickname", - }).Data(data).Save() - t.AssertNil(err) - one, err := db.Model(table).WherePri(1).One() - t.AssertNil(err) - t.Assert(one["passport"], data["nickname"]) - t.Assert(one["password"], data["nickname"]) - t.Assert(one["nickname"], "name_1") - }) + // map. + gtest.C(t, func(t *gtest.T) { + data := g.Map{ + "id": 1, + "passport": "pp1", + "password": "pw1", + "nickname": "n1", + "create_time": "2016-06-06", + } + _, err := db.Model(table).OnDuplicate(g.Map{ + "passport": "nickname", + "password": "nickname", + }).Data(data).Save() + t.AssertNil(err) + one, err := db.Model(table).WherePri(1).One() + t.AssertNil(err) + t.Assert(one["passport"], data["nickname"]) + t.Assert(one["password"], data["nickname"]) + t.Assert(one["nickname"], "name_1") + }) - // map+raw. - gtest.C(t, func(t *gtest.T) { - data := g.MapStrStr{ - "id": "1", - "passport": "pp1", - "password": "pw1", - "nickname": "n1", - "create_time": "2016-06-06", - } - _, err := db.Model(table).OnDuplicate(g.Map{ - "passport": gdb.Raw("CONCAT(VALUES(`passport`), '1')"), - "password": gdb.Raw("CONCAT(VALUES(`password`), '2')"), - }).Data(data).Save() - t.AssertNil(err) - one, err := db.Model(table).WherePri(1).One() - t.AssertNil(err) - t.Assert(one["passport"], data["passport"]+"1") - t.Assert(one["password"], data["password"]+"2") - t.Assert(one["nickname"], "name_1") - }) + // map+raw. + gtest.C(t, func(t *gtest.T) { + data := g.MapStrStr{ + "id": "1", + "passport": "pp1", + "password": "pw1", + "nickname": "n1", + "create_time": "2016-06-06", + } + _, err := db.Model(table).OnDuplicate(g.Map{ + "passport": gdb.Raw("CONCAT(VALUES(`passport`), '1')"), + "password": gdb.Raw("CONCAT(VALUES(`password`), '2')"), + }).Data(data).Save() + t.AssertNil(err) + one, err := db.Model(table).WherePri(1).One() + t.AssertNil(err) + t.Assert(one["passport"], data["passport"]+"1") + t.Assert(one["password"], data["password"]+"2") + t.Assert(one["nickname"], "name_1") + }) } func Test_Model_OnDuplicateEx(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - // string type 1. - gtest.C(t, func(t *gtest.T) { - data := g.Map{ - "id": 1, - "passport": "pp1", - "password": "pw1", - "nickname": "n1", - "create_time": "2016-06-06", - } - _, err := db.Model(table).OnDuplicateEx("nickname,create_time").Data(data).Save() - t.AssertNil(err) - one, err := db.Model(table).WherePri(1).One() - t.AssertNil(err) - t.Assert(one["passport"], data["passport"]) - t.Assert(one["password"], data["password"]) - t.Assert(one["nickname"], "name_1") - }) + // string type 1. + gtest.C(t, func(t *gtest.T) { + data := g.Map{ + "id": 1, + "passport": "pp1", + "password": "pw1", + "nickname": "n1", + "create_time": "2016-06-06", + } + _, err := db.Model(table).OnDuplicateEx("nickname,create_time").Data(data).Save() + t.AssertNil(err) + one, err := db.Model(table).WherePri(1).One() + t.AssertNil(err) + t.Assert(one["passport"], data["passport"]) + t.Assert(one["password"], data["password"]) + t.Assert(one["nickname"], "name_1") + }) - // string type 2. - gtest.C(t, func(t *gtest.T) { - data := g.Map{ - "id": 1, - "passport": "pp1", - "password": "pw1", - "nickname": "n1", - "create_time": "2016-06-06", - } - _, err := db.Model(table).OnDuplicateEx("nickname", "create_time").Data(data).Save() - t.AssertNil(err) - one, err := db.Model(table).WherePri(1).One() - t.AssertNil(err) - t.Assert(one["passport"], data["passport"]) - t.Assert(one["password"], data["password"]) - t.Assert(one["nickname"], "name_1") - }) + // string type 2. + gtest.C(t, func(t *gtest.T) { + data := g.Map{ + "id": 1, + "passport": "pp1", + "password": "pw1", + "nickname": "n1", + "create_time": "2016-06-06", + } + _, err := db.Model(table).OnDuplicateEx("nickname", "create_time").Data(data).Save() + t.AssertNil(err) + one, err := db.Model(table).WherePri(1).One() + t.AssertNil(err) + t.Assert(one["passport"], data["passport"]) + t.Assert(one["password"], data["password"]) + t.Assert(one["nickname"], "name_1") + }) - // slice. - gtest.C(t, func(t *gtest.T) { - data := g.Map{ - "id": 1, - "passport": "pp1", - "password": "pw1", - "nickname": "n1", - "create_time": "2016-06-06", - } - _, err := db.Model(table).OnDuplicateEx(g.Slice{"nickname", "create_time"}).Data(data).Save() - t.AssertNil(err) - one, err := db.Model(table).WherePri(1).One() - t.AssertNil(err) - t.Assert(one["passport"], data["passport"]) - t.Assert(one["password"], data["password"]) - t.Assert(one["nickname"], "name_1") - }) + // slice. + gtest.C(t, func(t *gtest.T) { + data := g.Map{ + "id": 1, + "passport": "pp1", + "password": "pw1", + "nickname": "n1", + "create_time": "2016-06-06", + } + _, err := db.Model(table).OnDuplicateEx(g.Slice{"nickname", "create_time"}).Data(data).Save() + t.AssertNil(err) + one, err := db.Model(table).WherePri(1).One() + t.AssertNil(err) + t.Assert(one["passport"], data["passport"]) + t.Assert(one["password"], data["password"]) + t.Assert(one["nickname"], "name_1") + }) - // map. - gtest.C(t, func(t *gtest.T) { - data := g.Map{ - "id": 1, - "passport": "pp1", - "password": "pw1", - "nickname": "n1", - "create_time": "2016-06-06", - } - _, err := db.Model(table).OnDuplicateEx(g.Map{ - "nickname": "nickname", - "create_time": "nickname", - }).Data(data).Save() - t.AssertNil(err) - one, err := db.Model(table).WherePri(1).One() - t.AssertNil(err) - t.Assert(one["passport"], data["passport"]) - t.Assert(one["password"], data["password"]) - t.Assert(one["nickname"], "name_1") - }) + // map. + gtest.C(t, func(t *gtest.T) { + data := g.Map{ + "id": 1, + "passport": "pp1", + "password": "pw1", + "nickname": "n1", + "create_time": "2016-06-06", + } + _, err := db.Model(table).OnDuplicateEx(g.Map{ + "nickname": "nickname", + "create_time": "nickname", + }).Data(data).Save() + t.AssertNil(err) + one, err := db.Model(table).WherePri(1).One() + t.AssertNil(err) + t.Assert(one["passport"], data["passport"]) + t.Assert(one["password"], data["password"]) + t.Assert(one["nickname"], "name_1") + }) } func Test_Model_Raw(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - all, err := db. - Raw(fmt.Sprintf("select * from %s where id in (?)", table), g.Slice{1, 5, 7, 8, 9, 10}). - WhereLT("id", 8). - WhereIn("id", g.Slice{1, 2, 3, 4, 5, 6, 7}). - OrderDesc("id"). - Limit(2). - All() - t.AssertNil(err) - t.Assert(len(all), 2) - t.Assert(all[0]["id"], 7) - t.Assert(all[1]["id"], 5) - }) + gtest.C(t, func(t *gtest.T) { + all, err := db. + Raw(fmt.Sprintf("select * from %s where id in (?)", table), g.Slice{1, 5, 7, 8, 9, 10}). + WhereLT("id", 8). + WhereIn("id", g.Slice{1, 2, 3, 4, 5, 6, 7}). + OrderDesc("id"). + Limit(2). + All() + t.AssertNil(err) + t.Assert(len(all), 2) + t.Assert(all[0]["id"], 7) + t.Assert(all[1]["id"], 5) + }) - gtest.C(t, func(t *gtest.T) { - count, err := db. - Raw(fmt.Sprintf("select * from %s where id in (?)", table), g.Slice{1, 5, 7, 8, 9, 10}). - WhereLT("id", 8). - WhereIn("id", g.Slice{1, 2, 3, 4, 5, 6, 7}). - OrderDesc("id"). - Limit(2). - Count() - t.AssertNil(err) - t.Assert(count, int64(6)) - }) + gtest.C(t, func(t *gtest.T) { + count, err := db. + Raw(fmt.Sprintf("select * from %s where id in (?)", table), g.Slice{1, 5, 7, 8, 9, 10}). + WhereLT("id", 8). + WhereIn("id", g.Slice{1, 2, 3, 4, 5, 6, 7}). + OrderDesc("id"). + Limit(2). + Count() + t.AssertNil(err) + t.Assert(count, int64(6)) + }) } func Test_Model_Handler(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - m := db.Model(table).Safe().Handler( - func(m *gdb.Model) *gdb.Model { - return m.Page(0, 3) - }, - func(m *gdb.Model) *gdb.Model { - return m.Where("id", g.Slice{1, 2, 3, 4, 5, 6}) - }, - func(m *gdb.Model) *gdb.Model { - return m.OrderDesc("id") - }, - ) - all, err := m.All() - t.AssertNil(err) - t.Assert(len(all), 3) - t.Assert(all[0]["id"], 6) - t.Assert(all[2]["id"], 4) - }) + gtest.C(t, func(t *gtest.T) { + m := db.Model(table).Safe().Handler( + func(m *gdb.Model) *gdb.Model { + return m.Page(0, 3) + }, + func(m *gdb.Model) *gdb.Model { + return m.Where("id", g.Slice{1, 2, 3, 4, 5, 6}) + }, + func(m *gdb.Model) *gdb.Model { + return m.OrderDesc("id") + }, + ) + all, err := m.All() + t.AssertNil(err) + t.Assert(len(all), 3) + t.Assert(all[0]["id"], 6) + t.Assert(all[2]["id"], 4) + }) } func Test_Model_FieldCount(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - all, err := db.Model(table).Fields("id").FieldCount("id", "total").Group("id").OrderAsc("id").All() - t.AssertNil(err) - t.Assert(len(all), TableSize) - t.Assert(all[0]["id"], 1) - t.Assert(all[0]["total"].Int(), 1) - }) + gtest.C(t, func(t *gtest.T) { + all, err := db.Model(table).Fields("id").FieldCount("id", "total").Group("id").OrderAsc("id").All() + t.AssertNil(err) + t.Assert(len(all), TableSize) + t.Assert(all[0]["id"], 1) + t.Assert(all[0]["total"].Int(), 1) + }) } func Test_Model_FieldMax(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - all, err := db.Model(table).Fields("id").FieldMax("id", "total").Group("id").OrderAsc("id").All() - t.AssertNil(err) - t.Assert(len(all), TableSize) - t.Assert(all[0]["id"], 1) - t.Assert(all[0]["total"].Int(), 1) - }) + gtest.C(t, func(t *gtest.T) { + all, err := db.Model(table).Fields("id").FieldMax("id", "total").Group("id").OrderAsc("id").All() + t.AssertNil(err) + t.Assert(len(all), TableSize) + t.Assert(all[0]["id"], 1) + t.Assert(all[0]["total"].Int(), 1) + }) } func Test_Model_FieldMin(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - all, err := db.Model(table).Fields("id").FieldMin("id", "total").Group("id").OrderAsc("id").All() - t.AssertNil(err) - t.Assert(len(all), TableSize) - t.Assert(all[0]["id"], 1) - t.Assert(all[0]["total"].Int(), 1) - }) + gtest.C(t, func(t *gtest.T) { + all, err := db.Model(table).Fields("id").FieldMin("id", "total").Group("id").OrderAsc("id").All() + t.AssertNil(err) + t.Assert(len(all), TableSize) + t.Assert(all[0]["id"], 1) + t.Assert(all[0]["total"].Int(), 1) + }) } func Test_Model_FieldAvg(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - all, err := db.Model(table).Fields("id").FieldAvg("id", "total").Group("id").OrderAsc("id").All() - t.AssertNil(err) - t.Assert(len(all), TableSize) - t.Assert(all[0]["id"], 1) - t.Assert(all[0]["total"].Int(), 1) - }) + gtest.C(t, func(t *gtest.T) { + all, err := db.Model(table).Fields("id").FieldAvg("id", "total").Group("id").OrderAsc("id").All() + t.AssertNil(err) + t.Assert(len(all), TableSize) + t.Assert(all[0]["id"], 1) + t.Assert(all[0]["total"].Int(), 1) + }) } func Test_Model_OmitEmptyWhere(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - // Basic type where. - gtest.C(t, func(t *gtest.T) { - count, err := db.Model(table).Where("id", 0).Count() - t.AssertNil(err) - t.Assert(count, int64(0)) - }) - gtest.C(t, func(t *gtest.T) { - count, err := db.Model(table).OmitEmptyWhere().Where("id", 0).Count() - t.AssertNil(err) - t.Assert(count, int64(TableSize)) - }) - gtest.C(t, func(t *gtest.T) { - count, err := db.Model(table).OmitEmptyWhere().Where("id", 0).Where("nickname", "").Count() - t.AssertNil(err) - t.Assert(count, int64(TableSize)) - }) - // Slice where. - gtest.C(t, func(t *gtest.T) { - count, err := db.Model(table).Where("id", g.Slice{1, 2, 3}).Count() - t.AssertNil(err) - t.Assert(count, int64(3)) - }) - gtest.C(t, func(t *gtest.T) { - count, err := db.Model(table).Where("id", g.Slice{}).Count() - t.AssertNil(err) - t.Assert(count, int64(0)) - }) - gtest.C(t, func(t *gtest.T) { - count, err := db.Model(table).OmitEmptyWhere().Where("id", g.Slice{}).Count() - t.AssertNil(err) - t.Assert(count, int64(TableSize)) - }) - gtest.C(t, func(t *gtest.T) { - count, err := db.Model(table).Where("id", g.Slice{}).OmitEmptyWhere().Count() - t.AssertNil(err) - t.Assert(count, int64(TableSize)) - }) - // Struct Where. - gtest.C(t, func(t *gtest.T) { - type Input struct { - Id []int - Name []string - } - count, err := db.Model(table).Where(Input{}).Count() - t.AssertNil(err) - t.Assert(count, int64(0)) - }) - gtest.C(t, func(t *gtest.T) { - type Input struct { - Id []int - Name []string - } - count, err := db.Model(table).Where(Input{}).OmitEmptyWhere().Count() - t.AssertNil(err) - t.Assert(count, int64(TableSize)) - }) - // Map Where. - gtest.C(t, func(t *gtest.T) { - count, err := db.Model(table).Where(g.Map{ - "id": []int{}, - "nickname": []string{}, - }).Count() - t.AssertNil(err) - t.Assert(count, int64(0)) - }) - gtest.C(t, func(t *gtest.T) { - type Input struct { - Id []int - } - count, err := db.Model(table).Where(g.Map{ - "id": []int{}, - }).OmitEmptyWhere().Count() - t.AssertNil(err) - t.Assert(count, int64(TableSize)) - }) + // Basic type where. + gtest.C(t, func(t *gtest.T) { + count, err := db.Model(table).Where("id", 0).Count() + t.AssertNil(err) + t.Assert(count, int64(0)) + }) + gtest.C(t, func(t *gtest.T) { + count, err := db.Model(table).OmitEmptyWhere().Where("id", 0).Count() + t.AssertNil(err) + t.Assert(count, int64(TableSize)) + }) + gtest.C(t, func(t *gtest.T) { + count, err := db.Model(table).OmitEmptyWhere().Where("id", 0).Where("nickname", "").Count() + t.AssertNil(err) + t.Assert(count, int64(TableSize)) + }) + // Slice where. + gtest.C(t, func(t *gtest.T) { + count, err := db.Model(table).Where("id", g.Slice{1, 2, 3}).Count() + t.AssertNil(err) + t.Assert(count, int64(3)) + }) + gtest.C(t, func(t *gtest.T) { + count, err := db.Model(table).Where("id", g.Slice{}).Count() + t.AssertNil(err) + t.Assert(count, int64(0)) + }) + gtest.C(t, func(t *gtest.T) { + count, err := db.Model(table).OmitEmptyWhere().Where("id", g.Slice{}).Count() + t.AssertNil(err) + t.Assert(count, int64(TableSize)) + }) + gtest.C(t, func(t *gtest.T) { + count, err := db.Model(table).Where("id", g.Slice{}).OmitEmptyWhere().Count() + t.AssertNil(err) + t.Assert(count, int64(TableSize)) + }) + // Struct Where. + gtest.C(t, func(t *gtest.T) { + type Input struct { + Id []int + Name []string + } + count, err := db.Model(table).Where(Input{}).Count() + t.AssertNil(err) + t.Assert(count, int64(0)) + }) + gtest.C(t, func(t *gtest.T) { + type Input struct { + Id []int + Name []string + } + count, err := db.Model(table).Where(Input{}).OmitEmptyWhere().Count() + t.AssertNil(err) + t.Assert(count, int64(TableSize)) + }) + // Map Where. + gtest.C(t, func(t *gtest.T) { + count, err := db.Model(table).Where(g.Map{ + "id": []int{}, + "nickname": []string{}, + }).Count() + t.AssertNil(err) + t.Assert(count, int64(0)) + }) + gtest.C(t, func(t *gtest.T) { + type Input struct { + Id []int + } + count, err := db.Model(table).Where(g.Map{ + "id": []int{}, + }).OmitEmptyWhere().Count() + t.AssertNil(err) + t.Assert(count, int64(TableSize)) + }) } // https://github.com/gogf/gf/issues/1387 func Test_Model_GTime_DefaultValue(t *testing.T) { - table := createTable() - defer dropTable(table) + table := createTable() + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - type User struct { - Id int - Passport string - Password string - Nickname string - CreateTime *gtime.Time - } - data := User{ - Id: 1, - Passport: "user_1", - Password: "pass_1", - Nickname: "name_1", - } - // Insert - _, err := db.Model(table).Data(data).Insert() - t.AssertNil(err) + gtest.C(t, func(t *gtest.T) { + type User struct { + Id int + Passport string + Password string + Nickname string + CreateTime *gtime.Time + } + data := User{ + Id: 1, + Passport: "user_1", + Password: "pass_1", + Nickname: "name_1", + } + // Insert + _, err := db.Model(table).Data(data).Insert() + t.AssertNil(err) - // Select - var ( - user *User - ) - err = db.Model(table).Scan(&user) - t.AssertNil(err) - t.Assert(user.Passport, data.Passport) - t.Assert(user.Password, data.Password) - t.Assert(user.CreateTime, data.CreateTime) - t.Assert(user.Nickname, data.Nickname) + // Select + var ( + user *User + ) + err = db.Model(table).Scan(&user) + t.AssertNil(err) + t.Assert(user.Passport, data.Passport) + t.Assert(user.Password, data.Password) + t.Assert(user.CreateTime, data.CreateTime) + t.Assert(user.Nickname, data.Nickname) - // Insert - user.Id = 2 - _, err = db.Model(table).Data(user).Insert() - t.AssertNil(err) - }) + // Insert + user.Id = 2 + _, err = db.Model(table).Data(user).Insert() + t.AssertNil(err) + }) } // Using filter does not affect the outside value inside function. func Test_Model_Insert_Filter(t *testing.T) { - // map - gtest.C(t, func(t *gtest.T) { - table := createTable() - defer dropTable(table) - data := g.Map{ - "id": 1, - "uid": 1, - "passport": "t1", - "password": "25d55ad283aa400af464c76d713c07ad", - "nickname": "name_1", - "create_time": gtime.Now().String(), - } - result, err := db.Model(table).Data(data).Insert() - t.AssertNil(err) - n, _ := result.LastInsertId() - t.Assert(n, 1) + // map + gtest.C(t, func(t *gtest.T) { + table := createTable() + defer dropTable(table) + data := g.Map{ + "id": 1, + "uid": 1, + "passport": "t1", + "password": "25d55ad283aa400af464c76d713c07ad", + "nickname": "name_1", + "create_time": gtime.Now().String(), + } + result, err := db.Model(table).Data(data).Insert() + t.AssertNil(err) + n, _ := result.LastInsertId() + t.Assert(n, 1) - t.Assert(data["uid"], 1) - }) - // slice - gtest.C(t, func(t *gtest.T) { - table := createTable() - defer dropTable(table) - data := g.List{ - g.Map{ - "id": 1, - "uid": 1, - "passport": "t1", - "password": "25d55ad283aa400af464c76d713c07ad", - "nickname": "name_1", - "create_time": gtime.Now().String(), - }, - g.Map{ - "id": 2, - "uid": 2, - "passport": "t1", - "password": "25d55ad283aa400af464c76d713c07ad", - "nickname": "name_1", - "create_time": gtime.Now().String(), - }, - } + t.Assert(data["uid"], 1) + }) + // slice + gtest.C(t, func(t *gtest.T) { + table := createTable() + defer dropTable(table) + data := g.List{ + g.Map{ + "id": 1, + "uid": 1, + "passport": "t1", + "password": "25d55ad283aa400af464c76d713c07ad", + "nickname": "name_1", + "create_time": gtime.Now().String(), + }, + g.Map{ + "id": 2, + "uid": 2, + "passport": "t1", + "password": "25d55ad283aa400af464c76d713c07ad", + "nickname": "name_1", + "create_time": gtime.Now().String(), + }, + } - result, err := db.Model(table).Data(data).Insert() - t.AssertNil(err) - n, _ := result.LastInsertId() - t.Assert(n, 2) + result, err := db.Model(table).Data(data).Insert() + t.AssertNil(err) + n, _ := result.LastInsertId() + t.Assert(n, 2) - t.Assert(data[0]["uid"], 1) - t.Assert(data[1]["uid"], 2) - }) + t.Assert(data[0]["uid"], 1) + t.Assert(data[1]["uid"], 2) + }) } func Test_Model_Embedded_Filter(t *testing.T) { - table := createTable() - defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - type Base struct { - Id int - Uid int - CreateTime string - NoneExist string - } - type User struct { - Base - Passport string - Password string - Nickname string - } - result, err := db.Model(table).Data(User{ - Passport: "john-test", - Password: "123456", - Nickname: "John", - Base: Base{ - Id: 100, - Uid: 100, - CreateTime: gtime.Now().String(), - }, - }).Insert() - t.AssertNil(err) - n, _ := result.RowsAffected() - t.Assert(n, 1) + table := createTable() + defer dropTable(table) + gtest.C(t, func(t *gtest.T) { + type Base struct { + Id int + Uid int + CreateTime string + NoneExist string + } + type User struct { + Base + Passport string + Password string + Nickname string + } + result, err := db.Model(table).Data(User{ + Passport: "john-test", + Password: "123456", + Nickname: "John", + Base: Base{ + Id: 100, + Uid: 100, + CreateTime: gtime.Now().String(), + }, + }).Insert() + t.AssertNil(err) + n, _ := result.RowsAffected() + t.Assert(n, 1) - var user *User - err = db.Model(table).Fields(user).Where("id=100").Scan(&user) - t.AssertNil(err) - t.Assert(user.Passport, "john-test") - t.Assert(user.Id, 100) - }) + var user *User + err = db.Model(table).Fields(user).Where("id=100").Scan(&user) + t.AssertNil(err) + t.Assert(user.Passport, "john-test") + t.Assert(user.Id, 100) + }) } // This is no longer used as the filter feature is automatically enabled from GoFrame v1.16.0. @@ -3240,29 +3242,29 @@ func Test_Model_Embedded_Filter(t *testing.T) { // } func Test_Model_Fields_AutoFilterInJoinStatement(t *testing.T) { - gtest.C(t, func(t *gtest.T) { - var err error - table1 := "user" - table2 := "score" - table3 := "info" - if _, err := db.Exec(ctx, fmt.Sprintf(` + gtest.C(t, func(t *gtest.T) { + var err error + table1 := "user" + table2 := "score" + table3 := "info" + if _, err := db.Exec(ctx, fmt.Sprintf(` CREATE TABLE IF NOT EXISTS %s ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(500) NOT NULL DEFAULT '', PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1; `, table1, - )); err != nil { - t.AssertNil(err) - } - defer dropTable(table1) - _, err = db.Model(table1).Insert(g.Map{ - "id": 1, - "name": "john", - }) - t.AssertNil(err) + )); err != nil { + t.AssertNil(err) + } + defer dropTable(table1) + _, err = db.Model(table1).Insert(g.Map{ + "id": 1, + "name": "john", + }) + t.AssertNil(err) - if _, err := db.Exec(ctx, fmt.Sprintf(` + if _, err := db.Exec(ctx, fmt.Sprintf(` CREATE TABLE IF NOT EXISTS %s ( id int(11) NOT NULL AUTO_INCREMENT, user_id int(11) NOT NULL DEFAULT 0, @@ -3270,18 +3272,18 @@ func Test_Model_Fields_AutoFilterInJoinStatement(t *testing.T) { PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1; `, table2, - )); err != nil { - t.AssertNil(err) - } - defer dropTable(table2) - _, err = db.Model(table2).Insert(g.Map{ - "id": 1, - "user_id": 1, - "number": "n", - }) - t.AssertNil(err) + )); err != nil { + t.AssertNil(err) + } + defer dropTable(table2) + _, err = db.Model(table2).Insert(g.Map{ + "id": 1, + "user_id": 1, + "number": "n", + }) + t.AssertNil(err) - if _, err := db.Exec(ctx, fmt.Sprintf(` + if _, err := db.Exec(ctx, fmt.Sprintf(` CREATE TABLE IF NOT EXISTS %s ( id int(11) NOT NULL AUTO_INCREMENT, user_id int(11) NOT NULL DEFAULT 0, @@ -3289,558 +3291,558 @@ func Test_Model_Fields_AutoFilterInJoinStatement(t *testing.T) { PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1; `, table3, - )); err != nil { - t.AssertNil(err) - } - defer dropTable(table3) - _, err = db.Model(table3).Insert(g.Map{ - "id": 1, - "user_id": 1, - "description": "brief", - }) - t.AssertNil(err) + )); err != nil { + t.AssertNil(err) + } + defer dropTable(table3) + _, err = db.Model(table3).Insert(g.Map{ + "id": 1, + "user_id": 1, + "description": "brief", + }) + t.AssertNil(err) - one, err := db.Model("user"). - Where("user.id", 1). - Fields("score.number,user.name"). - LeftJoin("score", "user.id=score.user_id"). - LeftJoin("info", "info.id=info.user_id"). - Order("user.id asc"). - One() - t.AssertNil(err) - t.Assert(len(one), 2) - t.Assert(one["name"].String(), "john") - t.Assert(one["number"].String(), "n") + one, err := db.Model("user"). + Where("user.id", 1). + Fields("score.number,user.name"). + LeftJoin("score", "user.id=score.user_id"). + LeftJoin("info", "info.id=info.user_id"). + Order("user.id asc"). + One() + t.AssertNil(err) + t.Assert(len(one), 2) + t.Assert(one["name"].String(), "john") + t.Assert(one["number"].String(), "n") - one, err = db.Model("user"). - LeftJoin("score", "user.id=score.user_id"). - LeftJoin("info", "info.id=info.user_id"). - Fields("score.number,user.name"). - One() - t.AssertNil(err) - t.Assert(len(one), 2) - t.Assert(one["name"].String(), "john") - t.Assert(one["number"].String(), "n") - }) + one, err = db.Model("user"). + LeftJoin("score", "user.id=score.user_id"). + LeftJoin("info", "info.id=info.user_id"). + Fields("score.number,user.name"). + One() + t.AssertNil(err) + t.Assert(len(one), 2) + t.Assert(one["name"].String(), "john") + t.Assert(one["number"].String(), "n") + }) } // https://github.com/gogf/gf/issues/1159 func Test_ScanList_NoRecreate_PtrAttribute(t *testing.T) { - gtest.C(t, func(t *gtest.T) { - type S1 struct { - Id int - Name string - Age int - Score int - } - type S3 struct { - One *S1 - } - var ( - s []*S3 - err error - ) - r1 := gdb.Result{ - gdb.Record{ - "id": gvar.New(1), - "name": gvar.New("john"), - "age": gvar.New(16), - }, - gdb.Record{ - "id": gvar.New(2), - "name": gvar.New("smith"), - "age": gvar.New(18), - }, - } - err = r1.ScanList(&s, "One") - t.AssertNil(err) - t.Assert(len(s), 2) - t.Assert(s[0].One.Name, "john") - t.Assert(s[0].One.Age, 16) - t.Assert(s[1].One.Name, "smith") - t.Assert(s[1].One.Age, 18) + gtest.C(t, func(t *gtest.T) { + type S1 struct { + Id int + Name string + Age int + Score int + } + type S3 struct { + One *S1 + } + var ( + s []*S3 + err error + ) + r1 := gdb.Result{ + gdb.Record{ + "id": gdb.NewValue(1), + "name": gdb.NewValue("john"), + "age": gdb.NewValue(16), + }, + gdb.Record{ + "id": gdb.NewValue(2), + "name": gdb.NewValue("smith"), + "age": gdb.NewValue(18), + }, + } + err = r1.ScanList(&s, "One") + t.AssertNil(err) + t.Assert(len(s), 2) + t.Assert(s[0].One.Name, "john") + t.Assert(s[0].One.Age, 16) + t.Assert(s[1].One.Name, "smith") + t.Assert(s[1].One.Age, 18) - r2 := gdb.Result{ - gdb.Record{ - "id": gvar.New(1), - "age": gvar.New(20), - }, - gdb.Record{ - "id": gvar.New(2), - "age": gvar.New(21), - }, - } - err = r2.ScanList(&s, "One", "One", "id:Id") - t.AssertNil(err) - t.Assert(len(s), 2) - t.Assert(s[0].One.Name, "john") - t.Assert(s[0].One.Age, 20) - t.Assert(s[1].One.Name, "smith") - t.Assert(s[1].One.Age, 21) - }) + r2 := gdb.Result{ + gdb.Record{ + "id": gdb.NewValue(1), + "age": gdb.NewValue(20), + }, + gdb.Record{ + "id": gdb.NewValue(2), + "age": gdb.NewValue(21), + }, + } + err = r2.ScanList(&s, "One", "One", "id:Id") + t.AssertNil(err) + t.Assert(len(s), 2) + t.Assert(s[0].One.Name, "john") + t.Assert(s[0].One.Age, 20) + t.Assert(s[1].One.Name, "smith") + t.Assert(s[1].One.Age, 21) + }) } // https://github.com/gogf/gf/issues/1159 func Test_ScanList_NoRecreate_StructAttribute(t *testing.T) { - gtest.C(t, func(t *gtest.T) { - type S1 struct { - Id int - Name string - Age int - Score int - } - type S3 struct { - One S1 - } - var ( - s []*S3 - err error - ) - r1 := gdb.Result{ - gdb.Record{ - "id": gvar.New(1), - "name": gvar.New("john"), - "age": gvar.New(16), - }, - gdb.Record{ - "id": gvar.New(2), - "name": gvar.New("smith"), - "age": gvar.New(18), - }, - } - err = r1.ScanList(&s, "One") - t.AssertNil(err) - t.Assert(len(s), 2) - t.Assert(s[0].One.Name, "john") - t.Assert(s[0].One.Age, 16) - t.Assert(s[1].One.Name, "smith") - t.Assert(s[1].One.Age, 18) + gtest.C(t, func(t *gtest.T) { + type S1 struct { + Id int + Name string + Age int + Score int + } + type S3 struct { + One S1 + } + var ( + s []*S3 + err error + ) + r1 := gdb.Result{ + gdb.Record{ + "id": gdb.NewValue(1), + "name": gdb.NewValue("john"), + "age": gdb.NewValue(16), + }, + gdb.Record{ + "id": gdb.NewValue(2), + "name": gdb.NewValue("smith"), + "age": gdb.NewValue(18), + }, + } + err = r1.ScanList(&s, "One") + t.AssertNil(err) + t.Assert(len(s), 2) + t.Assert(s[0].One.Name, "john") + t.Assert(s[0].One.Age, 16) + t.Assert(s[1].One.Name, "smith") + t.Assert(s[1].One.Age, 18) - r2 := gdb.Result{ - gdb.Record{ - "id": gvar.New(1), - "age": gvar.New(20), - }, - gdb.Record{ - "id": gvar.New(2), - "age": gvar.New(21), - }, - } - err = r2.ScanList(&s, "One", "One", "id:Id") - t.AssertNil(err) - t.Assert(len(s), 2) - t.Assert(s[0].One.Name, "john") - t.Assert(s[0].One.Age, 20) - t.Assert(s[1].One.Name, "smith") - t.Assert(s[1].One.Age, 21) - }) + r2 := gdb.Result{ + gdb.Record{ + "id": gdb.NewValue(1), + "age": gdb.NewValue(20), + }, + gdb.Record{ + "id": gdb.NewValue(2), + "age": gdb.NewValue(21), + }, + } + err = r2.ScanList(&s, "One", "One", "id:Id") + t.AssertNil(err) + t.Assert(len(s), 2) + t.Assert(s[0].One.Name, "john") + t.Assert(s[0].One.Age, 20) + t.Assert(s[1].One.Name, "smith") + t.Assert(s[1].One.Age, 21) + }) } // https://github.com/gogf/gf/issues/1159 func Test_ScanList_NoRecreate_SliceAttribute_Ptr(t *testing.T) { - gtest.C(t, func(t *gtest.T) { - type S1 struct { - Id int - Name string - Age int - Score int - } - type S2 struct { - Id int - Pid int - Name string - Age int - Score int - } - type S3 struct { - One *S1 - Many []*S2 - } - var ( - s []*S3 - err error - ) - r1 := gdb.Result{ - gdb.Record{ - "id": gvar.New(1), - "name": gvar.New("john"), - "age": gvar.New(16), - }, - gdb.Record{ - "id": gvar.New(2), - "name": gvar.New("smith"), - "age": gvar.New(18), - }, - } - err = r1.ScanList(&s, "One") - t.AssertNil(err) - t.Assert(len(s), 2) - t.Assert(s[0].One.Name, "john") - t.Assert(s[0].One.Age, 16) - t.Assert(s[1].One.Name, "smith") - t.Assert(s[1].One.Age, 18) + gtest.C(t, func(t *gtest.T) { + type S1 struct { + Id int + Name string + Age int + Score int + } + type S2 struct { + Id int + Pid int + Name string + Age int + Score int + } + type S3 struct { + One *S1 + Many []*S2 + } + var ( + s []*S3 + err error + ) + r1 := gdb.Result{ + gdb.Record{ + "id": gdb.NewValue(1), + "name": gdb.NewValue("john"), + "age": gdb.NewValue(16), + }, + gdb.Record{ + "id": gdb.NewValue(2), + "name": gdb.NewValue("smith"), + "age": gdb.NewValue(18), + }, + } + err = r1.ScanList(&s, "One") + t.AssertNil(err) + t.Assert(len(s), 2) + t.Assert(s[0].One.Name, "john") + t.Assert(s[0].One.Age, 16) + t.Assert(s[1].One.Name, "smith") + t.Assert(s[1].One.Age, 18) - r2 := gdb.Result{ - gdb.Record{ - "id": gvar.New(100), - "pid": gvar.New(1), - "age": gvar.New(30), - "name": gvar.New("john"), - }, - gdb.Record{ - "id": gvar.New(200), - "pid": gvar.New(1), - "age": gvar.New(31), - "name": gvar.New("smith"), - }, - } - err = r2.ScanList(&s, "Many", "One", "pid:Id") - // fmt.Printf("%+v", err) - t.AssertNil(err) - t.Assert(len(s), 2) - t.Assert(s[0].One.Name, "john") - t.Assert(s[0].One.Age, 16) - t.Assert(len(s[0].Many), 2) - t.Assert(s[0].Many[0].Name, "john") - t.Assert(s[0].Many[0].Age, 30) - t.Assert(s[0].Many[1].Name, "smith") - t.Assert(s[0].Many[1].Age, 31) + r2 := gdb.Result{ + gdb.Record{ + "id": gdb.NewValue(100), + "pid": gdb.NewValue(1), + "age": gdb.NewValue(30), + "name": gdb.NewValue("john"), + }, + gdb.Record{ + "id": gdb.NewValue(200), + "pid": gdb.NewValue(1), + "age": gdb.NewValue(31), + "name": gdb.NewValue("smith"), + }, + } + err = r2.ScanList(&s, "Many", "One", "pid:Id") + // fmt.Printf("%+v", err) + t.AssertNil(err) + t.Assert(len(s), 2) + t.Assert(s[0].One.Name, "john") + t.Assert(s[0].One.Age, 16) + t.Assert(len(s[0].Many), 2) + t.Assert(s[0].Many[0].Name, "john") + t.Assert(s[0].Many[0].Age, 30) + t.Assert(s[0].Many[1].Name, "smith") + t.Assert(s[0].Many[1].Age, 31) - t.Assert(s[1].One.Name, "smith") - t.Assert(s[1].One.Age, 18) - t.Assert(len(s[1].Many), 0) + t.Assert(s[1].One.Name, "smith") + t.Assert(s[1].One.Age, 18) + t.Assert(len(s[1].Many), 0) - r3 := gdb.Result{ - gdb.Record{ - "id": gvar.New(100), - "pid": gvar.New(1), - "age": gvar.New(40), - }, - gdb.Record{ - "id": gvar.New(200), - "pid": gvar.New(1), - "age": gvar.New(41), - }, - } - err = r3.ScanList(&s, "Many", "One", "pid:Id") - // fmt.Printf("%+v", err) - t.AssertNil(err) - t.Assert(len(s), 2) - t.Assert(s[0].One.Name, "john") - t.Assert(s[0].One.Age, 16) - t.Assert(len(s[0].Many), 2) - t.Assert(s[0].Many[0].Name, "john") - t.Assert(s[0].Many[0].Age, 40) - t.Assert(s[0].Many[1].Name, "smith") - t.Assert(s[0].Many[1].Age, 41) + r3 := gdb.Result{ + gdb.Record{ + "id": gdb.NewValue(100), + "pid": gdb.NewValue(1), + "age": gdb.NewValue(40), + }, + gdb.Record{ + "id": gdb.NewValue(200), + "pid": gdb.NewValue(1), + "age": gdb.NewValue(41), + }, + } + err = r3.ScanList(&s, "Many", "One", "pid:Id") + // fmt.Printf("%+v", err) + t.AssertNil(err) + t.Assert(len(s), 2) + t.Assert(s[0].One.Name, "john") + t.Assert(s[0].One.Age, 16) + t.Assert(len(s[0].Many), 2) + t.Assert(s[0].Many[0].Name, "john") + t.Assert(s[0].Many[0].Age, 40) + t.Assert(s[0].Many[1].Name, "smith") + t.Assert(s[0].Many[1].Age, 41) - t.Assert(s[1].One.Name, "smith") - t.Assert(s[1].One.Age, 18) - t.Assert(len(s[1].Many), 0) - }) + t.Assert(s[1].One.Name, "smith") + t.Assert(s[1].One.Age, 18) + t.Assert(len(s[1].Many), 0) + }) } // https://github.com/gogf/gf/issues/1159 func Test_ScanList_NoRecreate_SliceAttribute_Struct(t *testing.T) { - gtest.C(t, func(t *gtest.T) { - type S1 struct { - Id int - Name string - Age int - Score int - } - type S2 struct { - Id int - Pid int - Name string - Age int - Score int - } - type S3 struct { - One S1 - Many []S2 - } - var ( - s []S3 - err error - ) - r1 := gdb.Result{ - gdb.Record{ - "id": gvar.New(1), - "name": gvar.New("john"), - "age": gvar.New(16), - }, - gdb.Record{ - "id": gvar.New(2), - "name": gvar.New("smith"), - "age": gvar.New(18), - }, - } - err = r1.ScanList(&s, "One") - t.AssertNil(err) - t.Assert(len(s), 2) - t.Assert(s[0].One.Name, "john") - t.Assert(s[0].One.Age, 16) - t.Assert(s[1].One.Name, "smith") - t.Assert(s[1].One.Age, 18) + gtest.C(t, func(t *gtest.T) { + type S1 struct { + Id int + Name string + Age int + Score int + } + type S2 struct { + Id int + Pid int + Name string + Age int + Score int + } + type S3 struct { + One S1 + Many []S2 + } + var ( + s []S3 + err error + ) + r1 := gdb.Result{ + gdb.Record{ + "id": gdb.NewValue(1), + "name": gdb.NewValue("john"), + "age": gdb.NewValue(16), + }, + gdb.Record{ + "id": gdb.NewValue(2), + "name": gdb.NewValue("smith"), + "age": gdb.NewValue(18), + }, + } + err = r1.ScanList(&s, "One") + t.AssertNil(err) + t.Assert(len(s), 2) + t.Assert(s[0].One.Name, "john") + t.Assert(s[0].One.Age, 16) + t.Assert(s[1].One.Name, "smith") + t.Assert(s[1].One.Age, 18) - r2 := gdb.Result{ - gdb.Record{ - "id": gvar.New(100), - "pid": gvar.New(1), - "age": gvar.New(30), - "name": gvar.New("john"), - }, - gdb.Record{ - "id": gvar.New(200), - "pid": gvar.New(1), - "age": gvar.New(31), - "name": gvar.New("smith"), - }, - } - err = r2.ScanList(&s, "Many", "One", "pid:Id") - // fmt.Printf("%+v", err) - t.AssertNil(err) - t.Assert(len(s), 2) - t.Assert(s[0].One.Name, "john") - t.Assert(s[0].One.Age, 16) - t.Assert(len(s[0].Many), 2) - t.Assert(s[0].Many[0].Name, "john") - t.Assert(s[0].Many[0].Age, 30) - t.Assert(s[0].Many[1].Name, "smith") - t.Assert(s[0].Many[1].Age, 31) + r2 := gdb.Result{ + gdb.Record{ + "id": gdb.NewValue(100), + "pid": gdb.NewValue(1), + "age": gdb.NewValue(30), + "name": gdb.NewValue("john"), + }, + gdb.Record{ + "id": gdb.NewValue(200), + "pid": gdb.NewValue(1), + "age": gdb.NewValue(31), + "name": gdb.NewValue("smith"), + }, + } + err = r2.ScanList(&s, "Many", "One", "pid:Id") + // fmt.Printf("%+v", err) + t.AssertNil(err) + t.Assert(len(s), 2) + t.Assert(s[0].One.Name, "john") + t.Assert(s[0].One.Age, 16) + t.Assert(len(s[0].Many), 2) + t.Assert(s[0].Many[0].Name, "john") + t.Assert(s[0].Many[0].Age, 30) + t.Assert(s[0].Many[1].Name, "smith") + t.Assert(s[0].Many[1].Age, 31) - t.Assert(s[1].One.Name, "smith") - t.Assert(s[1].One.Age, 18) - t.Assert(len(s[1].Many), 0) + t.Assert(s[1].One.Name, "smith") + t.Assert(s[1].One.Age, 18) + t.Assert(len(s[1].Many), 0) - r3 := gdb.Result{ - gdb.Record{ - "id": gvar.New(100), - "pid": gvar.New(1), - "age": gvar.New(40), - }, - gdb.Record{ - "id": gvar.New(200), - "pid": gvar.New(1), - "age": gvar.New(41), - }, - } - err = r3.ScanList(&s, "Many", "One", "pid:Id") - // fmt.Printf("%+v", err) - t.AssertNil(err) - t.Assert(len(s), 2) - t.Assert(s[0].One.Name, "john") - t.Assert(s[0].One.Age, 16) - t.Assert(len(s[0].Many), 2) - t.Assert(s[0].Many[0].Name, "john") - t.Assert(s[0].Many[0].Age, 40) - t.Assert(s[0].Many[1].Name, "smith") - t.Assert(s[0].Many[1].Age, 41) + r3 := gdb.Result{ + gdb.Record{ + "id": gdb.NewValue(100), + "pid": gdb.NewValue(1), + "age": gdb.NewValue(40), + }, + gdb.Record{ + "id": gdb.NewValue(200), + "pid": gdb.NewValue(1), + "age": gdb.NewValue(41), + }, + } + err = r3.ScanList(&s, "Many", "One", "pid:Id") + // fmt.Printf("%+v", err) + t.AssertNil(err) + t.Assert(len(s), 2) + t.Assert(s[0].One.Name, "john") + t.Assert(s[0].One.Age, 16) + t.Assert(len(s[0].Many), 2) + t.Assert(s[0].Many[0].Name, "john") + t.Assert(s[0].Many[0].Age, 40) + t.Assert(s[0].Many[1].Name, "smith") + t.Assert(s[0].Many[1].Age, 41) - t.Assert(s[1].One.Name, "smith") - t.Assert(s[1].One.Age, 18) - t.Assert(len(s[1].Many), 0) - }) + t.Assert(s[1].One.Name, "smith") + t.Assert(s[1].One.Age, 18) + t.Assert(len(s[1].Many), 0) + }) } func TestResult_Structs1(t *testing.T) { - type A struct { - Id int `orm:"id"` - } - type B struct { - *A - Name string - } - gtest.C(t, func(t *gtest.T) { - r := gdb.Result{ - gdb.Record{"id": gvar.New(nil), "name": gvar.New("john")}, - gdb.Record{"id": gvar.New(1), "name": gvar.New("smith")}, - } - array := make([]*B, 2) - err := r.Structs(&array) - t.AssertNil(err) - t.Assert(array[0].Id, 0) - t.Assert(array[1].Id, 1) - t.Assert(array[0].Name, "john") - t.Assert(array[1].Name, "smith") - }) + type A struct { + Id int `orm:"id"` + } + type B struct { + *A + Name string + } + gtest.C(t, func(t *gtest.T) { + r := gdb.Result{ + gdb.Record{"id": gdb.NewValue(nil), "name": gdb.NewValue("john")}, + gdb.Record{"id": gdb.NewValue(1), "name": gdb.NewValue("smith")}, + } + array := make([]*B, 2) + err := r.Structs(&array) + t.AssertNil(err) + t.Assert(array[0].Id, 0) + t.Assert(array[1].Id, 1) + t.Assert(array[0].Name, "john") + t.Assert(array[1].Name, "smith") + }) } func Test_Builder_OmitEmptyWhere(t *testing.T) { - table := createInitTable() - defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - count, err := db.Model(table).Where("id", 1).Count() - t.AssertNil(err) - t.Assert(count, int64(1)) - }) - gtest.C(t, func(t *gtest.T) { - count, err := db.Model(table).Where("id", 0).OmitEmptyWhere().Count() - t.AssertNil(err) - t.Assert(count, int64(TableSize)) - }) - gtest.C(t, func(t *gtest.T) { - builder := db.Model(table).OmitEmptyWhere().Builder() - count, err := db.Model(table).Where( - builder.Where("id", 0), - ).Count() - t.AssertNil(err) - t.Assert(count, int64(TableSize)) - }) + table := createInitTable() + defer dropTable(table) + gtest.C(t, func(t *gtest.T) { + count, err := db.Model(table).Where("id", 1).Count() + t.AssertNil(err) + t.Assert(count, int64(1)) + }) + gtest.C(t, func(t *gtest.T) { + count, err := db.Model(table).Where("id", 0).OmitEmptyWhere().Count() + t.AssertNil(err) + t.Assert(count, int64(TableSize)) + }) + gtest.C(t, func(t *gtest.T) { + builder := db.Model(table).OmitEmptyWhere().Builder() + count, err := db.Model(table).Where( + builder.Where("id", 0), + ).Count() + t.AssertNil(err) + t.Assert(count, int64(TableSize)) + }) } func Test_Scan_Nil_Result_Error(t *testing.T) { - table := createInitTable() - defer dropTable(table) + table := createInitTable() + defer dropTable(table) - type S struct { - Id int - Name string - Age int - Score int - } - gtest.C(t, func(t *gtest.T) { - var s *S - err := db.Model(table).Where("id", 1).Scan(&s) - t.AssertNil(err) - t.Assert(s.Id, 1) - }) - gtest.C(t, func(t *gtest.T) { - var s *S - err := db.Model(table).Where("id", 100).Scan(&s) - t.AssertNil(err) - t.Assert(s, nil) - }) - gtest.C(t, func(t *gtest.T) { - var s S - err := db.Model(table).Where("id", 100).Scan(&s) - t.Assert(err, sql.ErrNoRows) - }) - gtest.C(t, func(t *gtest.T) { - var ss []*S - err := db.Model(table).Scan(&ss) - t.AssertNil(err) - t.Assert(len(ss), TableSize) - }) - // If the result is empty, it returns error. - gtest.C(t, func(t *gtest.T) { - var ss = make([]*S, 10) - err := db.Model(table).WhereGT("id", 100).Scan(&ss) - t.Assert(err, sql.ErrNoRows) - }) + type S struct { + Id int + Name string + Age int + Score int + } + gtest.C(t, func(t *gtest.T) { + var s *S + err := db.Model(table).Where("id", 1).Scan(&s) + t.AssertNil(err) + t.Assert(s.Id, 1) + }) + gtest.C(t, func(t *gtest.T) { + var s *S + err := db.Model(table).Where("id", 100).Scan(&s) + t.AssertNil(err) + t.Assert(s, nil) + }) + gtest.C(t, func(t *gtest.T) { + var s S + err := db.Model(table).Where("id", 100).Scan(&s) + t.Assert(err, sql.ErrNoRows) + }) + gtest.C(t, func(t *gtest.T) { + var ss []*S + err := db.Model(table).Scan(&ss) + t.AssertNil(err) + t.Assert(len(ss), TableSize) + }) + // If the result is empty, it returns error. + gtest.C(t, func(t *gtest.T) { + var ss = make([]*S, 10) + err := db.Model(table).WhereGT("id", 100).Scan(&ss) + t.Assert(err, sql.ErrNoRows) + }) } func Test_Model_FixGdbJoin(t *testing.T) { - array := gstr.SplitAndTrim(gtest.DataContent(`fix_gdb_join.sql`), ";") - for _, v := range array { - if _, err := db.Exec(ctx, v); err != nil { - gtest.Error(err) - } - } - defer dropTable(`common_resource`) - defer dropTable(`managed_resource`) - defer dropTable(`rules_template`) - defer dropTable(`resource_mark`) - gtest.C(t, func(t *gtest.T) { - t.AssertNil(db.GetCore().ClearCacheAll(ctx)) - sqlSlice, err := gdb.CatchSQL(ctx, func(ctx context.Context) error { - orm := db.Model(`managed_resource`).Ctx(ctx). - LeftJoinOnField(`common_resource`, `resource_id`). - LeftJoinOnFields(`resource_mark`, `resource_mark_id`, `=`, `id`). - LeftJoinOnFields(`rules_template`, `rule_template_id`, `=`, `template_id`). - FieldsPrefix( - `managed_resource`, - "resource_id", "user", "status", "status_message", "safe_publication", "rule_template_id", - "created_at", "comments", "expired_at", "resource_mark_id", "instance_id", "resource_name", - "pay_mode"). - FieldsPrefix(`resource_mark`, "mark_name", "color"). - FieldsPrefix(`rules_template`, "name"). - FieldsPrefix(`common_resource`, `src_instance_id`, "database_kind", "source_type", "ip", "port") - all, err := orm.OrderAsc("src_instance_id").All() - t.Assert(len(all), 4) - t.Assert(all[0]["pay_mode"], 1) - t.Assert(all[0]["src_instance_id"], 2) - t.Assert(all[3]["instance_id"], "dmcins-jxy0x75m") - t.Assert(all[3]["src_instance_id"], "vdb-6b6m3u1u") - t.Assert(all[3]["resource_mark_id"], "11") - return err - }) - t.AssertNil(err) + array := gstr.SplitAndTrim(gtest.DataContent(`fix_gdb_join.sql`), ";") + for _, v := range array { + if _, err := db.Exec(ctx, v); err != nil { + gtest.Error(err) + } + } + defer dropTable(`common_resource`) + defer dropTable(`managed_resource`) + defer dropTable(`rules_template`) + defer dropTable(`resource_mark`) + gtest.C(t, func(t *gtest.T) { + t.AssertNil(db.GetCore().ClearCacheAll(ctx)) + sqlSlice, err := gdb.CatchSQL(ctx, func(ctx context.Context) error { + orm := db.Model(`managed_resource`).Ctx(ctx). + LeftJoinOnField(`common_resource`, `resource_id`). + LeftJoinOnFields(`resource_mark`, `resource_mark_id`, `=`, `id`). + LeftJoinOnFields(`rules_template`, `rule_template_id`, `=`, `template_id`). + FieldsPrefix( + `managed_resource`, + "resource_id", "user", "status", "status_message", "safe_publication", "rule_template_id", + "created_at", "comments", "expired_at", "resource_mark_id", "instance_id", "resource_name", + "pay_mode"). + FieldsPrefix(`resource_mark`, "mark_name", "color"). + FieldsPrefix(`rules_template`, "name"). + FieldsPrefix(`common_resource`, `src_instance_id`, "database_kind", "source_type", "ip", "port") + all, err := orm.OrderAsc("src_instance_id").All() + t.Assert(len(all), 4) + t.Assert(all[0]["pay_mode"], 1) + t.Assert(all[0]["src_instance_id"], 2) + t.Assert(all[3]["instance_id"], "dmcins-jxy0x75m") + t.Assert(all[3]["src_instance_id"], "vdb-6b6m3u1u") + t.Assert(all[3]["resource_mark_id"], "11") + return err + }) + t.AssertNil(err) - t.Assert(gtest.DataContent(`fix_gdb_join_expect.sql`), sqlSlice[len(sqlSlice)-1]) - }) + t.Assert(gtest.DataContent(`fix_gdb_join_expect.sql`), sqlSlice[len(sqlSlice)-1]) + }) } func Test_Model_Year_Date_Time_DateTime_Timestamp(t *testing.T) { - table := "date_time_example" - array := gstr.SplitAndTrim(gtest.DataContent(`date_time_example.sql`), ";") - for _, v := range array { - if _, err := db.Exec(ctx, v); err != nil { - gtest.Error(err) - } - } - defer dropTable(table) + table := "date_time_example" + array := gstr.SplitAndTrim(gtest.DataContent(`date_time_example.sql`), ";") + for _, v := range array { + if _, err := db.Exec(ctx, v); err != nil { + gtest.Error(err) + } + } + defer dropTable(table) - gtest.C(t, func(t *gtest.T) { - // insert. - var now = gtime.Now() - _, err := db.Model("date_time_example").Insert(g.Map{ - "year": now, - "date": now, - "time": now, - "datetime": now, - "timestamp": now, - }) - t.AssertNil(err) - // select. - one, err := db.Model("date_time_example").One() - t.AssertNil(err) - t.Assert(one["year"].String(), now.Format("Y")) - t.Assert(one["date"].String(), now.Format("Y-m-d")) - t.Assert(one["time"].String(), now.Format("H:i:s")) - t.AssertLT(one["datetime"].GTime().Sub(now).Seconds(), 5) - t.AssertLT(one["timestamp"].GTime().Sub(now).Seconds(), 5) - }) + gtest.C(t, func(t *gtest.T) { + // insert. + var now = gtime.Now() + _, err := db.Model("date_time_example").Insert(g.Map{ + "year": now, + "date": now, + "time": now, + "datetime": now, + "timestamp": now, + }) + t.AssertNil(err) + // select. + one, err := db.Model("date_time_example").One() + t.AssertNil(err) + t.Assert(one["year"].String(), now.Format("Y")) + t.Assert(one["date"].String(), now.Format("Y-m-d")) + t.Assert(one["time"].String(), now.Format("H:i:s")) + t.AssertLT(one["datetime"].GTime().Sub(now).Seconds(), 5) + t.AssertLT(one["timestamp"].GTime().Sub(now).Seconds(), 5) + }) } func Test_OrderBy_Statement_Generated(t *testing.T) { - gtest.C(t, func(t *gtest.T) { - array := gstr.SplitAndTrim(gtest.DataContent(`fix_gdb_order_by.sql`), ";") - for _, v := range array { - if _, err := db.Exec(ctx, v); err != nil { - gtest.Error(err) - } - } - defer dropTable(`employee`) - sqlArray, _ := gdb.CatchSQL(ctx, func(ctx context.Context) error { - g.DB("default").Ctx(ctx).Model("employee").Order("name asc", "age desc").All() - return nil - }) - rawSql := strings.ReplaceAll(sqlArray[len(sqlArray)-1], " ", "") - expectSql := strings.ReplaceAll("SELECT * FROM `employee` ORDER BY `name` asc, `age` desc", " ", "") - t.Assert(rawSql, expectSql) - }) + gtest.C(t, func(t *gtest.T) { + array := gstr.SplitAndTrim(gtest.DataContent(`fix_gdb_order_by.sql`), ";") + for _, v := range array { + if _, err := db.Exec(ctx, v); err != nil { + gtest.Error(err) + } + } + defer dropTable(`employee`) + sqlArray, _ := gdb.CatchSQL(ctx, func(ctx context.Context) error { + g.DB("default").Ctx(ctx).Model("employee").Order("name asc", "age desc").All() + return nil + }) + rawSql := strings.ReplaceAll(sqlArray[len(sqlArray)-1], " ", "") + expectSql := strings.ReplaceAll("SELECT * FROM `employee` ORDER BY `name` asc, `age` desc", " ", "") + t.Assert(rawSql, expectSql) + }) } func Test_Fields_Raw(t *testing.T) { - gtest.C(t, func(t *gtest.T) { - table := createInitTable() - defer dropTable(table) - one, err := db.Model(table).Fields(gdb.Raw("1")).One() - t.AssertNil(err) - t.Assert(one["1"], 1) + gtest.C(t, func(t *gtest.T) { + table := createInitTable() + defer dropTable(table) + one, err := db.Model(table).Fields(gdb.Raw("1")).One() + t.AssertNil(err) + t.Assert(one["1"], 1) - one, err = db.Model(table).Fields(gdb.Raw("2")).One() - t.AssertNil(err) - t.Assert(one["2"], 2) + one, err = db.Model(table).Fields(gdb.Raw("2")).One() + t.AssertNil(err) + t.Assert(one["2"], 2) - one, err = db.Model(table).Fields(gdb.Raw("2")).Where("id", 2).One() - t.AssertNil(err) - t.Assert(one["2"], 2) + one, err = db.Model(table).Fields(gdb.Raw("2")).Where("id", 2).One() + t.AssertNil(err) + t.Assert(one["2"], 2) - one, err = db.Model(table).Fields(gdb.Raw("2")).Where("id", 10000000000).One() - t.AssertNil(err) - t.Assert(len(one), 0) - }) + one, err = db.Model(table).Fields(gdb.Raw("2")).Where("id", 10000000000).One() + t.AssertNil(err) + t.Assert(len(one), 0) + }) } diff --git a/contrib/drivers/mysql/testdata/issue1380.sql b/contrib/drivers/mysql/testdata/issues/1380.sql similarity index 100% rename from contrib/drivers/mysql/testdata/issue1380.sql rename to contrib/drivers/mysql/testdata/issues/1380.sql diff --git a/contrib/drivers/mysql/testdata/issue1401.sql b/contrib/drivers/mysql/testdata/issues/1401.sql similarity index 100% rename from contrib/drivers/mysql/testdata/issue1401.sql rename to contrib/drivers/mysql/testdata/issues/1401.sql diff --git a/contrib/drivers/mysql/testdata/issue1412.sql b/contrib/drivers/mysql/testdata/issues/1412.sql similarity index 100% rename from contrib/drivers/mysql/testdata/issue1412.sql rename to contrib/drivers/mysql/testdata/issues/1412.sql diff --git a/contrib/drivers/mysql/testdata/issue2105.sql b/contrib/drivers/mysql/testdata/issues/2105.sql similarity index 100% rename from contrib/drivers/mysql/testdata/issue2105.sql rename to contrib/drivers/mysql/testdata/issues/2105.sql diff --git a/contrib/drivers/mysql/testdata/issue2119.sql b/contrib/drivers/mysql/testdata/issues/2119.sql similarity index 100% rename from contrib/drivers/mysql/testdata/issue2119.sql rename to contrib/drivers/mysql/testdata/issues/2119.sql diff --git a/contrib/drivers/mysql/testdata/issue2439.sql b/contrib/drivers/mysql/testdata/issues/2439.sql similarity index 100% rename from contrib/drivers/mysql/testdata/issue2439.sql rename to contrib/drivers/mysql/testdata/issues/2439.sql diff --git a/contrib/drivers/mysql/testdata/issue2643.sql b/contrib/drivers/mysql/testdata/issues/2643.sql similarity index 100% rename from contrib/drivers/mysql/testdata/issue2643.sql rename to contrib/drivers/mysql/testdata/issues/2643.sql diff --git a/contrib/drivers/mysql/testdata/issue3086.sql b/contrib/drivers/mysql/testdata/issues/3086.sql similarity index 100% rename from contrib/drivers/mysql/testdata/issue3086.sql rename to contrib/drivers/mysql/testdata/issues/3086.sql diff --git a/contrib/drivers/mysql/testdata/issue3218.sql b/contrib/drivers/mysql/testdata/issues/3218.sql similarity index 100% rename from contrib/drivers/mysql/testdata/issue3218.sql rename to contrib/drivers/mysql/testdata/issues/3218.sql diff --git a/contrib/drivers/mysql/testdata/issue3626.sql b/contrib/drivers/mysql/testdata/issues/3626.sql similarity index 100% rename from contrib/drivers/mysql/testdata/issue3626.sql rename to contrib/drivers/mysql/testdata/issues/3626.sql diff --git a/contrib/drivers/mysql/testdata/issue3754.sql b/contrib/drivers/mysql/testdata/issues/3754.sql similarity index 100% rename from contrib/drivers/mysql/testdata/issue3754.sql rename to contrib/drivers/mysql/testdata/issues/3754.sql diff --git a/contrib/drivers/mysql/testdata/issue3915.sql b/contrib/drivers/mysql/testdata/issues/3915.sql similarity index 100% rename from contrib/drivers/mysql/testdata/issue3915.sql rename to contrib/drivers/mysql/testdata/issues/3915.sql diff --git a/contrib/drivers/mysql/testdata/issue4034.sql b/contrib/drivers/mysql/testdata/issues/4034.sql similarity index 100% rename from contrib/drivers/mysql/testdata/issue4034.sql rename to contrib/drivers/mysql/testdata/issues/4034.sql diff --git a/contrib/drivers/mysql/testdata/issues/4086.sql b/contrib/drivers/mysql/testdata/issues/4086.sql new file mode 100644 index 000000000..53a3646ec --- /dev/null +++ b/contrib/drivers/mysql/testdata/issues/4086.sql @@ -0,0 +1,10 @@ +DROP TABLE IF EXISTS `issue4086`; +CREATE TABLE `issue4086` ( + `proxy_id` bigint NOT NULL, + `recommend_ids` json DEFAULT NULL, + `photos` json DEFAULT NULL, + PRIMARY KEY (`proxy_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; + +INSERT INTO `issue4086` (`proxy_id`, `recommend_ids`, `photos`) VALUES (1, '[584, 585]', 'null'); +INSERT INTO `issue4086` (`proxy_id`, `recommend_ids`, `photos`) VALUES (2, '[]', NULL); \ No newline at end of file diff --git a/contrib/drivers/oracle/go.mod b/contrib/drivers/oracle/go.mod index 5b782dc93..39bb2f259 100644 --- a/contrib/drivers/oracle/go.mod +++ b/contrib/drivers/oracle/go.mod @@ -1,6 +1,8 @@ module github.com/gogf/gf/contrib/drivers/oracle/v2 -go 1.20 +go 1.22 + +toolchain go1.22.0 require ( github.com/gogf/gf/v2 v2.8.3 @@ -15,18 +17,20 @@ require ( github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/gorilla/websocket v1.5.3 // indirect github.com/grokify/html-strip-tags-go v0.1.0 // indirect + github.com/kr/text v0.2.0 // indirect github.com/magiconair/properties v1.8.9 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.16 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect github.com/rivo/uniseg v0.4.7 // indirect - go.opentelemetry.io/otel v1.24.0 // indirect - go.opentelemetry.io/otel/metric v1.24.0 // indirect - go.opentelemetry.io/otel/sdk v1.24.0 // indirect - go.opentelemetry.io/otel/trace v1.24.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect golang.org/x/net v0.32.0 // indirect golang.org/x/sys v0.28.0 // indirect golang.org/x/text v0.21.0 // indirect diff --git a/contrib/drivers/oracle/go.sum b/contrib/drivers/oracle/go.sum index 20159b137..7444a9a7e 100644 --- a/contrib/drivers/oracle/go.sum +++ b/contrib/drivers/oracle/go.sum @@ -2,7 +2,9 @@ github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0 github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= github.com/clbanning/mxj/v2 v2.7.0 h1:WA/La7UGCanFe5NpHF0Q3DNtnCsVoxbPKuyBNHWRyME= github.com/clbanning/mxj/v2 v2.7.0/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn/Qo+ve2s= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= @@ -15,10 +17,17 @@ github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ4 github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grokify/html-strip-tags-go v0.1.0 h1:03UrQLjAny8xci+R+qjCce/MYnpNXCtgzltlQbOBae4= github.com/grokify/html-strip-tags-go v0.1.0/go.mod h1:ZdzgfHEzAfz9X6Xe5eBLVblWIxXfYSQ40S/VKrAOGpc= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/magiconair/properties v1.8.9 h1:nWcCbLq1N2v/cpNsy5WvQ37Fb+YElfq20WJ/a8RkpQM= github.com/magiconair/properties v1.8.9/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= @@ -32,20 +41,24 @@ github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/sijms/go-ora/v2 v2.7.10 h1:GSLdj0PYYgSndhsnm7b6p32OqgnwnUZSkFb3j+htfhI= github.com/sijms/go-ora/v2 v2.7.10/go.mod h1:EHxlY6x7y9HAsdfumurRfTd+v8NrEOTR3Xl4FWlH6xk= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= -go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= -go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= -go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= -go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw= -go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg= -go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= -go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI= golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -54,7 +67,8 @@ golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/contrib/drivers/pgsql/go.mod b/contrib/drivers/pgsql/go.mod index 09ed53aba..edbfa4ea1 100644 --- a/contrib/drivers/pgsql/go.mod +++ b/contrib/drivers/pgsql/go.mod @@ -1,6 +1,8 @@ module github.com/gogf/gf/contrib/drivers/pgsql/v2 -go 1.20 +go 1.22 + +toolchain go1.22.0 require ( github.com/gogf/gf/v2 v2.8.3 @@ -15,18 +17,20 @@ require ( github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/gorilla/websocket v1.5.3 // indirect github.com/grokify/html-strip-tags-go v0.1.0 // indirect + github.com/kr/text v0.2.0 // indirect github.com/magiconair/properties v1.8.9 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.16 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect github.com/rivo/uniseg v0.4.7 // indirect - go.opentelemetry.io/otel v1.24.0 // indirect - go.opentelemetry.io/otel/metric v1.24.0 // indirect - go.opentelemetry.io/otel/sdk v1.24.0 // indirect - go.opentelemetry.io/otel/trace v1.24.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect golang.org/x/net v0.32.0 // indirect golang.org/x/sys v0.28.0 // indirect golang.org/x/text v0.21.0 // indirect diff --git a/contrib/drivers/pgsql/go.sum b/contrib/drivers/pgsql/go.sum index f1b56657c..7f021fc7d 100644 --- a/contrib/drivers/pgsql/go.sum +++ b/contrib/drivers/pgsql/go.sum @@ -2,7 +2,9 @@ github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0 github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= github.com/clbanning/mxj/v2 v2.7.0 h1:WA/La7UGCanFe5NpHF0Q3DNtnCsVoxbPKuyBNHWRyME= github.com/clbanning/mxj/v2 v2.7.0/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn/Qo+ve2s= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= @@ -15,10 +17,17 @@ github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ4 github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grokify/html-strip-tags-go v0.1.0 h1:03UrQLjAny8xci+R+qjCce/MYnpNXCtgzltlQbOBae4= github.com/grokify/html-strip-tags-go v0.1.0/go.mod h1:ZdzgfHEzAfz9X6Xe5eBLVblWIxXfYSQ40S/VKrAOGpc= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/magiconair/properties v1.8.9 h1:nWcCbLq1N2v/cpNsy5WvQ37Fb+YElfq20WJ/a8RkpQM= @@ -34,18 +43,22 @@ github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= -go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= -go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= -go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= -go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw= -go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg= -go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= -go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI= golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -54,7 +67,8 @@ golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/contrib/drivers/pgsql/pgsql_convert.go b/contrib/drivers/pgsql/pgsql_convert.go index d2652d307..9734c2321 100644 --- a/contrib/drivers/pgsql/pgsql_convert.go +++ b/contrib/drivers/pgsql/pgsql_convert.go @@ -7,130 +7,130 @@ package pgsql import ( - "context" - "reflect" - "strings" + "context" + "reflect" + "strings" - "github.com/lib/pq" + "github.com/lib/pq" - "github.com/gogf/gf/v2/database/gdb" - "github.com/gogf/gf/v2/frame/g" - "github.com/gogf/gf/v2/text/gregex" - "github.com/gogf/gf/v2/text/gstr" - "github.com/gogf/gf/v2/util/gconv" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/text/gregex" + "github.com/gogf/gf/v2/text/gstr" + "github.com/gogf/gf/v2/util/gconv" ) // ConvertValueForField converts value to database acceptable value. func (d *Driver) ConvertValueForField(ctx context.Context, fieldType string, fieldValue interface{}) (interface{}, error) { - if g.IsNil(fieldValue) { - return d.Core.ConvertValueForField(ctx, fieldType, fieldValue) - } + if g.IsNil(fieldValue) { + return d.Core.ConvertValueForField(ctx, fieldType, fieldValue) + } - var fieldValueKind = reflect.TypeOf(fieldValue).Kind() + var fieldValueKind = reflect.TypeOf(fieldValue).Kind() - if fieldValueKind == reflect.Slice { - // For pgsql, json or jsonb require '[]' - if !gstr.Contains(fieldType, "json") { - fieldValue = gstr.ReplaceByMap(gconv.String(fieldValue), - map[string]string{ - "[": "{", - "]": "}", - }, - ) - } - } - return d.Core.ConvertValueForField(ctx, fieldType, fieldValue) + if fieldValueKind == reflect.Slice { + // For pgsql, json or jsonb require '[]' + if !gstr.Contains(fieldType, "json") { + fieldValue = gstr.ReplaceByMap(gconv.String(fieldValue), + map[string]string{ + "[": "{", + "]": "}", + }, + ) + } + } + return d.Core.ConvertValueForField(ctx, fieldType, fieldValue) } // CheckLocalTypeForField checks and returns corresponding local golang type for given db type. func (d *Driver) CheckLocalTypeForField(ctx context.Context, fieldType string, fieldValue interface{}) (gdb.LocalType, error) { - var typeName string - match, _ := gregex.MatchString(`(.+?)\((.+)\)`, fieldType) - if len(match) == 3 { - typeName = gstr.Trim(match[1]) - } else { - typeName = fieldType - } - typeName = strings.ToLower(typeName) - switch typeName { - case - // For pgsql, int2 = smallint. - "int2", - // For pgsql, int4 = integer - "int4": - return gdb.LocalTypeInt, nil + var typeName string + match, _ := gregex.MatchString(`(.+?)\((.+)\)`, fieldType) + if len(match) == 3 { + typeName = gstr.Trim(match[1]) + } else { + typeName = fieldType + } + typeName = strings.ToLower(typeName) + switch typeName { + case + // For pgsql, int2 = smallint. + "int2", + // For pgsql, int4 = integer + "int4": + return gdb.LocalTypeInt, nil - case - // For pgsql, int8 = bigint - "int8": - return gdb.LocalTypeInt64, nil + case + // For pgsql, int8 = bigint + "int8": + return gdb.LocalTypeInt64, nil - case - "_int2", - "_int4": - return gdb.LocalTypeIntSlice, nil + case + "_int2", + "_int4": + return gdb.LocalTypeIntSlice, nil - case - "_int8": - return gdb.LocalTypeInt64Slice, nil + case + "_int8": + return gdb.LocalTypeInt64Slice, nil - case - "_varchar", "_text": - return gdb.LocalTypeStringSlice, nil + case + "_varchar", "_text": + return gdb.LocalTypeStringSlice, nil - default: - return d.Core.CheckLocalTypeForField(ctx, fieldType, fieldValue) - } + default: + return d.Core.CheckLocalTypeForField(ctx, fieldType, fieldValue) + } } // ConvertValueForLocal converts value to local Golang type of value according field type name from database. // The parameter `fieldType` is in lower case, like: // `float(5,2)`, `unsigned double(5,2)`, `decimal(10,2)`, `char(45)`, `varchar(100)`, etc. func (d *Driver) ConvertValueForLocal(ctx context.Context, fieldType string, fieldValue interface{}) (interface{}, error) { - typeName, _ := gregex.ReplaceString(`\(.+\)`, "", fieldType) - typeName = strings.ToLower(typeName) - switch typeName { - // For pgsql, int2 = smallint and int4 = integer. - case "int2", "int4": - return gconv.Int(gconv.String(fieldValue)), nil + typeName, _ := gregex.ReplaceString(`\(.+\)`, "", fieldType) + typeName = strings.ToLower(typeName) + switch typeName { + // For pgsql, int2 = smallint and int4 = integer. + case "int2", "int4": + return gconv.Int(gconv.String(fieldValue)), nil - // For pgsql, int8 = bigint. - case "int8": - return gconv.Int64(gconv.String(fieldValue)), nil + // For pgsql, int8 = bigint. + case "int8": + return gconv.Int64(gconv.String(fieldValue)), nil - // Int32 slice. - case - "_int2", "_int4": - return gconv.Ints( - gstr.ReplaceByMap(gconv.String(fieldValue), - map[string]string{ - "{": "[", - "}": "]", - }, - ), - ), nil + // Int32 slice. + case + "_int2", "_int4": + return gconv.Ints( + gstr.ReplaceByMap(gconv.String(fieldValue), + map[string]string{ + "{": "[", + "}": "]", + }, + ), + ), nil - // Int64 slice. - case - "_int8": - return gconv.Int64s( - gstr.ReplaceByMap(gconv.String(fieldValue), - map[string]string{ - "{": "[", - "}": "]", - }, - ), - ), nil + // Int64 slice. + case + "_int8": + return gconv.Int64s( + gstr.ReplaceByMap(gconv.String(fieldValue), + map[string]string{ + "{": "[", + "}": "]", + }, + ), + ), nil - // String slice. - case "_varchar", "_text": - var result pq.StringArray - if err := result.Scan(fieldValue); err != nil { - return nil, err - } - return []string(result), nil + // String slice. + case "_varchar", "_text": + var result = make(pq.StringArray, 0) + if err := result.Scan(fieldValue); err != nil { + return nil, err + } + return []string(result), nil - default: - return d.Core.ConvertValueForLocal(ctx, fieldType, fieldValue) - } + default: + return d.Core.ConvertValueForLocal(ctx, fieldType, fieldValue) + } } diff --git a/contrib/drivers/sqlite/go.mod b/contrib/drivers/sqlite/go.mod index eed458ead..60f434a72 100644 --- a/contrib/drivers/sqlite/go.mod +++ b/contrib/drivers/sqlite/go.mod @@ -1,6 +1,8 @@ module github.com/gogf/gf/contrib/drivers/sqlite/v2 -go 1.20 +go 1.22 + +toolchain go1.22.0 require ( github.com/glebarez/go-sqlite v1.21.2 @@ -16,9 +18,10 @@ require ( github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/google/uuid v1.3.0 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/gorilla/websocket v1.5.3 // indirect github.com/grokify/html-strip-tags-go v0.1.0 // indirect + github.com/kr/text v0.2.0 // indirect github.com/magiconair/properties v1.8.9 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect @@ -26,10 +29,10 @@ require ( github.com/olekukonko/tablewriter v0.0.5 // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/rivo/uniseg v0.4.7 // indirect - go.opentelemetry.io/otel v1.24.0 // indirect - go.opentelemetry.io/otel/metric v1.24.0 // indirect - go.opentelemetry.io/otel/sdk v1.24.0 // indirect - go.opentelemetry.io/otel/trace v1.24.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect golang.org/x/net v0.32.0 // indirect golang.org/x/sys v0.28.0 // indirect golang.org/x/text v0.21.0 // indirect diff --git a/contrib/drivers/sqlite/go.sum b/contrib/drivers/sqlite/go.sum index a6ac1e9ed..d49fc7a19 100644 --- a/contrib/drivers/sqlite/go.sum +++ b/contrib/drivers/sqlite/go.sum @@ -2,7 +2,9 @@ github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0 github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= github.com/clbanning/mxj/v2 v2.7.0 h1:WA/La7UGCanFe5NpHF0Q3DNtnCsVoxbPKuyBNHWRyME= github.com/clbanning/mxj/v2 v2.7.0/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn/Qo+ve2s= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= @@ -19,13 +21,19 @@ github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ4 github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26 h1:Xim43kblpZXfIBQsbuBVKCudVG457BR2GZFIz3uw3hQ= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26/go.mod h1:dDKJzRmX4S37WGHujM7tX//fmj1uioxKzKxz3lo4HJo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grokify/html-strip-tags-go v0.1.0 h1:03UrQLjAny8xci+R+qjCce/MYnpNXCtgzltlQbOBae4= github.com/grokify/html-strip-tags-go v0.1.0/go.mod h1:ZdzgfHEzAfz9X6Xe5eBLVblWIxXfYSQ40S/VKrAOGpc= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/magiconair/properties v1.8.9 h1:nWcCbLq1N2v/cpNsy5WvQ37Fb+YElfq20WJ/a8RkpQM= github.com/magiconair/properties v1.8.9/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= @@ -39,21 +47,25 @@ github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= -go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= -go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= -go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= -go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw= -go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg= -go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= -go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI= golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -62,8 +74,9 @@ golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= modernc.org/libc v1.22.5 h1:91BNch/e5B0uPbJFgqbxXuOnxBQjlS//icfQEGmvyjE= diff --git a/contrib/drivers/sqlitecgo/go.mod b/contrib/drivers/sqlitecgo/go.mod index 1ced67e34..b80615394 100644 --- a/contrib/drivers/sqlitecgo/go.mod +++ b/contrib/drivers/sqlitecgo/go.mod @@ -1,6 +1,8 @@ module github.com/gogf/gf/contrib/drivers/sqlitecgo/v2 -go 1.20 +go 1.22 + +toolchain go1.22.0 require ( github.com/gogf/gf/v2 v2.8.3 @@ -15,18 +17,20 @@ require ( github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/gorilla/websocket v1.5.3 // indirect github.com/grokify/html-strip-tags-go v0.1.0 // indirect + github.com/kr/text v0.2.0 // indirect github.com/magiconair/properties v1.8.9 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.16 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect github.com/rivo/uniseg v0.4.7 // indirect - go.opentelemetry.io/otel v1.24.0 // indirect - go.opentelemetry.io/otel/metric v1.24.0 // indirect - go.opentelemetry.io/otel/sdk v1.24.0 // indirect - go.opentelemetry.io/otel/trace v1.24.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect golang.org/x/net v0.32.0 // indirect golang.org/x/sys v0.28.0 // indirect golang.org/x/text v0.21.0 // indirect diff --git a/contrib/drivers/sqlitecgo/go.sum b/contrib/drivers/sqlitecgo/go.sum index e463112f2..10aa8ae71 100644 --- a/contrib/drivers/sqlitecgo/go.sum +++ b/contrib/drivers/sqlitecgo/go.sum @@ -2,7 +2,9 @@ github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0 github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= github.com/clbanning/mxj/v2 v2.7.0 h1:WA/La7UGCanFe5NpHF0Q3DNtnCsVoxbPKuyBNHWRyME= github.com/clbanning/mxj/v2 v2.7.0/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn/Qo+ve2s= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= @@ -15,10 +17,17 @@ github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ4 github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grokify/html-strip-tags-go v0.1.0 h1:03UrQLjAny8xci+R+qjCce/MYnpNXCtgzltlQbOBae4= github.com/grokify/html-strip-tags-go v0.1.0/go.mod h1:ZdzgfHEzAfz9X6Xe5eBLVblWIxXfYSQ40S/VKrAOGpc= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/magiconair/properties v1.8.9 h1:nWcCbLq1N2v/cpNsy5WvQ37Fb+YElfq20WJ/a8RkpQM= github.com/magiconair/properties v1.8.9/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= @@ -34,18 +43,22 @@ github.com/mattn/go-sqlite3 v1.14.17/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= -go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= -go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= -go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= -go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw= -go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg= -go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= -go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI= golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -54,7 +67,8 @@ golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/contrib/nosql/redis/go.mod b/contrib/nosql/redis/go.mod index 29dc703d8..2ea9adba0 100644 --- a/contrib/nosql/redis/go.mod +++ b/contrib/nosql/redis/go.mod @@ -1,12 +1,14 @@ module github.com/gogf/gf/contrib/nosql/redis/v2 -go 1.20 +go 1.22 + +toolchain go1.22.0 require ( github.com/gogf/gf/v2 v2.8.3 github.com/redis/go-redis/v9 v9.7.0 - go.opentelemetry.io/otel v1.24.0 - go.opentelemetry.io/otel/trace v1.24.0 + go.opentelemetry.io/otel v1.32.0 + go.opentelemetry.io/otel/trace v1.32.0 ) require ( @@ -19,16 +21,18 @@ require ( github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/gorilla/websocket v1.5.3 // indirect github.com/grokify/html-strip-tags-go v0.1.0 // indirect + github.com/kr/text v0.2.0 // indirect github.com/magiconair/properties v1.8.9 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.16 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect github.com/rivo/uniseg v0.4.7 // indirect - go.opentelemetry.io/otel/metric v1.24.0 // indirect - go.opentelemetry.io/otel/sdk v1.24.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect golang.org/x/net v0.32.0 // indirect golang.org/x/sys v0.28.0 // indirect golang.org/x/text v0.21.0 // indirect diff --git a/contrib/nosql/redis/go.sum b/contrib/nosql/redis/go.sum index 0c3db9d7c..6b2f2b542 100644 --- a/contrib/nosql/redis/go.sum +++ b/contrib/nosql/redis/go.sum @@ -1,12 +1,16 @@ github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0= github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs= +github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c= github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA= +github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/clbanning/mxj/v2 v2.7.0 h1:WA/La7UGCanFe5NpHF0Q3DNtnCsVoxbPKuyBNHWRyME= github.com/clbanning/mxj/v2 v2.7.0/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn/Qo+ve2s= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= @@ -21,10 +25,17 @@ github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ4 github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grokify/html-strip-tags-go v0.1.0 h1:03UrQLjAny8xci+R+qjCce/MYnpNXCtgzltlQbOBae4= github.com/grokify/html-strip-tags-go v0.1.0/go.mod h1:ZdzgfHEzAfz9X6Xe5eBLVblWIxXfYSQ40S/VKrAOGpc= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/magiconair/properties v1.8.9 h1:nWcCbLq1N2v/cpNsy5WvQ37Fb+YElfq20WJ/a8RkpQM= github.com/magiconair/properties v1.8.9/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= @@ -38,20 +49,24 @@ github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/redis/go-redis/v9 v9.7.0 h1:HhLSs+B6O021gwzl+locl0zEDnyNkxMtf/Z3NNBMa9E= github.com/redis/go-redis/v9 v9.7.0/go.mod h1:f6zhXITC7JUJIlPEiBOTXxJgPLdZcA93GewI7inzyWw= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= -go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= -go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= -go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= -go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw= -go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg= -go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= -go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI= golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -60,7 +75,8 @@ golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/contrib/registry/consul/go.mod b/contrib/registry/consul/go.mod index b110ccf82..2c44f5170 100644 --- a/contrib/registry/consul/go.mod +++ b/contrib/registry/consul/go.mod @@ -1,6 +1,8 @@ module github.com/gogf/gf/contrib/registry/consul/v2 -go 1.18 +go 1.22 + +toolchain go1.22.0 require ( github.com/gogf/gf/v2 v2.8.3 @@ -16,6 +18,7 @@ require ( github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-hclog v1.5.0 // indirect @@ -29,10 +32,10 @@ require ( github.com/mattn/go-isatty v0.0.20 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect - go.opentelemetry.io/otel v1.24.0 // indirect - go.opentelemetry.io/otel/metric v1.24.0 // indirect - go.opentelemetry.io/otel/sdk v1.24.0 // indirect - go.opentelemetry.io/otel/trace v1.24.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 // indirect golang.org/x/sys v0.28.0 // indirect golang.org/x/text v0.21.0 // indirect diff --git a/contrib/registry/consul/go.sum b/contrib/registry/consul/go.sum index caf44ad1f..0f8cc3f51 100644 --- a/contrib/registry/consul/go.sum +++ b/contrib/registry/consul/go.sum @@ -23,6 +23,7 @@ github.com/clbanning/mxj/v2 v2.7.0/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= @@ -48,15 +49,22 @@ github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5y github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4= +github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= +github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grokify/html-strip-tags-go v0.1.0 h1:03UrQLjAny8xci+R+qjCce/MYnpNXCtgzltlQbOBae4= +github.com/grokify/html-strip-tags-go v0.1.0/go.mod h1:ZdzgfHEzAfz9X6Xe5eBLVblWIxXfYSQ40S/VKrAOGpc= github.com/hashicorp/consul/api v1.26.1 h1:5oSXOO5fboPZeW5SN+TdGFP/BILDgBm19OrPZ/pICIM= github.com/hashicorp/consul/api v1.26.1/go.mod h1:B4sQTeaSO16NtynqrAdwOlahJ7IUDZM9cj2420xYL8A= github.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU= +github.com/hashicorp/consul/sdk v0.15.0/go.mod h1:r/OmRRPbHOe0yxNahLw7G9x5WG17E1BIECMtCjcPSNo= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -70,6 +78,7 @@ github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJ github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI= +github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= @@ -79,11 +88,14 @@ github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5O github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= github.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc= +github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= +github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI= +github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= @@ -98,11 +110,13 @@ github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/u github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/magiconair/properties v1.8.9 h1:nWcCbLq1N2v/cpNsy5WvQ37Fb+YElfq20WJ/a8RkpQM= github.com/magiconair/properties v1.8.9/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= @@ -121,6 +135,7 @@ github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/ github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= +github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= github.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY= @@ -137,14 +152,17 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= +github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= @@ -159,6 +177,9 @@ github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= +github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= @@ -167,20 +188,22 @@ github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6Mwd github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= -go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= -go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= -go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= -go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= -go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw= -go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg= -go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= -go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= @@ -194,6 +217,7 @@ golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI= +golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -235,8 +259,9 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/contrib/registry/etcd/go.mod b/contrib/registry/etcd/go.mod index 50db4fee6..17cb9486b 100644 --- a/contrib/registry/etcd/go.mod +++ b/contrib/registry/etcd/go.mod @@ -20,8 +20,10 @@ require ( github.com/go-logr/stdr v1.2.2 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/protobuf v1.5.4 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/gorilla/websocket v1.5.3 // indirect github.com/grokify/html-strip-tags-go v0.1.0 // indirect + github.com/kr/text v0.2.0 // indirect github.com/magiconair/properties v1.8.9 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect @@ -30,10 +32,10 @@ require ( github.com/rivo/uniseg v0.4.7 // indirect go.etcd.io/etcd/api/v3 v3.5.17 // indirect go.etcd.io/etcd/client/pkg/v3 v3.5.17 // indirect - go.opentelemetry.io/otel v1.24.0 // indirect - go.opentelemetry.io/otel/metric v1.24.0 // indirect - go.opentelemetry.io/otel/sdk v1.24.0 // indirect - go.opentelemetry.io/otel/trace v1.24.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/atomic v1.7.0 // indirect go.uber.org/multierr v1.6.0 // indirect go.uber.org/zap v1.17.0 // indirect diff --git a/contrib/registry/etcd/go.sum b/contrib/registry/etcd/go.sum index 2bf6733f7..1ae5b2355 100644 --- a/contrib/registry/etcd/go.sum +++ b/contrib/registry/etcd/go.sum @@ -6,6 +6,7 @@ github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmf github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -27,12 +28,18 @@ github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grokify/html-strip-tags-go v0.1.0 h1:03UrQLjAny8xci+R+qjCce/MYnpNXCtgzltlQbOBae4= github.com/grokify/html-strip-tags-go v0.1.0/go.mod h1:ZdzgfHEzAfz9X6Xe5eBLVblWIxXfYSQ40S/VKrAOGpc= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/magiconair/properties v1.8.9 h1:nWcCbLq1N2v/cpNsy5WvQ37Fb+YElfq20WJ/a8RkpQM= github.com/magiconair/properties v1.8.9/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= @@ -52,11 +59,13 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= go.etcd.io/etcd/api/v3 v3.5.17 h1:cQB8eb8bxwuxOilBpMJAEo8fAONyrdXTHUNcMd8yT1w= @@ -65,14 +74,14 @@ go.etcd.io/etcd/client/pkg/v3 v3.5.17 h1:XxnDXAWq2pnxqx76ljWwiQ9jylbpC4rvkAeRVOU go.etcd.io/etcd/client/pkg/v3 v3.5.17/go.mod h1:4DqK1TKacp/86nJk4FLQqo6Mn2vvQFBmruW3pP14H/w= go.etcd.io/etcd/client/v3 v3.5.17 h1:o48sINNeWz5+pjy/Z0+HKpj/xSnBkuVhVvXkjEXbqZY= go.etcd.io/etcd/client/v3 v3.5.17/go.mod h1:j2d4eXTHWkT2ClBgnnEPm/Wuu7jsqku41v9DZ3OtjQo= -go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= -go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= -go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= -go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= -go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw= -go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg= -go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= -go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= @@ -122,8 +131,9 @@ google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= diff --git a/contrib/registry/file/go.mod b/contrib/registry/file/go.mod index f26c05720..d2533732f 100644 --- a/contrib/registry/file/go.mod +++ b/contrib/registry/file/go.mod @@ -1,6 +1,8 @@ module github.com/gogf/gf/contrib/registry/file/v2 -go 1.20 +go 1.22 + +toolchain go1.22.0 require github.com/gogf/gf/v2 v2.8.3 @@ -12,18 +14,20 @@ require ( github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/gorilla/websocket v1.5.3 // indirect github.com/grokify/html-strip-tags-go v0.1.0 // indirect + github.com/kr/text v0.2.0 // indirect github.com/magiconair/properties v1.8.9 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.16 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect github.com/rivo/uniseg v0.4.7 // indirect - go.opentelemetry.io/otel v1.24.0 // indirect - go.opentelemetry.io/otel/metric v1.24.0 // indirect - go.opentelemetry.io/otel/sdk v1.24.0 // indirect - go.opentelemetry.io/otel/trace v1.24.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect golang.org/x/net v0.32.0 // indirect golang.org/x/sys v0.28.0 // indirect golang.org/x/text v0.21.0 // indirect diff --git a/contrib/registry/file/go.sum b/contrib/registry/file/go.sum index 3f5df0ec3..4a2bcdc09 100644 --- a/contrib/registry/file/go.sum +++ b/contrib/registry/file/go.sum @@ -2,7 +2,9 @@ github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0 github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= github.com/clbanning/mxj/v2 v2.7.0 h1:WA/La7UGCanFe5NpHF0Q3DNtnCsVoxbPKuyBNHWRyME= github.com/clbanning/mxj/v2 v2.7.0/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn/Qo+ve2s= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= @@ -15,10 +17,17 @@ github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ4 github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grokify/html-strip-tags-go v0.1.0 h1:03UrQLjAny8xci+R+qjCce/MYnpNXCtgzltlQbOBae4= github.com/grokify/html-strip-tags-go v0.1.0/go.mod h1:ZdzgfHEzAfz9X6Xe5eBLVblWIxXfYSQ40S/VKrAOGpc= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/magiconair/properties v1.8.9 h1:nWcCbLq1N2v/cpNsy5WvQ37Fb+YElfq20WJ/a8RkpQM= github.com/magiconair/properties v1.8.9/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= @@ -32,18 +41,22 @@ github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= -go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= -go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= -go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= -go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw= -go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg= -go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= -go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI= golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -52,7 +65,8 @@ golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/contrib/registry/nacos/go.mod b/contrib/registry/nacos/go.mod index ee1b6f4c3..a2c621cea 100644 --- a/contrib/registry/nacos/go.mod +++ b/contrib/registry/nacos/go.mod @@ -1,6 +1,8 @@ module github.com/gogf/gf/contrib/registry/nacos/v2 -go 1.20 +go 1.22 + +toolchain go1.22.0 require ( github.com/gogf/gf/v2 v2.8.3 @@ -26,6 +28,7 @@ require ( github.com/go-logr/stdr v1.2.2 // indirect github.com/golang/mock v1.6.0 // indirect github.com/golang/protobuf v1.5.3 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/gorilla/websocket v1.5.3 // indirect github.com/grokify/html-strip-tags-go v0.1.0 // indirect github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af // indirect @@ -44,10 +47,10 @@ require ( github.com/prometheus/common v0.32.1 // indirect github.com/prometheus/procfs v0.7.3 // indirect github.com/rivo/uniseg v0.4.7 // indirect - go.opentelemetry.io/otel v1.24.0 // indirect - go.opentelemetry.io/otel/metric v1.24.0 // indirect - go.opentelemetry.io/otel/sdk v1.24.0 // indirect - go.opentelemetry.io/otel/trace v1.24.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/atomic v1.7.0 // indirect go.uber.org/multierr v1.6.0 // indirect go.uber.org/zap v1.21.0 // indirect diff --git a/contrib/registry/nacos/go.sum b/contrib/registry/nacos/go.sum index 8f1eddd6f..6b13b063c 100644 --- a/contrib/registry/nacos/go.sum +++ b/contrib/registry/nacos/go.sum @@ -146,6 +146,7 @@ github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= @@ -157,6 +158,8 @@ github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= @@ -183,8 +186,9 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= @@ -245,6 +249,8 @@ github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJ github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= @@ -255,7 +261,8 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -265,14 +272,14 @@ go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= -go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= -go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= -go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= -go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw= -go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg= -go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= -go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= @@ -557,8 +564,9 @@ google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHh gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/ini.v1 v1.66.2 h1:XfR1dOYubytKy4Shzc2LHrrGhU0lDCfDGG1yLPmpgsI= gopkg.in/ini.v1 v1.66.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= diff --git a/contrib/registry/polaris/go.mod b/contrib/registry/polaris/go.mod index dbbc7ba72..f8423fbb2 100644 --- a/contrib/registry/polaris/go.mod +++ b/contrib/registry/polaris/go.mod @@ -1,6 +1,8 @@ module github.com/gogf/gf/contrib/registry/polaris/v2 -go 1.20 +go 1.22 + +toolchain go1.22.0 require ( github.com/gogf/gf/v2 v2.8.3 @@ -41,10 +43,10 @@ require ( github.com/prometheus/procfs v0.15.1 // indirect github.com/rivo/uniseg v0.4.7 // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect - go.opentelemetry.io/otel v1.24.0 // indirect - go.opentelemetry.io/otel/metric v1.24.0 // indirect - go.opentelemetry.io/otel/sdk v1.24.0 // indirect - go.opentelemetry.io/otel/trace v1.24.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/atomic v1.7.0 // indirect go.uber.org/multierr v1.6.0 // indirect go.uber.org/zap v1.21.0 // indirect diff --git a/contrib/registry/polaris/go.sum b/contrib/registry/polaris/go.sum index e784f1e8d..db8c38d84 100644 --- a/contrib/registry/polaris/go.sum +++ b/contrib/registry/polaris/go.sum @@ -303,6 +303,7 @@ github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= @@ -372,6 +373,7 @@ github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFB github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= @@ -444,7 +446,8 @@ github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= @@ -468,7 +471,8 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -482,14 +486,14 @@ go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= -go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= -go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= -go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= -go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw= -go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg= -go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= -go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= diff --git a/contrib/registry/zookeeper/go.mod b/contrib/registry/zookeeper/go.mod index 6c2a5c0f5..7f1f3466c 100644 --- a/contrib/registry/zookeeper/go.mod +++ b/contrib/registry/zookeeper/go.mod @@ -1,6 +1,8 @@ module github.com/gogf/gf/contrib/registry/zookeeper/v2 -go 1.20 +go 1.22 + +toolchain go1.22.0 require ( github.com/go-zookeeper/zk v1.0.3 @@ -16,18 +18,20 @@ require ( github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/gorilla/websocket v1.5.3 // indirect github.com/grokify/html-strip-tags-go v0.1.0 // indirect + github.com/kr/text v0.2.0 // indirect github.com/magiconair/properties v1.8.9 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.16 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect github.com/rivo/uniseg v0.4.7 // indirect - go.opentelemetry.io/otel v1.24.0 // indirect - go.opentelemetry.io/otel/metric v1.24.0 // indirect - go.opentelemetry.io/otel/sdk v1.24.0 // indirect - go.opentelemetry.io/otel/trace v1.24.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect golang.org/x/net v0.32.0 // indirect golang.org/x/sys v0.28.0 // indirect golang.org/x/text v0.21.0 // indirect diff --git a/contrib/registry/zookeeper/go.sum b/contrib/registry/zookeeper/go.sum index f0cf8086b..e24c5df24 100644 --- a/contrib/registry/zookeeper/go.sum +++ b/contrib/registry/zookeeper/go.sum @@ -2,7 +2,9 @@ github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0 github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= github.com/clbanning/mxj/v2 v2.7.0 h1:WA/La7UGCanFe5NpHF0Q3DNtnCsVoxbPKuyBNHWRyME= github.com/clbanning/mxj/v2 v2.7.0/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn/Qo+ve2s= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= @@ -17,10 +19,17 @@ github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre github.com/go-zookeeper/zk v1.0.3 h1:7M2kwOsc//9VeeFiPtf+uSJlVpU66x9Ba5+8XK7/TDg= github.com/go-zookeeper/zk v1.0.3/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grokify/html-strip-tags-go v0.1.0 h1:03UrQLjAny8xci+R+qjCce/MYnpNXCtgzltlQbOBae4= github.com/grokify/html-strip-tags-go v0.1.0/go.mod h1:ZdzgfHEzAfz9X6Xe5eBLVblWIxXfYSQ40S/VKrAOGpc= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/magiconair/properties v1.8.9 h1:nWcCbLq1N2v/cpNsy5WvQ37Fb+YElfq20WJ/a8RkpQM= github.com/magiconair/properties v1.8.9/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= @@ -34,18 +43,22 @@ github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= -go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= -go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= -go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= -go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw= -go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg= -go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= -go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI= golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs= golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= @@ -56,7 +69,8 @@ golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/contrib/rpc/grpcx/go.mod b/contrib/rpc/grpcx/go.mod index 465676b0a..9d9705297 100644 --- a/contrib/rpc/grpcx/go.mod +++ b/contrib/rpc/grpcx/go.mod @@ -1,12 +1,14 @@ module github.com/gogf/gf/contrib/rpc/grpcx/v2 -go 1.20 +go 1.22 + +toolchain go1.22.0 require ( github.com/gogf/gf/contrib/registry/file/v2 v2.8.3 github.com/gogf/gf/v2 v2.8.3 - go.opentelemetry.io/otel v1.24.0 - go.opentelemetry.io/otel/trace v1.24.0 + go.opentelemetry.io/otel v1.32.0 + go.opentelemetry.io/otel/trace v1.32.0 google.golang.org/grpc v1.64.1 google.golang.org/protobuf v1.34.2 ) @@ -19,6 +21,7 @@ require ( github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/gorilla/websocket v1.5.3 // indirect github.com/grokify/html-strip-tags-go v0.1.0 // indirect github.com/magiconair/properties v1.8.9 // indirect @@ -27,8 +30,8 @@ require ( github.com/mattn/go-runewidth v0.0.16 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect github.com/rivo/uniseg v0.4.7 // indirect - go.opentelemetry.io/otel/metric v1.24.0 // indirect - go.opentelemetry.io/otel/sdk v1.24.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect golang.org/x/net v0.32.0 // indirect golang.org/x/sys v0.28.0 // indirect golang.org/x/text v0.21.0 // indirect diff --git a/contrib/rpc/grpcx/go.sum b/contrib/rpc/grpcx/go.sum index ce2771206..ed1149c8b 100644 --- a/contrib/rpc/grpcx/go.sum +++ b/contrib/rpc/grpcx/go.sum @@ -3,6 +3,7 @@ github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2 github.com/clbanning/mxj/v2 v2.7.0 h1:WA/La7UGCanFe5NpHF0Q3DNtnCsVoxbPKuyBNHWRyME= github.com/clbanning/mxj/v2 v2.7.0/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn/Qo+ve2s= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= @@ -15,10 +16,17 @@ github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ4 github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grokify/html-strip-tags-go v0.1.0 h1:03UrQLjAny8xci+R+qjCce/MYnpNXCtgzltlQbOBae4= github.com/grokify/html-strip-tags-go v0.1.0/go.mod h1:ZdzgfHEzAfz9X6Xe5eBLVblWIxXfYSQ40S/VKrAOGpc= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/magiconair/properties v1.8.9 h1:nWcCbLq1N2v/cpNsy5WvQ37Fb+YElfq20WJ/a8RkpQM= github.com/magiconair/properties v1.8.9/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= @@ -32,18 +40,22 @@ github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= -go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= -go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= -go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= -go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw= -go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg= -go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= -go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI= golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -58,7 +70,8 @@ google.golang.org/grpc v1.64.1 h1:LKtvyfbX3UGVPFcGqJ9ItpVWW6oN/2XqTxfAnwRRXiA= google.golang.org/grpc v1.64.1/go.mod h1:hiQF4LFZelK2WKaP6W0L92zGHtiQdZxk8CrSdvyjeP0= google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/contrib/sdk/httpclient/go.mod b/contrib/sdk/httpclient/go.mod index be05225fb..e2abac29e 100644 --- a/contrib/sdk/httpclient/go.mod +++ b/contrib/sdk/httpclient/go.mod @@ -1,6 +1,8 @@ module github.com/gogf/gf/contrib/sdk/httpclient/v2 -go 1.20 +go 1.22 + +toolchain go1.22.0 require github.com/gogf/gf/v2 v2.8.3 @@ -12,18 +14,20 @@ require ( github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/gorilla/websocket v1.5.3 // indirect github.com/grokify/html-strip-tags-go v0.1.0 // indirect + github.com/kr/text v0.2.0 // indirect github.com/magiconair/properties v1.8.9 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.16 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect github.com/rivo/uniseg v0.4.7 // indirect - go.opentelemetry.io/otel v1.24.0 // indirect - go.opentelemetry.io/otel/metric v1.24.0 // indirect - go.opentelemetry.io/otel/sdk v1.24.0 // indirect - go.opentelemetry.io/otel/trace v1.24.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect golang.org/x/net v0.32.0 // indirect golang.org/x/sys v0.28.0 // indirect golang.org/x/text v0.21.0 // indirect diff --git a/contrib/sdk/httpclient/go.sum b/contrib/sdk/httpclient/go.sum index 3f5df0ec3..4a2bcdc09 100644 --- a/contrib/sdk/httpclient/go.sum +++ b/contrib/sdk/httpclient/go.sum @@ -2,7 +2,9 @@ github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0 github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= github.com/clbanning/mxj/v2 v2.7.0 h1:WA/La7UGCanFe5NpHF0Q3DNtnCsVoxbPKuyBNHWRyME= github.com/clbanning/mxj/v2 v2.7.0/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn/Qo+ve2s= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= @@ -15,10 +17,17 @@ github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ4 github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grokify/html-strip-tags-go v0.1.0 h1:03UrQLjAny8xci+R+qjCce/MYnpNXCtgzltlQbOBae4= github.com/grokify/html-strip-tags-go v0.1.0/go.mod h1:ZdzgfHEzAfz9X6Xe5eBLVblWIxXfYSQ40S/VKrAOGpc= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/magiconair/properties v1.8.9 h1:nWcCbLq1N2v/cpNsy5WvQ37Fb+YElfq20WJ/a8RkpQM= github.com/magiconair/properties v1.8.9/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= @@ -32,18 +41,22 @@ github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= -go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= -go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= -go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= -go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw= -go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg= -go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= -go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI= golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -52,7 +65,8 @@ golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/contrib/trace/otlpgrpc/go.mod b/contrib/trace/otlpgrpc/go.mod index b32e636b2..6f9aeee21 100644 --- a/contrib/trace/otlpgrpc/go.mod +++ b/contrib/trace/otlpgrpc/go.mod @@ -1,13 +1,15 @@ module github.com/gogf/gf/contrib/trace/otlpgrpc/v2 -go 1.20 +go 1.22 + +toolchain go1.22.0 require ( github.com/gogf/gf/v2 v2.8.3 - go.opentelemetry.io/otel v1.24.0 + go.opentelemetry.io/otel v1.32.0 go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.24.0 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.24.0 - go.opentelemetry.io/otel/sdk v1.24.0 + go.opentelemetry.io/otel/sdk v1.32.0 google.golang.org/grpc v1.64.1 ) @@ -20,6 +22,7 @@ require ( github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/gorilla/websocket v1.5.3 // indirect github.com/grokify/html-strip-tags-go v0.1.0 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 // indirect @@ -29,8 +32,8 @@ require ( github.com/mattn/go-runewidth v0.0.16 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect github.com/rivo/uniseg v0.4.7 // indirect - go.opentelemetry.io/otel/metric v1.24.0 // indirect - go.opentelemetry.io/otel/trace v1.24.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.opentelemetry.io/proto/otlp v1.1.0 // indirect golang.org/x/net v0.32.0 // indirect golang.org/x/sys v0.28.0 // indirect diff --git a/contrib/trace/otlpgrpc/go.sum b/contrib/trace/otlpgrpc/go.sum index 92a50b717..c5557eb6c 100644 --- a/contrib/trace/otlpgrpc/go.sum +++ b/contrib/trace/otlpgrpc/go.sum @@ -5,6 +5,7 @@ github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyY github.com/clbanning/mxj/v2 v2.7.0 h1:WA/La7UGCanFe5NpHF0Q3DNtnCsVoxbPKuyBNHWRyME= github.com/clbanning/mxj/v2 v2.7.0/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn/Qo+ve2s= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= @@ -17,6 +18,9 @@ github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ4 github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grokify/html-strip-tags-go v0.1.0 h1:03UrQLjAny8xci+R+qjCce/MYnpNXCtgzltlQbOBae4= @@ -24,7 +28,9 @@ github.com/grokify/html-strip-tags-go v0.1.0/go.mod h1:ZdzgfHEzAfz9X6Xe5eBLVblWI github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 h1:Wqo399gCIufwto+VfwCSvsnfGpF/w5E9CNxSwbpD6No= github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0/go.mod h1:qmOFXW2epJhM0qSnUUYpldc7gVz2KMQwJ/QYCDIa7XU= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/magiconair/properties v1.8.9 h1:nWcCbLq1N2v/cpNsy5WvQ37Fb+YElfq20WJ/a8RkpQM= github.com/magiconair/properties v1.8.9/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= @@ -38,26 +44,30 @@ github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= -go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.24.0 h1:t6wl9SPayj+c7lEIFgm4ooDBZVb01IhLB4InpomhRw8= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.24.0/go.mod h1:iSDOcsnSA5INXzZtwaBPrKp/lWu/V14Dd+llD0oI2EA= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.24.0 h1:Mw5xcxMwlqoJd97vwPxA8isEaIoxsta9/Q51+TTJLGE= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.24.0/go.mod h1:CQNu9bj7o7mC6U7+CA/schKEYakYXWr79ucDHTMGhCM= -go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= -go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= -go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw= -go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg= -go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= -go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.opentelemetry.io/proto/otlp v1.1.0 h1:2Di21piLrCqJ3U3eXGCTPHE9R8Nh+0uglSnOyxikMeI= go.opentelemetry.io/proto/otlp v1.1.0/go.mod h1:GpBHCBWiqvVLDqmHZsoMM3C5ySeKTC7ej/RNTae6MdY= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI= golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -76,5 +86,6 @@ google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6h google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/contrib/trace/otlphttp/go.mod b/contrib/trace/otlphttp/go.mod index 25afc8d74..d7d6125b9 100644 --- a/contrib/trace/otlphttp/go.mod +++ b/contrib/trace/otlphttp/go.mod @@ -1,13 +1,15 @@ module github.com/gogf/gf/contrib/trace/otlphttp/v2 -go 1.20 +go 1.22 + +toolchain go1.22.0 require ( github.com/gogf/gf/v2 v2.8.3 - go.opentelemetry.io/otel v1.24.0 + go.opentelemetry.io/otel v1.32.0 go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.24.0 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.24.0 - go.opentelemetry.io/otel/sdk v1.24.0 + go.opentelemetry.io/otel/sdk v1.32.0 ) require ( @@ -19,6 +21,7 @@ require ( github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/gorilla/websocket v1.5.3 // indirect github.com/grokify/html-strip-tags-go v0.1.0 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 // indirect @@ -28,8 +31,8 @@ require ( github.com/mattn/go-runewidth v0.0.16 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect github.com/rivo/uniseg v0.4.7 // indirect - go.opentelemetry.io/otel/metric v1.24.0 // indirect - go.opentelemetry.io/otel/trace v1.24.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.opentelemetry.io/proto/otlp v1.1.0 // indirect golang.org/x/net v0.32.0 // indirect golang.org/x/sys v0.28.0 // indirect diff --git a/contrib/trace/otlphttp/go.sum b/contrib/trace/otlphttp/go.sum index 8178bfd17..a5ac0d2a2 100644 --- a/contrib/trace/otlphttp/go.sum +++ b/contrib/trace/otlphttp/go.sum @@ -5,6 +5,7 @@ github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyY github.com/clbanning/mxj/v2 v2.7.0 h1:WA/La7UGCanFe5NpHF0Q3DNtnCsVoxbPKuyBNHWRyME= github.com/clbanning/mxj/v2 v2.7.0/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn/Qo+ve2s= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= @@ -17,6 +18,9 @@ github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ4 github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grokify/html-strip-tags-go v0.1.0 h1:03UrQLjAny8xci+R+qjCce/MYnpNXCtgzltlQbOBae4= @@ -24,7 +28,9 @@ github.com/grokify/html-strip-tags-go v0.1.0/go.mod h1:ZdzgfHEzAfz9X6Xe5eBLVblWI github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 h1:Wqo399gCIufwto+VfwCSvsnfGpF/w5E9CNxSwbpD6No= github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0/go.mod h1:qmOFXW2epJhM0qSnUUYpldc7gVz2KMQwJ/QYCDIa7XU= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/magiconair/properties v1.8.9 h1:nWcCbLq1N2v/cpNsy5WvQ37Fb+YElfq20WJ/a8RkpQM= github.com/magiconair/properties v1.8.9/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= @@ -38,23 +44,26 @@ github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= -go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.24.0 h1:t6wl9SPayj+c7lEIFgm4ooDBZVb01IhLB4InpomhRw8= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.24.0/go.mod h1:iSDOcsnSA5INXzZtwaBPrKp/lWu/V14Dd+llD0oI2EA= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.24.0 h1:Xw8U6u2f8DK2XAkGRFV7BBLENgnTGX9i4rQRxJf+/vs= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.24.0/go.mod h1:6KW1Fm6R/s6Z3PGXwSJN2K4eT6wQB3vXX6CVnYX9NmM= -go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= -go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= -go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw= -go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg= -go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= -go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.opentelemetry.io/proto/otlp v1.1.0 h1:2Di21piLrCqJ3U3eXGCTPHE9R8Nh+0uglSnOyxikMeI= go.opentelemetry.io/proto/otlp v1.1.0/go.mod h1:GpBHCBWiqvVLDqmHZsoMM3C5ySeKTC7ej/RNTae6MdY= golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI= @@ -75,5 +84,6 @@ google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6h google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/database/gdb/gdb.go b/database/gdb/gdb.go index 558ca92c9..efa41d521 100644 --- a/database/gdb/gdb.go +++ b/database/gdb/gdb.go @@ -10,900 +10,901 @@ package gdb import ( - "context" - "database/sql" - "time" + "context" + "database/sql" + "time" - "github.com/gogf/gf/v2/container/garray" - "github.com/gogf/gf/v2/container/gmap" - "github.com/gogf/gf/v2/container/gtype" - "github.com/gogf/gf/v2/container/gvar" - "github.com/gogf/gf/v2/errors/gcode" - "github.com/gogf/gf/v2/errors/gerror" - "github.com/gogf/gf/v2/os/gcache" - "github.com/gogf/gf/v2/os/gcmd" - "github.com/gogf/gf/v2/os/gctx" - "github.com/gogf/gf/v2/os/glog" - "github.com/gogf/gf/v2/util/grand" - "github.com/gogf/gf/v2/util/gutil" + "github.com/gogf/gf/v2/container/garray" + "github.com/gogf/gf/v2/container/gmap" + "github.com/gogf/gf/v2/container/gtype" + "github.com/gogf/gf/v2/database/gdb/internal/defines" + "github.com/gogf/gf/v2/database/gdb/internal/fieldvar" + "github.com/gogf/gf/v2/errors/gcode" + "github.com/gogf/gf/v2/errors/gerror" + "github.com/gogf/gf/v2/os/gcache" + "github.com/gogf/gf/v2/os/gcmd" + "github.com/gogf/gf/v2/os/gctx" + "github.com/gogf/gf/v2/os/glog" + "github.com/gogf/gf/v2/util/grand" + "github.com/gogf/gf/v2/util/gutil" ) // DB defines the interfaces for ORM operations. type DB interface { - // =========================================================================== - // Model creation. - // =========================================================================== - - // Model creates and returns a new ORM model from given schema. - // The parameter `table` can be more than one table names, and also alias name, like: - // 1. Model names: - // Model("user") - // Model("user u") - // Model("user, user_detail") - // Model("user u, user_detail ud") - // 2. Model name with alias: Model("user", "u") - // Also see Core.Model. - Model(tableNameOrStruct ...interface{}) *Model - - // Raw creates and returns a model based on a raw sql not a table. - Raw(rawSql string, args ...interface{}) *Model - - // Schema switches to a specified schema. - // Also see Core.Schema. - Schema(schema string) *Schema - - // With creates and returns an ORM model based on metadata of given object. - // Also see Core.With. - With(objects ...interface{}) *Model - - // Open creates a raw connection object for database with given node configuration. - // Note that it is not recommended using the function manually. - Open(config *ConfigNode) (*sql.DB, error) - - // Ctx is a chaining function, which creates and returns a new DB that is a shallow copy - // of current DB object and with given context in it. - // Also see Core.Ctx. - Ctx(ctx context.Context) DB - - // Close closes the database and prevents new queries from starting. - // Close then waits for all queries that have started processing on the server - // to finish. - // - // It is rare to Close a DB, as the DB handle is meant to be - // long-lived and shared between many goroutines. - Close(ctx context.Context) error - - // =========================================================================== - // Query APIs. - // =========================================================================== - - // Query executes a SQL query that returns rows using given SQL and arguments. - // The args are for any placeholder parameters in the query. - Query(ctx context.Context, sql string, args ...interface{}) (Result, error) - - // Exec executes a SQL query that doesn't return rows (e.g., INSERT, UPDATE, DELETE). - // It returns sql.Result for accessing LastInsertId or RowsAffected. - Exec(ctx context.Context, sql string, args ...interface{}) (sql.Result, error) - - // Prepare creates a prepared statement for later queries or executions. - // The execOnMaster parameter determines whether the statement executes on master node. - Prepare(ctx context.Context, sql string, execOnMaster ...bool) (*Stmt, error) - - // =========================================================================== - // Common APIs for CRUD. - // =========================================================================== - - // Insert inserts one or multiple records into table. - // The data can be a map, struct, or slice of maps/structs. - // The optional batch parameter specifies the batch size for bulk inserts. - Insert(ctx context.Context, table string, data interface{}, batch ...int) (sql.Result, error) - - // InsertIgnore inserts records but ignores duplicate key errors. - // It works like Insert but adds IGNORE keyword to the SQL statement. - InsertIgnore(ctx context.Context, table string, data interface{}, batch ...int) (sql.Result, error) - - // InsertAndGetId inserts a record and returns the auto-generated ID. - // It's a convenience method combining Insert with LastInsertId. - InsertAndGetId(ctx context.Context, table string, data interface{}, batch ...int) (int64, error) - - // Replace inserts or replaces records using REPLACE INTO syntax. - // Existing records with same unique key will be deleted and re-inserted. - Replace(ctx context.Context, table string, data interface{}, batch ...int) (sql.Result, error) - - // Save inserts or updates records using INSERT ... ON DUPLICATE KEY UPDATE syntax. - // It updates existing records instead of replacing them entirely. - Save(ctx context.Context, table string, data interface{}, batch ...int) (sql.Result, error) - - // Update updates records in table that match the condition. - // The data can be a map or struct containing the new values. - // The condition specifies the WHERE clause with optional placeholder args. - Update(ctx context.Context, table string, data interface{}, condition interface{}, args ...interface{}) (sql.Result, error) - - // Delete deletes records from table that match the condition. - // The condition specifies the WHERE clause with optional placeholder args. - Delete(ctx context.Context, table string, condition interface{}, args ...interface{}) (sql.Result, error) - - // =========================================================================== - // Internal APIs for CRUD, which can be overwritten by custom CRUD implements. - // =========================================================================== - - // DoSelect executes a SELECT query using the given link and returns the result. - // This is an internal method that can be overridden by custom implementations. - DoSelect(ctx context.Context, link Link, sql string, args ...interface{}) (result Result, err error) - - // DoInsert performs the actual INSERT operation with given options. - // This is an internal method that can be overridden by custom implementations. - DoInsert(ctx context.Context, link Link, table string, data List, option DoInsertOption) (result sql.Result, err error) - - // DoUpdate performs the actual UPDATE operation. - // This is an internal method that can be overridden by custom implementations. - DoUpdate(ctx context.Context, link Link, table string, data interface{}, condition string, args ...interface{}) (result sql.Result, err error) - - // DoDelete performs the actual DELETE operation. - // This is an internal method that can be overridden by custom implementations. - DoDelete(ctx context.Context, link Link, table string, condition string, args ...interface{}) (result sql.Result, err error) - - // DoQuery executes a query that returns rows. - // This is an internal method that can be overridden by custom implementations. - DoQuery(ctx context.Context, link Link, sql string, args ...interface{}) (result Result, err error) - - // DoExec executes a query that doesn't return rows. - // This is an internal method that can be overridden by custom implementations. - DoExec(ctx context.Context, link Link, sql string, args ...interface{}) (result sql.Result, err error) - - // DoFilter processes and filters SQL and args before execution. - // This is an internal method that can be overridden to implement custom SQL filtering. - DoFilter(ctx context.Context, link Link, sql string, args []interface{}) (newSql string, newArgs []interface{}, err error) - - // DoCommit handles the actual commit operation for transactions. - // This is an internal method that can be overridden by custom implementations. - DoCommit(ctx context.Context, in DoCommitInput) (out DoCommitOutput, err error) - - // DoPrepare creates a prepared statement on the given link. - // This is an internal method that can be overridden by custom implementations. - DoPrepare(ctx context.Context, link Link, sql string) (*Stmt, error) - - // =========================================================================== - // Query APIs for convenience purpose. - // =========================================================================== - - // GetAll executes a query and returns all rows as Result. - // It's a convenience wrapper around Query. - GetAll(ctx context.Context, sql string, args ...interface{}) (Result, error) + // =========================================================================== + // Model creation. + // =========================================================================== + + // Model creates and returns a new ORM model from given schema. + // The parameter `table` can be more than one table names, and also alias name, like: + // 1. Model names: + // Model("user") + // Model("user u") + // Model("user, user_detail") + // Model("user u, user_detail ud") + // 2. Model name with alias: Model("user", "u") + // Also see Core.Model. + Model(tableNameOrStruct ...interface{}) *Model + + // Raw creates and returns a model based on a raw sql not a table. + Raw(rawSql string, args ...interface{}) *Model + + // Schema switches to a specified schema. + // Also see Core.Schema. + Schema(schema string) *Schema + + // With creates and returns an ORM model based on metadata of given object. + // Also see Core.With. + With(objects ...interface{}) *Model + + // Open creates a raw connection object for database with given node configuration. + // Note that it is not recommended using the function manually. + Open(config *ConfigNode) (*sql.DB, error) + + // Ctx is a chaining function, which creates and returns a new DB that is a shallow copy + // of current DB object and with given context in it. + // Also see Core.Ctx. + Ctx(ctx context.Context) DB + + // Close closes the database and prevents new queries from starting. + // Close then waits for all queries that have started processing on the server + // to finish. + // + // It is rare to Close a DB, as the DB handle is meant to be + // long-lived and shared between many goroutines. + Close(ctx context.Context) error + + // =========================================================================== + // Query APIs. + // =========================================================================== + + // Query executes a SQL query that returns rows using given SQL and arguments. + // The args are for any placeholder parameters in the query. + Query(ctx context.Context, sql string, args ...interface{}) (Result, error) + + // Exec executes a SQL query that doesn't return rows (e.g., INSERT, UPDATE, DELETE). + // It returns sql.Result for accessing LastInsertId or RowsAffected. + Exec(ctx context.Context, sql string, args ...interface{}) (sql.Result, error) + + // Prepare creates a prepared statement for later queries or executions. + // The execOnMaster parameter determines whether the statement executes on master node. + Prepare(ctx context.Context, sql string, execOnMaster ...bool) (*Stmt, error) + + // =========================================================================== + // Common APIs for CRUD. + // =========================================================================== + + // Insert inserts one or multiple records into table. + // The data can be a map, struct, or slice of maps/structs. + // The optional batch parameter specifies the batch size for bulk inserts. + Insert(ctx context.Context, table string, data interface{}, batch ...int) (sql.Result, error) + + // InsertIgnore inserts records but ignores duplicate key errors. + // It works like Insert but adds IGNORE keyword to the SQL statement. + InsertIgnore(ctx context.Context, table string, data interface{}, batch ...int) (sql.Result, error) + + // InsertAndGetId inserts a record and returns the auto-generated ID. + // It's a convenience method combining Insert with LastInsertId. + InsertAndGetId(ctx context.Context, table string, data interface{}, batch ...int) (int64, error) + + // Replace inserts or replaces records using REPLACE INTO syntax. + // Existing records with same unique key will be deleted and re-inserted. + Replace(ctx context.Context, table string, data interface{}, batch ...int) (sql.Result, error) + + // Save inserts or updates records using INSERT ... ON DUPLICATE KEY UPDATE syntax. + // It updates existing records instead of replacing them entirely. + Save(ctx context.Context, table string, data interface{}, batch ...int) (sql.Result, error) + + // Update updates records in table that match the condition. + // The data can be a map or struct containing the new values. + // The condition specifies the WHERE clause with optional placeholder args. + Update(ctx context.Context, table string, data interface{}, condition interface{}, args ...interface{}) (sql.Result, error) + + // Delete deletes records from table that match the condition. + // The condition specifies the WHERE clause with optional placeholder args. + Delete(ctx context.Context, table string, condition interface{}, args ...interface{}) (sql.Result, error) + + // =========================================================================== + // Internal APIs for CRUD, which can be overwritten by custom CRUD implements. + // =========================================================================== + + // DoSelect executes a SELECT query using the given link and returns the result. + // This is an internal method that can be overridden by custom implementations. + DoSelect(ctx context.Context, link Link, sql string, args ...interface{}) (result Result, err error) + + // DoInsert performs the actual INSERT operation with given options. + // This is an internal method that can be overridden by custom implementations. + DoInsert(ctx context.Context, link Link, table string, data List, option DoInsertOption) (result sql.Result, err error) + + // DoUpdate performs the actual UPDATE operation. + // This is an internal method that can be overridden by custom implementations. + DoUpdate(ctx context.Context, link Link, table string, data interface{}, condition string, args ...interface{}) (result sql.Result, err error) + + // DoDelete performs the actual DELETE operation. + // This is an internal method that can be overridden by custom implementations. + DoDelete(ctx context.Context, link Link, table string, condition string, args ...interface{}) (result sql.Result, err error) + + // DoQuery executes a query that returns rows. + // This is an internal method that can be overridden by custom implementations. + DoQuery(ctx context.Context, link Link, sql string, args ...interface{}) (result Result, err error) + + // DoExec executes a query that doesn't return rows. + // This is an internal method that can be overridden by custom implementations. + DoExec(ctx context.Context, link Link, sql string, args ...interface{}) (result sql.Result, err error) + + // DoFilter processes and filters SQL and args before execution. + // This is an internal method that can be overridden to implement custom SQL filtering. + DoFilter(ctx context.Context, link Link, sql string, args []interface{}) (newSql string, newArgs []interface{}, err error) + + // DoCommit handles the actual commit operation for transactions. + // This is an internal method that can be overridden by custom implementations. + DoCommit(ctx context.Context, in DoCommitInput) (out DoCommitOutput, err error) + + // DoPrepare creates a prepared statement on the given link. + // This is an internal method that can be overridden by custom implementations. + DoPrepare(ctx context.Context, link Link, sql string) (*Stmt, error) + + // =========================================================================== + // Query APIs for convenience purpose. + // =========================================================================== + + // GetAll executes a query and returns all rows as Result. + // It's a convenience wrapper around Query. + GetAll(ctx context.Context, sql string, args ...interface{}) (Result, error) - // GetOne executes a query and returns the first row as Record. - // It's useful when you expect only one row to be returned. - GetOne(ctx context.Context, sql string, args ...interface{}) (Record, error) + // GetOne executes a query and returns the first row as Record. + // It's useful when you expect only one row to be returned. + GetOne(ctx context.Context, sql string, args ...interface{}) (Record, error) - // GetValue executes a query and returns the first column of the first row. - // It's useful for queries like SELECT COUNT(*) or getting a single value. - GetValue(ctx context.Context, sql string, args ...interface{}) (Value, error) + // GetValue executes a query and returns the first column of the first row. + // It's useful for queries like SELECT COUNT(*) or getting a single value. + GetValue(ctx context.Context, sql string, args ...interface{}) (Value, error) - // GetArray executes a query and returns the first column of all rows. - // It's useful for queries like SELECT id FROM table. - GetArray(ctx context.Context, sql string, args ...interface{}) ([]Value, error) + // GetArray executes a query and returns the first column of all rows. + // It's useful for queries like SELECT id FROM table. + GetArray(ctx context.Context, sql string, args ...interface{}) ([]Value, error) - // GetCount executes a COUNT query and returns the result as an integer. - // It's a convenience method for counting rows. - GetCount(ctx context.Context, sql string, args ...interface{}) (int, error) + // GetCount executes a COUNT query and returns the result as an integer. + // It's a convenience method for counting rows. + GetCount(ctx context.Context, sql string, args ...interface{}) (int, error) - // GetScan executes a query and scans the result into the given object pointer. - // It automatically maps database columns to struct fields or slice elements. - GetScan(ctx context.Context, objPointer interface{}, sql string, args ...interface{}) error + // GetScan executes a query and scans the result into the given object pointer. + // It automatically maps database columns to struct fields or slice elements. + GetScan(ctx context.Context, objPointer interface{}, sql string, args ...interface{}) error - // Union combines multiple SELECT queries using UNION operator. - // It returns a new Model that represents the combined query. - Union(unions ...*Model) *Model + // Union combines multiple SELECT queries using UNION operator. + // It returns a new Model that represents the combined query. + Union(unions ...*Model) *Model - // UnionAll combines multiple SELECT queries using UNION ALL operator. - // Unlike Union, it keeps duplicate rows in the result. - UnionAll(unions ...*Model) *Model + // UnionAll combines multiple SELECT queries using UNION ALL operator. + // Unlike Union, it keeps duplicate rows in the result. + UnionAll(unions ...*Model) *Model - // =========================================================================== - // Master/Slave specification support. - // =========================================================================== + // =========================================================================== + // Master/Slave specification support. + // =========================================================================== - // Master returns a connection to the master database node. - // The optional schema parameter specifies which database schema to use. - Master(schema ...string) (*sql.DB, error) + // Master returns a connection to the master database node. + // The optional schema parameter specifies which database schema to use. + Master(schema ...string) (*sql.DB, error) - // Slave returns a connection to a slave database node. - // The optional schema parameter specifies which database schema to use. - Slave(schema ...string) (*sql.DB, error) + // Slave returns a connection to a slave database node. + // The optional schema parameter specifies which database schema to use. + Slave(schema ...string) (*sql.DB, error) - // =========================================================================== - // Ping-Pong. - // =========================================================================== + // =========================================================================== + // Ping-Pong. + // =========================================================================== - // PingMaster checks if the master database node is accessible. - // It returns an error if the connection fails. - PingMaster() error + // PingMaster checks if the master database node is accessible. + // It returns an error if the connection fails. + PingMaster() error - // PingSlave checks if any slave database node is accessible. - // It returns an error if no slave connections are available. - PingSlave() error + // PingSlave checks if any slave database node is accessible. + // It returns an error if no slave connections are available. + PingSlave() error - // =========================================================================== - // Transaction. - // =========================================================================== + // =========================================================================== + // Transaction. + // =========================================================================== - // Begin starts a new transaction and returns a TX interface. - // The returned TX must be committed or rolled back to release resources. - Begin(ctx context.Context) (TX, error) + // Begin starts a new transaction and returns a TX interface. + // The returned TX must be committed or rolled back to release resources. + Begin(ctx context.Context) (TX, error) - // BeginWithOptions starts a new transaction with the given options and returns a TX interface. - // The options allow specifying isolation level and read-only mode. - // The returned TX must be committed or rolled back to release resources. - BeginWithOptions(ctx context.Context, opts TxOptions) (TX, error) + // BeginWithOptions starts a new transaction with the given options and returns a TX interface. + // The options allow specifying isolation level and read-only mode. + // The returned TX must be committed or rolled back to release resources. + BeginWithOptions(ctx context.Context, opts TxOptions) (TX, error) - // Transaction executes a function within a transaction. - // It automatically handles commit/rollback based on whether f returns an error. - Transaction(ctx context.Context, f func(ctx context.Context, tx TX) error) error + // Transaction executes a function within a transaction. + // It automatically handles commit/rollback based on whether f returns an error. + Transaction(ctx context.Context, f func(ctx context.Context, tx TX) error) error - // TransactionWithOptions executes a function within a transaction with specific options. - // It allows customizing transaction behavior like isolation level and timeout. - TransactionWithOptions(ctx context.Context, opts TxOptions, f func(ctx context.Context, tx TX) error) error + // TransactionWithOptions executes a function within a transaction with specific options. + // It allows customizing transaction behavior like isolation level and timeout. + TransactionWithOptions(ctx context.Context, opts TxOptions, f func(ctx context.Context, tx TX) error) error - // =========================================================================== - // Configuration methods. - // =========================================================================== + // =========================================================================== + // Configuration methods. + // =========================================================================== - // GetCache returns the cache instance used by this database. - // The cache is used for query results caching. - GetCache() *gcache.Cache + // GetCache returns the cache instance used by this database. + // The cache is used for query results caching. + GetCache() *gcache.Cache - // SetDebug enables or disables debug mode for SQL logging. - // When enabled, all SQL statements and their execution time are logged. - SetDebug(debug bool) + // SetDebug enables or disables debug mode for SQL logging. + // When enabled, all SQL statements and their execution time are logged. + SetDebug(debug bool) - // GetDebug returns whether debug mode is enabled. - GetDebug() bool + // GetDebug returns whether debug mode is enabled. + GetDebug() bool - // GetSchema returns the current database schema name. - GetSchema() string + // GetSchema returns the current database schema name. + GetSchema() string - // GetPrefix returns the table name prefix used by this database. - GetPrefix() string + // GetPrefix returns the table name prefix used by this database. + GetPrefix() string - // GetGroup returns the configuration group name of this database. - GetGroup() string + // GetGroup returns the configuration group name of this database. + GetGroup() string - // SetDryRun enables or disables dry-run mode. - // In dry-run mode, SQL statements are generated but not executed. - SetDryRun(enabled bool) + // SetDryRun enables or disables dry-run mode. + // In dry-run mode, SQL statements are generated but not executed. + SetDryRun(enabled bool) - // GetDryRun returns whether dry-run mode is enabled. - GetDryRun() bool + // GetDryRun returns whether dry-run mode is enabled. + GetDryRun() bool - // SetLogger sets a custom logger for database operations. - // The logger must implement glog.ILogger interface. - SetLogger(logger glog.ILogger) + // SetLogger sets a custom logger for database operations. + // The logger must implement glog.ILogger interface. + SetLogger(logger glog.ILogger) - // GetLogger returns the current logger used by this database. - GetLogger() glog.ILogger + // GetLogger returns the current logger used by this database. + GetLogger() glog.ILogger - // GetConfig returns the configuration node used by this database. - GetConfig() *ConfigNode + // GetConfig returns the configuration node used by this database. + GetConfig() *ConfigNode - // SetMaxIdleConnCount sets the maximum number of idle connections in the pool. - SetMaxIdleConnCount(n int) + // SetMaxIdleConnCount sets the maximum number of idle connections in the pool. + SetMaxIdleConnCount(n int) - // SetMaxOpenConnCount sets the maximum number of open connections to the database. - SetMaxOpenConnCount(n int) + // SetMaxOpenConnCount sets the maximum number of open connections to the database. + SetMaxOpenConnCount(n int) - // SetMaxConnLifeTime sets the maximum amount of time a connection may be reused. - SetMaxConnLifeTime(d time.Duration) + // SetMaxConnLifeTime sets the maximum amount of time a connection may be reused. + SetMaxConnLifeTime(d time.Duration) - // =========================================================================== - // Utility methods. - // =========================================================================== + // =========================================================================== + // Utility methods. + // =========================================================================== - // Stats returns statistics about the database connection pool. - // It includes information like the number of active and idle connections. - Stats(ctx context.Context) []StatsItem + // Stats returns statistics about the database connection pool. + // It includes information like the number of active and idle connections. + Stats(ctx context.Context) []StatsItem - // GetCtx returns the context associated with this database instance. - GetCtx() context.Context + // GetCtx returns the context associated with this database instance. + GetCtx() context.Context - // GetCore returns the underlying Core instance of this database. - GetCore() *Core + // GetCore returns the underlying Core instance of this database. + GetCore() *Core - // GetChars returns the left and right quote characters used for escaping identifiers. - // For example, in MySQL these are backticks: ` and `. - GetChars() (charLeft string, charRight string) + // GetChars returns the left and right quote characters used for escaping identifiers. + // For example, in MySQL these are backticks: ` and `. + GetChars() (charLeft string, charRight string) - // Tables returns a list of all table names in the specified schema. - // If no schema is specified, it uses the default schema. - Tables(ctx context.Context, schema ...string) (tables []string, err error) + // Tables returns a list of all table names in the specified schema. + // If no schema is specified, it uses the default schema. + Tables(ctx context.Context, schema ...string) (tables []string, err error) - // TableFields returns detailed information about all fields in the specified table. - // The returned map keys are field names and values contain field metadata. - TableFields(ctx context.Context, table string, schema ...string) (map[string]*TableField, error) + // TableFields returns detailed information about all fields in the specified table. + // The returned map keys are field names and values contain field metadata. + TableFields(ctx context.Context, table string, schema ...string) (map[string]*TableField, error) - // ConvertValueForField converts a value to the appropriate type for a database field. - // It handles type conversion from Go types to database-specific types. - ConvertValueForField(ctx context.Context, fieldType string, fieldValue interface{}) (interface{}, error) + // ConvertValueForField converts a value to the appropriate type for a database field. + // It handles type conversion from Go types to database-specific types. + ConvertValueForField(ctx context.Context, fieldType string, fieldValue interface{}) (interface{}, error) - // ConvertValueForLocal converts a database value to the appropriate Go type. - // It handles type conversion from database-specific types to Go types. - ConvertValueForLocal(ctx context.Context, fieldType string, fieldValue interface{}) (interface{}, error) + // ConvertValueForLocal converts a database value to the appropriate Go type. + // It handles type conversion from database-specific types to Go types. + ConvertValueForLocal(ctx context.Context, fieldType string, fieldValue interface{}) (interface{}, error) - // CheckLocalTypeForField checks if a Go value is compatible with a database field type. - // It returns the appropriate LocalType and any conversion errors. - CheckLocalTypeForField(ctx context.Context, fieldType string, fieldValue interface{}) (LocalType, error) + // CheckLocalTypeForField checks if a Go value is compatible with a database field type. + // It returns the appropriate LocalType and any conversion errors. + CheckLocalTypeForField(ctx context.Context, fieldType string, fieldValue interface{}) (LocalType, error) - // FormatUpsert formats an upsert (INSERT ... ON DUPLICATE KEY UPDATE) statement. - // It generates the appropriate SQL based on the columns, values, and options provided. - FormatUpsert(columns []string, list List, option DoInsertOption) (string, error) + // FormatUpsert formats an upsert (INSERT ... ON DUPLICATE KEY UPDATE) statement. + // It generates the appropriate SQL based on the columns, values, and options provided. + FormatUpsert(columns []string, list List, option DoInsertOption) (string, error) - // OrderRandomFunction returns the SQL function for random ordering. - // The implementation is database-specific (e.g., RAND() for MySQL). - OrderRandomFunction() string + // OrderRandomFunction returns the SQL function for random ordering. + // The implementation is database-specific (e.g., RAND() for MySQL). + OrderRandomFunction() string } // TX defines the interfaces for ORM transaction operations. type TX interface { - Link + Link - // Ctx binds a context to current transaction. - // The context is used for operations like timeout control. - Ctx(ctx context.Context) TX + // Ctx binds a context to current transaction. + // The context is used for operations like timeout control. + Ctx(ctx context.Context) TX - // Raw creates and returns a model based on a raw SQL. - // The rawSql can contain placeholders ? and corresponding args. - Raw(rawSql string, args ...interface{}) *Model + // Raw creates and returns a model based on a raw SQL. + // The rawSql can contain placeholders ? and corresponding args. + Raw(rawSql string, args ...interface{}) *Model - // Model creates and returns a Model from given table name/struct. - // The parameter can be table name as string, or struct/*struct type. - Model(tableNameQueryOrStruct ...interface{}) *Model + // Model creates and returns a Model from given table name/struct. + // The parameter can be table name as string, or struct/*struct type. + Model(tableNameQueryOrStruct ...interface{}) *Model - // With creates and returns a Model from given object. - // It automatically analyzes the object and generates corresponding SQL. - With(object interface{}) *Model + // With creates and returns a Model from given object. + // It automatically analyzes the object and generates corresponding SQL. + With(object interface{}) *Model - // =========================================================================== - // Nested transaction if necessary. - // =========================================================================== + // =========================================================================== + // Nested transaction if necessary. + // =========================================================================== - // Begin starts a nested transaction. - // It creates a new savepoint for current transaction. - Begin() error + // Begin starts a nested transaction. + // It creates a new savepoint for current transaction. + Begin() error - // Commit commits current transaction/savepoint. - // For nested transactions, it releases the current savepoint. - Commit() error + // Commit commits current transaction/savepoint. + // For nested transactions, it releases the current savepoint. + Commit() error - // Rollback rolls back current transaction/savepoint. - // For nested transactions, it rolls back to the current savepoint. - Rollback() error + // Rollback rolls back current transaction/savepoint. + // For nested transactions, it rolls back to the current savepoint. + Rollback() error - // Transaction executes given function in a nested transaction. - // It automatically handles commit/rollback based on function's error return. - Transaction(ctx context.Context, f func(ctx context.Context, tx TX) error) (err error) + // Transaction executes given function in a nested transaction. + // It automatically handles commit/rollback based on function's error return. + Transaction(ctx context.Context, f func(ctx context.Context, tx TX) error) (err error) - // TransactionWithOptions executes given function in a nested transaction with options. - // It allows customizing transaction behavior like isolation level. - TransactionWithOptions(ctx context.Context, opts TxOptions, f func(ctx context.Context, tx TX) error) error + // TransactionWithOptions executes given function in a nested transaction with options. + // It allows customizing transaction behavior like isolation level. + TransactionWithOptions(ctx context.Context, opts TxOptions, f func(ctx context.Context, tx TX) error) error - // =========================================================================== - // Core method. - // =========================================================================== + // =========================================================================== + // Core method. + // =========================================================================== - // Query executes a query that returns rows using given SQL and arguments. - // The args are for any placeholder parameters in the query. - Query(sql string, args ...interface{}) (result Result, err error) + // Query executes a query that returns rows using given SQL and arguments. + // The args are for any placeholder parameters in the query. + Query(sql string, args ...interface{}) (result Result, err error) - // Exec executes a query that doesn't return rows. - // For example: INSERT, UPDATE, DELETE. - Exec(sql string, args ...interface{}) (sql.Result, error) + // Exec executes a query that doesn't return rows. + // For example: INSERT, UPDATE, DELETE. + Exec(sql string, args ...interface{}) (sql.Result, error) - // Prepare creates a prepared statement for later queries or executions. - // Multiple queries or executions may be run concurrently from the statement. - Prepare(sql string) (*Stmt, error) + // Prepare creates a prepared statement for later queries or executions. + // Multiple queries or executions may be run concurrently from the statement. + Prepare(sql string) (*Stmt, error) - // =========================================================================== - // Query. - // =========================================================================== + // =========================================================================== + // Query. + // =========================================================================== - // GetAll executes a query and returns all rows as Result. - // It's a convenient wrapper for Query. - GetAll(sql string, args ...interface{}) (Result, error) + // GetAll executes a query and returns all rows as Result. + // It's a convenient wrapper for Query. + GetAll(sql string, args ...interface{}) (Result, error) - // GetOne executes a query and returns the first row as Record. - // It's useful when you expect only one row to be returned. - GetOne(sql string, args ...interface{}) (Record, error) + // GetOne executes a query and returns the first row as Record. + // It's useful when you expect only one row to be returned. + GetOne(sql string, args ...interface{}) (Record, error) - // GetStruct executes a query and scans the result into given struct. - // The obj should be a pointer to struct. - GetStruct(obj interface{}, sql string, args ...interface{}) error + // GetStruct executes a query and scans the result into given struct. + // The obj should be a pointer to struct. + GetStruct(obj interface{}, sql string, args ...interface{}) error - // GetStructs executes a query and scans all results into given struct slice. - // The objPointerSlice should be a pointer to slice of struct. - GetStructs(objPointerSlice interface{}, sql string, args ...interface{}) error + // GetStructs executes a query and scans all results into given struct slice. + // The objPointerSlice should be a pointer to slice of struct. + GetStructs(objPointerSlice interface{}, sql string, args ...interface{}) error - // GetScan executes a query and scans the result into given variables. - // The pointer can be type of struct/*struct/[]struct/[]*struct. - GetScan(pointer interface{}, sql string, args ...interface{}) error + // GetScan executes a query and scans the result into given variables. + // The pointer can be type of struct/*struct/[]struct/[]*struct. + GetScan(pointer interface{}, sql string, args ...interface{}) error - // GetValue executes a query and returns the first column of first row. - // It's useful for queries like SELECT COUNT(*). - GetValue(sql string, args ...interface{}) (Value, error) + // GetValue executes a query and returns the first column of first row. + // It's useful for queries like SELECT COUNT(*). + GetValue(sql string, args ...interface{}) (Value, error) - // GetCount executes a query that should return a count value. - // It's a convenient wrapper for count queries. - GetCount(sql string, args ...interface{}) (int64, error) + // GetCount executes a query that should return a count value. + // It's a convenient wrapper for count queries. + GetCount(sql string, args ...interface{}) (int64, error) - // =========================================================================== - // CRUD. - // =========================================================================== + // =========================================================================== + // CRUD. + // =========================================================================== - // Insert inserts one or multiple records into table. - // The data can be map/struct/*struct/[]map/[]struct/[]*struct. - Insert(table string, data interface{}, batch ...int) (sql.Result, error) + // Insert inserts one or multiple records into table. + // The data can be map/struct/*struct/[]map/[]struct/[]*struct. + Insert(table string, data interface{}, batch ...int) (sql.Result, error) - // InsertIgnore inserts one or multiple records with IGNORE option. - // It ignores records that would cause duplicate key conflicts. - InsertIgnore(table string, data interface{}, batch ...int) (sql.Result, error) + // InsertIgnore inserts one or multiple records with IGNORE option. + // It ignores records that would cause duplicate key conflicts. + InsertIgnore(table string, data interface{}, batch ...int) (sql.Result, error) - // InsertAndGetId inserts one record and returns its id value. - // It's commonly used with auto-increment primary key. - InsertAndGetId(table string, data interface{}, batch ...int) (int64, error) + // InsertAndGetId inserts one record and returns its id value. + // It's commonly used with auto-increment primary key. + InsertAndGetId(table string, data interface{}, batch ...int) (int64, error) - // Replace inserts or replaces records using REPLACE INTO syntax. - // Existing records with same unique key will be deleted and re-inserted. - Replace(table string, data interface{}, batch ...int) (sql.Result, error) + // Replace inserts or replaces records using REPLACE INTO syntax. + // Existing records with same unique key will be deleted and re-inserted. + Replace(table string, data interface{}, batch ...int) (sql.Result, error) - // Save inserts or updates records using INSERT ... ON DUPLICATE KEY UPDATE syntax. - // It updates existing records instead of replacing them entirely. - Save(table string, data interface{}, batch ...int) (sql.Result, error) + // Save inserts or updates records using INSERT ... ON DUPLICATE KEY UPDATE syntax. + // It updates existing records instead of replacing them entirely. + Save(table string, data interface{}, batch ...int) (sql.Result, error) - // Update updates records in table that match given condition. - // The data can be map/struct, and condition supports various formats. - Update(table string, data interface{}, condition interface{}, args ...interface{}) (sql.Result, error) + // Update updates records in table that match given condition. + // The data can be map/struct, and condition supports various formats. + Update(table string, data interface{}, condition interface{}, args ...interface{}) (sql.Result, error) - // Delete deletes records from table that match given condition. - // The condition supports various formats with optional arguments. - Delete(table string, condition interface{}, args ...interface{}) (sql.Result, error) + // Delete deletes records from table that match given condition. + // The condition supports various formats with optional arguments. + Delete(table string, condition interface{}, args ...interface{}) (sql.Result, error) - // =========================================================================== - // Utility methods. - // =========================================================================== + // =========================================================================== + // Utility methods. + // =========================================================================== - // GetCtx returns the context that is bound to current transaction. - GetCtx() context.Context + // GetCtx returns the context that is bound to current transaction. + GetCtx() context.Context - // GetDB returns the underlying DB interface object. - GetDB() DB + // GetDB returns the underlying DB interface object. + GetDB() DB - // GetSqlTX returns the underlying *sql.Tx object. - // Note: be very careful when using this method. - GetSqlTX() *sql.Tx + // GetSqlTX returns the underlying *sql.Tx object. + // Note: be very careful when using this method. + GetSqlTX() *sql.Tx - // IsClosed checks if current transaction is closed. - // A transaction is closed after Commit or Rollback. - IsClosed() bool + // IsClosed checks if current transaction is closed. + // A transaction is closed after Commit or Rollback. + IsClosed() bool - // =========================================================================== - // Save point feature. - // =========================================================================== + // =========================================================================== + // Save point feature. + // =========================================================================== - // SavePoint creates a save point with given name. - // It's used in nested transactions to create rollback points. - SavePoint(point string) error + // SavePoint creates a save point with given name. + // It's used in nested transactions to create rollback points. + SavePoint(point string) error - // RollbackTo rolls back transaction to previously created save point. - // If the save point doesn't exist, it returns an error. - RollbackTo(point string) error + // RollbackTo rolls back transaction to previously created save point. + // If the save point doesn't exist, it returns an error. + RollbackTo(point string) error } // StatsItem defines the stats information for a configuration node. type StatsItem interface { - // Node returns the configuration node info. - Node() ConfigNode + // Node returns the configuration node info. + Node() ConfigNode - // Stats returns the connection stat for current node. - Stats() sql.DBStats + // Stats returns the connection stat for current node. + Stats() sql.DBStats } // Core is the base struct for database management. type Core struct { - db DB // DB interface object. - ctx context.Context // Context for chaining operation only. Do not set a default value in Core initialization. - group string // Configuration group name. - schema string // Custom schema for this object. - debug *gtype.Bool // Enable debug mode for the database, which can be changed in runtime. - cache *gcache.Cache // Cache manager, SQL result cache only. - links *gmap.Map // links caches all created links by node. - logger glog.ILogger // Logger for logging functionality. - config *ConfigNode // Current config node. - dynamicConfig dynamicConfig // Dynamic configurations, which can be changed in runtime. - innerMemCache *gcache.Cache + db DB // DB interface object. + ctx context.Context // Context for chaining operation only. Do not set a default value in Core initialization. + group string // Configuration group name. + schema string // Custom schema for this object. + debug *gtype.Bool // Enable debug mode for the database, which can be changed in runtime. + cache *gcache.Cache // Cache manager, SQL result cache only. + links *gmap.Map // links caches all created links by node. + logger glog.ILogger // Logger for logging functionality. + config *ConfigNode // Current config node. + dynamicConfig dynamicConfig // Dynamic configurations, which can be changed in runtime. + innerMemCache *gcache.Cache // Internal memory cache for storing temporary data. } type dynamicConfig struct { - MaxIdleConnCount int - MaxOpenConnCount int - MaxConnLifeTime time.Duration + MaxIdleConnCount int + MaxOpenConnCount int + MaxConnLifeTime time.Duration } // DoCommitInput is the input parameters for function DoCommit. type DoCommitInput struct { - // Db is the underlying database connection object. - Db *sql.DB + // Db is the underlying database connection object. + Db *sql.DB - // Tx is the underlying transaction object. - Tx *sql.Tx + // Tx is the underlying transaction object. + Tx *sql.Tx - // Stmt is the prepared statement object. - Stmt *sql.Stmt + // Stmt is the prepared statement object. + Stmt *sql.Stmt - // Link is the common database function wrapper interface. - Link Link + // Link is the common database function wrapper interface. + Link Link - // Sql is the SQL string to be executed. - Sql string + // Sql is the SQL string to be executed. + Sql string - // Args is the arguments for SQL placeholders. - Args []interface{} + // Args is the arguments for SQL placeholders. + Args []interface{} - // Type indicates the type of SQL operation. - Type SqlType + // Type indicates the type of SQL operation. + Type SqlType - // TxOptions specifies the transaction options. - TxOptions sql.TxOptions + // TxOptions specifies the transaction options. + TxOptions sql.TxOptions - // TxCancelFunc is the context cancel function for transaction. - TxCancelFunc context.CancelFunc + // TxCancelFunc is the context cancel function for transaction. + TxCancelFunc context.CancelFunc - // IsTransaction indicates whether current operation is in transaction. - IsTransaction bool + // IsTransaction indicates whether current operation is in transaction. + IsTransaction bool } // DoCommitOutput is the output parameters for function DoCommit. type DoCommitOutput struct { - // Result is the result of exec statement. - Result sql.Result + // Result is the result of exec statement. + Result sql.Result - // Records is the result of query statement. - Records []Record + // Records is the result of query statement. + Records []Record - // Stmt is the Statement object result for Prepare. - Stmt *Stmt + // Stmt is the Statement object result for Prepare. + Stmt *Stmt - // Tx is the transaction object result for Begin. - Tx TX + // Tx is the transaction object result for Begin. + Tx TX - // RawResult is the underlying result, which might be sql.Result/*sql.Rows/*sql.Row. - RawResult interface{} + // RawResult is the underlying result, which might be sql.Result/*sql.Rows/*sql.Row. + RawResult interface{} } // Driver is the interface for integrating sql drivers into package gdb. type Driver interface { - // New creates and returns a database object for specified database server. - New(core *Core, node *ConfigNode) (DB, error) + // New creates and returns a database object for specified database server. + New(core *Core, node *ConfigNode) (DB, error) } // Link is a common database function wrapper interface. // Note that, any operation using `Link` will have no SQL logging. type Link interface { - QueryContext(ctx context.Context, sql string, args ...interface{}) (*sql.Rows, error) - ExecContext(ctx context.Context, sql string, args ...interface{}) (sql.Result, error) - PrepareContext(ctx context.Context, sql string) (*sql.Stmt, error) - IsOnMaster() bool - IsTransaction() bool + QueryContext(ctx context.Context, sql string, args ...interface{}) (*sql.Rows, error) + ExecContext(ctx context.Context, sql string, args ...interface{}) (sql.Result, error) + PrepareContext(ctx context.Context, sql string) (*sql.Stmt, error) + IsOnMaster() bool + IsTransaction() bool } // Sql is the sql recording struct. type Sql struct { - Sql string // SQL string(may contain reserved char '?'). - Type SqlType // SQL operation type. - Args []interface{} // Arguments for this sql. - Format string // Formatted sql which contains arguments in the sql. - Error error // Execution result. - Start int64 // Start execution timestamp in milliseconds. - End int64 // End execution timestamp in milliseconds. - Group string // Group is the group name of the configuration that the sql is executed from. - Schema string // Schema is the schema name of the configuration that the sql is executed from. - IsTransaction bool // IsTransaction marks whether this sql is executed in transaction. - RowsAffected int64 // RowsAffected marks retrieved or affected number with current sql statement. + Sql string // SQL string(may contain reserved char '?'). + Type SqlType // SQL operation type. + Args []interface{} // Arguments for this sql. + Format string // Formatted sql which contains arguments in the sql. + Error error // Execution result. + Start int64 // Start execution timestamp in milliseconds. + End int64 // End execution timestamp in milliseconds. + Group string // Group is the group name of the configuration that the sql is executed from. + Schema string // Schema is the schema name of the configuration that the sql is executed from. + IsTransaction bool // IsTransaction marks whether this sql is executed in transaction. + RowsAffected int64 // RowsAffected marks retrieved or affected number with current sql statement. } // DoInsertOption is the input struct for function DoInsert. type DoInsertOption struct { - // OnDuplicateStr is the custom string for `on duplicated` statement. - OnDuplicateStr string + // OnDuplicateStr is the custom string for `on duplicated` statement. + OnDuplicateStr string - // OnDuplicateMap is the custom key-value map from `OnDuplicateEx` function for `on duplicated` statement. - OnDuplicateMap map[string]interface{} + // OnDuplicateMap is the custom key-value map from `OnDuplicateEx` function for `on duplicated` statement. + OnDuplicateMap map[string]interface{} - // OnConflict is the custom conflict key of upsert clause, if the database needs it. - OnConflict []string + // OnConflict is the custom conflict key of upsert clause, if the database needs it. + OnConflict []string - // InsertOption is the insert operation in constant value. - InsertOption InsertOption + // InsertOption is the insert operation in constant value. + InsertOption InsertOption - // BatchCount is the batch count for batch inserting. - BatchCount int + // BatchCount is the batch count for batch inserting. + BatchCount int } // TableField is the struct for table field. type TableField struct { - // Index is for ordering purpose as map is unordered. - Index int + // Index is for ordering purpose as map is unordered. + Index int - // Name is the field name. - Name string + // Name is the field name. + Name string - // Type is the field type. Eg: 'int(10) unsigned', 'varchar(64)'. - Type string + // Type is the field type. Eg: 'int(10) unsigned', 'varchar(64)'. + Type string - // Null is whether the field can be null or not. - Null bool + // Null is whether the field can be null or not. + Null bool - // Key is the index information(empty if it's not an index). Eg: PRI, MUL. - Key string + // Key is the index information(empty if it's not an index). Eg: PRI, MUL. + Key string - // Default is the default value for the field. - Default interface{} + // Default is the default value for the field. + Default interface{} - // Extra is the extra information. Eg: auto_increment. - Extra string + // Extra is the extra information. Eg: auto_increment. + Extra string - // Comment is the field comment. - Comment string + // Comment is the field comment. + Comment string } // Counter is the type for update count. type Counter struct { - // Field is the field name. - Field string + // Field is the field name. + Field string - // Value is the value. - Value float64 + // Value is the value. + Value float64 } type ( - // Raw is a raw sql that will not be treated as argument but as a direct sql part. - Raw string + // Raw is a raw sql that will not be treated as argument but as a direct sql part. + Raw string - // Value is the field value type. - Value = *gvar.Var + // Value is the field value type. + Value = *fieldvar.Var - // Record is the row record of the table. - Record map[string]Value + // Record is the row record of the table. + Record map[string]Value - // Result is the row record array. - Result []Record + // Result is the row record array. + Result []Record - // Map is alias of map[string]interface{}, which is the most common usage map type. - Map = map[string]interface{} + // Map is alias of map[string]interface{}, which is the most common usage map type. + Map = map[string]interface{} - // List is type of map array. - List = []Map + // List is type of map array. + List = []Map ) type CatchSQLManager struct { - // SQLArray is the array of sql. - SQLArray *garray.StrArray + // SQLArray is the array of sql. + SQLArray *garray.StrArray - // DoCommit marks it will be committed to underlying driver or not. - DoCommit bool + // DoCommit marks it will be committed to underlying driver or not. + DoCommit bool } const ( - defaultModelSafe = false - defaultCharset = `utf8` - defaultProtocol = `tcp` - unionTypeNormal = 0 - unionTypeAll = 1 - defaultMaxIdleConnCount = 10 // Max idle connection count in pool. - defaultMaxOpenConnCount = 0 // Max open connection count in pool. Default is no limit. - defaultMaxConnLifeTime = 30 * time.Second // Max lifetime for per connection in pool in seconds. - cachePrefixTableFields = `TableFields:` - cachePrefixSelectCache = `SelectCache:` - commandEnvKeyForDryRun = "gf.gdb.dryrun" - modelForDaoSuffix = `ForDao` - dbRoleSlave = `slave` - ctxKeyForDB gctx.StrKey = `CtxKeyForDB` - ctxKeyCatchSQL gctx.StrKey = `CtxKeyCatchSQL` - ctxKeyInternalProducedSQL gctx.StrKey = `CtxKeyInternalProducedSQL` + defaultModelSafe = false + defaultCharset = `utf8` + defaultProtocol = `tcp` + unionTypeNormal = 0 + unionTypeAll = 1 + defaultMaxIdleConnCount = 10 // Max idle connection count in pool. + defaultMaxOpenConnCount = 0 // Max open connection count in pool. Default is no limit. + defaultMaxConnLifeTime = 30 * time.Second // Max lifetime for per connection in pool in seconds. + cachePrefixTableFields = `TableFields:` + cachePrefixSelectCache = `SelectCache:` + commandEnvKeyForDryRun = "gf.gdb.dryrun" + modelForDaoSuffix = `ForDao` + dbRoleSlave = `slave` + ctxKeyForDB gctx.StrKey = `CtxKeyForDB` + ctxKeyCatchSQL gctx.StrKey = `CtxKeyCatchSQL` + ctxKeyInternalProducedSQL gctx.StrKey = `CtxKeyInternalProducedSQL` - linkPattern = `^(\w+):(.*?):(.*?)@(\w+?)\((.+?)\)/{0,1}([^\?]*)\?{0,1}(.*?)$` - linkPatternDescription = `type:username:password@protocol(host:port)/dbname?param1=value1&...¶mN=valueN` + linkPattern = `^(\w+):(.*?):(.*?)@(\w+?)\((.+?)\)/{0,1}([^\?]*)\?{0,1}(.*?)$` + linkPatternDescription = `type:username:password@protocol(host:port)/dbname?param1=value1&...¶mN=valueN` ) type ctxTimeoutType int const ( - ctxTimeoutTypeExec ctxTimeoutType = iota - ctxTimeoutTypeQuery - ctxTimeoutTypePrepare - ctxTimeoutTypeTrans + ctxTimeoutTypeExec ctxTimeoutType = iota + ctxTimeoutTypeQuery + ctxTimeoutTypePrepare + ctxTimeoutTypeTrans ) type SelectType int const ( - SelectTypeDefault SelectType = iota - SelectTypeCount - SelectTypeValue - SelectTypeArray + SelectTypeDefault SelectType = iota + SelectTypeCount + SelectTypeValue + SelectTypeArray ) type joinOperator string const ( - joinOperatorLeft joinOperator = "LEFT" - joinOperatorRight joinOperator = "RIGHT" - joinOperatorInner joinOperator = "INNER" + joinOperatorLeft joinOperator = "LEFT" + joinOperatorRight joinOperator = "RIGHT" + joinOperatorInner joinOperator = "INNER" ) type InsertOption int const ( - InsertOptionDefault InsertOption = iota - InsertOptionReplace - InsertOptionSave - InsertOptionIgnore + InsertOptionDefault InsertOption = iota + InsertOptionReplace + InsertOptionSave + InsertOptionIgnore ) const ( - InsertOperationInsert = "INSERT" - InsertOperationReplace = "REPLACE" - InsertOperationIgnore = "INSERT IGNORE" - InsertOnDuplicateKeyUpdate = "ON DUPLICATE KEY UPDATE" + InsertOperationInsert = "INSERT" + InsertOperationReplace = "REPLACE" + InsertOperationIgnore = "INSERT IGNORE" + InsertOnDuplicateKeyUpdate = "ON DUPLICATE KEY UPDATE" ) type SqlType string const ( - SqlTypeBegin SqlType = "DB.Begin" - SqlTypeTXCommit SqlType = "TX.Commit" - SqlTypeTXRollback SqlType = "TX.Rollback" - SqlTypeExecContext SqlType = "DB.ExecContext" - SqlTypeQueryContext SqlType = "DB.QueryContext" - SqlTypePrepareContext SqlType = "DB.PrepareContext" - SqlTypeStmtExecContext SqlType = "DB.Statement.ExecContext" - SqlTypeStmtQueryContext SqlType = "DB.Statement.QueryContext" - SqlTypeStmtQueryRowContext SqlType = "DB.Statement.QueryRowContext" + SqlTypeBegin SqlType = "DB.Begin" + SqlTypeTXCommit SqlType = "TX.Commit" + SqlTypeTXRollback SqlType = "TX.Rollback" + SqlTypeExecContext SqlType = "DB.ExecContext" + SqlTypeQueryContext SqlType = "DB.QueryContext" + SqlTypePrepareContext SqlType = "DB.PrepareContext" + SqlTypeStmtExecContext SqlType = "DB.Statement.ExecContext" + SqlTypeStmtQueryContext SqlType = "DB.Statement.QueryContext" + SqlTypeStmtQueryRowContext SqlType = "DB.Statement.QueryRowContext" ) -type LocalType string +type LocalType = defines.LocalType const ( - LocalTypeUndefined LocalType = "" - LocalTypeString LocalType = "string" - LocalTypeTime LocalType = "time" - LocalTypeDate LocalType = "date" - LocalTypeDatetime LocalType = "datetime" - LocalTypeInt LocalType = "int" - LocalTypeUint LocalType = "uint" - LocalTypeInt64 LocalType = "int64" - LocalTypeUint64 LocalType = "uint64" - LocalTypeIntSlice LocalType = "[]int" - LocalTypeInt64Slice LocalType = "[]int64" - LocalTypeUint64Slice LocalType = "[]uint64" - LocalTypeStringSlice LocalType = "[]string" - LocalTypeInt64Bytes LocalType = "int64-bytes" - LocalTypeUint64Bytes LocalType = "uint64-bytes" - LocalTypeFloat32 LocalType = "float32" - LocalTypeFloat64 LocalType = "float64" - LocalTypeBytes LocalType = "[]byte" - LocalTypeBool LocalType = "bool" - LocalTypeJson LocalType = "json" - LocalTypeJsonb LocalType = "jsonb" + LocalTypeUndefined = defines.LocalTypeUndefined + LocalTypeString = defines.LocalTypeString + LocalTypeTime = defines.LocalTypeTime + LocalTypeDate = defines.LocalTypeDate + LocalTypeDatetime = defines.LocalTypeDatetime + LocalTypeInt = defines.LocalTypeInt + LocalTypeUint = defines.LocalTypeUint + LocalTypeInt64 = defines.LocalTypeInt64 + LocalTypeUint64 = defines.LocalTypeUint64 + LocalTypeIntSlice = defines.LocalTypeIntSlice + LocalTypeInt64Slice = defines.LocalTypeInt64Slice + LocalTypeUint64Slice = defines.LocalTypeUint64Slice + LocalTypeStringSlice = defines.LocalTypeStringSlice + LocalTypeInt64Bytes = defines.LocalTypeInt64Bytes + LocalTypeUint64Bytes = defines.LocalTypeUint64Bytes + LocalTypeFloat32 = defines.LocalTypeFloat32 + LocalTypeFloat64 = defines.LocalTypeFloat64 + LocalTypeBytes = defines.LocalTypeBytes + LocalTypeBool = defines.LocalTypeBool + LocalTypeJson = defines.LocalTypeJson + LocalTypeJsonb = defines.LocalTypeJsonb ) const ( - fieldTypeBinary = "binary" - fieldTypeVarbinary = "varbinary" - fieldTypeBlob = "blob" - fieldTypeTinyblob = "tinyblob" - fieldTypeMediumblob = "mediumblob" - fieldTypeLongblob = "longblob" - fieldTypeInt = "int" - fieldTypeTinyint = "tinyint" - fieldTypeSmallInt = "small_int" - fieldTypeSmallint = "smallint" - fieldTypeMediumInt = "medium_int" - fieldTypeMediumint = "mediumint" - fieldTypeSerial = "serial" - fieldTypeBigInt = "big_int" - fieldTypeBigint = "bigint" - fieldTypeBigserial = "bigserial" - fieldTypeReal = "real" - fieldTypeFloat = "float" - fieldTypeDouble = "double" - fieldTypeDecimal = "decimal" - fieldTypeMoney = "money" - fieldTypeNumeric = "numeric" - fieldTypeSmallmoney = "smallmoney" - fieldTypeBool = "bool" - fieldTypeBit = "bit" - fieldTypeYear = "year" // YYYY - fieldTypeDate = "date" // YYYY-MM-DD - fieldTypeTime = "time" // HH:MM:SS - fieldTypeDatetime = "datetime" // YYYY-MM-DD HH:MM:SS - fieldTypeTimestamp = "timestamp" // YYYYMMDD HHMMSS - fieldTypeTimestampz = "timestamptz" - fieldTypeJson = "json" - fieldTypeJsonb = "jsonb" + fieldTypeBinary = "binary" + fieldTypeVarbinary = "varbinary" + fieldTypeBlob = "blob" + fieldTypeTinyblob = "tinyblob" + fieldTypeMediumblob = "mediumblob" + fieldTypeLongblob = "longblob" + fieldTypeInt = "int" + fieldTypeTinyint = "tinyint" + fieldTypeSmallInt = "small_int" + fieldTypeSmallint = "smallint" + fieldTypeMediumInt = "medium_int" + fieldTypeMediumint = "mediumint" + fieldTypeSerial = "serial" + fieldTypeBigInt = "big_int" + fieldTypeBigint = "bigint" + fieldTypeBigserial = "bigserial" + fieldTypeReal = "real" + fieldTypeFloat = "float" + fieldTypeDouble = "double" + fieldTypeDecimal = "decimal" + fieldTypeMoney = "money" + fieldTypeNumeric = "numeric" + fieldTypeSmallmoney = "smallmoney" + fieldTypeBool = "bool" + fieldTypeBit = "bit" + fieldTypeYear = "year" // YYYY + fieldTypeDate = "date" // YYYY-MM-DD + fieldTypeTime = "time" // HH:MM:SS + fieldTypeDatetime = "datetime" // YYYY-MM-DD HH:MM:SS + fieldTypeTimestamp = "timestamp" // YYYYMMDD HHMMSS + fieldTypeTimestampz = "timestamptz" + fieldTypeJson = "json" + fieldTypeJsonb = "jsonb" ) var ( - // instances is the management map for instances. - instances = gmap.NewStrAnyMap(true) + // instances is the management map for instances. + instances = gmap.NewStrAnyMap(true) - // driverMap manages all custom registered driver. - driverMap = map[string]Driver{} + // driverMap manages all custom registered driver. + driverMap = map[string]Driver{} - // lastOperatorRegPattern is the regular expression pattern for a string - // which has operator at its tail. - lastOperatorRegPattern = `[<>=]+\s*$` + // lastOperatorRegPattern is the regular expression pattern for a string + // which has operator at its tail. + lastOperatorRegPattern = `[<>=]+\s*$` - // regularFieldNameRegPattern is the regular expression pattern for a string - // which is a regular field name of table. - regularFieldNameRegPattern = `^[\w\.\-]+$` + // regularFieldNameRegPattern is the regular expression pattern for a string + // which is a regular field name of table. + regularFieldNameRegPattern = `^[\w\.\-]+$` - // regularFieldNameWithCommaRegPattern is the regular expression pattern for one or more strings - // which are regular field names of table, multiple field names joined with char ','. - regularFieldNameWithCommaRegPattern = `^[\w\.\-,\s]+$` + // regularFieldNameWithCommaRegPattern is the regular expression pattern for one or more strings + // which are regular field names of table, multiple field names joined with char ','. + regularFieldNameWithCommaRegPattern = `^[\w\.\-,\s]+$` - // regularFieldNameWithoutDotRegPattern is similar to regularFieldNameRegPattern but not allows '.'. - // Note that, although some databases allow char '.' in the field name, but it here does not allow '.' - // in the field name as it conflicts with "db.table.field" pattern in SOME situations. - regularFieldNameWithoutDotRegPattern = `^[\w\-]+$` + // regularFieldNameWithoutDotRegPattern is similar to regularFieldNameRegPattern but not allows '.'. + // Note that, although some databases allow char '.' in the field name, but it here does not allow '.' + // in the field name as it conflicts with "db.table.field" pattern in SOME situations. + regularFieldNameWithoutDotRegPattern = `^[\w\-]+$` - // allDryRun sets dry-run feature for all database connections. - // It is commonly used for command options for convenience. - allDryRun = false + // allDryRun sets dry-run feature for all database connections. + // It is commonly used for command options for convenience. + allDryRun = false ) func init() { - // allDryRun is initialized from environment or command options. - allDryRun = gcmd.GetOptWithEnv(commandEnvKeyForDryRun, false).Bool() + // allDryRun is initialized from environment or command options. + allDryRun = gcmd.GetOptWithEnv(commandEnvKeyForDryRun, false).Bool() } // Register registers custom database driver to gdb. func Register(name string, driver Driver) error { - driverMap[name] = newDriverWrapper(driver) - return nil + driverMap[name] = newDriverWrapper(driver) + return nil } // New creates and returns an ORM object with given configuration node. func New(node ConfigNode) (db DB, err error) { - return newDBByConfigNode(&node, "") + return newDBByConfigNode(&node, "") } // NewByGroup creates and returns an ORM object with global configurations. // The parameter `name` specifies the configuration group name, // which is DefaultGroupName in default. func NewByGroup(group ...string) (db DB, err error) { - groupName := configs.group - if len(group) > 0 && group[0] != "" { - groupName = group[0] - } - configs.RLock() - defer configs.RUnlock() + groupName := configs.group + if len(group) > 0 && group[0] != "" { + groupName = group[0] + } + configs.RLock() + defer configs.RUnlock() - if len(configs.config) < 1 { - return nil, gerror.NewCode( - gcode.CodeInvalidConfiguration, - "database configuration is empty, please set the database configuration before using", - ) - } - if _, ok := configs.config[groupName]; ok { - var node *ConfigNode - if node, err = getConfigNodeByGroup(groupName, true); err == nil { - return newDBByConfigNode(node, groupName) - } - return nil, err - } - return nil, gerror.NewCodef( - gcode.CodeInvalidConfiguration, - `database configuration node "%s" is not found, did you misspell group name "%s" or miss the database configuration?`, - groupName, groupName, - ) + if len(configs.config) < 1 { + return nil, gerror.NewCode( + gcode.CodeInvalidConfiguration, + "database configuration is empty, please set the database configuration before using", + ) + } + if _, ok := configs.config[groupName]; ok { + var node *ConfigNode + if node, err = getConfigNodeByGroup(groupName, true); err == nil { + return newDBByConfigNode(node, groupName) + } + return nil, err + } + return nil, gerror.NewCodef( + gcode.CodeInvalidConfiguration, + `database configuration node "%s" is not found, did you misspell group name "%s" or miss the database configuration?`, + groupName, groupName, + ) } // newDBByConfigNode creates and returns an ORM object with given configuration node and group name. @@ -912,54 +913,54 @@ func NewByGroup(group ...string) (db DB, err error) { // The parameter `node` is used for DB creation, not for underlying connection creation. // So all db type configurations in the same group should be the same. func newDBByConfigNode(node *ConfigNode, group string) (db DB, err error) { - if node.Link != "" { - node, err = parseConfigNodeLink(node) - if err != nil { - return - } - } - c := &Core{ - group: group, - debug: gtype.NewBool(), - cache: gcache.New(), - links: gmap.New(true), - logger: glog.New(), - config: node, - innerMemCache: gcache.New(), - dynamicConfig: dynamicConfig{ - MaxIdleConnCount: node.MaxIdleConnCount, - MaxOpenConnCount: node.MaxOpenConnCount, - MaxConnLifeTime: node.MaxConnLifeTime, - }, - } - if v, ok := driverMap[node.Type]; ok { - if c.db, err = v.New(c, node); err != nil { - return nil, err - } - return c.db, nil - } - errorMsg := `cannot find database driver for specified database type "%s"` - errorMsg += `, did you misspell type name "%s" or forget importing the database driver? ` - errorMsg += `possible reference: https://github.com/gogf/gf/tree/master/contrib/drivers` - return nil, gerror.NewCodef(gcode.CodeInvalidConfiguration, errorMsg, node.Type, node.Type) + if node.Link != "" { + node, err = parseConfigNodeLink(node) + if err != nil { + return + } + } + c := &Core{ + group: group, + debug: gtype.NewBool(), + cache: gcache.New(), + links: gmap.New(true), + logger: glog.New(), + config: node, + innerMemCache: gcache.New(), + dynamicConfig: dynamicConfig{ + MaxIdleConnCount: node.MaxIdleConnCount, + MaxOpenConnCount: node.MaxOpenConnCount, + MaxConnLifeTime: node.MaxConnLifeTime, + }, + } + if v, ok := driverMap[node.Type]; ok { + if c.db, err = v.New(c, node); err != nil { + return nil, err + } + return c.db, nil + } + errorMsg := `cannot find database driver for specified database type "%s"` + errorMsg += `, did you misspell type name "%s" or forget importing the database driver? ` + errorMsg += `possible reference: https://github.com/gogf/gf/tree/master/contrib/drivers` + return nil, gerror.NewCodef(gcode.CodeInvalidConfiguration, errorMsg, node.Type, node.Type) } // Instance returns an instance for DB operations. // The parameter `name` specifies the configuration group name, // which is DefaultGroupName in default. func Instance(name ...string) (db DB, err error) { - group := configs.group - if len(name) > 0 && name[0] != "" { - group = name[0] - } - v := instances.GetOrSetFuncLock(group, func() interface{} { - db, err = NewByGroup(group) - return db - }) - if v != nil { - return v.(DB), nil - } - return + group := configs.group + if len(name) > 0 && name[0] != "" { + group = name[0] + } + v := instances.GetOrSetFuncLock(group, func() interface{} { + db, err = NewByGroup(group) + return db + }) + if v != nil { + return v.(DB), nil + } + return } // getConfigNodeByGroup calculates and returns a configuration node of given group. It @@ -970,39 +971,39 @@ func Instance(name ...string) (db DB, err error) { // The parameter `master` specifies whether retrieving a master node, or else a slave node // if master-slave nodes are configured. func getConfigNodeByGroup(group string, master bool) (*ConfigNode, error) { - if list, ok := configs.config[group]; ok { - // Separates master and slave configuration nodes array. - var ( - masterList = make(ConfigGroup, 0) - slaveList = make(ConfigGroup, 0) - ) - for i := 0; i < len(list); i++ { - if list[i].Role == dbRoleSlave { - slaveList = append(slaveList, list[i]) - } else { - masterList = append(masterList, list[i]) - } - } - if len(masterList) < 1 { - return nil, gerror.NewCode( - gcode.CodeInvalidConfiguration, - "at least one master node configuration's need to make sense", - ) - } - if len(slaveList) < 1 { - slaveList = masterList - } - if master { - return getConfigNodeByWeight(masterList), nil - } else { - return getConfigNodeByWeight(slaveList), nil - } - } - return nil, gerror.NewCodef( - gcode.CodeInvalidConfiguration, - "empty database configuration for item name '%s'", - group, - ) + if list, ok := configs.config[group]; ok { + // Separates master and slave configuration nodes array. + var ( + masterList = make(ConfigGroup, 0) + slaveList = make(ConfigGroup, 0) + ) + for i := 0; i < len(list); i++ { + if list[i].Role == dbRoleSlave { + slaveList = append(slaveList, list[i]) + } else { + masterList = append(masterList, list[i]) + } + } + if len(masterList) < 1 { + return nil, gerror.NewCode( + gcode.CodeInvalidConfiguration, + "at least one master node configuration's need to make sense", + ) + } + if len(slaveList) < 1 { + slaveList = masterList + } + if master { + return getConfigNodeByWeight(masterList), nil + } else { + return getConfigNodeByWeight(slaveList), nil + } + } + return nil, gerror.NewCodef( + gcode.CodeInvalidConfiguration, + "empty database configuration for item name '%s'", + group, + ) } // getConfigNodeByWeight calculates the configuration weights and randomly returns a node. @@ -1013,116 +1014,116 @@ func getConfigNodeByGroup(group string, master bool) (*ConfigNode, error) { // 2. Node1 weight range is [0, 99], and node2 weight range is [100, 199], ratio is 1:1; // 3. If the random number is 99, it then chooses and returns node1;. func getConfigNodeByWeight(cg ConfigGroup) *ConfigNode { - if len(cg) < 2 { - return &cg[0] - } - var total int - for i := 0; i < len(cg); i++ { - total += cg[i].Weight * 100 - } - // If total is 0 means all the nodes have no weight attribute configured. - // It then defaults each node's weight attribute to 1. - if total == 0 { - for i := 0; i < len(cg); i++ { - cg[i].Weight = 1 - total += cg[i].Weight * 100 - } - } - // Exclude the right border value. - var ( - minWeight = 0 - maxWeight = 0 - random = grand.N(0, total-1) - ) - for i := 0; i < len(cg); i++ { - maxWeight = minWeight + cg[i].Weight*100 - if random >= minWeight && random < maxWeight { - // ==================================================== - // Return a COPY of the ConfigNode. - // ==================================================== - node := ConfigNode{} - node = cg[i] - return &node - } - minWeight = maxWeight - } - return nil + if len(cg) < 2 { + return &cg[0] + } + var total int + for i := 0; i < len(cg); i++ { + total += cg[i].Weight * 100 + } + // If total is 0 means all the nodes have no weight attribute configured. + // It then defaults each node's weight attribute to 1. + if total == 0 { + for i := 0; i < len(cg); i++ { + cg[i].Weight = 1 + total += cg[i].Weight * 100 + } + } + // Exclude the right border value. + var ( + minWeight = 0 + maxWeight = 0 + random = grand.N(0, total-1) + ) + for i := 0; i < len(cg); i++ { + maxWeight = minWeight + cg[i].Weight*100 + if random >= minWeight && random < maxWeight { + // ==================================================== + // Return a COPY of the ConfigNode. + // ==================================================== + node := ConfigNode{} + node = cg[i] + return &node + } + minWeight = maxWeight + } + return nil } // getSqlDb retrieves and returns an underlying database connection object. // The parameter `master` specifies whether retrieves master node connection if // master-slave nodes are configured. func (c *Core) getSqlDb(master bool, schema ...string) (sqlDb *sql.DB, err error) { - var ( - node *ConfigNode - ctx = c.db.GetCtx() - ) - if c.group != "" { - // Load balance. - configs.RLock() - defer configs.RUnlock() - // Value COPY for node. - // The returned node is a clone of configuration node, which is safe for later modification. - node, err = getConfigNodeByGroup(c.group, master) - if err != nil { - return nil, err - } - } else { - // Value COPY for node. - n := *c.db.GetConfig() - node = &n - } - if node.Charset == "" { - node.Charset = defaultCharset - } - // Changes the schema. - nodeSchema := gutil.GetOrDefaultStr(c.schema, schema...) - if nodeSchema != "" { - node.Name = nodeSchema - } - // Update the configuration object in internal data. - if err = c.setConfigNodeToCtx(ctx, node); err != nil { - return - } + var ( + node *ConfigNode + ctx = c.db.GetCtx() + ) + if c.group != "" { + // Load balance. + configs.RLock() + defer configs.RUnlock() + // Value COPY for node. + // The returned node is a clone of configuration node, which is safe for later modification. + node, err = getConfigNodeByGroup(c.group, master) + if err != nil { + return nil, err + } + } else { + // Value COPY for node. + n := *c.db.GetConfig() + node = &n + } + if node.Charset == "" { + node.Charset = defaultCharset + } + // Changes the schema. + nodeSchema := gutil.GetOrDefaultStr(c.schema, schema...) + if nodeSchema != "" { + node.Name = nodeSchema + } + // Update the configuration object in internal data. + if err = c.setConfigNodeToCtx(ctx, node); err != nil { + return + } - // Cache the underlying connection pool object by node. - var ( - instanceCacheFunc = func() interface{} { - if sqlDb, err = c.db.Open(node); err != nil { - return nil - } - if sqlDb == nil { - return nil - } - if c.dynamicConfig.MaxIdleConnCount > 0 { - sqlDb.SetMaxIdleConns(c.dynamicConfig.MaxIdleConnCount) - } else { - sqlDb.SetMaxIdleConns(defaultMaxIdleConnCount) - } - if c.dynamicConfig.MaxOpenConnCount > 0 { - sqlDb.SetMaxOpenConns(c.dynamicConfig.MaxOpenConnCount) - } else { - sqlDb.SetMaxOpenConns(defaultMaxOpenConnCount) - } - if c.dynamicConfig.MaxConnLifeTime > 0 { - sqlDb.SetConnMaxLifetime(c.dynamicConfig.MaxConnLifeTime) - } else { - sqlDb.SetConnMaxLifetime(defaultMaxConnLifeTime) - } - return sqlDb - } - // it here uses NODE VALUE not pointer as the cache key, in case of oracle ORA-12516 error. - instanceValue = c.links.GetOrSetFuncLock(*node, instanceCacheFunc) - ) - if instanceValue != nil && sqlDb == nil { - // It reads from instance map. - sqlDb = instanceValue.(*sql.DB) - } - if node.Debug { - c.db.SetDebug(node.Debug) - } - if node.DryRun { - c.db.SetDryRun(node.DryRun) - } - return + // Cache the underlying connection pool object by node. + var ( + instanceCacheFunc = func() interface{} { + if sqlDb, err = c.db.Open(node); err != nil { + return nil + } + if sqlDb == nil { + return nil + } + if c.dynamicConfig.MaxIdleConnCount > 0 { + sqlDb.SetMaxIdleConns(c.dynamicConfig.MaxIdleConnCount) + } else { + sqlDb.SetMaxIdleConns(defaultMaxIdleConnCount) + } + if c.dynamicConfig.MaxOpenConnCount > 0 { + sqlDb.SetMaxOpenConns(c.dynamicConfig.MaxOpenConnCount) + } else { + sqlDb.SetMaxOpenConns(defaultMaxOpenConnCount) + } + if c.dynamicConfig.MaxConnLifeTime > 0 { + sqlDb.SetConnMaxLifetime(c.dynamicConfig.MaxConnLifeTime) + } else { + sqlDb.SetConnMaxLifetime(defaultMaxConnLifeTime) + } + return sqlDb + } + // it here uses NODE VALUE not pointer as the cache key, in case of oracle ORA-12516 error. + instanceValue = c.links.GetOrSetFuncLock(*node, instanceCacheFunc) + ) + if instanceValue != nil && sqlDb == nil { + // It reads from instance map. + sqlDb = instanceValue.(*sql.DB) + } + if node.Debug { + c.db.SetDebug(node.Debug) + } + if node.DryRun { + c.db.SetDryRun(node.DryRun) + } + return } diff --git a/database/gdb/gdb_core.go b/database/gdb/gdb_core.go index 509716112..f1cd226ea 100644 --- a/database/gdb/gdb_core.go +++ b/database/gdb/gdb_core.go @@ -8,30 +8,29 @@ package gdb import ( - "context" - "database/sql" - "fmt" - "reflect" - "strings" + "context" + "database/sql" + "fmt" + "reflect" + "strings" - "github.com/gogf/gf/v2/container/gmap" - "github.com/gogf/gf/v2/container/gset" - "github.com/gogf/gf/v2/container/gvar" - "github.com/gogf/gf/v2/errors/gcode" - "github.com/gogf/gf/v2/errors/gerror" - "github.com/gogf/gf/v2/internal/intlog" - "github.com/gogf/gf/v2/internal/reflection" - "github.com/gogf/gf/v2/internal/utils" - "github.com/gogf/gf/v2/os/gcache" - "github.com/gogf/gf/v2/text/gregex" - "github.com/gogf/gf/v2/text/gstr" - "github.com/gogf/gf/v2/util/gconv" - "github.com/gogf/gf/v2/util/gutil" + "github.com/gogf/gf/v2/container/gmap" + "github.com/gogf/gf/v2/container/gset" + "github.com/gogf/gf/v2/errors/gcode" + "github.com/gogf/gf/v2/errors/gerror" + "github.com/gogf/gf/v2/internal/intlog" + "github.com/gogf/gf/v2/internal/reflection" + "github.com/gogf/gf/v2/internal/utils" + "github.com/gogf/gf/v2/os/gcache" + "github.com/gogf/gf/v2/text/gregex" + "github.com/gogf/gf/v2/text/gstr" + "github.com/gogf/gf/v2/util/gconv" + "github.com/gogf/gf/v2/util/gutil" ) // GetCore returns the underlying *Core object. func (c *Core) GetCore() *Core { - return c + return c } // Ctx is a chaining function, which creates and returns a new DB that is a shallow copy @@ -39,67 +38,67 @@ func (c *Core) GetCore() *Core { // Note that this returned DB object can be used only once, so do not assign it to // a global or package variable for long using. func (c *Core) Ctx(ctx context.Context) DB { - if ctx == nil { - return c.db - } - // It makes a shallow copy of current db and changes its context for next chaining operation. - var ( - err error - newCore = &Core{} - configNode = c.db.GetConfig() - ) - *newCore = *c - // It creates a new DB object(NOT NEW CONNECTION), which is commonly a wrapper for object `Core`. - newCore.db, err = driverMap[configNode.Type].New(newCore, configNode) - if err != nil { - // It is really a serious error here. - // Do not let it continue. - panic(err) - } - newCore.ctx = WithDB(ctx, newCore.db) - newCore.ctx = c.injectInternalCtxData(newCore.ctx) - return newCore.db + if ctx == nil { + return c.db + } + // It makes a shallow copy of current db and changes its context for next chaining operation. + var ( + err error + newCore = &Core{} + configNode = c.db.GetConfig() + ) + *newCore = *c + // It creates a new DB object(NOT NEW CONNECTION), which is commonly a wrapper for object `Core`. + newCore.db, err = driverMap[configNode.Type].New(newCore, configNode) + if err != nil { + // It is really a serious error here. + // Do not let it continue. + panic(err) + } + newCore.ctx = WithDB(ctx, newCore.db) + newCore.ctx = c.injectInternalCtxData(newCore.ctx) + return newCore.db } // GetCtx returns the context for current DB. // It returns `context.Background()` is there's no context previously set. func (c *Core) GetCtx() context.Context { - ctx := c.ctx - if ctx == nil { - ctx = context.TODO() - } - return c.injectInternalCtxData(ctx) + ctx := c.ctx + if ctx == nil { + ctx = context.TODO() + } + return c.injectInternalCtxData(ctx) } // GetCtxTimeout returns the context and cancel function for specified timeout type. func (c *Core) GetCtxTimeout(ctx context.Context, timeoutType ctxTimeoutType) (context.Context, context.CancelFunc) { - if ctx == nil { - ctx = c.db.GetCtx() - } else { - ctx = context.WithValue(ctx, "WrappedByGetCtxTimeout", nil) - } - var config = c.db.GetConfig() - switch timeoutType { - case ctxTimeoutTypeExec: - if c.db.GetConfig().ExecTimeout > 0 { - return context.WithTimeout(ctx, config.ExecTimeout) - } - case ctxTimeoutTypeQuery: - if c.db.GetConfig().QueryTimeout > 0 { - return context.WithTimeout(ctx, config.QueryTimeout) - } - case ctxTimeoutTypePrepare: - if c.db.GetConfig().PrepareTimeout > 0 { - return context.WithTimeout(ctx, config.PrepareTimeout) - } - case ctxTimeoutTypeTrans: - if c.db.GetConfig().TranTimeout > 0 { - return context.WithTimeout(ctx, config.TranTimeout) - } - default: - panic(gerror.NewCodef(gcode.CodeInvalidParameter, "invalid context timeout type: %d", timeoutType)) - } - return ctx, func() {} + if ctx == nil { + ctx = c.db.GetCtx() + } else { + ctx = context.WithValue(ctx, "WrappedByGetCtxTimeout", nil) + } + var config = c.db.GetConfig() + switch timeoutType { + case ctxTimeoutTypeExec: + if c.db.GetConfig().ExecTimeout > 0 { + return context.WithTimeout(ctx, config.ExecTimeout) + } + case ctxTimeoutTypeQuery: + if c.db.GetConfig().QueryTimeout > 0 { + return context.WithTimeout(ctx, config.QueryTimeout) + } + case ctxTimeoutTypePrepare: + if c.db.GetConfig().PrepareTimeout > 0 { + return context.WithTimeout(ctx, config.PrepareTimeout) + } + case ctxTimeoutTypeTrans: + if c.db.GetConfig().TranTimeout > 0 { + return context.WithTimeout(ctx, config.TranTimeout) + } + default: + panic(gerror.NewCodef(gcode.CodeInvalidParameter, "invalid context timeout type: %d", timeoutType)) + } + return ctx, func() {} } // Close closes the database and prevents new queries from starting. @@ -109,97 +108,97 @@ func (c *Core) GetCtxTimeout(ctx context.Context, timeoutType ctxTimeoutType) (c // It is rare to Close a DB, as the DB handle is meant to be // long-lived and shared between many goroutines. func (c *Core) Close(ctx context.Context) (err error) { - if err = c.cache.Close(ctx); err != nil { - return err - } - c.links.LockFunc(func(m map[any]any) { - for k, v := range m { - if db, ok := v.(*sql.DB); ok { - err = db.Close() - if err != nil { - err = gerror.WrapCode(gcode.CodeDbOperationError, err, `db.Close failed`) - } - intlog.Printf(ctx, `close link: %s, err: %v`, k, err) - if err != nil { - return - } - delete(m, k) - } - } - }) - return + if err = c.cache.Close(ctx); err != nil { + return err + } + c.links.LockFunc(func(m map[any]any) { + for k, v := range m { + if db, ok := v.(*sql.DB); ok { + err = db.Close() + if err != nil { + err = gerror.WrapCode(gcode.CodeDbOperationError, err, `db.Close failed`) + } + intlog.Printf(ctx, `close link: %s, err: %v`, k, err) + if err != nil { + return + } + delete(m, k) + } + } + }) + return } // Master creates and returns a connection from master node if master-slave configured. // It returns the default connection if master-slave not configured. func (c *Core) Master(schema ...string) (*sql.DB, error) { - var ( - usedSchema = gutil.GetOrDefaultStr(c.schema, schema...) - charL, charR = c.db.GetChars() - ) - return c.getSqlDb(true, gstr.Trim(usedSchema, charL+charR)) + var ( + usedSchema = gutil.GetOrDefaultStr(c.schema, schema...) + charL, charR = c.db.GetChars() + ) + return c.getSqlDb(true, gstr.Trim(usedSchema, charL+charR)) } // Slave creates and returns a connection from slave node if master-slave configured. // It returns the default connection if master-slave not configured. func (c *Core) Slave(schema ...string) (*sql.DB, error) { - var ( - usedSchema = gutil.GetOrDefaultStr(c.schema, schema...) - charL, charR = c.db.GetChars() - ) - return c.getSqlDb(false, gstr.Trim(usedSchema, charL+charR)) + var ( + usedSchema = gutil.GetOrDefaultStr(c.schema, schema...) + charL, charR = c.db.GetChars() + ) + return c.getSqlDb(false, gstr.Trim(usedSchema, charL+charR)) } // GetAll queries and returns data records from database. func (c *Core) GetAll(ctx context.Context, sql string, args ...interface{}) (Result, error) { - return c.db.DoSelect(ctx, nil, sql, args...) + return c.db.DoSelect(ctx, nil, sql, args...) } // DoSelect queries and returns data records from database. func (c *Core) DoSelect(ctx context.Context, link Link, sql string, args ...interface{}) (result Result, err error) { - return c.db.DoQuery(ctx, link, sql, args...) + return c.db.DoQuery(ctx, link, sql, args...) } // GetOne queries and returns one record from database. func (c *Core) GetOne(ctx context.Context, sql string, args ...interface{}) (Record, error) { - list, err := c.db.GetAll(ctx, sql, args...) - if err != nil { - return nil, err - } - if len(list) > 0 { - return list[0], nil - } - return nil, nil + list, err := c.db.GetAll(ctx, sql, args...) + if err != nil { + return nil, err + } + if len(list) > 0 { + return list[0], nil + } + return nil, nil } // GetArray queries and returns data values as slice from database. // Note that if there are multiple columns in the result, it returns just one column values randomly. func (c *Core) GetArray(ctx context.Context, sql string, args ...interface{}) ([]Value, error) { - all, err := c.db.DoSelect(ctx, nil, sql, args...) - if err != nil { - return nil, err - } - return all.Array(), nil + all, err := c.db.DoSelect(ctx, nil, sql, args...) + if err != nil { + return nil, err + } + return all.Array(), nil } // doGetStruct queries one record from database and converts it to given struct. // The parameter `pointer` should be a pointer to struct. func (c *Core) doGetStruct(ctx context.Context, pointer interface{}, sql string, args ...interface{}) error { - one, err := c.db.GetOne(ctx, sql, args...) - if err != nil { - return err - } - return one.Struct(pointer) + one, err := c.db.GetOne(ctx, sql, args...) + if err != nil { + return err + } + return one.Struct(pointer) } // doGetStructs queries records from database and converts them to given struct. // The parameter `pointer` should be type of struct slice: []struct/[]*struct. func (c *Core) doGetStructs(ctx context.Context, pointer interface{}, sql string, args ...interface{}) error { - all, err := c.db.GetAll(ctx, sql, args...) - if err != nil { - return err - } - return all.Structs(pointer) + all, err := c.db.GetAll(ctx, sql, args...) + if err != nil { + return err + } + return all.Structs(pointer) } // GetScan queries one or more records from database and converts them to given struct or @@ -209,115 +208,115 @@ func (c *Core) doGetStructs(ctx context.Context, pointer interface{}, sql string // the conversion. If parameter `pointer` is type of slice, it calls GetStructs internally // for conversion. func (c *Core) GetScan(ctx context.Context, pointer interface{}, sql string, args ...interface{}) error { - reflectInfo := reflection.OriginTypeAndKind(pointer) - if reflectInfo.InputKind != reflect.Ptr { - return gerror.NewCodef( - gcode.CodeInvalidParameter, - "params should be type of pointer, but got: %v", - reflectInfo.InputKind, - ) - } - switch reflectInfo.OriginKind { - case reflect.Array, reflect.Slice: - return c.db.GetCore().doGetStructs(ctx, pointer, sql, args...) + reflectInfo := reflection.OriginTypeAndKind(pointer) + if reflectInfo.InputKind != reflect.Ptr { + return gerror.NewCodef( + gcode.CodeInvalidParameter, + "params should be type of pointer, but got: %v", + reflectInfo.InputKind, + ) + } + switch reflectInfo.OriginKind { + case reflect.Array, reflect.Slice: + return c.db.GetCore().doGetStructs(ctx, pointer, sql, args...) - case reflect.Struct: - return c.db.GetCore().doGetStruct(ctx, pointer, sql, args...) - } - return gerror.NewCodef( - gcode.CodeInvalidParameter, - `in valid parameter type "%v", of which element type should be type of struct/slice`, - reflectInfo.InputType, - ) + case reflect.Struct: + return c.db.GetCore().doGetStruct(ctx, pointer, sql, args...) + } + return gerror.NewCodef( + gcode.CodeInvalidParameter, + `in valid parameter type "%v", of which element type should be type of struct/slice`, + reflectInfo.InputType, + ) } // GetValue queries and returns the field value from database. // The sql should query only one field from database, or else it returns only one // field of the result. 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 gvar.New(nil), err - } - for _, v := range one { - return v, nil - } - return gvar.New(nil), nil + one, err := c.db.GetOne(ctx, sql, args...) + if err != nil { + return nil, err + } + for _, v := range one { + return v, nil + } + return nil, nil } // GetCount queries and returns the count from database. func (c *Core) GetCount(ctx context.Context, sql string, args ...interface{}) (int, error) { - // If the query fields do not contain function "COUNT", - // it replaces the sql string and adds the "COUNT" function to the fields. - if !gregex.IsMatchString(`(?i)SELECT\s+COUNT\(.+\)\s+FROM`, sql) { - sql, _ = gregex.ReplaceString(`(?i)(SELECT)\s+(.+)\s+(FROM)`, `$1 COUNT($2) $3`, sql) - } - value, err := c.db.GetValue(ctx, sql, args...) - if err != nil { - return 0, err - } - return value.Int(), nil + // If the query fields do not contain function "COUNT", + // it replaces the sql string and adds the "COUNT" function to the fields. + if !gregex.IsMatchString(`(?i)SELECT\s+COUNT\(.+\)\s+FROM`, sql) { + sql, _ = gregex.ReplaceString(`(?i)(SELECT)\s+(.+)\s+(FROM)`, `$1 COUNT($2) $3`, sql) + } + value, err := c.db.GetValue(ctx, sql, args...) + if err != nil { + return 0, err + } + return value.Int(), nil } // Union does "(SELECT xxx FROM xxx) UNION (SELECT xxx FROM xxx) ..." statement. func (c *Core) Union(unions ...*Model) *Model { - var ctx = c.db.GetCtx() - return c.doUnion(ctx, unionTypeNormal, unions...) + var ctx = c.db.GetCtx() + return c.doUnion(ctx, unionTypeNormal, unions...) } // UnionAll does "(SELECT xxx FROM xxx) UNION ALL (SELECT xxx FROM xxx) ..." statement. func (c *Core) UnionAll(unions ...*Model) *Model { - var ctx = c.db.GetCtx() - return c.doUnion(ctx, unionTypeAll, unions...) + var ctx = c.db.GetCtx() + return c.doUnion(ctx, unionTypeAll, unions...) } func (c *Core) doUnion(ctx context.Context, unionType int, unions ...*Model) *Model { - var ( - unionTypeStr string - composedSqlStr string - composedArgs = make([]interface{}, 0) - ) - if unionType == unionTypeAll { - unionTypeStr = "UNION ALL" - } else { - unionTypeStr = "UNION" - } - for _, v := range unions { - sqlWithHolder, holderArgs := v.getFormattedSqlAndArgs(ctx, SelectTypeDefault, false) - if composedSqlStr == "" { - composedSqlStr += fmt.Sprintf(`(%s)`, sqlWithHolder) - } else { - composedSqlStr += fmt.Sprintf(` %s (%s)`, unionTypeStr, sqlWithHolder) - } - composedArgs = append(composedArgs, holderArgs...) - } - return c.db.Raw(composedSqlStr, composedArgs...) + var ( + unionTypeStr string + composedSqlStr string + composedArgs = make([]interface{}, 0) + ) + if unionType == unionTypeAll { + unionTypeStr = "UNION ALL" + } else { + unionTypeStr = "UNION" + } + for _, v := range unions { + sqlWithHolder, holderArgs := v.getFormattedSqlAndArgs(ctx, SelectTypeDefault, false) + if composedSqlStr == "" { + composedSqlStr += fmt.Sprintf(`(%s)`, sqlWithHolder) + } else { + composedSqlStr += fmt.Sprintf(` %s (%s)`, unionTypeStr, sqlWithHolder) + } + composedArgs = append(composedArgs, holderArgs...) + } + return c.db.Raw(composedSqlStr, composedArgs...) } // PingMaster pings the master node to check authentication or keeps the connection alive. func (c *Core) PingMaster() error { - var ctx = c.db.GetCtx() - if master, err := c.db.Master(); err != nil { - return err - } else { - if err = master.PingContext(ctx); err != nil { - err = gerror.WrapCode(gcode.CodeDbOperationError, err, `master.Ping failed`) - } - return err - } + var ctx = c.db.GetCtx() + if master, err := c.db.Master(); err != nil { + return err + } else { + if err = master.PingContext(ctx); err != nil { + err = gerror.WrapCode(gcode.CodeDbOperationError, err, `master.Ping failed`) + } + return err + } } // PingSlave pings the slave node to check authentication or keeps the connection alive. func (c *Core) PingSlave() error { - var ctx = c.db.GetCtx() - if slave, err := c.db.Slave(); err != nil { - return err - } else { - if err = slave.PingContext(ctx); err != nil { - err = gerror.WrapCode(gcode.CodeDbOperationError, err, `slave.Ping failed`) - } - return err - } + var ctx = c.db.GetCtx() + if slave, err := c.db.Slave(); err != nil { + return err + } else { + if err = slave.PingContext(ctx); err != nil { + err = gerror.WrapCode(gcode.CodeDbOperationError, err, `slave.Ping failed`) + } + return err + } } // Insert does "INSERT INTO ..." statement for the table. @@ -330,10 +329,10 @@ func (c *Core) PingSlave() error { // // The parameter `batch` specifies the batch operation count when given data is slice. func (c *Core) Insert(ctx context.Context, table string, data interface{}, batch ...int) (sql.Result, error) { - if len(batch) > 0 { - return c.Model(table).Ctx(ctx).Data(data).Batch(batch[0]).Insert() - } - return c.Model(table).Ctx(ctx).Data(data).Insert() + if len(batch) > 0 { + return c.Model(table).Ctx(ctx).Data(data).Batch(batch[0]).Insert() + } + return c.Model(table).Ctx(ctx).Data(data).Insert() } // InsertIgnore does "INSERT IGNORE INTO ..." statement for the table. @@ -346,18 +345,18 @@ func (c *Core) Insert(ctx context.Context, table string, data interface{}, batch // // The parameter `batch` specifies the batch operation count when given data is slice. func (c *Core) InsertIgnore(ctx context.Context, table string, data interface{}, batch ...int) (sql.Result, error) { - if len(batch) > 0 { - return c.Model(table).Ctx(ctx).Data(data).Batch(batch[0]).InsertIgnore() - } - return c.Model(table).Ctx(ctx).Data(data).InsertIgnore() + if len(batch) > 0 { + return c.Model(table).Ctx(ctx).Data(data).Batch(batch[0]).InsertIgnore() + } + return c.Model(table).Ctx(ctx).Data(data).InsertIgnore() } // InsertAndGetId performs action Insert and returns the last insert id that automatically generated. func (c *Core) InsertAndGetId(ctx context.Context, table string, data interface{}, batch ...int) (int64, error) { - if len(batch) > 0 { - return c.Model(table).Ctx(ctx).Data(data).Batch(batch[0]).InsertAndGetId() - } - return c.Model(table).Ctx(ctx).Data(data).InsertAndGetId() + if len(batch) > 0 { + return c.Model(table).Ctx(ctx).Data(data).Batch(batch[0]).InsertAndGetId() + } + return c.Model(table).Ctx(ctx).Data(data).InsertAndGetId() } // Replace does "REPLACE INTO ..." statement for the table. @@ -373,10 +372,10 @@ func (c *Core) InsertAndGetId(ctx context.Context, table string, data interface{ // If given data is type of slice, it then does batch replacing, and the optional parameter // `batch` specifies the batch operation count. func (c *Core) Replace(ctx context.Context, table string, data interface{}, batch ...int) (sql.Result, error) { - if len(batch) > 0 { - return c.Model(table).Ctx(ctx).Data(data).Batch(batch[0]).Replace() - } - return c.Model(table).Ctx(ctx).Data(data).Replace() + if len(batch) > 0 { + return c.Model(table).Ctx(ctx).Data(data).Batch(batch[0]).Replace() + } + return c.Model(table).Ctx(ctx).Data(data).Replace() } // Save does "INSERT INTO ... ON DUPLICATE KEY UPDATE..." statement for the table. @@ -391,33 +390,33 @@ func (c *Core) Replace(ctx context.Context, table string, data interface{}, batc // If given data is type of slice, it then does batch saving, and the optional parameter // `batch` specifies the batch operation count. func (c *Core) Save(ctx context.Context, table string, data interface{}, batch ...int) (sql.Result, error) { - if len(batch) > 0 { - return c.Model(table).Ctx(ctx).Data(data).Batch(batch[0]).Save() - } - return c.Model(table).Ctx(ctx).Data(data).Save() + if len(batch) > 0 { + return c.Model(table).Ctx(ctx).Data(data).Batch(batch[0]).Save() + } + return c.Model(table).Ctx(ctx).Data(data).Save() } func (c *Core) fieldsToSequence(ctx context.Context, table string, fields []string) ([]string, error) { - var ( - fieldSet = gset.NewStrSetFrom(fields) - fieldsResultInSequence = make([]string, 0) - tableFields, err = c.db.TableFields(ctx, table) - ) - if err != nil { - return nil, err - } - // Sort the fields in order. - var fieldsOfTableInSequence = make([]string, len(tableFields)) - for _, field := range tableFields { - fieldsOfTableInSequence[field.Index] = field.Name - } - // Sort the input fields. - for _, fieldName := range fieldsOfTableInSequence { - if fieldSet.Contains(fieldName) { - fieldsResultInSequence = append(fieldsResultInSequence, fieldName) - } - } - return fieldsResultInSequence, nil + var ( + fieldSet = gset.NewStrSetFrom(fields) + fieldsResultInSequence = make([]string, 0) + tableFields, err = c.db.TableFields(ctx, table) + ) + if err != nil { + return nil, err + } + // Sort the fields in order. + var fieldsOfTableInSequence = make([]string, len(tableFields)) + for _, field := range tableFields { + fieldsOfTableInSequence[field.Index] = field.Name + } + // Sort the input fields. + for _, fieldName := range fieldsOfTableInSequence { + if fieldSet.Contains(fieldName) { + fieldsResultInSequence = append(fieldsResultInSequence, fieldName) + } + } + return fieldsResultInSequence, nil } // DoInsert inserts or updates data for given table. @@ -433,117 +432,117 @@ func (c *Core) fieldsToSequence(ctx context.Context, table string, fields []stri // InsertOptionSave: if there's unique/primary key in the data, it updates it or else inserts a new one; // InsertOptionIgnore: if there's unique/primary key in the data, it ignores the inserting; func (c *Core) DoInsert(ctx context.Context, link Link, table string, list List, option DoInsertOption) (result sql.Result, err error) { - var ( - keys []string // Field names. - values []string // Value holder string array, like: (?,?,?) - params []interface{} // Values that will be committed to underlying database driver. - onDuplicateStr string // onDuplicateStr is used in "ON DUPLICATE KEY UPDATE" statement. - ) - // ============================================================================================ - // Group the list by fields. Different fields to different list. - // It here uses ListMap to keep sequence for data inserting. - // ============================================================================================ - var keyListMap = gmap.NewListMap() - for _, item := range list { - var ( - tmpKeys = make([]string, 0) - tmpKeysInSequenceStr string - ) - for k := range item { - tmpKeys = append(tmpKeys, k) - } - keys, err = c.fieldsToSequence(ctx, table, tmpKeys) - if err != nil { - return nil, err - } - tmpKeysInSequenceStr = gstr.Join(keys, ",") - if !keyListMap.Contains(tmpKeysInSequenceStr) { - keyListMap.Set(tmpKeysInSequenceStr, make(List, 0)) - } - tmpKeysInSequenceList := keyListMap.Get(tmpKeysInSequenceStr).(List) - tmpKeysInSequenceList = append(tmpKeysInSequenceList, item) - keyListMap.Set(tmpKeysInSequenceStr, tmpKeysInSequenceList) - } - if keyListMap.Size() > 1 { - var ( - tmpResult sql.Result - sqlResult SqlResult - rowsAffected int64 - ) - keyListMap.Iterator(func(key, value interface{}) bool { - tmpResult, err = c.DoInsert(ctx, link, table, value.(List), option) - if err != nil { - return false - } - rowsAffected, err = tmpResult.RowsAffected() - if err != nil { - return false - } - sqlResult.Result = tmpResult - sqlResult.Affected += rowsAffected - return true - }) - return &sqlResult, err - } + var ( + keys []string // Field names. + values []string // Value holder string array, like: (?,?,?) + params []interface{} // Values that will be committed to underlying database driver. + onDuplicateStr string // onDuplicateStr is used in "ON DUPLICATE KEY UPDATE" statement. + ) + // ============================================================================================ + // Group the list by fields. Different fields to different list. + // It here uses ListMap to keep sequence for data inserting. + // ============================================================================================ + var keyListMap = gmap.NewListMap() + for _, item := range list { + var ( + tmpKeys = make([]string, 0) + tmpKeysInSequenceStr string + ) + for k := range item { + tmpKeys = append(tmpKeys, k) + } + keys, err = c.fieldsToSequence(ctx, table, tmpKeys) + if err != nil { + return nil, err + } + tmpKeysInSequenceStr = gstr.Join(keys, ",") + if !keyListMap.Contains(tmpKeysInSequenceStr) { + keyListMap.Set(tmpKeysInSequenceStr, make(List, 0)) + } + tmpKeysInSequenceList := keyListMap.Get(tmpKeysInSequenceStr).(List) + tmpKeysInSequenceList = append(tmpKeysInSequenceList, item) + keyListMap.Set(tmpKeysInSequenceStr, tmpKeysInSequenceList) + } + if keyListMap.Size() > 1 { + var ( + tmpResult sql.Result + sqlResult SqlResult + rowsAffected int64 + ) + keyListMap.Iterator(func(key, value interface{}) bool { + tmpResult, err = c.DoInsert(ctx, link, table, value.(List), option) + if err != nil { + return false + } + rowsAffected, err = tmpResult.RowsAffected() + if err != nil { + return false + } + sqlResult.Result = tmpResult + sqlResult.Affected += rowsAffected + return true + }) + return &sqlResult, err + } - // Prepare the batch result pointer. - var ( - charL, charR = c.db.GetChars() - batchResult = new(SqlResult) - keysStr = charL + strings.Join(keys, charR+","+charL) + charR - operation = GetInsertOperationByOption(option.InsertOption) - ) - // Upsert clause only takes effect on Save operation. - if option.InsertOption == InsertOptionSave { - onDuplicateStr, err = c.db.FormatUpsert(keys, list, option) - if err != nil { - return nil, err - } - } - var ( - listLength = len(list) - valueHolders = make([]string, 0) - ) - for i := 0; i < listLength; i++ { - values = values[:0] - // Note that the map type is unordered, - // so it should use slice+key to retrieve the value. - for _, k := range keys { - if s, ok := list[i][k].(Raw); ok { - values = append(values, gconv.String(s)) - } else { - values = append(values, "?") - params = append(params, list[i][k]) - } - } - valueHolders = append(valueHolders, "("+gstr.Join(values, ",")+")") - // Batch package checks: It meets the batch number, or it is the last element. - if len(valueHolders) == option.BatchCount || (i == listLength-1 && len(valueHolders) > 0) { - var ( - stdSqlResult sql.Result - affectedRows int64 - ) - stdSqlResult, err = c.db.DoExec(ctx, link, fmt.Sprintf( - "%s INTO %s(%s) VALUES%s %s", - operation, c.QuotePrefixTableName(table), keysStr, - gstr.Join(valueHolders, ","), - onDuplicateStr, - ), params...) - if err != nil { - return stdSqlResult, err - } - if affectedRows, err = stdSqlResult.RowsAffected(); err != nil { - err = gerror.WrapCode(gcode.CodeDbOperationError, err, `sql.Result.RowsAffected failed`) - return stdSqlResult, err - } else { - batchResult.Result = stdSqlResult - batchResult.Affected += affectedRows - } - params = params[:0] - valueHolders = valueHolders[:0] - } - } - return batchResult, nil + // Prepare the batch result pointer. + var ( + charL, charR = c.db.GetChars() + batchResult = new(SqlResult) + keysStr = charL + strings.Join(keys, charR+","+charL) + charR + operation = GetInsertOperationByOption(option.InsertOption) + ) + // Upsert clause only takes effect on Save operation. + if option.InsertOption == InsertOptionSave { + onDuplicateStr, err = c.db.FormatUpsert(keys, list, option) + if err != nil { + return nil, err + } + } + var ( + listLength = len(list) + valueHolders = make([]string, 0) + ) + for i := 0; i < listLength; i++ { + values = values[:0] + // Note that the map type is unordered, + // so it should use slice+key to retrieve the value. + for _, k := range keys { + if s, ok := list[i][k].(Raw); ok { + values = append(values, gconv.String(s)) + } else { + values = append(values, "?") + params = append(params, list[i][k]) + } + } + valueHolders = append(valueHolders, "("+gstr.Join(values, ",")+")") + // Batch package checks: It meets the batch number, or it is the last element. + if len(valueHolders) == option.BatchCount || (i == listLength-1 && len(valueHolders) > 0) { + var ( + stdSqlResult sql.Result + affectedRows int64 + ) + stdSqlResult, err = c.db.DoExec(ctx, link, fmt.Sprintf( + "%s INTO %s(%s) VALUES%s %s", + operation, c.QuotePrefixTableName(table), keysStr, + gstr.Join(valueHolders, ","), + onDuplicateStr, + ), params...) + if err != nil { + return stdSqlResult, err + } + if affectedRows, err = stdSqlResult.RowsAffected(); err != nil { + err = gerror.WrapCode(gcode.CodeDbOperationError, err, `sql.Result.RowsAffected failed`) + return stdSqlResult, err + } else { + batchResult.Result = stdSqlResult + batchResult.Affected += affectedRows + } + params = params[:0] + valueHolders = valueHolders[:0] + } + } + return batchResult, nil } // Update does "UPDATE ... " statement for the table. @@ -561,104 +560,104 @@ func (c *Core) DoInsert(ctx context.Context, link Link, table string, list List, // "age IN(?,?)", 18, 50 // User{ Id : 1, UserName : "john"}. func (c *Core) Update(ctx context.Context, table string, data interface{}, condition interface{}, args ...interface{}) (sql.Result, error) { - return c.Model(table).Ctx(ctx).Data(data).Where(condition, args...).Update() + return c.Model(table).Ctx(ctx).Data(data).Where(condition, args...).Update() } // DoUpdate does "UPDATE ... " statement for the table. // This function is usually used for custom interface definition, you do not need to call it manually. func (c *Core) DoUpdate(ctx context.Context, link Link, table string, data interface{}, condition string, args ...interface{}) (result sql.Result, err error) { - table = c.QuotePrefixTableName(table) - var ( - rv = reflect.ValueOf(data) - kind = rv.Kind() - ) - if kind == reflect.Ptr { - rv = rv.Elem() - kind = rv.Kind() - } - var ( - params []interface{} - updates string - ) - switch kind { - case reflect.Map, reflect.Struct: - var ( - fields []string - dataMap map[string]interface{} - counterHandler = func(column string, counter Counter) { - if counter.Value != 0 { - column = c.QuoteWord(column) - var ( - columnRef = c.QuoteWord(counter.Field) - columnVal = counter.Value - operator = "+" - ) - if columnVal < 0 { - operator = "-" - columnVal = -columnVal - } - fields = append(fields, fmt.Sprintf("%s=%s%s?", column, columnRef, operator)) - params = append(params, columnVal) - } - } - ) - dataMap, err = c.ConvertDataForRecord(ctx, data, table) - if err != nil { - return nil, err - } - // Sort the data keys in sequence of table fields. - var ( - dataKeys = make([]string, 0) - keysInSequence = make([]string, 0) - ) - for k := range dataMap { - dataKeys = append(dataKeys, k) - } - keysInSequence, err = c.fieldsToSequence(ctx, table, dataKeys) - if err != nil { - return nil, err - } - for _, k := range keysInSequence { - v := dataMap[k] - switch value := v.(type) { - case *Counter: - counterHandler(k, *value) + table = c.QuotePrefixTableName(table) + var ( + rv = reflect.ValueOf(data) + kind = rv.Kind() + ) + if kind == reflect.Ptr { + rv = rv.Elem() + kind = rv.Kind() + } + var ( + params []interface{} + updates string + ) + switch kind { + case reflect.Map, reflect.Struct: + var ( + fields []string + dataMap map[string]interface{} + counterHandler = func(column string, counter Counter) { + if counter.Value != 0 { + column = c.QuoteWord(column) + var ( + columnRef = c.QuoteWord(counter.Field) + columnVal = counter.Value + operator = "+" + ) + if columnVal < 0 { + operator = "-" + columnVal = -columnVal + } + fields = append(fields, fmt.Sprintf("%s=%s%s?", column, columnRef, operator)) + params = append(params, columnVal) + } + } + ) + dataMap, err = c.ConvertDataForRecord(ctx, data, table) + if err != nil { + return nil, err + } + // Sort the data keys in sequence of table fields. + var ( + dataKeys = make([]string, 0) + keysInSequence = make([]string, 0) + ) + for k := range dataMap { + dataKeys = append(dataKeys, k) + } + keysInSequence, err = c.fieldsToSequence(ctx, table, dataKeys) + if err != nil { + return nil, err + } + for _, k := range keysInSequence { + v := dataMap[k] + switch value := v.(type) { + case *Counter: + counterHandler(k, *value) - case Counter: - counterHandler(k, value) + case Counter: + counterHandler(k, value) - default: - if s, ok := v.(Raw); ok { - fields = append(fields, c.QuoteWord(k)+"="+gconv.String(s)) - } else { - fields = append(fields, c.QuoteWord(k)+"=?") - params = append(params, v) - } - } - } - updates = strings.Join(fields, ",") + default: + if s, ok := v.(Raw); ok { + fields = append(fields, c.QuoteWord(k)+"="+gconv.String(s)) + } else { + fields = append(fields, c.QuoteWord(k)+"=?") + params = append(params, v) + } + } + } + updates = strings.Join(fields, ",") - default: - updates = gconv.String(data) - } - if len(updates) == 0 { - return nil, gerror.NewCode(gcode.CodeMissingParameter, "data cannot be empty") - } - if len(params) > 0 { - args = append(params, args...) - } - // If no link passed, it then uses the master link. - if link == nil { - if link, err = c.MasterLink(); err != nil { - return nil, err - } - } - return c.db.DoExec(ctx, link, fmt.Sprintf( - "UPDATE %s SET %s%s", - table, updates, condition, - ), - args..., - ) + default: + updates = gconv.String(data) + } + if len(updates) == 0 { + return nil, gerror.NewCode(gcode.CodeMissingParameter, "data cannot be empty") + } + if len(params) > 0 { + args = append(params, args...) + } + // If no link passed, it then uses the master link. + if link == nil { + if link, err = c.MasterLink(); err != nil { + return nil, err + } + } + return c.db.DoExec(ctx, link, fmt.Sprintf( + "UPDATE %s SET %s%s", + table, updates, condition, + ), + args..., + ) } // Delete does "DELETE FROM ... " statement for the table. @@ -673,28 +672,28 @@ func (c *Core) DoUpdate(ctx context.Context, link Link, table string, data inter // "age IN(?,?)", 18, 50 // User{ Id : 1, UserName : "john"}. func (c *Core) Delete(ctx context.Context, table string, condition interface{}, args ...interface{}) (result sql.Result, err error) { - return c.Model(table).Ctx(ctx).Where(condition, args...).Delete() + return c.Model(table).Ctx(ctx).Where(condition, args...).Delete() } // DoDelete does "DELETE FROM ... " statement for the table. // This function is usually used for custom interface definition, you do not need call it manually. func (c *Core) DoDelete(ctx context.Context, link Link, table string, condition string, args ...interface{}) (result sql.Result, err error) { - if link == nil { - if link, err = c.MasterLink(); err != nil { - return nil, err - } - } - table = c.QuotePrefixTableName(table) - return c.db.DoExec(ctx, link, fmt.Sprintf("DELETE FROM %s%s", table, condition), args...) + if link == nil { + if link, err = c.MasterLink(); err != nil { + return nil, err + } + } + table = c.QuotePrefixTableName(table) + return c.db.DoExec(ctx, link, fmt.Sprintf("DELETE FROM %s%s", table, condition), args...) } // FilteredLink retrieves and returns filtered `linkInfo` that can be using for // logging or tracing purpose. func (c *Core) FilteredLink() string { - return fmt.Sprintf( - `%s@%s(%s:%s)/%s`, - c.config.User, c.config.Protocol, c.config.Host, c.config.Port, c.config.Name, - ) + return fmt.Sprintf( + `%s@%s(%s:%s)/%s`, + c.config.User, c.config.Protocol, c.config.Host, c.config.Port, c.config.Name, + ) } // MarshalJSON implements the interface MarshalJSON for json.Marshal. @@ -703,96 +702,97 @@ func (c *Core) FilteredLink() string { // Note that this interface implements mainly for workaround for a json infinite loop bug // of Golang version < v1.14. func (c *Core) MarshalJSON() ([]byte, error) { - return []byte(fmt.Sprintf(`%+v`, c)), nil + return []byte(fmt.Sprintf(`%+v`, c)), nil } // writeSqlToLogger outputs the Sql object to logger. // It is enabled only if configuration "debug" is true. func (c *Core) writeSqlToLogger(ctx context.Context, sql *Sql) { - var transactionIdStr string - if sql.IsTransaction { - if v := ctx.Value(transactionIdForLoggerCtx); v != nil { - transactionIdStr = fmt.Sprintf(`[txid:%d] `, v.(uint64)) - } - } - s := fmt.Sprintf( - "[%3d ms] [%s] [%s] [rows:%-3d] %s%s", - sql.End-sql.Start, sql.Group, sql.Schema, sql.RowsAffected, transactionIdStr, sql.Format, - ) - if sql.Error != nil { - s += "\nError: " + sql.Error.Error() - c.logger.Error(ctx, s) - } else { - c.logger.Debug(ctx, s) - } + var transactionIdStr string + if sql.IsTransaction { + if v := ctx.Value(transactionIdForLoggerCtx); v != nil { + transactionIdStr = fmt.Sprintf(`[txid:%d] `, v.(uint64)) + } + } + s := fmt.Sprintf( + "[%3d ms] [%s] [%s] [rows:%-3d] %s%s", + sql.End-sql.Start, sql.Group, sql.Schema, sql.RowsAffected, transactionIdStr, sql.Format, + ) + if sql.Error != nil { + s += "\nError: " + sql.Error.Error() + c.logger.Error(ctx, s) + } else { + c.logger.Debug(ctx, s) + } } // HasTable determine whether the table name exists in the database. func (c *Core) HasTable(name string) (bool, error) { - tables, err := c.GetTablesWithCache() - if err != nil { - return false, err - } - charL, charR := c.db.GetChars() - name = gstr.Trim(name, charL+charR) - for _, table := range tables { - if table == name { - return true, nil - } - } - return false, nil + tables, err := c.GetTablesWithCache() + if err != nil { + return false, err + } + charL, charR := c.db.GetChars() + name = gstr.Trim(name, charL+charR) + for _, table := range tables { + if table == name { + return true, nil + } + } + return false, nil } +// GetInnerMemCache retrieves and returns the inner memory cache object. func (c *Core) GetInnerMemCache() *gcache.Cache { - return c.innerMemCache + return c.innerMemCache } // GetTablesWithCache retrieves and returns the table names of current database with cache. func (c *Core) GetTablesWithCache() ([]string, error) { - var ( - ctx = c.db.GetCtx() - cacheKey = fmt.Sprintf(`Tables:%s`, c.db.GetGroup()) - cacheDuration = gcache.DurationNoExpire - innerMemCache = c.GetInnerMemCache() - ) - result, err := innerMemCache.GetOrSetFuncLock( - ctx, cacheKey, - func(ctx context.Context) (interface{}, error) { - tableList, err := c.db.Tables(ctx) - if err != nil { - return nil, err - } - return tableList, nil - }, cacheDuration, - ) - if err != nil { - return nil, err - } - return result.Strings(), nil + var ( + ctx = c.db.GetCtx() + cacheKey = fmt.Sprintf(`Tables:%s`, c.db.GetGroup()) + cacheDuration = gcache.DurationNoExpire + innerMemCache = c.GetInnerMemCache() + ) + result, err := innerMemCache.GetOrSetFuncLock( + ctx, cacheKey, + func(ctx context.Context) (interface{}, error) { + tableList, err := c.db.Tables(ctx) + if err != nil { + return nil, err + } + return tableList, nil + }, cacheDuration, + ) + if err != nil { + return nil, err + } + return result.Strings(), nil } // IsSoftCreatedFieldName checks and returns whether given field name is an automatic-filled created time. func (c *Core) IsSoftCreatedFieldName(fieldName string) bool { - if fieldName == "" { - return false - } - if config := c.db.GetConfig(); config.CreatedAt != "" { - if utils.EqualFoldWithoutChars(fieldName, config.CreatedAt) { - return true - } - return gstr.InArray(append([]string{config.CreatedAt}, createdFieldNames...), fieldName) - } - for _, v := range createdFieldNames { - if utils.EqualFoldWithoutChars(fieldName, v) { - return true - } - } - return false + if fieldName == "" { + return false + } + if config := c.db.GetConfig(); config.CreatedAt != "" { + if utils.EqualFoldWithoutChars(fieldName, config.CreatedAt) { + return true + } + return gstr.InArray(append([]string{config.CreatedAt}, createdFieldNames...), fieldName) + } + for _, v := range createdFieldNames { + if utils.EqualFoldWithoutChars(fieldName, v) { + return true + } + } + return false } // FormatSqlBeforeExecuting formats the sql string and its arguments before executing. // The internal handleArguments function might be called twice during the SQL procedure, // but do not worry about it, it's safe and efficient. func (c *Core) FormatSqlBeforeExecuting(sql string, args []interface{}) (newSql string, newArgs []interface{}) { - return handleSliceAndStructArgsForSql(sql, args) + return handleSliceAndStructArgsForSql(sql, args) } diff --git a/database/gdb/gdb_core_structure.go b/database/gdb/gdb_core_structure.go index bbb9df757..25f90ebd1 100644 --- a/database/gdb/gdb_core_structure.go +++ b/database/gdb/gdb_core_structure.go @@ -7,61 +7,61 @@ package gdb import ( - "context" - "database/sql/driver" - "reflect" - "strings" - "time" + "context" + "database/sql/driver" + "reflect" + "strings" + "time" - "github.com/gogf/gf/v2/encoding/gbinary" - "github.com/gogf/gf/v2/errors/gerror" - "github.com/gogf/gf/v2/internal/intlog" - "github.com/gogf/gf/v2/internal/json" - "github.com/gogf/gf/v2/os/gtime" - "github.com/gogf/gf/v2/text/gregex" - "github.com/gogf/gf/v2/text/gstr" - "github.com/gogf/gf/v2/util/gconv" - "github.com/gogf/gf/v2/util/gutil" + "github.com/gogf/gf/v2/encoding/gbinary" + "github.com/gogf/gf/v2/errors/gerror" + "github.com/gogf/gf/v2/internal/intlog" + "github.com/gogf/gf/v2/internal/json" + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/text/gregex" + "github.com/gogf/gf/v2/text/gstr" + "github.com/gogf/gf/v2/util/gconv" + "github.com/gogf/gf/v2/util/gutil" ) // GetFieldTypeStr retrieves and returns the field type string for certain field by name. func (c *Core) GetFieldTypeStr(ctx context.Context, fieldName, table, schema string) string { - field := c.GetFieldType(ctx, fieldName, table, schema) - if field != nil { - // Kinds of data type examples: - // year(4) - // datetime - // varchar(64) - // bigint(20) - // int(10) unsigned - typeName := gstr.StrTillEx(field.Type, "(") // int(10) unsigned -> int - if typeName != "" { - typeName = gstr.Trim(typeName) - } else { - typeName = field.Type - } - return typeName - } - return "" + field := c.GetFieldType(ctx, fieldName, table, schema) + if field != nil { + // Kinds of data type examples: + // year(4) + // datetime + // varchar(64) + // bigint(20) + // int(10) unsigned + typeName := gstr.StrTillEx(field.Type, "(") // int(10) unsigned -> int + if typeName != "" { + typeName = gstr.Trim(typeName) + } else { + typeName = field.Type + } + return typeName + } + return "" } // GetFieldType retrieves and returns the field type object for certain field by name. func (c *Core) GetFieldType(ctx context.Context, fieldName, table, schema string) *TableField { - fieldsMap, err := c.db.TableFields(ctx, table, schema) - if err != nil { - intlog.Errorf( - ctx, - `TableFields failed for table "%s", schema "%s": %+v`, - table, schema, err, - ) - return nil - } - for tableFieldName, tableField := range fieldsMap { - if tableFieldName == fieldName { - return tableField - } - } - return nil + fieldsMap, err := c.db.TableFields(ctx, table, schema) + if err != nil { + intlog.Errorf( + ctx, + `TableFields failed for table "%s", schema "%s": %+v`, + table, schema, err, + ) + return nil + } + for tableFieldName, tableField := range fieldsMap { + if tableFieldName == fieldName { + return tableField + } + } + return nil } // ConvertDataForRecord is a very important function, which does converting for any data that @@ -70,418 +70,420 @@ func (c *Core) GetFieldType(ctx context.Context, fieldName, table, schema string // The parameter `value` should be type of *map/map/*struct/struct. // It supports embedded struct definition for struct. func (c *Core) ConvertDataForRecord(ctx context.Context, value interface{}, table string) (map[string]interface{}, error) { - var ( - err error - data = MapOrStructToMapDeep(value, true) - ) - for fieldName, fieldValue := range data { - var fieldType = c.GetFieldTypeStr(ctx, fieldName, table, c.GetSchema()) - data[fieldName], err = c.db.ConvertValueForField( - ctx, - fieldType, - fieldValue, - ) - if err != nil { - return nil, gerror.Wrapf(err, `ConvertDataForRecord failed for value: %#v`, fieldValue) - } - } - return data, nil + var ( + err error + data = MapOrStructToMapDeep(value, true) + ) + for fieldName, fieldValue := range data { + var fieldType = c.GetFieldTypeStr(ctx, fieldName, table, c.GetSchema()) + data[fieldName], err = c.db.ConvertValueForField( + ctx, + fieldType, + fieldValue, + ) + if err != nil { + return nil, gerror.Wrapf(err, `ConvertDataForRecord failed for value: %#v`, fieldValue) + } + } + return data, nil } // ConvertValueForField converts value to the type of the record field. // The parameter `fieldType` is the target record field. // The parameter `fieldValue` is the value that to be committed to record field. func (c *Core) ConvertValueForField(ctx context.Context, fieldType string, fieldValue interface{}) (interface{}, error) { - var ( - err error - convertedValue = fieldValue - ) - switch fieldValue.(type) { - case time.Time, *time.Time, gtime.Time, *gtime.Time: - goto Default - } - // If `value` implements interface `driver.Valuer`, it then uses the interface for value converting. - if valuer, ok := fieldValue.(driver.Valuer); ok { - if convertedValue, err = valuer.Value(); err != nil { - return nil, err - } - return convertedValue, nil - } + var ( + err error + convertedValue = fieldValue + ) + switch fieldValue.(type) { + case time.Time, *time.Time, gtime.Time, *gtime.Time: + goto Default + } + // If `value` implements interface `driver.Valuer`, it then uses the interface for value converting. + if valuer, ok := fieldValue.(driver.Valuer); ok { + if convertedValue, err = valuer.Value(); err != nil { + return nil, err + } + return convertedValue, nil + } Default: - // Default value converting. - var ( - rvValue = reflect.ValueOf(fieldValue) - rvKind = rvValue.Kind() - ) - for rvKind == reflect.Ptr { - rvValue = rvValue.Elem() - rvKind = rvValue.Kind() - } - switch rvKind { - case reflect.Invalid: - convertedValue = nil + // Default value converting. + var ( + rvValue = reflect.ValueOf(fieldValue) + rvKind = rvValue.Kind() + ) + for rvKind == reflect.Ptr { + rvValue = rvValue.Elem() + rvKind = rvValue.Kind() + } + switch rvKind { + case reflect.Invalid: + convertedValue = nil - case reflect.Slice, reflect.Array, reflect.Map: - // It should ignore the bytes type. - if _, ok := fieldValue.([]byte); !ok { - // Convert the value to JSON. - convertedValue, err = json.Marshal(fieldValue) - if err != nil { - return nil, err - } - } - case reflect.Struct: - switch r := fieldValue.(type) { - // If the time is zero, it then updates it to nil, - // which will insert/update the value to database as "null". - case time.Time: - if r.IsZero() { - convertedValue = nil - } else { - switch fieldType { - case fieldTypeYear: - convertedValue = r.Format("2006") - case fieldTypeDate: - convertedValue = r.Format("2006-01-02") - case fieldTypeTime: - convertedValue = r.Format("15:04:05") - default: - } - } + case reflect.Slice, reflect.Array, reflect.Map: + // It should ignore the bytes type. + if _, ok := fieldValue.([]byte); !ok { + // Convert the value to JSON. + convertedValue, err = json.Marshal(fieldValue) + if err != nil { + return nil, err + } + } + case reflect.Struct: + switch r := fieldValue.(type) { + // If the time is zero, it then updates it to nil, + // which will insert/update the value to database as "null". + case time.Time: + if r.IsZero() { + convertedValue = nil + } else { + switch fieldType { + case fieldTypeYear: + convertedValue = r.Format("2006") + case fieldTypeDate: + convertedValue = r.Format("2006-01-02") + case fieldTypeTime: + convertedValue = r.Format("15:04:05") + default: + } + } - case *time.Time: - if r == nil { - // Nothing to do. - } else { - switch fieldType { - case fieldTypeYear: - convertedValue = r.Format("2006") - case fieldTypeDate: - convertedValue = r.Format("2006-01-02") - case fieldTypeTime: - convertedValue = r.Format("15:04:05") - default: - } - } + case *time.Time: + if r == nil { + // Nothing to do. + } else { + switch fieldType { + case fieldTypeYear: + convertedValue = r.Format("2006") + case fieldTypeDate: + convertedValue = r.Format("2006-01-02") + case fieldTypeTime: + convertedValue = r.Format("15:04:05") + default: + } + } - case gtime.Time: - if r.IsZero() { - convertedValue = nil - } else { - switch fieldType { - case fieldTypeYear: - convertedValue = r.Layout("2006") - case fieldTypeDate: - convertedValue = r.Layout("2006-01-02") - case fieldTypeTime: - convertedValue = r.Layout("15:04:05") - default: - convertedValue = r.Time - } - } + case gtime.Time: + if r.IsZero() { + convertedValue = nil + } else { + switch fieldType { + case fieldTypeYear: + convertedValue = r.Layout("2006") + case fieldTypeDate: + convertedValue = r.Layout("2006-01-02") + case fieldTypeTime: + convertedValue = r.Layout("15:04:05") + default: + convertedValue = r.Time + } + } - case *gtime.Time: - if r.IsZero() { - convertedValue = nil - } else { - switch fieldType { - case fieldTypeYear: - convertedValue = r.Layout("2006") - case fieldTypeDate: - convertedValue = r.Layout("2006-01-02") - case fieldTypeTime: - convertedValue = r.Layout("15:04:05") - default: - convertedValue = r.Time - } - } + case *gtime.Time: + if r.IsZero() { + convertedValue = nil + } else { + switch fieldType { + case fieldTypeYear: + convertedValue = r.Layout("2006") + case fieldTypeDate: + convertedValue = r.Layout("2006-01-02") + case fieldTypeTime: + convertedValue = r.Layout("15:04:05") + default: + convertedValue = r.Time + } + } - case Counter, *Counter: - // Nothing to do. + case Counter, *Counter: + // Nothing to do. - default: - // If `value` implements interface iNil, - // check its IsNil() function, if got ture, - // which will insert/update the value to database as "null". - if v, ok := fieldValue.(iNil); ok && v.IsNil() { - convertedValue = nil - } else if s, ok := fieldValue.(iString); ok { - // Use string conversion in default. - convertedValue = s.String() - } else { - // Convert the value to JSON. - convertedValue, err = json.Marshal(fieldValue) - if err != nil { - return nil, err - } - } - } - default: - } + default: + // If `value` implements interface iNil, + // check its IsNil() function, if got ture, + // which will insert/update the value to database as "null". + if v, ok := fieldValue.(iNil); ok && v.IsNil() { + convertedValue = nil + } else if s, ok := fieldValue.(iString); ok { + // Use string conversion in default. + convertedValue = s.String() + } else { + // Convert the value to JSON. + convertedValue, err = json.Marshal(fieldValue) + if err != nil { + return nil, err + } + } + } + default: + } - return convertedValue, nil + return convertedValue, nil } // CheckLocalTypeForField checks and returns corresponding type for given db type. -func (c *Core) CheckLocalTypeForField(ctx context.Context, fieldType string, fieldValue interface{}) (LocalType, error) { - var ( - typeName string - typePattern string - ) - match, _ := gregex.MatchString(`(.+?)\((.+)\)`, fieldType) - if len(match) == 3 { - typeName = gstr.Trim(match[1]) - typePattern = gstr.Trim(match[2]) - } else { - typeName = gstr.Split(fieldType, " ")[0] - } +// The `fieldType` is retrieved from ColumnTypes of db driver, example: +// UNSIGNED INT +func (c *Core) CheckLocalTypeForField(ctx context.Context, fieldType string, _ interface{}) (LocalType, error) { + var ( + typeName string + typePattern string + ) + match, _ := gregex.MatchString(`(.+?)\((.+)\)`, fieldType) + if len(match) == 3 { + typeName = gstr.Trim(match[1]) + typePattern = gstr.Trim(match[2]) + } else { + var array = gstr.SplitAndTrim(fieldType, " ") + if gstr.Equal(array[0], "unsigned") { + typeName = array[1] + } else { + typeName = array[0] + } + } - typeName = strings.ToLower(typeName) + typeName = strings.ToLower(typeName) - switch typeName { - case - fieldTypeBinary, - fieldTypeVarbinary, - fieldTypeBlob, - fieldTypeTinyblob, - fieldTypeMediumblob, - fieldTypeLongblob: - return LocalTypeBytes, nil + switch typeName { + case + fieldTypeBinary, + fieldTypeVarbinary, + fieldTypeBlob, + fieldTypeTinyblob, + fieldTypeMediumblob, + fieldTypeLongblob: + return LocalTypeBytes, nil - case - fieldTypeInt, - fieldTypeTinyint, - fieldTypeSmallInt, - fieldTypeSmallint, - fieldTypeMediumInt, - fieldTypeMediumint, - fieldTypeSerial: - if gstr.ContainsI(fieldType, "unsigned") { - return LocalTypeUint, nil - } - return LocalTypeInt, nil + case + fieldTypeInt, + fieldTypeTinyint, + fieldTypeSmallInt, + fieldTypeSmallint, + fieldTypeMediumInt, + fieldTypeMediumint, + fieldTypeSerial: + if gstr.ContainsI(fieldType, "unsigned") { + return LocalTypeUint, nil + } + return LocalTypeInt, nil - case - fieldTypeBigInt, - fieldTypeBigint, - fieldTypeBigserial: - if gstr.ContainsI(fieldType, "unsigned") { - return LocalTypeUint64, nil - } - return LocalTypeInt64, nil + case + fieldTypeBigInt, + fieldTypeBigint, + fieldTypeBigserial: + if gstr.ContainsI(fieldType, "unsigned") { + return LocalTypeUint64, nil + } + return LocalTypeInt64, nil - case - fieldTypeReal: - return LocalTypeFloat32, nil + case + fieldTypeReal: + return LocalTypeFloat32, nil - case - fieldTypeDecimal, - fieldTypeMoney, - fieldTypeNumeric, - fieldTypeSmallmoney: - return LocalTypeString, nil - case - fieldTypeFloat, - fieldTypeDouble: - return LocalTypeFloat64, nil + case + fieldTypeDecimal, + fieldTypeMoney, + fieldTypeNumeric, + fieldTypeSmallmoney: + return LocalTypeString, nil + case + fieldTypeFloat, + fieldTypeDouble: + return LocalTypeFloat64, nil - case - fieldTypeBit: - // It is suggested using bit(1) as boolean. - if typePattern == "1" { - return LocalTypeBool, nil - } - s := gconv.String(fieldValue) - // mssql is true|false string. - if strings.EqualFold(s, "true") || strings.EqualFold(s, "false") { - return LocalTypeBool, nil - } - if gstr.ContainsI(fieldType, "unsigned") { - return LocalTypeUint64Bytes, nil - } - return LocalTypeInt64Bytes, nil + case + fieldTypeBit: + // It is suggested using bit(1) as boolean. + if typePattern == "1" { + return LocalTypeBool, nil + } + if gstr.ContainsI(fieldType, "unsigned") { + return LocalTypeUint64Bytes, nil + } + return LocalTypeInt64Bytes, nil - case - fieldTypeBool: - return LocalTypeBool, nil + case + fieldTypeBool: + return LocalTypeBool, nil - case - fieldTypeDate: - return LocalTypeDate, nil + case + fieldTypeDate: + return LocalTypeDate, nil - case - fieldTypeTime: - return LocalTypeTime, nil + case + fieldTypeTime: + return LocalTypeTime, nil - case - fieldTypeDatetime, - fieldTypeTimestamp, - fieldTypeTimestampz: - return LocalTypeDatetime, nil + case + fieldTypeDatetime, + fieldTypeTimestamp, + fieldTypeTimestampz: + return LocalTypeDatetime, nil - case - fieldTypeJson: - return LocalTypeJson, nil + case + fieldTypeJson: + return LocalTypeJson, nil - case - fieldTypeJsonb: - return LocalTypeJsonb, nil + case + fieldTypeJsonb: + return LocalTypeJsonb, nil - default: - // Auto-detect field type, using key match. - switch { - case strings.Contains(typeName, "text") || strings.Contains(typeName, "char") || strings.Contains(typeName, "character"): - return LocalTypeString, nil + default: + // Auto-detect field type, using key match. + switch { + case strings.Contains(typeName, "text") || strings.Contains(typeName, "char") || strings.Contains(typeName, "character"): + return LocalTypeString, nil - case strings.Contains(typeName, "float") || strings.Contains(typeName, "double") || strings.Contains(typeName, "numeric"): - return LocalTypeFloat64, nil + case strings.Contains(typeName, "float") || strings.Contains(typeName, "double") || strings.Contains(typeName, "numeric"): + return LocalTypeFloat64, nil - case strings.Contains(typeName, "bool"): - return LocalTypeBool, nil + case strings.Contains(typeName, "bool"): + return LocalTypeBool, nil - case strings.Contains(typeName, "binary") || strings.Contains(typeName, "blob"): - return LocalTypeBytes, nil + case strings.Contains(typeName, "binary") || strings.Contains(typeName, "blob"): + return LocalTypeBytes, nil - case strings.Contains(typeName, "int"): - if gstr.ContainsI(fieldType, "unsigned") { - return LocalTypeUint, nil - } - return LocalTypeInt, nil + case strings.Contains(typeName, "int"): + if gstr.ContainsI(fieldType, "unsigned") { + return LocalTypeUint, nil + } + return LocalTypeInt, nil - case strings.Contains(typeName, "time"): - return LocalTypeDatetime, nil + case strings.Contains(typeName, "time"): + return LocalTypeDatetime, nil - case strings.Contains(typeName, "date"): - return LocalTypeDatetime, nil + case strings.Contains(typeName, "date"): + return LocalTypeDatetime, nil - default: - return LocalTypeString, nil - } - } + default: + return LocalTypeString, nil + } + } } // ConvertValueForLocal converts value to local Golang type of value according field type name from database. // The parameter `fieldType` is in lower case, like: // `float(5,2)`, `unsigned double(5,2)`, `decimal(10,2)`, `char(45)`, `varchar(100)`, etc. func (c *Core) ConvertValueForLocal( - ctx context.Context, fieldType string, fieldValue interface{}, + ctx context.Context, fieldType string, fieldValue interface{}, ) (interface{}, error) { - // If there's no type retrieved, it returns the `fieldValue` directly - // to use its original data type, as `fieldValue` is type of interface{}. - if fieldType == "" { - return fieldValue, nil - } - typeName, err := c.db.CheckLocalTypeForField(ctx, fieldType, fieldValue) - if err != nil { - return nil, err - } - switch typeName { - case LocalTypeBytes: - var typeNameStr = string(typeName) - if strings.Contains(typeNameStr, "binary") || strings.Contains(typeNameStr, "blob") { - return fieldValue, nil - } - return gconv.Bytes(fieldValue), nil + // If there's no type retrieved, it returns the `fieldValue` directly + // to use its original data type, as `fieldValue` is type of interface{}. + if fieldType == "" { + return fieldValue, nil + } + typeName, err := c.db.CheckLocalTypeForField(ctx, fieldType, fieldValue) + if err != nil { + return nil, err + } + switch typeName { + case LocalTypeBytes: + var typeNameStr = string(typeName) + if strings.Contains(typeNameStr, "binary") || strings.Contains(typeNameStr, "blob") { + return fieldValue, nil + } + return gconv.Bytes(fieldValue), nil - case LocalTypeInt: - return gconv.Int(gconv.String(fieldValue)), nil + case LocalTypeInt: + return gconv.Int(gconv.String(fieldValue)), nil - case LocalTypeUint: - return gconv.Uint(gconv.String(fieldValue)), nil + case LocalTypeUint: + return gconv.Uint(gconv.String(fieldValue)), nil - case LocalTypeInt64: - return gconv.Int64(gconv.String(fieldValue)), nil + case LocalTypeInt64: + return gconv.Int64(gconv.String(fieldValue)), nil - case LocalTypeUint64: - return gconv.Uint64(gconv.String(fieldValue)), nil + case LocalTypeUint64: + return gconv.Uint64(gconv.String(fieldValue)), nil - case LocalTypeInt64Bytes: - return gbinary.BeDecodeToInt64(gconv.Bytes(fieldValue)), nil + case LocalTypeInt64Bytes: + return gbinary.BeDecodeToInt64(gconv.Bytes(fieldValue)), nil - case LocalTypeUint64Bytes: - return gbinary.BeDecodeToUint64(gconv.Bytes(fieldValue)), nil + case LocalTypeUint64Bytes: + return gbinary.BeDecodeToUint64(gconv.Bytes(fieldValue)), nil - case LocalTypeFloat32: - return gconv.Float32(gconv.String(fieldValue)), nil + case LocalTypeFloat32: + return gconv.Float32(gconv.String(fieldValue)), nil - case LocalTypeFloat64: - return gconv.Float64(gconv.String(fieldValue)), nil + case LocalTypeFloat64: + return gconv.Float64(gconv.String(fieldValue)), nil - case LocalTypeBool: - s := gconv.String(fieldValue) - // mssql is true|false string. - if strings.EqualFold(s, "true") { - return 1, nil - } - if strings.EqualFold(s, "false") { - return 0, nil - } - return gconv.Bool(fieldValue), nil + case LocalTypeBool: + s := gconv.String(fieldValue) + // mssql is true|false string. + if strings.EqualFold(s, "true") { + return 1, nil + } + if strings.EqualFold(s, "false") { + return 0, nil + } + return gconv.Bool(fieldValue), nil - case LocalTypeDate: - if t, ok := fieldValue.(time.Time); ok { - return gtime.NewFromTime(t).Format("Y-m-d"), nil - } - t, _ := gtime.StrToTime(gconv.String(fieldValue)) - return t.Format("Y-m-d"), nil + case LocalTypeDate: + if t, ok := fieldValue.(time.Time); ok { + return gtime.NewFromTime(t).Format("Y-m-d"), nil + } + t, _ := gtime.StrToTime(gconv.String(fieldValue)) + return t.Format("Y-m-d"), nil - case LocalTypeTime: - if t, ok := fieldValue.(time.Time); ok { - return gtime.NewFromTime(t).Format("H:i:s"), nil - } - t, _ := gtime.StrToTime(gconv.String(fieldValue)) - return t.Format("H:i:s"), nil + case LocalTypeTime: + if t, ok := fieldValue.(time.Time); ok { + return gtime.NewFromTime(t).Format("H:i:s"), nil + } + t, _ := gtime.StrToTime(gconv.String(fieldValue)) + return t.Format("H:i:s"), nil - case LocalTypeDatetime: - if t, ok := fieldValue.(time.Time); ok { - return gtime.NewFromTime(t), nil - } - t, _ := gtime.StrToTime(gconv.String(fieldValue)) - return t, nil + case LocalTypeDatetime: + if t, ok := fieldValue.(time.Time); ok { + return gtime.NewFromTime(t), nil + } + t, _ := gtime.StrToTime(gconv.String(fieldValue)) + return t, nil - default: - return gconv.String(fieldValue), nil - } + default: + return gconv.String(fieldValue), nil + } } // mappingAndFilterData automatically mappings the map key to table field and removes // all key-value pairs that are not the field of given table. func (c *Core) mappingAndFilterData(ctx context.Context, schema, table string, data map[string]interface{}, filter bool) (map[string]interface{}, error) { - fieldsMap, err := c.db.TableFields(ctx, c.guessPrimaryTableName(table), schema) - if err != nil { - return nil, err - } - if len(fieldsMap) == 0 { - return nil, gerror.Newf(`The table %s may not exist, or the table contains no fields`, table) - } - fieldsKeyMap := make(map[string]interface{}, len(fieldsMap)) - for k := range fieldsMap { - fieldsKeyMap[k] = nil - } - // Automatic data key to table field name mapping. - var foundKey string - for dataKey, dataValue := range data { - if _, ok := fieldsKeyMap[dataKey]; !ok { - foundKey, _ = gutil.MapPossibleItemByKey(fieldsKeyMap, dataKey) - if foundKey != "" { - if _, ok = data[foundKey]; !ok { - data[foundKey] = dataValue - } - delete(data, dataKey) - } - } - } - // Data filtering. - // It deletes all key-value pairs that has incorrect field name. - if filter { - for dataKey := range data { - if _, ok := fieldsMap[dataKey]; !ok { - delete(data, dataKey) - } - } - if len(data) == 0 { - return nil, gerror.Newf(`input data match no fields in table %s`, table) - } - } - return data, nil + fieldsMap, err := c.db.TableFields(ctx, c.guessPrimaryTableName(table), schema) + if err != nil { + return nil, err + } + if len(fieldsMap) == 0 { + return nil, gerror.Newf(`The table %s may not exist, or the table contains no fields`, table) + } + fieldsKeyMap := make(map[string]interface{}, len(fieldsMap)) + for k := range fieldsMap { + fieldsKeyMap[k] = nil + } + // Automatic data key to table field name mapping. + var foundKey string + for dataKey, dataValue := range data { + if _, ok := fieldsKeyMap[dataKey]; !ok { + foundKey, _ = gutil.MapPossibleItemByKey(fieldsKeyMap, dataKey) + if foundKey != "" { + if _, ok = data[foundKey]; !ok { + data[foundKey] = dataValue + } + delete(data, dataKey) + } + } + } + // Data filtering. + // It deletes all key-value pairs that has incorrect field name. + if filter { + for dataKey := range data { + if _, ok := fieldsMap[dataKey]; !ok { + delete(data, dataKey) + } + } + if len(data) == 0 { + return nil, gerror.Newf(`input data match no fields in table %s`, table) + } + } + return data, nil } diff --git a/database/gdb/gdb_core_underlying.go b/database/gdb/gdb_core_underlying.go index 045d11c65..bc380a335 100644 --- a/database/gdb/gdb_core_underlying.go +++ b/database/gdb/gdb_core_underlying.go @@ -8,299 +8,298 @@ package gdb import ( - "context" - "database/sql" - "fmt" - "reflect" + "context" + "database/sql" + "fmt" + "reflect" - "go.opentelemetry.io/otel" - "go.opentelemetry.io/otel/trace" + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/trace" - "github.com/gogf/gf/v2" - "github.com/gogf/gf/v2/container/gvar" - "github.com/gogf/gf/v2/errors/gcode" - "github.com/gogf/gf/v2/errors/gerror" - "github.com/gogf/gf/v2/internal/intlog" - "github.com/gogf/gf/v2/os/gtime" - "github.com/gogf/gf/v2/util/gconv" - "github.com/gogf/gf/v2/util/guid" + "github.com/gogf/gf/v2" + "github.com/gogf/gf/v2/errors/gcode" + "github.com/gogf/gf/v2/errors/gerror" + "github.com/gogf/gf/v2/internal/intlog" + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gconv" + "github.com/gogf/gf/v2/util/guid" ) // Query commits one query SQL to underlying driver and returns the execution result. // It is most commonly used for data querying. func (c *Core) Query(ctx context.Context, sql string, args ...interface{}) (result Result, err error) { - return c.db.DoQuery(ctx, nil, sql, args...) + return c.db.DoQuery(ctx, nil, sql, args...) } // DoQuery commits the sql string and its arguments to underlying driver // through given link object and returns the execution result. func (c *Core) DoQuery(ctx context.Context, link Link, sql string, args ...interface{}) (result Result, err error) { - // Transaction checks. - if link == nil { - if tx := TXFromCtx(ctx, c.db.GetGroup()); tx != nil { - // Firstly, check and retrieve transaction link from context. - link = &txLink{tx.GetSqlTX()} - } else if link, err = c.SlaveLink(); err != nil { - // Or else it creates one from master node. - return nil, err - } - } else if !link.IsTransaction() { - // If current link is not transaction link, it checks and retrieves transaction from context. - if tx := TXFromCtx(ctx, c.db.GetGroup()); tx != nil { - link = &txLink{tx.GetSqlTX()} - } - } + // Transaction checks. + if link == nil { + if tx := TXFromCtx(ctx, c.db.GetGroup()); tx != nil { + // Firstly, check and retrieve transaction link from context. + link = &txLink{tx.GetSqlTX()} + } else if link, err = c.SlaveLink(); err != nil { + // Or else it creates one from master node. + return nil, err + } + } else if !link.IsTransaction() { + // If current link is not transaction link, it checks and retrieves transaction from context. + if tx := TXFromCtx(ctx, c.db.GetGroup()); tx != nil { + link = &txLink{tx.GetSqlTX()} + } + } - // Sql filtering. - sql, args = c.FormatSqlBeforeExecuting(sql, args) - sql, args, err = c.db.DoFilter(ctx, link, sql, args) - if err != nil { - return nil, err - } - // SQL format and retrieve. - if v := ctx.Value(ctxKeyCatchSQL); v != nil { - var ( - manager = v.(*CatchSQLManager) - formattedSql = FormatSqlWithArgs(sql, args) - ) - manager.SQLArray.Append(formattedSql) - if !manager.DoCommit && ctx.Value(ctxKeyInternalProducedSQL) == nil { - return nil, nil - } - } - // Link execution. - var out DoCommitOutput - out, err = c.db.DoCommit(ctx, DoCommitInput{ - Link: link, - Sql: sql, - Args: args, - Stmt: nil, - Type: SqlTypeQueryContext, - IsTransaction: link.IsTransaction(), - }) - if err != nil { - return nil, err - } - return out.Records, err + // Sql filtering. + sql, args = c.FormatSqlBeforeExecuting(sql, args) + sql, args, err = c.db.DoFilter(ctx, link, sql, args) + if err != nil { + return nil, err + } + // SQL format and retrieve. + if v := ctx.Value(ctxKeyCatchSQL); v != nil { + var ( + manager = v.(*CatchSQLManager) + formattedSql = FormatSqlWithArgs(sql, args) + ) + manager.SQLArray.Append(formattedSql) + if !manager.DoCommit && ctx.Value(ctxKeyInternalProducedSQL) == nil { + return nil, nil + } + } + // Link execution. + var out DoCommitOutput + out, err = c.db.DoCommit(ctx, DoCommitInput{ + Link: link, + Sql: sql, + Args: args, + Stmt: nil, + Type: SqlTypeQueryContext, + IsTransaction: link.IsTransaction(), + }) + if err != nil { + return nil, err + } + return out.Records, err } // Exec commits one query SQL to underlying driver and returns the execution result. // It is most commonly used for data inserting and updating. func (c *Core) Exec(ctx context.Context, sql string, args ...interface{}) (result sql.Result, err error) { - return c.db.DoExec(ctx, nil, sql, args...) + return c.db.DoExec(ctx, nil, sql, args...) } // DoExec commits the sql string and its arguments to underlying driver // through given link object and returns the execution result. func (c *Core) DoExec(ctx context.Context, link Link, sql string, args ...interface{}) (result sql.Result, err error) { - // Transaction checks. - if link == nil { - if tx := TXFromCtx(ctx, c.db.GetGroup()); tx != nil { - // Firstly, check and retrieve transaction link from context. - link = &txLink{tx.GetSqlTX()} - } else if link, err = c.MasterLink(); err != nil { - // Or else it creates one from master node. - return nil, err - } - } else if !link.IsTransaction() { - // If current link is not transaction link, it checks and retrieves transaction from context. - if tx := TXFromCtx(ctx, c.db.GetGroup()); tx != nil { - link = &txLink{tx.GetSqlTX()} - } - } + // Transaction checks. + if link == nil { + if tx := TXFromCtx(ctx, c.db.GetGroup()); tx != nil { + // Firstly, check and retrieve transaction link from context. + link = &txLink{tx.GetSqlTX()} + } else if link, err = c.MasterLink(); err != nil { + // Or else it creates one from master node. + return nil, err + } + } else if !link.IsTransaction() { + // If current link is not transaction link, it checks and retrieves transaction from context. + if tx := TXFromCtx(ctx, c.db.GetGroup()); tx != nil { + link = &txLink{tx.GetSqlTX()} + } + } - // SQL filtering. - sql, args = c.FormatSqlBeforeExecuting(sql, args) - sql, args, err = c.db.DoFilter(ctx, link, sql, args) - if err != nil { - return nil, err - } - // SQL format and retrieve. - if v := ctx.Value(ctxKeyCatchSQL); v != nil { - var ( - manager = v.(*CatchSQLManager) - formattedSql = FormatSqlWithArgs(sql, args) - ) - manager.SQLArray.Append(formattedSql) - if !manager.DoCommit && ctx.Value(ctxKeyInternalProducedSQL) == nil { - return new(SqlResult), nil - } - } - // Link execution. - var out DoCommitOutput - out, err = c.db.DoCommit(ctx, DoCommitInput{ - Link: link, - Sql: sql, - Args: args, - Stmt: nil, - Type: SqlTypeExecContext, - IsTransaction: link.IsTransaction(), - }) - if err != nil { - return nil, err - } - return out.Result, err + // SQL filtering. + sql, args = c.FormatSqlBeforeExecuting(sql, args) + sql, args, err = c.db.DoFilter(ctx, link, sql, args) + if err != nil { + return nil, err + } + // SQL format and retrieve. + if v := ctx.Value(ctxKeyCatchSQL); v != nil { + var ( + manager = v.(*CatchSQLManager) + formattedSql = FormatSqlWithArgs(sql, args) + ) + manager.SQLArray.Append(formattedSql) + if !manager.DoCommit && ctx.Value(ctxKeyInternalProducedSQL) == nil { + return new(SqlResult), nil + } + } + // Link execution. + var out DoCommitOutput + out, err = c.db.DoCommit(ctx, DoCommitInput{ + Link: link, + Sql: sql, + Args: args, + Stmt: nil, + Type: SqlTypeExecContext, + IsTransaction: link.IsTransaction(), + }) + if err != nil { + return nil, err + } + return out.Result, err } // DoFilter is a hook function, which filters the sql and its arguments before it's committed to underlying driver. // The parameter `link` specifies the current database connection operation object. You can modify the sql // string `sql` and its arguments `args` as you wish before they're committed to driver. func (c *Core) DoFilter( - ctx context.Context, link Link, sql string, args []interface{}, + ctx context.Context, link Link, sql string, args []interface{}, ) (newSql string, newArgs []interface{}, err error) { - return sql, args, nil + return sql, args, nil } // DoCommit commits current sql and arguments to underlying sql driver. func (c *Core) DoCommit(ctx context.Context, in DoCommitInput) (out DoCommitOutput, err error) { - var ( - sqlTx *sql.Tx - sqlStmt *sql.Stmt - sqlRows *sql.Rows - sqlResult sql.Result - stmtSqlRows *sql.Rows - stmtSqlRow *sql.Row - rowsAffected int64 - cancelFuncForTimeout context.CancelFunc - formattedSql = FormatSqlWithArgs(in.Sql, in.Args) - timestampMilli1 = gtime.TimestampMilli() - ) + var ( + sqlTx *sql.Tx + sqlStmt *sql.Stmt + sqlRows *sql.Rows + sqlResult sql.Result + stmtSqlRows *sql.Rows + stmtSqlRow *sql.Row + rowsAffected int64 + cancelFuncForTimeout context.CancelFunc + formattedSql = FormatSqlWithArgs(in.Sql, in.Args) + timestampMilli1 = gtime.TimestampMilli() + ) - // Trace span start. - tr := otel.GetTracerProvider().Tracer(traceInstrumentName, trace.WithInstrumentationVersion(gf.VERSION)) - ctx, span := tr.Start(ctx, string(in.Type), trace.WithSpanKind(trace.SpanKindInternal)) - defer span.End() + // Trace span start. + tr := otel.GetTracerProvider().Tracer(traceInstrumentName, trace.WithInstrumentationVersion(gf.VERSION)) + ctx, span := tr.Start(ctx, string(in.Type), trace.WithSpanKind(trace.SpanKindInternal)) + defer span.End() - // Execution by type. - switch in.Type { - case SqlTypeBegin: - ctx, cancelFuncForTimeout = c.GetCtxTimeout(ctx, ctxTimeoutTypeTrans) - formattedSql = fmt.Sprintf( - `%s (IosolationLevel: %s, ReadOnly: %t)`, - formattedSql, in.TxOptions.Isolation.String(), in.TxOptions.ReadOnly, - ) - if sqlTx, err = in.Db.BeginTx(ctx, &in.TxOptions); err == nil { - out.Tx = &TXCore{ - db: c.db, - tx: sqlTx, - ctx: context.WithValue(ctx, transactionIdForLoggerCtx, transactionIdGenerator.Add(1)), - master: in.Db, - transactionId: guid.S(), - cancelFunc: cancelFuncForTimeout, - } - ctx = out.Tx.GetCtx() - } - out.RawResult = sqlTx + // Execution by type. + switch in.Type { + case SqlTypeBegin: + ctx, cancelFuncForTimeout = c.GetCtxTimeout(ctx, ctxTimeoutTypeTrans) + formattedSql = fmt.Sprintf( + `%s (IosolationLevel: %s, ReadOnly: %t)`, + formattedSql, in.TxOptions.Isolation.String(), in.TxOptions.ReadOnly, + ) + if sqlTx, err = in.Db.BeginTx(ctx, &in.TxOptions); err == nil { + out.Tx = &TXCore{ + db: c.db, + tx: sqlTx, + ctx: context.WithValue(ctx, transactionIdForLoggerCtx, transactionIdGenerator.Add(1)), + master: in.Db, + transactionId: guid.S(), + cancelFunc: cancelFuncForTimeout, + } + ctx = out.Tx.GetCtx() + } + out.RawResult = sqlTx - case SqlTypeTXCommit: - if in.TxCancelFunc != nil { - defer in.TxCancelFunc() - } - err = in.Tx.Commit() + case SqlTypeTXCommit: + if in.TxCancelFunc != nil { + defer in.TxCancelFunc() + } + err = in.Tx.Commit() - case SqlTypeTXRollback: - if in.TxCancelFunc != nil { - defer in.TxCancelFunc() - } - err = in.Tx.Rollback() + case SqlTypeTXRollback: + if in.TxCancelFunc != nil { + defer in.TxCancelFunc() + } + err = in.Tx.Rollback() - case SqlTypeExecContext: - ctx, cancelFuncForTimeout = c.GetCtxTimeout(ctx, ctxTimeoutTypeExec) - defer cancelFuncForTimeout() - if c.db.GetDryRun() { - sqlResult = new(SqlResult) - } else { - sqlResult, err = in.Link.ExecContext(ctx, in.Sql, in.Args...) - } - out.RawResult = sqlResult + case SqlTypeExecContext: + ctx, cancelFuncForTimeout = c.GetCtxTimeout(ctx, ctxTimeoutTypeExec) + defer cancelFuncForTimeout() + if c.db.GetDryRun() { + sqlResult = new(SqlResult) + } else { + sqlResult, err = in.Link.ExecContext(ctx, in.Sql, in.Args...) + } + out.RawResult = sqlResult - case SqlTypeQueryContext: - ctx, cancelFuncForTimeout = c.GetCtxTimeout(ctx, ctxTimeoutTypeQuery) - defer cancelFuncForTimeout() - sqlRows, err = in.Link.QueryContext(ctx, in.Sql, in.Args...) - out.RawResult = sqlRows + case SqlTypeQueryContext: + ctx, cancelFuncForTimeout = c.GetCtxTimeout(ctx, ctxTimeoutTypeQuery) + defer cancelFuncForTimeout() + sqlRows, err = in.Link.QueryContext(ctx, in.Sql, in.Args...) + out.RawResult = sqlRows - case SqlTypePrepareContext: - ctx, cancelFuncForTimeout = c.GetCtxTimeout(ctx, ctxTimeoutTypePrepare) - defer cancelFuncForTimeout() - sqlStmt, err = in.Link.PrepareContext(ctx, in.Sql) - out.RawResult = sqlStmt + case SqlTypePrepareContext: + ctx, cancelFuncForTimeout = c.GetCtxTimeout(ctx, ctxTimeoutTypePrepare) + defer cancelFuncForTimeout() + sqlStmt, err = in.Link.PrepareContext(ctx, in.Sql) + out.RawResult = sqlStmt - case SqlTypeStmtExecContext: - ctx, cancelFuncForTimeout = c.GetCtxTimeout(ctx, ctxTimeoutTypeExec) - defer cancelFuncForTimeout() - if c.db.GetDryRun() { - sqlResult = new(SqlResult) - } else { - sqlResult, err = in.Stmt.ExecContext(ctx, in.Args...) - } - out.RawResult = sqlResult + case SqlTypeStmtExecContext: + ctx, cancelFuncForTimeout = c.GetCtxTimeout(ctx, ctxTimeoutTypeExec) + defer cancelFuncForTimeout() + if c.db.GetDryRun() { + sqlResult = new(SqlResult) + } else { + sqlResult, err = in.Stmt.ExecContext(ctx, in.Args...) + } + out.RawResult = sqlResult - case SqlTypeStmtQueryContext: - ctx, cancelFuncForTimeout = c.GetCtxTimeout(ctx, ctxTimeoutTypeQuery) - defer cancelFuncForTimeout() - stmtSqlRows, err = in.Stmt.QueryContext(ctx, in.Args...) - out.RawResult = stmtSqlRows + case SqlTypeStmtQueryContext: + ctx, cancelFuncForTimeout = c.GetCtxTimeout(ctx, ctxTimeoutTypeQuery) + defer cancelFuncForTimeout() + stmtSqlRows, err = in.Stmt.QueryContext(ctx, in.Args...) + out.RawResult = stmtSqlRows - case SqlTypeStmtQueryRowContext: - ctx, cancelFuncForTimeout = c.GetCtxTimeout(ctx, ctxTimeoutTypeQuery) - defer cancelFuncForTimeout() - stmtSqlRow = in.Stmt.QueryRowContext(ctx, in.Args...) - out.RawResult = stmtSqlRow + case SqlTypeStmtQueryRowContext: + ctx, cancelFuncForTimeout = c.GetCtxTimeout(ctx, ctxTimeoutTypeQuery) + defer cancelFuncForTimeout() + stmtSqlRow = in.Stmt.QueryRowContext(ctx, in.Args...) + out.RawResult = stmtSqlRow - default: - panic(gerror.NewCodef(gcode.CodeInvalidParameter, `invalid SqlType "%s"`, in.Type)) - } - // Result handling. - switch { - case sqlResult != nil && !c.GetIgnoreResultFromCtx(ctx): - rowsAffected, err = sqlResult.RowsAffected() - out.Result = sqlResult + default: + panic(gerror.NewCodef(gcode.CodeInvalidParameter, `invalid SqlType "%s"`, in.Type)) + } + // Result handling. + switch { + case sqlResult != nil && !c.GetIgnoreResultFromCtx(ctx): + rowsAffected, err = sqlResult.RowsAffected() + out.Result = sqlResult - case sqlRows != nil: - out.Records, err = c.RowsToResult(ctx, sqlRows) - rowsAffected = int64(len(out.Records)) + case sqlRows != nil: + out.Records, err = c.RowsToResult(ctx, sqlRows) + rowsAffected = int64(len(out.Records)) - case sqlStmt != nil: - out.Stmt = &Stmt{ - Stmt: sqlStmt, - core: c, - link: in.Link, - sql: in.Sql, - } - } - var ( - timestampMilli2 = gtime.TimestampMilli() - sqlObj = &Sql{ - Sql: in.Sql, - Type: in.Type, - Args: in.Args, - Format: formattedSql, - Error: err, - Start: timestampMilli1, - End: timestampMilli2, - Group: c.db.GetGroup(), - Schema: c.db.GetSchema(), - RowsAffected: rowsAffected, - IsTransaction: in.IsTransaction, - } - ) + case sqlStmt != nil: + out.Stmt = &Stmt{ + Stmt: sqlStmt, + core: c, + link: in.Link, + sql: in.Sql, + } + } + var ( + timestampMilli2 = gtime.TimestampMilli() + sqlObj = &Sql{ + Sql: in.Sql, + Type: in.Type, + Args: in.Args, + Format: formattedSql, + Error: err, + Start: timestampMilli1, + End: timestampMilli2, + Group: c.db.GetGroup(), + Schema: c.db.GetSchema(), + RowsAffected: rowsAffected, + IsTransaction: in.IsTransaction, + } + ) - // Tracing. - c.traceSpanEnd(ctx, span, sqlObj) + // Tracing. + c.traceSpanEnd(ctx, span, sqlObj) - // Logging. - if c.db.GetDebug() { - c.writeSqlToLogger(ctx, sqlObj) - } - if err != nil && err != sql.ErrNoRows { - err = gerror.WrapCode( - gcode.CodeDbOperationError, - err, - FormatSqlWithArgs(in.Sql, in.Args), - ) - } - return out, err + // Logging. + if c.db.GetDebug() { + c.writeSqlToLogger(ctx, sqlObj) + } + if err != nil && err != sql.ErrNoRows { + err = gerror.WrapCode( + gcode.CodeDbOperationError, + err, + FormatSqlWithArgs(in.Sql, in.Args), + ) + } + return out, err } // Prepare creates a prepared statement for later queries or executions. @@ -312,190 +311,200 @@ func (c *Core) DoCommit(ctx context.Context, in DoCommitInput) (out DoCommitOutp // The parameter `execOnMaster` specifies whether executing the sql on master node, // or else it executes the sql on slave node if master-slave configured. func (c *Core) Prepare(ctx context.Context, sql string, execOnMaster ...bool) (*Stmt, error) { - var ( - err error - link Link - ) - if len(execOnMaster) > 0 && execOnMaster[0] { - if link, err = c.MasterLink(); err != nil { - return nil, err - } - } else { - if link, err = c.SlaveLink(); err != nil { - return nil, err - } - } - return c.db.DoPrepare(ctx, link, sql) + var ( + err error + link Link + ) + if len(execOnMaster) > 0 && execOnMaster[0] { + if link, err = c.MasterLink(); err != nil { + return nil, err + } + } else { + if link, err = c.SlaveLink(); err != nil { + return nil, err + } + } + return c.db.DoPrepare(ctx, link, sql) } // DoPrepare calls prepare function on given link object and returns the statement object. func (c *Core) DoPrepare(ctx context.Context, link Link, sql string) (stmt *Stmt, err error) { - // Transaction checks. - if link == nil { - if tx := TXFromCtx(ctx, c.db.GetGroup()); tx != nil { - // Firstly, check and retrieve transaction link from context. - link = &txLink{tx.GetSqlTX()} - } else { - // Or else it creates one from master node. - if link, err = c.MasterLink(); err != nil { - return nil, err - } - } - } else if !link.IsTransaction() { - // If current link is not transaction link, it checks and retrieves transaction from context. - if tx := TXFromCtx(ctx, c.db.GetGroup()); tx != nil { - link = &txLink{tx.GetSqlTX()} - } - } + // Transaction checks. + if link == nil { + if tx := TXFromCtx(ctx, c.db.GetGroup()); tx != nil { + // Firstly, check and retrieve transaction link from context. + link = &txLink{tx.GetSqlTX()} + } else { + // Or else it creates one from master node. + if link, err = c.MasterLink(); err != nil { + return nil, err + } + } + } else if !link.IsTransaction() { + // If current link is not transaction link, it checks and retrieves transaction from context. + if tx := TXFromCtx(ctx, c.db.GetGroup()); tx != nil { + link = &txLink{tx.GetSqlTX()} + } + } - if c.db.GetConfig().PrepareTimeout > 0 { - // DO NOT USE cancel function in prepare statement. - var cancelFunc context.CancelFunc - ctx, cancelFunc = context.WithTimeout(ctx, c.db.GetConfig().PrepareTimeout) - defer cancelFunc() - } + if c.db.GetConfig().PrepareTimeout > 0 { + // DO NOT USE cancel function in prepare statement. + var cancelFunc context.CancelFunc + ctx, cancelFunc = context.WithTimeout(ctx, c.db.GetConfig().PrepareTimeout) + defer cancelFunc() + } - // Link execution. - var out DoCommitOutput - out, err = c.db.DoCommit(ctx, DoCommitInput{ - Link: link, - Sql: sql, - Type: SqlTypePrepareContext, - IsTransaction: link.IsTransaction(), - }) - if err != nil { - return nil, err - } - return out.Stmt, err + // Link execution. + var out DoCommitOutput + out, err = c.db.DoCommit(ctx, DoCommitInput{ + Link: link, + Sql: sql, + Type: SqlTypePrepareContext, + IsTransaction: link.IsTransaction(), + }) + if err != nil { + return nil, err + } + return out.Stmt, err } // FormatUpsert formats and returns SQL clause part for upsert statement. // In default implements, this function performs upsert statement for MySQL like: // `INSERT INTO ... ON DUPLICATE KEY UPDATE x=VALUES(z),m=VALUES(y)...` func (c *Core) FormatUpsert(columns []string, list List, option DoInsertOption) (string, error) { - var onDuplicateStr string - if option.OnDuplicateStr != "" { - onDuplicateStr = option.OnDuplicateStr - } else if len(option.OnDuplicateMap) > 0 { - for k, v := range option.OnDuplicateMap { - if len(onDuplicateStr) > 0 { - onDuplicateStr += "," - } - switch v.(type) { - case Raw, *Raw: - onDuplicateStr += fmt.Sprintf( - "%s=%s", - c.QuoteWord(k), - v, - ) - default: - onDuplicateStr += fmt.Sprintf( - "%s=VALUES(%s)", - c.QuoteWord(k), - c.QuoteWord(gconv.String(v)), - ) - } - } - } else { - for _, column := range columns { - // If it's `SAVE` operation, do not automatically update the creating time. - if c.IsSoftCreatedFieldName(column) { - continue - } - if len(onDuplicateStr) > 0 { - onDuplicateStr += "," - } - onDuplicateStr += fmt.Sprintf( - "%s=VALUES(%s)", - c.QuoteWord(column), - c.QuoteWord(column), - ) - } - } + var onDuplicateStr string + if option.OnDuplicateStr != "" { + onDuplicateStr = option.OnDuplicateStr + } else if len(option.OnDuplicateMap) > 0 { + for k, v := range option.OnDuplicateMap { + if len(onDuplicateStr) > 0 { + onDuplicateStr += "," + } + switch v.(type) { + case Raw, *Raw: + onDuplicateStr += fmt.Sprintf( + "%s=%s", + c.QuoteWord(k), + v, + ) + default: + onDuplicateStr += fmt.Sprintf( + "%s=VALUES(%s)", + c.QuoteWord(k), + c.QuoteWord(gconv.String(v)), + ) + } + } + } else { + for _, column := range columns { + // If it's `SAVE` operation, do not automatically update the creating time. + if c.IsSoftCreatedFieldName(column) { + continue + } + if len(onDuplicateStr) > 0 { + onDuplicateStr += "," + } + onDuplicateStr += fmt.Sprintf( + "%s=VALUES(%s)", + c.QuoteWord(column), + c.QuoteWord(column), + ) + } + } - return InsertOnDuplicateKeyUpdate + " " + onDuplicateStr, nil + return InsertOnDuplicateKeyUpdate + " " + onDuplicateStr, nil } // RowsToResult converts underlying data record type sql.Rows to Result type. func (c *Core) RowsToResult(ctx context.Context, rows *sql.Rows) (Result, error) { - if rows == nil { - return nil, nil - } - defer func() { - if err := rows.Close(); err != nil { - intlog.Errorf(ctx, `%+v`, err) - } - }() - if !rows.Next() { - return nil, nil - } - // Column names and types. - columnTypes, err := rows.ColumnTypes() - if err != nil { - return nil, err - } + if rows == nil { + return nil, nil + } + defer func() { + if err := rows.Close(); err != nil { + intlog.Errorf(ctx, `%+v`, err) + } + }() + if !rows.Next() { + return nil, nil + } + // Column names and types. + columnTypes, err := rows.ColumnTypes() + if err != nil { + return nil, err + } - if len(columnTypes) > 0 { - if internalData := c.getInternalColumnFromCtx(ctx); internalData != nil { - internalData.FirstResultColumn = columnTypes[0].Name() - } - } - var ( - values = make([]interface{}, len(columnTypes)) - result = make(Result, 0) - scanArgs = make([]interface{}, len(values)) - ) - for i := range values { - scanArgs[i] = &values[i] - } - for { - if err = rows.Scan(scanArgs...); err != nil { - return result, err - } - record := Record{} - for i, value := range values { - if value == nil { - // DO NOT use `gvar.New(nil)` here as it creates an initialized object - // which will cause struct converting issue. - record[columnTypes[i].Name()] = nil - } else { - var convertedValue interface{} - if convertedValue, err = c.columnValueToLocalValue(ctx, value, columnTypes[i]); err != nil { - return nil, err - } - record[columnTypes[i].Name()] = gvar.New(convertedValue) - } - } - result = append(result, record) - if !rows.Next() { - break - } - } - return result, nil + if len(columnTypes) > 0 { + if internalData := c.getInternalColumnFromCtx(ctx); internalData != nil { + internalData.FirstResultColumn = columnTypes[0].Name() + } + } + var ( + values = make([]interface{}, len(columnTypes)) + result = make(Result, 0) + scanArgs = make([]interface{}, len(values)) + ) + for i := range values { + scanArgs[i] = &values[i] + } + for { + if err = rows.Scan(scanArgs...); err != nil { + return result, err + } + record := Record{} + for i, value := range values { + if value == nil { + // DO NOT use `gvar.New(nil)` here as it creates an initialized object + // which will cause struct converting issue. + record[columnTypes[i].Name()] = nil + } else { + var ( + convertedValue interface{} + columnType = columnTypes[i] + localType = LocalTypeUndefined + ) + if convertedValue, err = c.columnValueToLocalValue(ctx, value, columnType); err != nil { + return nil, err + } + localType, err = c.db.CheckLocalTypeForField(ctx, columnType.DatabaseTypeName(), value) + if err != nil { + return nil, err + } + record[columnTypes[i].Name()] = NewValueWithType(convertedValue, localType) + } + } + result = append(result, record) + if !rows.Next() { + break + } + } + return result, nil } // OrderRandomFunction returns the SQL function for random ordering. func (c *Core) OrderRandomFunction() string { - return "RAND()" + return "RAND()" } -func (c *Core) columnValueToLocalValue(ctx context.Context, value interface{}, columnType *sql.ColumnType) (interface{}, error) { - var scanType = columnType.ScanType() - if scanType != nil { - // Common basic builtin types. - switch scanType.Kind() { - case - reflect.Bool, - reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, - reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, - reflect.Float32, reflect.Float64: - return gconv.Convert( - gconv.String(value), - columnType.ScanType().String(), - ), nil - default: - } - } - // Other complex types, especially custom types. - return c.db.ConvertValueForLocal(ctx, columnType.DatabaseTypeName(), value) +func (c *Core) columnValueToLocalValue( + ctx context.Context, value interface{}, columnType *sql.ColumnType, +) (interface{}, error) { + var scanType = columnType.ScanType() + if scanType != nil { + // Common basic builtin types. + switch scanType.Kind() { + case + reflect.Bool, + reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, + reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, + reflect.Float32, reflect.Float64: + return gconv.Convert( + gconv.String(value), + columnType.ScanType().String(), + ), nil + default: + } + } + // Other complex types, especially custom types. + return c.db.ConvertValueForLocal(ctx, columnType.DatabaseTypeName(), value) } diff --git a/database/gdb/gdb_type_result.go b/database/gdb/gdb_type_result.go index 03e7051d3..5ebce52d2 100644 --- a/database/gdb/gdb_type_result.go +++ b/database/gdb/gdb_type_result.go @@ -7,198 +7,199 @@ package gdb import ( - "database/sql" - "math" + "database/sql" + "math" - "github.com/gogf/gf/v2/container/gvar" - "github.com/gogf/gf/v2/encoding/gjson" - "github.com/gogf/gf/v2/internal/empty" - "github.com/gogf/gf/v2/util/gconv" + "github.com/gogf/gf/v2/encoding/gjson" + "github.com/gogf/gf/v2/internal/empty" + "github.com/gogf/gf/v2/util/gconv" ) // IsEmpty checks and returns whether `r` is empty. func (r Result) IsEmpty() bool { - return r == nil || r.Len() == 0 + return r == nil || r.Len() == 0 } // Len returns the length of result list. func (r Result) Len() int { - return len(r) + return len(r) } // Size is alias of function Len. func (r Result) Size() int { - return r.Len() + return r.Len() } // Chunk splits a Result into multiple Results, // the size of each array is determined by `size`. // The last chunk may contain less than size elements. func (r Result) Chunk(size int) []Result { - if size < 1 { - return nil - } - length := len(r) - chunks := int(math.Ceil(float64(length) / float64(size))) - var n []Result - for i, end := 0, 0; chunks > 0; chunks-- { - end = (i + 1) * size - if end > length { - end = length - } - n = append(n, r[i*size:end]) - i++ - } - return n + if size < 1 { + return nil + } + length := len(r) + chunks := int(math.Ceil(float64(length) / float64(size))) + var n []Result + for i, end := 0, 0; chunks > 0; chunks-- { + end = (i + 1) * size + if end > length { + end = length + } + n = append(n, r[i*size:end]) + i++ + } + return n } // Json converts `r` to JSON format content. func (r Result) Json() string { - content, _ := gjson.New(r.List()).ToJsonString() - return content + content, _ := gjson.New(r.List()).ToJsonString() + return content } // Xml converts `r` to XML format content. func (r Result) Xml(rootTag ...string) string { - content, _ := gjson.New(r.List()).ToXmlString(rootTag...) - return content + content, _ := gjson.New(r.List()).ToXmlString(rootTag...) + return content } // List converts `r` to a List. func (r Result) List() List { - list := make(List, len(r)) - for k, v := range r { - list[k] = v.Map() - } - return list + list := make(List, len(r)) + for k, v := range r { + list[k] = v.Map() + } + return list } // Array retrieves and returns specified column values as slice. // The parameter `field` is optional is the column field is only one. // The default `field` is the first field name of the first item in `Result` if parameter `field` is not given. func (r Result) Array(field ...string) []Value { - array := make([]Value, len(r)) - if len(r) == 0 { - return array - } - key := "" - if len(field) > 0 && field[0] != "" { - key = field[0] - } else { - for k := range r[0] { - key = k - break - } - } - for k, v := range r { - array[k] = v[key] - } - return array + array := make([]Value, len(r)) + if len(r) == 0 { + return array + } + key := "" + if len(field) > 0 && field[0] != "" { + key = field[0] + } else { + for k := range r[0] { + key = k + break + } + } + for k, v := range r { + array[k] = v[key] + } + return array } // MapKeyValue converts `r` to a map[string]Value of which key is specified by `key`. // Note that the item value may be type of slice. func (r Result) MapKeyValue(key string) map[string]Value { - var ( - s string - m = make(map[string]Value) - tempMap = make(map[string][]interface{}) - hasMultiValues bool - ) - for _, item := range r { - if k, ok := item[key]; ok { - s = k.String() - tempMap[s] = append(tempMap[s], item) - if len(tempMap[s]) > 1 { - hasMultiValues = true - } - } - } - for k, v := range tempMap { - if hasMultiValues { - m[k] = gvar.New(v) - } else { - m[k] = gvar.New(v[0]) - } - } - return m + var ( + s string + m = make(map[string]Value) + tempMap = make(map[string][]interface{}) + localType LocalType + hasMultiValues bool + ) + for _, item := range r { + if k, ok := item[key]; ok { + s = k.String() + localType = k.LocalType() + tempMap[s] = append(tempMap[s], item) + if len(tempMap[s]) > 1 { + hasMultiValues = true + } + } + } + for k, v := range tempMap { + if hasMultiValues { + m[k] = NewValue(v) + } else { + m[k] = NewValueWithType(v[0], localType) + } + } + return m } // MapKeyStr converts `r` to a map[string]Map of which key is specified by `key`. func (r Result) MapKeyStr(key string) map[string]Map { - m := make(map[string]Map) - for _, item := range r { - if v, ok := item[key]; ok { - m[v.String()] = item.Map() - } - } - return m + m := make(map[string]Map) + for _, item := range r { + if v, ok := item[key]; ok { + m[v.String()] = item.Map() + } + } + return m } // MapKeyInt converts `r` to a map[int]Map of which key is specified by `key`. func (r Result) MapKeyInt(key string) map[int]Map { - m := make(map[int]Map) - for _, item := range r { - if v, ok := item[key]; ok { - m[v.Int()] = item.Map() - } - } - return m + m := make(map[int]Map) + for _, item := range r { + if v, ok := item[key]; ok { + m[v.Int()] = item.Map() + } + } + return m } // MapKeyUint converts `r` to a map[uint]Map of which key is specified by `key`. func (r Result) MapKeyUint(key string) map[uint]Map { - m := make(map[uint]Map) - for _, item := range r { - if v, ok := item[key]; ok { - m[v.Uint()] = item.Map() - } - } - return m + m := make(map[uint]Map) + for _, item := range r { + if v, ok := item[key]; ok { + m[v.Uint()] = item.Map() + } + } + return m } // RecordKeyStr converts `r` to a map[string]Record of which key is specified by `key`. func (r Result) RecordKeyStr(key string) map[string]Record { - m := make(map[string]Record) - for _, item := range r { - if v, ok := item[key]; ok { - m[v.String()] = item - } - } - return m + m := make(map[string]Record) + for _, item := range r { + if v, ok := item[key]; ok { + m[v.String()] = item + } + } + return m } // RecordKeyInt converts `r` to a map[int]Record of which key is specified by `key`. func (r Result) RecordKeyInt(key string) map[int]Record { - m := make(map[int]Record) - for _, item := range r { - if v, ok := item[key]; ok { - m[v.Int()] = item - } - } - return m + m := make(map[int]Record) + for _, item := range r { + if v, ok := item[key]; ok { + m[v.Int()] = item + } + } + return m } // RecordKeyUint converts `r` to a map[uint]Record of which key is specified by `key`. func (r Result) RecordKeyUint(key string) map[uint]Record { - m := make(map[uint]Record) - for _, item := range r { - if v, ok := item[key]; ok { - m[v.Uint()] = item - } - } - return m + m := make(map[uint]Record) + for _, item := range r { + if v, ok := item[key]; ok { + m[v.Uint()] = item + } + } + return m } // Structs converts `r` to struct slice. // Note that the parameter `pointer` should be type of *[]struct/*[]*struct. func (r Result) Structs(pointer interface{}) (err error) { - // If the result is empty and the target pointer is not empty, it returns error. - if r.IsEmpty() { - if !empty.IsEmpty(pointer, true) { - return sql.ErrNoRows - } - return nil - } - return gconv.StructsTag(r, pointer, OrmTagForStruct) + // If the result is empty and the target pointer is not empty, it returns error. + if r.IsEmpty() { + if !empty.IsEmpty(pointer, true) { + return sql.ErrNoRows + } + return nil + } + return gconv.StructsTag(r, pointer, OrmTagForStruct) } diff --git a/database/gdb/gdb_type_value.go b/database/gdb/gdb_type_value.go new file mode 100644 index 000000000..4945e7c59 --- /dev/null +++ b/database/gdb/gdb_type_value.go @@ -0,0 +1,19 @@ +// Copyright GoFrame Author(https://goframe.org). All Rights Reserved. +// +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, +// You can obtain one at https://github.com/gogf/gf. + +package gdb + +import "github.com/gogf/gf/v2/database/gdb/internal/fieldvar" + +// NewValue creates and returns a new Value object. +func NewValue(value any) Value { + return fieldvar.New(value) +} + +// NewValueWithType creates and returns a new Value object with specified local type. +func NewValueWithType(value any, localType LocalType) Value { + return fieldvar.NewWithType(value, localType) +} diff --git a/database/gdb/internal/defines/defines.go b/database/gdb/internal/defines/defines.go new file mode 100644 index 000000000..090aa55b7 --- /dev/null +++ b/database/gdb/internal/defines/defines.go @@ -0,0 +1,36 @@ +// Copyright GoFrame Author(https://goframe.org). All Rights Reserved. +// +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, +// You can obtain one at https://github.com/gogf/gf. + +// Package defines provides some common definitions for gdb package. +package defines + +// LocalType is a type that defines the local storage type of a field value. +// It is used to specify how the field value should be processed locally. +type LocalType string + +const ( + LocalTypeUndefined LocalType = "" + LocalTypeString LocalType = "string" + LocalTypeTime LocalType = "time" + LocalTypeDate LocalType = "date" + LocalTypeDatetime LocalType = "datetime" + LocalTypeInt LocalType = "int" + LocalTypeUint LocalType = "uint" + LocalTypeInt64 LocalType = "int64" + LocalTypeUint64 LocalType = "uint64" + LocalTypeIntSlice LocalType = "[]int" + LocalTypeInt64Slice LocalType = "[]int64" + LocalTypeUint64Slice LocalType = "[]uint64" + LocalTypeStringSlice LocalType = "[]string" + LocalTypeInt64Bytes LocalType = "int64-bytes" + LocalTypeUint64Bytes LocalType = "uint64-bytes" + LocalTypeFloat32 LocalType = "float32" + LocalTypeFloat64 LocalType = "float64" + LocalTypeBytes LocalType = "[]byte" + LocalTypeBool LocalType = "bool" + LocalTypeJson LocalType = "json" + LocalTypeJsonb LocalType = "jsonb" +) diff --git a/database/gdb/internal/fieldvar/fieldvar.go b/database/gdb/internal/fieldvar/fieldvar.go new file mode 100644 index 000000000..41b36997f --- /dev/null +++ b/database/gdb/internal/fieldvar/fieldvar.go @@ -0,0 +1,63 @@ +// Copyright GoFrame Author(https://goframe.org). All Rights Reserved. +// +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, +// You can obtain one at https://github.com/gogf/gf. + +// Package fieldvar provides a variable wrapper for field value in database operations. +// It is used for field value storage and conversion in database operations. +package fieldvar + +import ( + "github.com/gogf/gf/v2/database/gdb/internal/defines" + "github.com/gogf/gf/v2/internal/json" +) + +// Var is a wrapper for any type of value, which is used for field variable. +// Note that, do not embed *gvar.Var into Var but use it as an attribute, as there issue in nil pointer receiver +// when calling methods that is not defined directly on Var. +type Var struct { + value any + localType defines.LocalType +} + +// New creates and returns a new Var object. +func New(value any) *Var { + return &Var{ + value: value, + } +} + +// NewWithType creates and returns a new Var object with specified local type. +func NewWithType(value any, localType defines.LocalType) *Var { + return &Var{ + value: value, + localType: localType, + } +} + +// LocalType returns the local type of the value. +func (v *Var) LocalType() defines.LocalType { + return v.localType +} + +// MarshalJSON implements the interface MarshalJSON for json.Marshal. +func (v *Var) MarshalJSON() ([]byte, error) { + return json.Marshal(v.Val()) +} + +// UnmarshalJSON implements the interface UnmarshalJSON for json.Unmarshal. +func (v *Var) UnmarshalJSON(b []byte) error { + var i interface{} + if err := json.UnmarshalUseNumber(b, &i); err != nil { + return err + } + v.Set(i) + return nil +} + +// UnmarshalValue is an interface implement which sets any type of value for Var. +func (v *Var) UnmarshalValue(value interface{}) error { + v.Set(value) + return nil +} diff --git a/database/gdb/internal/fieldvar/fieldvar_basic.go b/database/gdb/internal/fieldvar/fieldvar_basic.go new file mode 100644 index 000000000..75b914581 --- /dev/null +++ b/database/gdb/internal/fieldvar/fieldvar_basic.go @@ -0,0 +1,99 @@ +// Copyright GoFrame Author(https://goframe.org). All Rights Reserved. +// +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, +// You can obtain one at https://github.com/gogf/gf. + +package fieldvar + +import ( + "github.com/gogf/gf/v2/util/gconv" +) + +// Val returns the current value of `v`. +func (v *Var) Val() interface{} { + if v == nil { + return nil + } + return v.value +} + +// Interface is alias of Val. +func (v *Var) Interface() interface{} { + return v.Val() +} + +// Bytes converts and returns `v` as []byte. +func (v *Var) Bytes() []byte { + return gconv.Bytes(v.Val()) +} + +// String converts and returns `v` as string. +func (v *Var) String() string { + return gconv.String(v.Val()) +} + +// Bool converts and returns `v` as bool. +func (v *Var) Bool() bool { + return gconv.Bool(v.Val()) +} + +// Int converts and returns `v` as int. +func (v *Var) Int() int { + return gconv.Int(v.Val()) +} + +// Int8 converts and returns `v` as int8. +func (v *Var) Int8() int8 { + return gconv.Int8(v.Val()) +} + +// Int16 converts and returns `v` as int16. +func (v *Var) Int16() int16 { + return gconv.Int16(v.Val()) +} + +// Int32 converts and returns `v` as int32. +func (v *Var) Int32() int32 { + return gconv.Int32(v.Val()) +} + +// Int64 converts and returns `v` as int64. +func (v *Var) Int64() int64 { + return gconv.Int64(v.Val()) +} + +// Uint converts and returns `v` as uint. +func (v *Var) Uint() uint { + return gconv.Uint(v.Val()) +} + +// Uint8 converts and returns `v` as uint8. +func (v *Var) Uint8() uint8 { + return gconv.Uint8(v.Val()) +} + +// Uint16 converts and returns `v` as uint16. +func (v *Var) Uint16() uint16 { + return gconv.Uint16(v.Val()) +} + +// Uint32 converts and returns `v` as uint32. +func (v *Var) Uint32() uint32 { + return gconv.Uint32(v.Val()) +} + +// Uint64 converts and returns `v` as uint64. +func (v *Var) Uint64() uint64 { + return gconv.Uint64(v.Val()) +} + +// Float32 converts and returns `v` as float32. +func (v *Var) Float32() float32 { + return gconv.Float32(v.Val()) +} + +// Float64 converts and returns `v` as float64. +func (v *Var) Float64() float64 { + return gconv.Float64(v.Val()) +} diff --git a/database/gdb/internal/fieldvar/fieldvar_copy.go b/database/gdb/internal/fieldvar/fieldvar_copy.go new file mode 100644 index 000000000..4698a9a88 --- /dev/null +++ b/database/gdb/internal/fieldvar/fieldvar_copy.go @@ -0,0 +1,30 @@ +// Copyright GoFrame Author(https://goframe.org). All Rights Reserved. +// +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, +// You can obtain one at https://github.com/gogf/gf. + +package fieldvar + +import ( + "github.com/gogf/gf/v2/internal/deepcopy" + "github.com/gogf/gf/v2/util/gutil" +) + +// Copy does a deep copy of current Var and returns a pointer to this Var. +func (v *Var) Copy() *Var { + return NewWithType(gutil.Copy(v.Val()), v.localType) +} + +// Clone does a shallow copy of current Var and returns a pointer to this Var. +func (v *Var) Clone() *Var { + return NewWithType(v.Val(), v.localType) +} + +// DeepCopy implements interface for deep copy of current type. +func (v *Var) DeepCopy() interface{} { + if v == nil { + return nil + } + return NewWithType(deepcopy.Copy(v.Val()), v.localType) +} diff --git a/database/gdb/internal/fieldvar/fieldvar_is.go b/database/gdb/internal/fieldvar/fieldvar_is.go new file mode 100644 index 000000000..3c8c17a3a --- /dev/null +++ b/database/gdb/internal/fieldvar/fieldvar_is.go @@ -0,0 +1,51 @@ +// Copyright GoFrame Author(https://goframe.org). All Rights Reserved. +// +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, +// You can obtain one at https://github.com/gogf/gf. + +package fieldvar + +import ( + "github.com/gogf/gf/v2/internal/utils" +) + +// IsNil checks whether `v` is nil. +func (v *Var) IsNil() bool { + return utils.IsNil(v.Val()) +} + +// IsEmpty checks whether `v` is empty. +func (v *Var) IsEmpty() bool { + return utils.IsEmpty(v.Val()) +} + +// IsInt checks whether `v` is type of int. +func (v *Var) IsInt() bool { + return utils.IsInt(v.Val()) +} + +// IsUint checks whether `v` is type of uint. +func (v *Var) IsUint() bool { + return utils.IsUint(v.Val()) +} + +// IsFloat checks whether `v` is type of float. +func (v *Var) IsFloat() bool { + return utils.IsFloat(v.Val()) +} + +// IsSlice checks whether `v` is type of slice. +func (v *Var) IsSlice() bool { + return utils.IsSlice(v.Val()) +} + +// IsMap checks whether `v` is type of map. +func (v *Var) IsMap() bool { + return utils.IsMap(v.Val()) +} + +// IsStruct checks whether `v` is type of struct. +func (v *Var) IsStruct() bool { + return utils.IsStruct(v.Val()) +} diff --git a/database/gdb/internal/fieldvar/fieldvar_map.go b/database/gdb/internal/fieldvar/fieldvar_map.go new file mode 100644 index 000000000..a70d6c84a --- /dev/null +++ b/database/gdb/internal/fieldvar/fieldvar_map.go @@ -0,0 +1,65 @@ +// Copyright GoFrame Author(https://goframe.org). All Rights Reserved. +// +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, +// You can obtain one at https://github.com/gogf/gf. + +package fieldvar + +import "github.com/gogf/gf/v2/util/gconv" + +// MapOption specifies the option for map converting. +type MapOption = gconv.MapOption + +// Map converts and returns `v` as map[string]interface{}. +func (v *Var) Map(option ...MapOption) map[string]interface{} { + return gconv.Map(v.Val(), option...) +} + +// MapStrAny is like function Map, but implements the interface of MapStrAny. +func (v *Var) MapStrAny(option ...MapOption) map[string]interface{} { + return v.Map(option...) +} + +// MapStrStr converts and returns `v` as map[string]string. +func (v *Var) MapStrStr(option ...MapOption) map[string]string { + return gconv.MapStrStr(v.Val(), option...) +} + +// MapStrVar converts and returns `v` as map[string]Var. +func (v *Var) MapStrVar(option ...MapOption) map[string]*Var { + m := v.Map(option...) + if len(m) > 0 { + vMap := make(map[string]*Var, len(m)) + for k, v := range m { + vMap[k] = New(v) + } + return vMap + } + return nil +} + +// Maps converts and returns `v` as map[string]string. +// See gconv.Maps. +func (v *Var) Maps(option ...MapOption) []map[string]interface{} { + return gconv.Maps(v.Val(), option...) +} + +// MapToMap converts any map type variable `params` to another map type variable `pointer`. +// See gconv.MapToMap. +func (v *Var) MapToMap(pointer interface{}, mapping ...map[string]string) (err error) { + return gconv.MapToMap(v.Val(), pointer, mapping...) +} + +// MapToMaps converts any map type variable `params` to another map type variable `pointer`. +// See gconv.MapToMaps. +func (v *Var) MapToMaps(pointer interface{}, mapping ...map[string]string) (err error) { + return gconv.MapToMaps(v.Val(), pointer, mapping...) +} + +// MapToMapsDeep converts any map type variable `params` to another map type variable +// `pointer` recursively. +// See gconv.MapToMapsDeep. +func (v *Var) MapToMapsDeep(pointer interface{}, mapping ...map[string]string) (err error) { + return gconv.MapToMaps(v.Val(), pointer, mapping...) +} diff --git a/database/gdb/internal/fieldvar/fieldvar_scan.go b/database/gdb/internal/fieldvar/fieldvar_scan.go new file mode 100644 index 000000000..3da52ab78 --- /dev/null +++ b/database/gdb/internal/fieldvar/fieldvar_scan.go @@ -0,0 +1,18 @@ +// Copyright GoFrame Author(https://goframe.org). All Rights Reserved. +// +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, +// You can obtain one at https://github.com/gogf/gf. + +package fieldvar + +import ( + "github.com/gogf/gf/v2/util/gconv" +) + +// Scan automatically checks the type of `pointer` and converts value of Var to `pointer`. +// +// See gconv.Scan. +func (v *Var) Scan(pointer interface{}, mapping ...map[string]string) error { + return gconv.Scan(v.Val(), pointer, mapping...) +} diff --git a/database/gdb/internal/fieldvar/fieldvar_set.go b/database/gdb/internal/fieldvar/fieldvar_set.go new file mode 100644 index 000000000..e31f9a449 --- /dev/null +++ b/database/gdb/internal/fieldvar/fieldvar_set.go @@ -0,0 +1,14 @@ +// Copyright GoFrame Author(https://goframe.org). All Rights Reserved. +// +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, +// You can obtain one at https://github.com/gogf/gf. + +package fieldvar + +// Set sets `value` to `v`, and returns the old value. +func (v *Var) Set(value interface{}) (old interface{}) { + old = v.value + v.value = value + return +} diff --git a/database/gdb/internal/fieldvar/fieldvar_slice.go b/database/gdb/internal/fieldvar/fieldvar_slice.go new file mode 100644 index 000000000..6659d7b9a --- /dev/null +++ b/database/gdb/internal/fieldvar/fieldvar_slice.go @@ -0,0 +1,86 @@ +// Copyright GoFrame Author(https://goframe.org). All Rights Reserved. +// +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, +// You can obtain one at https://github.com/gogf/gf. + +package fieldvar + +import ( + "github.com/gogf/gf/v2/database/gdb/internal/defines" + "github.com/gogf/gf/v2/internal/json" + "github.com/gogf/gf/v2/util/gconv" +) + +// Ints converts and returns `v` as []int. +func (v *Var) Ints() []int { + return gconv.Ints(v.Val()) +} + +// Int64s converts and returns `v` as []int64. +func (v *Var) Int64s() []int64 { + return gconv.Int64s(v.Val()) +} + +// Uints converts and returns `v` as []uint. +func (v *Var) Uints() []uint { + return gconv.Uints(v.Val()) +} + +// Uint64s converts and returns `v` as []uint64. +func (v *Var) Uint64s() []uint64 { + return gconv.Uint64s(v.Val()) +} + +// Floats is alias of Float64s. +func (v *Var) Floats() []float64 { + return gconv.Floats(v.Val()) +} + +// Float32s converts and returns `v` as []float32. +func (v *Var) Float32s() []float32 { + return gconv.Float32s(v.Val()) +} + +// Float64s converts and returns `v` as []float64. +func (v *Var) Float64s() []float64 { + return gconv.Float64s(v.Val()) +} + +// Strings converts and returns `v` as []string. +func (v *Var) Strings() []string { + if v.localType == defines.LocalTypeJson { + var s []string + _ = json.Unmarshal(v.Bytes(), &s) + return s + } + return gconv.Strings(v.Val()) +} + +// Interfaces converts and returns `v` as []interfaces{}. +func (v *Var) Interfaces() []interface{} { + return gconv.Interfaces(v.Val()) +} + +// Slice is alias of Interfaces. +func (v *Var) Slice() []interface{} { + return v.Interfaces() +} + +// Array is alias of Interfaces. +func (v *Var) Array() []interface{} { + return v.Interfaces() +} + +// Vars converts and returns `v` as []Var. +func (v *Var) Vars() []*Var { + array := gconv.Interfaces(v.Val()) + if len(array) == 0 { + return nil + } + vars := make([]*Var, len(array)) + for k, v := range array { + vars[k] = New(v) + } + return vars +} diff --git a/database/gdb/internal/fieldvar/fieldvar_struct.go b/database/gdb/internal/fieldvar/fieldvar_struct.go new file mode 100644 index 000000000..904f48e32 --- /dev/null +++ b/database/gdb/internal/fieldvar/fieldvar_struct.go @@ -0,0 +1,23 @@ +// Copyright GoFrame Author(https://goframe.org). All Rights Reserved. +// +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, +// You can obtain one at https://github.com/gogf/gf. + +package fieldvar + +import ( + "github.com/gogf/gf/v2/util/gconv" +) + +// Struct maps value of `v` to `pointer`. +// The parameter `pointer` should be a pointer to a struct instance. +// The parameter `mapping` is used to specify the key-to-attribute mapping rules. +func (v *Var) Struct(pointer interface{}, mapping ...map[string]string) error { + return gconv.Struct(v.Val(), pointer, mapping...) +} + +// Structs converts and returns `v` as given struct slice. +func (v *Var) Structs(pointer interface{}, mapping ...map[string]string) error { + return gconv.Structs(v.Val(), pointer, mapping...) +} diff --git a/database/gdb/internal/fieldvar/fieldvar_time.go b/database/gdb/internal/fieldvar/fieldvar_time.go new file mode 100644 index 000000000..4a8bf30c6 --- /dev/null +++ b/database/gdb/internal/fieldvar/fieldvar_time.go @@ -0,0 +1,34 @@ +// Copyright GoFrame Author(https://goframe.org). All Rights Reserved. +// +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, +// You can obtain one at https://github.com/gogf/gf. + +package fieldvar + +import ( + "time" + + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gconv" +) + +// Time converts and returns `v` as time.Time. +// The parameter `format` specifies the format of the time string using gtime, +// Example: Y-m-d H:i:s. +func (v *Var) Time(format ...string) time.Time { + return gconv.Time(v.Val(), format...) +} + +// Duration converts and returns `v` as time.Duration. +// If value of `v` is string, then it uses time.ParseDuration for conversion. +func (v *Var) Duration() time.Duration { + return gconv.Duration(v.Val()) +} + +// GTime converts and returns `v` as *gtime.Time. +// The parameter `format` specifies the format of the time string using gtime, +// Example: Y-m-d H:i:s. +func (v *Var) GTime(format ...string) *gtime.Time { + return gconv.GTime(v.Val(), format...) +} diff --git a/example/go.mod b/example/go.mod index 426044591..1c106f2d9 100644 --- a/example/go.mod +++ b/example/go.mod @@ -25,12 +25,12 @@ require ( github.com/nacos-group/nacos-sdk-go/v2 v2.2.7 github.com/polarismesh/polaris-go v1.5.8 github.com/prometheus/client_golang v1.20.2 - go.opentelemetry.io/otel v1.29.0 + go.opentelemetry.io/otel v1.32.0 go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.29.0 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.29.0 go.opentelemetry.io/otel/exporters/prometheus v0.46.0 - go.opentelemetry.io/otel/sdk v1.29.0 + go.opentelemetry.io/otel/sdk v1.32.0 golang.org/x/time v0.6.0 google.golang.org/grpc v1.68.1 google.golang.org/protobuf v1.34.2 @@ -129,9 +129,9 @@ require ( go.etcd.io/etcd/client/pkg/v3 v3.5.17 // indirect go.etcd.io/etcd/client/v3 v3.5.17 // indirect go.opentelemetry.io/contrib/instrumentation/runtime v0.49.0 // indirect - go.opentelemetry.io/otel/metric v1.29.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.24.0 // indirect - go.opentelemetry.io/otel/trace v1.29.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.opentelemetry.io/proto/otlp v1.3.1 // indirect go.uber.org/multierr v1.10.0 // indirect go.uber.org/zap v1.26.0 // indirect diff --git a/example/go.sum b/example/go.sum index 71f6c7064..cf23d2c40 100644 --- a/example/go.sum +++ b/example/go.sum @@ -665,8 +665,8 @@ github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= -github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= @@ -709,8 +709,8 @@ github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1F github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/tevid/gohamcrest v1.1.1 h1:ou+xSqlIw1xfGTg1uq1nif/htZ2S3EzRqLm2BP+tYU0= @@ -748,8 +748,8 @@ go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opentelemetry.io/contrib/instrumentation/runtime v0.49.0 h1:dg9y+7ArpumB6zwImJv47RHfdgOGQ1EMkzP5vLkEnTU= go.opentelemetry.io/contrib/instrumentation/runtime v0.49.0/go.mod h1:Ul4MtXqu/hJBM+v7a6dCF0nHwckPMLpIpLeCi4+zfdw= -go.opentelemetry.io/otel v1.29.0 h1:PdomN/Al4q/lN6iBJEN3AwPvUiHPMlt93c8bqTG5Llw= -go.opentelemetry.io/otel v1.29.0/go.mod h1:N/WtXPs1CNCUEx+Agz5uouwCba+i+bJGFicT8SR4NP8= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0 h1:dIIDULZJpgdiHz5tXrTgKIMLkus6jEFa7x5SOKcyR7E= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0/go.mod h1:jlRVBe7+Z1wyxFSUs48L6OBQZ5JwH2Hg/Vbl+t9rAgI= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.29.0 h1:nSiV3s7wiCam610XcLbYOmMfJxB9gO4uK3Xgv5gmTgg= @@ -758,14 +758,14 @@ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.29.0 h1:JAv0J go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.29.0/go.mod h1:QNKLmUEAq2QUbPQUfvw4fmv0bgbK7UlOSFCnXyfvSNc= go.opentelemetry.io/otel/exporters/prometheus v0.46.0 h1:I8WIFXR351FoLJYuloU4EgXbtNX2URfU/85pUPheIEQ= go.opentelemetry.io/otel/exporters/prometheus v0.46.0/go.mod h1:ztwVUHe5DTR/1v7PeuGRnU5Bbd4QKYwApWmuutKsJSs= -go.opentelemetry.io/otel/metric v1.29.0 h1:vPf/HFWTNkPu1aYeIsc98l4ktOQaL6LeSoeV2g+8YLc= -go.opentelemetry.io/otel/metric v1.29.0/go.mod h1:auu/QWieFVWx+DmQOUMgj0F8LHWdgalxXqvp7BII/W8= -go.opentelemetry.io/otel/sdk v1.29.0 h1:vkqKjk7gwhS8VaWb0POZKmIEDimRCMsopNYnriHyryo= -go.opentelemetry.io/otel/sdk v1.29.0/go.mod h1:pM8Dx5WKnvxLCb+8lG1PRNIDxu9g9b9g59Qr7hfAAok= -go.opentelemetry.io/otel/sdk/metric v1.24.0 h1:yyMQrPzF+k88/DbH7o4FMAs80puqd+9osbiBrJrz/w8= -go.opentelemetry.io/otel/sdk/metric v1.24.0/go.mod h1:I6Y5FjH6rvEnTTAYQz3Mmv2kl6Ek5IIrmwTLqMrrOE0= -go.opentelemetry.io/otel/trace v1.29.0 h1:J/8ZNK4XgR7a21DZUAsbF8pZ5Jcw1VhACmnYt39JTi4= -go.opentelemetry.io/otel/trace v1.29.0/go.mod h1:eHl3w0sp3paPkYstJOmAimxhiFXPg+MMTlEh3nsQgWQ= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8=