diff --git a/go.mod b/go.mod index 7d50cd9f85..72ec0ce76f 100644 --- a/go.mod +++ b/go.mod @@ -94,7 +94,7 @@ require ( yunion.io/x/ovsdb v0.0.0-20230306173834-f164f413a900 yunion.io/x/pkg v1.10.4-0.20250403114914-586e94d39281 yunion.io/x/s3cli v0.0.0-20241221171442-1c11599d28e1 - yunion.io/x/sqlchemy v1.1.3-0.20250307104108-2f8e0af883e9 + yunion.io/x/sqlchemy v1.1.3-0.20250420094945-40f40c75a31f yunion.io/x/structarg v0.0.0-20231017124457-df4d5009457c ) diff --git a/go.sum b/go.sum index 0dfa47262b..5805f6e3c4 100644 --- a/go.sum +++ b/go.sum @@ -1293,7 +1293,7 @@ yunion.io/x/pkg v1.10.4-0.20250403114914-586e94d39281 h1:P22/MaBc9bqE9DyHvS3oQjc yunion.io/x/pkg v1.10.4-0.20250403114914-586e94d39281/go.mod h1:0Bwxqd9MA3ACi119/l02FprY/o9gHahmYC2bsSbnVpM= yunion.io/x/s3cli v0.0.0-20241221171442-1c11599d28e1 h1:1KJ3YYinydPHpDEQRXdr/T8SYcKZ5Er+m489H+PnaQ4= yunion.io/x/s3cli v0.0.0-20241221171442-1c11599d28e1/go.mod h1:0iFKpOs1y4lbCxeOmq3Xx/0AcQoewVPwj62eRluioEo= -yunion.io/x/sqlchemy v1.1.3-0.20250307104108-2f8e0af883e9 h1:KU8BikBBUJlSkA1Ib01htqaDdzt20K+ezNkTZD8Rxjk= -yunion.io/x/sqlchemy v1.1.3-0.20250307104108-2f8e0af883e9/go.mod h1:vCIZpqhZ5Jzaq3tFyrti/vv8BijQKtkzSgNT/uH4H5A= +yunion.io/x/sqlchemy v1.1.3-0.20250420094945-40f40c75a31f h1:xuy9a8Hg0d8dfD8j13f687eKPCxEvttgpLQWb4NvKpI= +yunion.io/x/sqlchemy v1.1.3-0.20250420094945-40f40c75a31f/go.mod h1:vCIZpqhZ5Jzaq3tFyrti/vv8BijQKtkzSgNT/uH4H5A= yunion.io/x/structarg v0.0.0-20231017124457-df4d5009457c h1:QuLab2kSRECZRxo4Lo2KcYn6XjQFDGaZ1+x0pYDVVwQ= yunion.io/x/structarg v0.0.0-20231017124457-df4d5009457c/go.mod h1:EP6NSv2C0zzqBDTKumv8hPWLb3XvgMZDHQRfyuOrQng= diff --git a/pkg/apis/compute/bucket.go b/pkg/apis/compute/bucket.go index 8ae94edb70..04b9a742a1 100644 --- a/pkg/apis/compute/bucket.go +++ b/pkg/apis/compute/bucket.go @@ -80,6 +80,8 @@ func (self BucketDetails) GetMetricTags() map[string]string { "status": self.Status, "tenant": self.Project, "tenant_id": self.ProjectId, + "account": self.Account, + "account_id": self.AccountId, "external_id": self.ExternalId, } return AppendMetricTags(ret, self.MetadataResourceInfo, self.ProjectizedResourceInfo) diff --git a/pkg/apis/compute/dbinstance.go b/pkg/apis/compute/dbinstance.go index c16089a61e..dd2f44e06c 100644 --- a/pkg/apis/compute/dbinstance.go +++ b/pkg/apis/compute/dbinstance.go @@ -342,6 +342,8 @@ func (self DBInstanceDetails) GetMetricTags() map[string]string { "tenant_id": self.ProjectId, "brand": self.Brand, "domain_id": self.DomainId, + "account": self.Account, + "account_id": self.AccountId, "project_domain": self.ProjectDomain, "external_id": self.ExternalId, } diff --git a/pkg/apis/compute/elasticcache.go b/pkg/apis/compute/elasticcache.go index e5321573f6..ea90c2b28e 100644 --- a/pkg/apis/compute/elasticcache.go +++ b/pkg/apis/compute/elasticcache.go @@ -53,6 +53,8 @@ func (self ElasticcacheDetails) GetMetricTags() map[string]string { "tenant": self.Project, "tenant_id": self.ProjectId, "brand": self.Brand, + "account": self.Account, + "account_id": self.AccountId, "domain_id": self.DomainId, "project_domain": self.ProjectDomain, "external_id": self.ExternalId, diff --git a/pkg/apis/compute/loadbalancer.go b/pkg/apis/compute/loadbalancer.go index 9e6bfb2910..dfb671e4c4 100644 --- a/pkg/apis/compute/loadbalancer.go +++ b/pkg/apis/compute/loadbalancer.go @@ -261,6 +261,8 @@ func (self LoadbalancerDetails) GetMetricTags() map[string]string { "status": self.Status, "tenant": self.Project, "tenant_id": self.ProjectId, + "account": self.Account, + "account_id": self.AccountId, "external_id": self.ExternalId, } return AppendMetricTags(ret, self.MetadataResourceInfo, self.ProjectizedResourceInfo) diff --git a/vendor/modules.txt b/vendor/modules.txt index 8977d8cc15..501e1a59d8 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -1699,7 +1699,6 @@ yunion.io/x/pkg/util/netutils yunion.io/x/pkg/util/osprofile yunion.io/x/pkg/util/pinyinutils yunion.io/x/pkg/util/printutils -yunion.io/x/pkg/util/prometheus yunion.io/x/pkg/util/qemuimgfmt yunion.io/x/pkg/util/rand yunion.io/x/pkg/util/rbacscope @@ -1726,7 +1725,7 @@ yunion.io/x/pkg/utils # yunion.io/x/s3cli v0.0.0-20241221171442-1c11599d28e1 ## explicit; go 1.12 yunion.io/x/s3cli -# yunion.io/x/sqlchemy v1.1.3-0.20250307104108-2f8e0af883e9 +# yunion.io/x/sqlchemy v1.1.3-0.20250420094945-40f40c75a31f ## explicit; go 1.17 yunion.io/x/sqlchemy yunion.io/x/sqlchemy/backends diff --git a/vendor/yunion.io/x/pkg/util/prometheus/doc.go b/vendor/yunion.io/x/pkg/util/prometheus/doc.go deleted file mode 100644 index d4baa33e92..0000000000 --- a/vendor/yunion.io/x/pkg/util/prometheus/doc.go +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright 2019 Yunion -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package prometheus // import "yunion.io/x/pkg/util/prometheus" diff --git a/vendor/yunion.io/x/pkg/util/prometheus/gin_handler.go b/vendor/yunion.io/x/pkg/util/prometheus/gin_handler.go deleted file mode 100644 index f6fbe4f516..0000000000 --- a/vendor/yunion.io/x/pkg/util/prometheus/gin_handler.go +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2019 Yunion -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package prometheus - -import ( - "github.com/gin-gonic/gin" - "github.com/prometheus/client_golang/prometheus/promhttp" -) - -func InstallHandler(r *gin.Engine) { - r.Any("/metrics", gin.WrapH(promhttp.Handler())) -} diff --git a/vendor/yunion.io/x/sqlchemy/backends/clickhouse/clickhouse.go b/vendor/yunion.io/x/sqlchemy/backends/clickhouse/clickhouse.go index 4195d54e4e..31c14b49f9 100644 --- a/vendor/yunion.io/x/sqlchemy/backends/clickhouse/clickhouse.go +++ b/vendor/yunion.io/x/sqlchemy/backends/clickhouse/clickhouse.go @@ -123,17 +123,17 @@ func (click *SClickhouseBackend) GetCreateSQLs(ts sqlchemy.ITableSpec) []string var ttlCol IClickhouseColumnSpec for _, c := range ts.Columns() { cols = append(cols, c.DefinitionString()) - if c.IsPrimary() { - primaries = append(primaries, fmt.Sprintf("`%s`", c.Name())) - } if cc, ok := c.(IClickhouseColumnSpec); ok { - if cc.IsOrderBy() { - orderbys = append(orderbys, fmt.Sprintf("`%s`", c.Name())) - } partition := cc.PartitionBy() if len(partition) > 0 && !utils.IsInStringArray(partition, partitions) { partitions = append(partitions, partition) } + if c.IsPrimary() && len(partition) == 0 { + primaries = append(primaries, fmt.Sprintf("`%s`", c.Name())) + } + if cc.IsOrderBy() && len(partition) == 0 { + orderbys = append(orderbys, fmt.Sprintf("`%s`", c.Name())) + } ttlC, ttlU := cc.GetTTL() if ttlC > 0 && len(ttlU) > 0 { ttlCol = cc @@ -183,7 +183,7 @@ func (click *SClickhouseBackend) GetCreateSQLs(ts sqlchemy.ITableSpec) []string createSql += fmt.Sprintf("\nTTL `%s` + INTERVAL %d %s", ttlCol.Name(), ttlCount, ttlUnit) } // set default time zone of table to UTC - createSql += "\nSETTINGS index_granularity=8192" + createSql += "\nSETTINGS index_granularity=8192, allow_nullable_key=1" } return []string{ createSql, diff --git a/vendor/yunion.io/x/sqlchemy/backends/clickhouse/column.go b/vendor/yunion.io/x/sqlchemy/backends/clickhouse/column.go index 6628be63ed..d06585c18b 100644 --- a/vendor/yunion.io/x/sqlchemy/backends/clickhouse/column.go +++ b/vendor/yunion.io/x/sqlchemy/backends/clickhouse/column.go @@ -20,13 +20,11 @@ import ( "fmt" "reflect" "strconv" - "strings" "time" "yunion.io/x/log" "yunion.io/x/pkg/gotypes" "yunion.io/x/pkg/tristate" - "yunion.io/x/pkg/util/timeutils" "yunion.io/x/pkg/utils" "yunion.io/x/sqlchemy" @@ -157,8 +155,8 @@ func (c *SBooleanColumn) DefinitionString() string { // ConvertFromString implementation of SBooleanColumn for IColumnSpec func (c *SBooleanColumn) ConvertFromString(str string) interface{} { - switch strings.ToLower(str) { - case "true", "yes", "on", "ok", "1": + switch sqlchemy.ConvertValueToBool(str) { + case true: return uint8(1) default: return uint8(0) @@ -167,11 +165,12 @@ func (c *SBooleanColumn) ConvertFromString(str string) interface{} { // ConvertFromValue implementation of STristateColumn for IColumnSpec func (c *SBooleanColumn) ConvertFromValue(val interface{}) interface{} { - bVal := val.(bool) - if bVal { + switch sqlchemy.ConvertValueToBool(val) { + case true: return uint8(1) + default: + return uint8(0) } - return uint8(0) } // IsZero implementation of SBooleanColumn for IColumnSpec @@ -207,24 +206,24 @@ func (c *STristateColumn) DefinitionString() string { // ConvertFromString implementation of STristateColumn for IColumnSpec func (c *STristateColumn) ConvertFromString(str string) interface{} { - switch strings.ToLower(str) { - case "true", "yes", "on", "ok", "1": + switch sqlchemy.ConvertValueToTriState(str) { + case tristate.True: return uint8(1) - case "none", "null", "unknown": - return sql.NullInt32{} - default: + case tristate.False: return uint8(0) + default: + return sql.NullInt32{} } } // ConvertFromValue implementation of STristateColumn for IColumnSpec func (c *STristateColumn) ConvertFromValue(val interface{}) interface{} { - bVal := val.(tristate.TriState) - if bVal == tristate.True { + switch sqlchemy.ConvertValueToTriState(val) { + case tristate.True: return uint8(1) - } else if bVal == tristate.False { + case tristate.False: return uint8(0) - } else { + default: return sql.NullInt32{} } } @@ -282,37 +281,26 @@ func (c *SIntegerColumn) IsZero(val interface{}) bool { // ConvertFromString implementation of STristateColumn for IColumnSpec func (c *SIntegerColumn) ConvertFromString(str string) interface{} { - ctype := c.SBaseColumn.ColType() - if ctype[0] == 'U' { - // unsigned - val, _ := strconv.ParseUint(str, 10, 64) - switch ctype { - case "UInt8": - return uint8(val) - case "UInt16": - return uint16(val) - case "UInt32": - return uint32(val) - case "UInt64": - return val - default: - panic(fmt.Sprintf("unsupported type %s", ctype)) - } - } else { - val, _ := strconv.ParseInt(str, 10, 64) - switch ctype { - case "Int8": - return int8(val) - case "Int16": - return int16(val) - case "Int32": - return int32(val) - case "Int64": - return val - default: - panic(fmt.Sprintf("unsupported type %s", ctype)) - } + val := sqlchemy.ConvertValueToInteger(str) + switch c.ColType() { + case "UInt8": + return uint8(val) + case "UInt16": + return uint16(val) + case "UInt32": + return uint32(val) + case "UInt64": + return val + case "Int8": + return int8(val) + case "Int16": + return int16(val) + case "Int32": + return int32(val) + case "Int64": + return val } + panic(fmt.Sprintf("unsupported type %s", c.ColType())) } // IsAutoVersion implements IsAutoVersion for IColumnSpec @@ -374,16 +362,14 @@ func (c *SFloatColumn) IsZero(val interface{}) bool { // ConvertFromString implementation of STristateColumn for IColumnSpec func (c *SFloatColumn) ConvertFromString(str string) interface{} { - ctype := c.SBaseColumn.ColType() - val, _ := strconv.ParseFloat(str, 64) - switch ctype { + floatVal := sqlchemy.ConvertValueToFloat(str) + switch c.ColType() { case "Float32": - return float32(val) + return float32(floatVal) case "Float64": - return val - default: - panic(fmt.Sprintf("unsupported type %s", ctype)) + return floatVal } + panic(fmt.Sprintf("unsupported type %s", c.ColType())) } // NewFloatColumn returns an instance of SFloatColumn @@ -442,8 +428,7 @@ func (c *SDecimalColumn) IsZero(val interface{}) bool { // ConvertFromString implementation of STristateColumn for IColumnSpec func (c *SDecimalColumn) ConvertFromString(str string) interface{} { - val, _ := strconv.ParseFloat(str, 64) - return val + return sqlchemy.ConvertValueToFloat(str) } // NewDecimalColumn returns an instance of SDecimalColumn @@ -564,8 +549,12 @@ func (c *STimeTypeColumn) IsZero(val interface{}) bool { // ConvertFromString implementation of STristateColumn for IColumnSpec func (c *STimeTypeColumn) ConvertFromString(str string) interface{} { - tm, _ := timeutils.ParseTimeStr(str) - return tm + return sqlchemy.ConvertValueToTime(str) +} + +// ConvertFromValue implementation of STimeTypeColumn for IColumnSpec +func (c *STimeTypeColumn) ConvertFromValue(val interface{}) interface{} { + return sqlchemy.ConvertValueToTime(val) } func (c *STimeTypeColumn) GetTTL() (int, string) { diff --git a/vendor/yunion.io/x/sqlchemy/backends/clickhouse/sync.go b/vendor/yunion.io/x/sqlchemy/backends/clickhouse/sync.go index 3fe1f91328..4bee198cb9 100644 --- a/vendor/yunion.io/x/sqlchemy/backends/clickhouse/sync.go +++ b/vendor/yunion.io/x/sqlchemy/backends/clickhouse/sync.go @@ -47,6 +47,18 @@ func findTtlColumn(cols []sqlchemy.IColumnSpec) sColumnTTL { return ret } +func findOrderByColumns(cols []sqlchemy.IColumnSpec) []string { + var ret []string + for _, col := range cols { + if clickCol, ok := col.(IClickhouseColumnSpec); ok { + if (clickCol.IsOrderBy() || clickCol.IsPrimary()) && len(clickCol.PartitionBy()) == 0 { + ret = append(ret, clickCol.Name()) + } + } + } + return ret +} + func findPartitions(cols []sqlchemy.IColumnSpec) []string { parts := make([]string, 0) for i := range cols { @@ -158,18 +170,41 @@ func (clickhouse *SClickhouseBackend) CommitTableChangeSQL(ts sqlchemy.ITableSpe }*/ // check TTL - oldTtlSpec := findTtlColumn(changes.OldColumns) - newTtlSpec := findTtlColumn(ts.Columns()) - log.Debugf("old: %s new: %s", jsonutils.Marshal(oldTtlSpec), jsonutils.Marshal(newTtlSpec)) - if oldTtlSpec != newTtlSpec { - if oldTtlSpec.Count > 0 && newTtlSpec.Count == 0 { - // remove - sql := fmt.Sprintf("REMOVE TTL") - alters = append(alters, sql) - } else { + { + oldTtlSpec := findTtlColumn(changes.OldColumns) + newTtlSpec := findTtlColumn(ts.Columns()) + log.Debugf("old: %s new: %s", jsonutils.Marshal(oldTtlSpec), jsonutils.Marshal(newTtlSpec)) + if oldTtlSpec != newTtlSpec { + if oldTtlSpec.Count > 0 && newTtlSpec.Count == 0 { + // remove + sql := fmt.Sprintf("REMOVE TTL") + alters = append(alters, sql) + } else { + // alter + sql := fmt.Sprintf("MODIFY TTL `%s` + INTERVAL %d %s", newTtlSpec.ColName, newTtlSpec.Count, newTtlSpec.Unit) + alters = append(alters, sql) + } + } + } + + // check order by + { + oldOrderBys := findOrderByColumns(changes.OldColumns) + newOrderBys := findOrderByColumns(ts.Columns()) + log.Debugf("old: %s new: %s", jsonutils.Marshal(oldOrderBys), jsonutils.Marshal(newOrderBys)) + if jsonutils.Marshal(oldOrderBys).String() != jsonutils.Marshal(newOrderBys).String() { // alter - sql := fmt.Sprintf("MODIFY TTL `%s` + INTERVAL %d %s", newTtlSpec.ColName, newTtlSpec.Count, newTtlSpec.Unit) - alters = append(alters, sql) + altered := false + for i := range newOrderBys { + if !utils.IsInStringArray(newOrderBys[i], oldOrderBys) { + oldOrderBys = append(oldOrderBys, newOrderBys[i]) + altered = true + } + } + if altered { + sql := fmt.Sprintf("MODIFY ORDER BY (%s)", strings.Join(oldOrderBys, ", ")) + alters = append(alters, sql) + } } } diff --git a/vendor/yunion.io/x/sqlchemy/backends/dameng/column.go b/vendor/yunion.io/x/sqlchemy/backends/dameng/column.go index 225ba3c7c0..e7f8274c20 100644 --- a/vendor/yunion.io/x/sqlchemy/backends/dameng/column.go +++ b/vendor/yunion.io/x/sqlchemy/backends/dameng/column.go @@ -20,13 +20,11 @@ import ( "fmt" "reflect" "strconv" - "strings" "time" "yunion.io/x/log" "yunion.io/x/pkg/gotypes" "yunion.io/x/pkg/tristate" - "yunion.io/x/pkg/util/timeutils" "yunion.io/x/pkg/utils" "yunion.io/x/sqlchemy" @@ -85,8 +83,8 @@ func (c *SBooleanColumn) DefinitionString() string { // ConvertFromString implementation of SBooleanColumn for IColumnSpec func (c *SBooleanColumn) ConvertFromString(str string) interface{} { - switch strings.ToLower(str) { - case "true", "yes", "on", "ok", "1": + switch sqlchemy.ConvertValueToBool(str) { + case true: return 1 default: return 0 @@ -95,16 +93,12 @@ func (c *SBooleanColumn) ConvertFromString(str string) interface{} { // ConvertFromValue implementation of STristateColumn for IColumnSpec func (c *SBooleanColumn) ConvertFromValue(val interface{}) interface{} { - var bVal bool - if c.IsPointer() { - bVal = *val.(*bool) - } else { - bVal = val.(bool) - } - if bVal { + switch sqlchemy.ConvertValueToBool(val) { + case true: return 1 + default: + return 0 } - return 0 } // IsZero implementation of SBooleanColumn for IColumnSpec @@ -140,24 +134,24 @@ func (c *STristateColumn) DefinitionString() string { // ConvertFromString implementation of STristateColumn for IColumnSpec func (c *STristateColumn) ConvertFromString(str string) interface{} { - switch strings.ToLower(str) { - case "true", "yes", "on", "ok", "1": + switch sqlchemy.ConvertValueToTriState(str) { + case tristate.True: return 1 - case "none", "null", "unknown": - return sql.NullInt32{} - default: + case tristate.False: return 0 + default: + return sql.NullInt32{} } } // ConvertFromValue implementation of STristateColumn for IColumnSpec func (c *STristateColumn) ConvertFromValue(val interface{}) interface{} { - bVal := val.(tristate.TriState) - if bVal == tristate.True { + switch sqlchemy.ConvertValueToTriState(val) { + case tristate.True: return 1 - } else if bVal == tristate.False { + case tristate.False: return 0 - } else { + default: return sql.NullInt32{} } } @@ -234,8 +228,18 @@ func (c *SIntegerColumn) IsZero(val interface{}) bool { // ConvertFromString implementation of SBooleanColumn for IColumnSpec func (c *SIntegerColumn) ConvertFromString(str string) interface{} { - val, _ := strconv.ParseInt(str, 10, 64) - return val + intval := sqlchemy.ConvertValueToInteger(str) + switch c.ColType() { + case "TINYINT": + return int8(intval) + case "SMALLINT": + return int16(intval) + case "INT": + return int(intval) + case "BIGINT": + return int64(intval) + } + panic(fmt.Sprintf("unsupported type %s", c.ColType())) } func (c *SIntegerColumn) IsAutoVersion() bool { @@ -335,8 +339,14 @@ func (c *SFloatColumn) IsZero(val interface{}) bool { // ConvertFromString implementation of SBooleanColumn for IColumnSpec func (c *SFloatColumn) ConvertFromString(str string) interface{} { - val, _ := strconv.ParseFloat(str, 64) - return val + floatVal := sqlchemy.ConvertValueToFloat(str) + switch c.ColType() { + case "FLOAT", "REAL": + return float32(floatVal) + case "DOUBLE": + return floatVal + } + panic(fmt.Sprintf("unsupported type %s", c.ColType())) } // NewFloatColumn returns an instance of SFloatColumn @@ -392,8 +402,7 @@ func (c *SDecimalColumn) IsZero(val interface{}) bool { // ConvertFromString implementation of SBooleanColumn for IColumnSpec func (c *SDecimalColumn) ConvertFromString(str string) interface{} { - val, _ := strconv.ParseFloat(str, 64) - return val + return sqlchemy.ConvertValueToFloat(str) } // NewDecimalColumn returns an instance of SDecimalColumn @@ -498,8 +507,11 @@ func (c *STimeTypeColumn) ColType() string { // ConvertFromString implementation of SBooleanColumn for IColumnSpec func (c *STimeTypeColumn) ConvertFromString(str string) interface{} { - tm, _ := timeutils.ParseTimeStr(str) - return tm + return sqlchemy.ConvertValueToTime(str) +} + +func (c *STimeTypeColumn) ConvertFromValue(val interface{}) interface{} { + return sqlchemy.ConvertValueToTime(val) } // NewTimeTypeColumn return an instance of STimeTypeColumn diff --git a/vendor/yunion.io/x/sqlchemy/backends/dameng/dameng.go b/vendor/yunion.io/x/sqlchemy/backends/dameng/dameng.go index 8afe7b63e3..3a86d474c6 100644 --- a/vendor/yunion.io/x/sqlchemy/backends/dameng/dameng.go +++ b/vendor/yunion.io/x/sqlchemy/backends/dameng/dameng.go @@ -257,7 +257,7 @@ func (dameng *SDamengBackend) GetColumnSpecByFieldType(table *sqlchemy.STableSpe col := NewDecimalColumn(fieldname, tagmap, isPointer) return &col } - colType := "REAL" + colType := "FLOAT" if fieldType == gotypes.Float64Type { colType = "DOUBLE" } diff --git a/vendor/yunion.io/x/sqlchemy/backends/mysql/column.go b/vendor/yunion.io/x/sqlchemy/backends/mysql/column.go index ff42acd1da..dad35e37ba 100644 --- a/vendor/yunion.io/x/sqlchemy/backends/mysql/column.go +++ b/vendor/yunion.io/x/sqlchemy/backends/mysql/column.go @@ -26,7 +26,6 @@ import ( "yunion.io/x/log" "yunion.io/x/pkg/gotypes" "yunion.io/x/pkg/tristate" - "yunion.io/x/pkg/util/timeutils" "yunion.io/x/pkg/utils" "yunion.io/x/sqlchemy" @@ -85,8 +84,8 @@ func (c *SBooleanColumn) DefinitionString() string { // ConvertFromString implementation of SBooleanColumn for IColumnSpec func (c *SBooleanColumn) ConvertFromString(str string) interface{} { - switch strings.ToLower(str) { - case "true", "yes", "on", "ok", "1": + switch sqlchemy.ConvertValueToBool(str) { + case true: return 1 default: return 0 @@ -95,16 +94,12 @@ func (c *SBooleanColumn) ConvertFromString(str string) interface{} { // ConvertFromValue implementation of STristateColumn for IColumnSpec func (c *SBooleanColumn) ConvertFromValue(val interface{}) interface{} { - var bVal bool - if c.IsPointer() { - bVal = *val.(*bool) - } else { - bVal = val.(bool) - } - if bVal { + switch sqlchemy.ConvertValueToBool(val) { + case true: return 1 + default: + return 0 } - return 0 } // IsZero implementation of SBooleanColumn for IColumnSpec @@ -140,24 +135,24 @@ func (c *STristateColumn) DefinitionString() string { // ConvertFromString implementation of STristateColumn for IColumnSpec func (c *STristateColumn) ConvertFromString(str string) interface{} { - switch strings.ToLower(str) { - case "true", "yes", "on", "ok", "1": + switch sqlchemy.ConvertValueToTriState(str) { + case tristate.True: return 1 - case "none", "null", "unknown": - return sql.NullInt32{} - default: + case tristate.False: return 0 + default: + return sql.NullInt32{} } } // ConvertFromValue implementation of STristateColumn for IColumnSpec func (c *STristateColumn) ConvertFromValue(val interface{}) interface{} { - bVal := val.(tristate.TriState) - if bVal == tristate.True { + switch sqlchemy.ConvertValueToTriState(val) { + case tristate.True: return 1 - } else if bVal == tristate.False { + case tristate.False: return 0 - } else { + default: return sql.NullInt32{} } } @@ -232,15 +227,34 @@ func (c *SIntegerColumn) IsZero(val interface{}) bool { return true } +func (c *SIntegerColumn) int2int(intval int64) interface{} { + colType := c.ColType() + parts := strings.Split(colType, "(") + switch parts[0] { + case "TINYINT": + return int8(intval) + case "SMALLINT": + return int16(intval) + case "INT": + return int(intval) + case "BIGINT": + return int64(intval) + case "UNSIGNED TINYINT": + return uint8(intval) + case "UNSIGNED SMALLINT": + return uint16(intval) + case "UNSIGNED INT": + return uint(intval) + case "UNSIGNED BIGINT": + return uint64(intval) + } + panic(fmt.Sprintf("unsupported type %s", c.ColType())) +} + // ConvertFromString implementation of SBooleanColumn for IColumnSpec func (c *SIntegerColumn) ConvertFromString(str string) interface{} { - if c.isUnsigned { - val, _ := strconv.ParseUint(str, 10, 64) - return val - } else { - val, _ := strconv.ParseInt(str, 10, 64) - return val - } + intval := sqlchemy.ConvertValueToInteger(str) + return c.int2int(intval) } // ColType implementation of SIntegerColumn for IColumnSpec @@ -350,8 +364,7 @@ func (c *SFloatColumn) IsZero(val interface{}) bool { // ConvertFromString implementation of SBooleanColumn for IColumnSpec func (c *SFloatColumn) ConvertFromString(str string) interface{} { - val, _ := strconv.ParseFloat(str, 64) - return val + return sqlchemy.ConvertValueToFloat(str) } // NewFloatColumn returns an instance of SFloatColumn @@ -407,8 +420,7 @@ func (c *SDecimalColumn) IsZero(val interface{}) bool { // ConvertFromString implementation of SBooleanColumn for IColumnSpec func (c *SDecimalColumn) ConvertFromString(str string) interface{} { - val, _ := strconv.ParseFloat(str, 64) - return val + return sqlchemy.ConvertValueToFloat(str) } // NewDecimalColumn returns an instance of SDecimalColumn @@ -541,8 +553,12 @@ func (c *STimeTypeColumn) IsZero(val interface{}) bool { // ConvertFromString implementation of SBooleanColumn for IColumnSpec func (c *STimeTypeColumn) ConvertFromString(str string) interface{} { - tm, _ := timeutils.ParseTimeStr(str) - return tm + return sqlchemy.ConvertValueToTime(str) +} + +// ConvertFromValue implementation of STimeTypeColumn for IColumnSpec +func (c *STimeTypeColumn) ConvertFromValue(val interface{}) interface{} { + return sqlchemy.ConvertValueToTime(val) } // NewTimeTypeColumn return an instance of STimeTypeColumn diff --git a/vendor/yunion.io/x/sqlchemy/backends/sqlite/column.go b/vendor/yunion.io/x/sqlchemy/backends/sqlite/column.go index a74d78d97d..fa95a73ca2 100644 --- a/vendor/yunion.io/x/sqlchemy/backends/sqlite/column.go +++ b/vendor/yunion.io/x/sqlchemy/backends/sqlite/column.go @@ -20,12 +20,10 @@ import ( "fmt" "reflect" "strconv" - "strings" "time" "yunion.io/x/pkg/gotypes" "yunion.io/x/pkg/tristate" - "yunion.io/x/pkg/util/timeutils" "yunion.io/x/pkg/utils" "yunion.io/x/sqlchemy" @@ -88,18 +86,15 @@ func (c *SBooleanColumn) DefinitionString() string { // ConvertFromString implementation of SBooleanColumn for IColumnSpec func (c *SBooleanColumn) ConvertFromString(str string) interface{} { - switch strings.ToLower(str) { - case "true", "yes", "on", "ok", "1": + if sqlchemy.ConvertValueToBool(str) { return 1 - default: - return 0 } + return 0 } // ConvertFromValue implementation of STristateColumn for IColumnSpec func (c *SBooleanColumn) ConvertFromValue(val interface{}) interface{} { - bVal := val.(bool) - if bVal { + if sqlchemy.ConvertValueToBool(val) { return 1 } return 0 @@ -138,10 +133,10 @@ func (c *STristateColumn) DefinitionString() string { // ConvertFromString implementation of STristateColumn for IColumnSpec func (c *STristateColumn) ConvertFromString(str string) interface{} { - switch strings.ToLower(str) { - case "true", "yes", "on", "ok", "1": + switch sqlchemy.ConvertValueToTriState(str) { + case tristate.True: return 1 - case "none", "null", "unknown": + case tristate.None: return sql.NullInt32{} default: return 0 @@ -150,12 +145,12 @@ func (c *STristateColumn) ConvertFromString(str string) interface{} { // ConvertFromValue implementation of STristateColumn for IColumnSpec func (c *STristateColumn) ConvertFromValue(val interface{}) interface{} { - bVal := val.(tristate.TriState) - if bVal == tristate.True { + switch sqlchemy.ConvertValueToTriState(val) { + case tristate.True: return 1 - } else if bVal == tristate.None { + case tristate.None: return sql.NullInt32{} - } else { + default: return 0 } } @@ -219,8 +214,7 @@ func (c *SIntegerColumn) IsZero(val interface{}) bool { // ConvertFromString implementation of SBooleanColumn for IColumnSpec func (c *SIntegerColumn) ConvertFromString(str string) interface{} { - val, _ := strconv.ParseInt(str, 10, 64) - return val + return sqlchemy.ConvertValueToInteger(str) } func (c *SIntegerColumn) IsAutoVersion() bool { @@ -316,8 +310,7 @@ func (c *SFloatColumn) IsZero(val interface{}) bool { // ConvertFromString implementation of SBooleanColumn for IColumnSpec func (c *SFloatColumn) ConvertFromString(str string) interface{} { - val, _ := strconv.ParseFloat(str, 64) - return val + return sqlchemy.ConvertValueToFloat(str) } // NewFloatColumn returns an instance of SFloatColumn @@ -403,8 +396,12 @@ func (c *STimeTypeColumn) IsZero(val interface{}) bool { // ConvertFromString implementation of SBooleanColumn for IColumnSpec func (c *STimeTypeColumn) ConvertFromString(str string) interface{} { - tm, _ := timeutils.ParseTimeStr(str) - return tm + return sqlchemy.ConvertValueToTime(str) +} + +// ConvertFromValue implementation of STimeTypeColumn for IColumnSpec +func (c *STimeTypeColumn) ConvertFromValue(val interface{}) interface{} { + return sqlchemy.ConvertValueToTime(val) } // NewTimeTypeColumn return an instance of STimeTypeColumn diff --git a/vendor/yunion.io/x/sqlchemy/conditions.go b/vendor/yunion.io/x/sqlchemy/conditions.go index 6860ccf5a1..91f4080540 100644 --- a/vendor/yunion.io/x/sqlchemy/conditions.go +++ b/vendor/yunion.io/x/sqlchemy/conditions.go @@ -328,7 +328,7 @@ func IsFalse(f IQueryField) ICondition { return &c } -// SNoLaterThanCondition coompares a DATETIME field with current time and ensure the field is no later than now, e.g. a <= NOW() +// SNoLaterThanCondition compares a DATETIME field with current time and ensure the field is no later than now, e.g. a <= NOW() type SNoLaterThanCondition struct { SSingleCondition } @@ -430,15 +430,13 @@ func VarConditionWhereClause(v interface{}) string { } func varConditionVariables(v interface{}) []interface{} { - switch v.(type) { + switch vv := v.(type) { case IQueryField: return []interface{}{} case *SQuery: - q := v.(*SQuery) - return q.Variables() + return vv.Variables() case *SSubQuery: - q := v.(*SSubQuery) - return q.query.Variables() + return vv.query.Variables() default: return reflectutils.ExpandInterface(v) } @@ -462,7 +460,11 @@ func (t *STupleCondition) Variables() []interface{} { if isFieldRequireAscii(t.left) && !isVariableAscii(t.right) { return []interface{}{} } - return varConditionVariables(t.right) + vars := varConditionVariables(t.right) + for i := range vars { + vars[i] = t.left.ConvertFromValue(vars[i]) + } + return vars } // database implementation of STupleCondition for ICondition @@ -710,9 +712,13 @@ type STripleCondition struct { func (t *STripleCondition) Variables() []interface{} { ret := make([]interface{}, 0) vars := varConditionVariables(t.right) - ret = append(ret, vars...) + for i := range vars { + ret = append(ret, t.left.ConvertFromValue(vars[i])) + } vars = varConditionVariables(t.right2) - ret = append(ret, vars...) + for i := range vars { + ret = append(ret, t.left.ConvertFromValue(vars[i])) + } return ret } diff --git a/vendor/yunion.io/x/sqlchemy/functions.go b/vendor/yunion.io/x/sqlchemy/functions.go index 0cfc095f33..9542b67ad6 100644 --- a/vendor/yunion.io/x/sqlchemy/functions.go +++ b/vendor/yunion.io/x/sqlchemy/functions.go @@ -51,6 +51,8 @@ type SFunctionFieldBase struct { alias string aggregate bool + + convertFunc func(interface{}) interface{} } func (ff *SFunctionFieldBase) getQuoteChar() string { @@ -97,6 +99,14 @@ func (ff *SFunctionFieldBase) Variables() []interface{} { return ff.variables() } +// ConvertFromValue implementation of SFunctionFieldBase for IQueryField +func (ff *SFunctionFieldBase) ConvertFromValue(val interface{}) interface{} { + if ff.convertFunc != nil { + return ff.convertFunc(val) + } + return val +} + func (ff *SFunctionFieldBase) IsAggregate() bool { return ff.aggregate } @@ -140,16 +150,21 @@ func (ff *sExprFunction) queryFields() []IQueryField { return ff.fields } -// NewFunctionField returns an instance of query field by calling a SQL embedded function func NewFunctionField(name string, isAggr bool, funcexp string, fields ...IQueryField) IQueryField { + return NewFunctionFieldWithConvert(name, isAggr, funcexp, nil, fields...) +} + +// NewFunctionField returns an instance of query field by calling a SQL embedded function +func NewFunctionFieldWithConvert(name string, isAggr bool, funcexp string, convertFunc func(interface{}) interface{}, fields ...IQueryField) IQueryField { funcBase := &sExprFunction{ fields: fields, function: funcexp, } return &SFunctionFieldBase{ - IFunction: funcBase, - alias: name, - aggregate: isAggr, + IFunction: funcBase, + alias: name, + aggregate: isAggr, + convertFunc: convertFunc, } } @@ -238,6 +253,11 @@ func (s *SConstField) Label(label string) IQueryField { return s } +// ConvertFromValue implementation of SConstField for IQueryField +func (s *SConstField) ConvertFromValue(val interface{}) interface{} { + return val +} + // database implementation of SConstField for IQueryField func (s *SConstField) database() *SDatabase { return nil @@ -287,6 +307,11 @@ func (s *SStringField) Label(label string) IQueryField { return s } +// ConvertFromValue implementation of SStringField for IQueryField +func (s *SStringField) ConvertFromValue(val interface{}) interface{} { + return val +} + // database implementation of SStringField for IQueryField func (s *SStringField) database() *SDatabase { return nil diff --git a/vendor/yunion.io/x/sqlchemy/querydefs.go b/vendor/yunion.io/x/sqlchemy/querydefs.go index f739985480..e9dbb0654d 100644 --- a/vendor/yunion.io/x/sqlchemy/querydefs.go +++ b/vendor/yunion.io/x/sqlchemy/querydefs.go @@ -81,6 +81,9 @@ type IQueryField interface { // return variables Variables() []interface{} + // ConvertFromValue returns the SQL representation of a value for this + ConvertFromValue(val interface{}) interface{} + // Database returns the database of this IQuerySource database() *SDatabase } diff --git a/vendor/yunion.io/x/sqlchemy/queryfield.go b/vendor/yunion.io/x/sqlchemy/queryfield.go index ea72a132b8..382a3fdae6 100644 --- a/vendor/yunion.io/x/sqlchemy/queryfield.go +++ b/vendor/yunion.io/x/sqlchemy/queryfield.go @@ -53,6 +53,15 @@ func (sqf *sQueryField) Variables() []interface{} { return nil } +// ConvertFromValue returns the SQL representation of a value for this +func (sqf *sQueryField) ConvertFromValue(val interface{}) interface{} { + field := sqf.from.Field(sqf.name) + if field == nil { + return val + } + return field.ConvertFromValue(val) +} + // Database returns the database of this IQuerySource func (sqf *sQueryField) database() *SDatabase { return sqf.from.database() diff --git a/vendor/yunion.io/x/sqlchemy/rawquery.go b/vendor/yunion.io/x/sqlchemy/rawquery.go index 854513c2ba..8d411cb796 100644 --- a/vendor/yunion.io/x/sqlchemy/rawquery.go +++ b/vendor/yunion.io/x/sqlchemy/rawquery.go @@ -48,6 +48,11 @@ func (rqf *SRawQueryField) Variables() []interface{} { return nil } +// ConvertFromValue implementation of SRawQueryField for IQueryField +func (rqf *SRawQueryField) ConvertFromValue(val interface{}) interface{} { + return val +} + func (rqf *SRawQueryField) database() *SDatabase { return rqf.db } diff --git a/vendor/yunion.io/x/sqlchemy/reflect.go b/vendor/yunion.io/x/sqlchemy/reflect.go index 2dd74fc468..ddba6381f8 100644 --- a/vendor/yunion.io/x/sqlchemy/reflect.go +++ b/vendor/yunion.io/x/sqlchemy/reflect.go @@ -202,3 +202,517 @@ func setValueBySQLString(value reflect.Value, val string) error { } } } + +func ConvertValueToTime(val interface{}) time.Time { + switch v := val.(type) { + case string: + tm, _ := timeutils.ParseTimeStr(v) + return tm + case time.Time: + return v + case int: + return time.Unix(int64(v), 0) + case int32: + return time.Unix(int64(v), 0) + case int64: + return time.Unix(int64(v), 0) + case uint: + return time.Unix(int64(v), 0) + case uint32: + return time.Unix(int64(v), 0) + case uint64: + return time.Unix(int64(v), 0) + case float32: + return time.Unix(int64(v), int64((v-float32(int64(v)))*1000000000)) + case float64: + return time.Unix(int64(v), int64((v-float64(int64(v)))*1000000000)) + case *string: + tm, _ := timeutils.ParseTimeStr(*v) + return tm + case *time.Time: + return *v + case *int: + return time.Unix(int64(*v), 0) + case *int32: + return time.Unix(int64(*v), 0) + case *int64: + return time.Unix(int64(*v), 0) + case *uint: + return time.Unix(int64(*v), 0) + case *uint32: + return time.Unix(int64(*v), 0) + case *uint64: + return time.Unix(int64(*v), 0) + case *float32: + return time.Unix(int64(*v), int64((*v-float32(int64(*v)))*1000000000)) + case *float64: + return time.Unix(int64(*v), int64((*v-float64(int64(*v)))*1000000000)) + } + return time.Time{} +} + +func ConvertValueToInteger(val interface{}) int64 { + switch v := val.(type) { + case string: + intv, _ := strconv.ParseInt(v, 10, 64) + return intv + case int: + return int64(v) + case int32: + return int64(v) + case int64: + return v + case uint: + return int64(v) + case uint32: + return int64(v) + case uint64: + return int64(v) + case float32: + return int64(v) + case float64: + return int64(v) + case time.Time: + return v.Unix() + case *string: + intv, _ := strconv.ParseInt(*v, 10, 64) + return intv + case *int: + return int64(*v) + case *int32: + return int64(*v) + case *int64: + return *v + case *uint: + return int64(*v) + case *uint32: + return int64(*v) + case *uint64: + return int64(*v) + case *float32: + return int64(*v) + case *float64: + return int64(*v) + case *time.Time: + return v.Unix() + } + return 0 +} + +func ConvertValueToFloat(val interface{}) float64 { + switch v := val.(type) { + case string: + intv, _ := strconv.ParseFloat(v, 64) + return intv + case int: + return float64(v) + case int32: + return float64(v) + case int64: + return float64(v) + case uint: + return float64(v) + case uint32: + return float64(v) + case uint64: + return float64(v) + case float32: + return float64(v) + case float64: + return v + case time.Time: + return float64(v.Unix()) + case *string: + intv, _ := strconv.ParseFloat(*v, 64) + return intv + case *int: + return float64(*v) + case *int32: + return float64(*v) + case *int64: + return float64(*v) + case *uint: + return float64(*v) + case *uint32: + return float64(*v) + case *uint64: + return float64(*v) + case *float32: + return float64(*v) + case *float64: + return *v + case *time.Time: + return float64(v.Unix()) + } + + return 0 +} + +func ConvertValueToBool(val interface{}) bool { + switch v := val.(type) { + case string: + v = strings.ToLower(v) + return v == "1" || v == "true" || v == "ok" || v == "yes" || v == "on" + case bool: + return v + case tristate.TriState: + return v == tristate.True + case int8: + return v > 0 + case int16: + return v > 0 + case int: + return v > 0 + case int32: + return v > 0 + case int64: + return v > 0 + case uint8: + return v > 0 + case uint16: + return v > 0 + case uint: + return v > 0 + case uint32: + return v > 0 + case uint64: + return v > 0 + case float32: + return v > 0 + case float64: + return v > 0 + case *string: + nv := strings.ToLower(*v) + return nv == "1" || nv == "true" || nv == "ok" || nv == "yes" || nv == "on" + case *bool: + return *v + case *tristate.TriState: + return *v == tristate.True + case *int8: + return *v > 0 + case *int16: + return *v > 0 + case *int: + return *v > 0 + case *int32: + return *v > 0 + case *int64: + return *v > 0 + case *uint8: + return *v > 0 + case *uint16: + return *v > 0 + case *uint: + return *v > 0 + case *uint32: + return *v > 0 + case *uint64: + return *v > 0 + case *float32: + return *v > 0 + case *float64: + return *v > 0 + } + return false +} + +func ConvertValueToTriState(val interface{}) tristate.TriState { + switch v := val.(type) { + case tristate.TriState: + return v + case string: + switch strings.ToLower(v) { + case "true", "yes", "on", "ok", "1": + return tristate.True + case "none", "null", "unknown": + return tristate.None + default: + return tristate.False + } + case bool: + if v { + return tristate.True + } else { + return tristate.False + } + case int8: + switch { + case v > 0: + return tristate.True + case v < 0: + return tristate.False + default: + return tristate.None + } + case int16: + switch { + case v > 0: + return tristate.True + case v < 0: + return tristate.False + default: + return tristate.None + } + case int: + switch { + case v > 0: + return tristate.True + case v < 0: + return tristate.False + default: + return tristate.None + } + case int32: + switch { + case v > 0: + return tristate.True + case v < 0: + return tristate.False + default: + return tristate.None + } + case int64: + switch { + case v > 0: + return tristate.True + case v < 0: + return tristate.False + default: + return tristate.None + } + case uint8: + switch { + case v > 0: + return tristate.True + case v < 0: + return tristate.False + default: + return tristate.None + } + case uint16: + switch { + case v > 0: + return tristate.True + case v < 0: + return tristate.False + default: + return tristate.None + } + case uint: + switch { + case v > 0: + return tristate.True + case v < 0: + return tristate.False + default: + return tristate.None + } + case uint32: + switch { + case v > 0: + return tristate.True + case v < 0: + return tristate.False + default: + return tristate.None + } + case uint64: + switch { + case v > 0: + return tristate.True + case v < 0: + return tristate.False + default: + return tristate.None + } + case float32: + switch { + case v > 0: + return tristate.True + case v < 0: + return tristate.False + default: + return tristate.None + } + case float64: + switch { + case v > 0: + return tristate.True + case v < 0: + return tristate.False + default: + return tristate.None + } + case *string: + switch strings.ToLower(*v) { + case "true", "yes", "on", "ok", "1": + return tristate.True + case "none", "null", "unknown": + return tristate.None + default: + return tristate.False + } + case *bool: + if *v { + return tristate.True + } else { + return tristate.False + } + case *tristate.TriState: + return *v + case *int8: + switch { + case *v > 0: + return tristate.True + case *v < 0: + return tristate.False + default: + return tristate.None + } + case *int: + switch { + case *v > 0: + return tristate.True + case *v < 0: + return tristate.False + default: + return tristate.None + } + case *int32: + switch { + case *v > 0: + return tristate.True + case *v < 0: + return tristate.False + default: + return tristate.None + } + case *int64: + switch { + case *v > 0: + return tristate.True + case *v < 0: + return tristate.False + default: + return tristate.None + } + case *uint8: + switch { + case *v > 0: + return tristate.True + case *v < 0: + return tristate.False + default: + return tristate.None + } + case *uint16: + switch { + case *v > 0: + return tristate.True + case *v < 0: + return tristate.False + default: + return tristate.None + } + case *uint: + switch { + case *v > 0: + return tristate.True + case *v < 0: + return tristate.False + default: + return tristate.None + } + case *uint32: + switch { + case *v > 0: + return tristate.True + case *v < 0: + return tristate.False + default: + return tristate.None + } + case *uint64: + switch { + case *v > 0: + return tristate.True + case *v < 0: + return tristate.False + default: + return tristate.None + } + case *float32: + switch { + case *v > 0: + return tristate.True + case *v < 0: + return tristate.False + default: + return tristate.None + } + case *float64: + switch { + case *v > 0: + return tristate.True + case *v < 0: + return tristate.False + default: + return tristate.None + } + } + return tristate.None +} + +func ConvertValueToString(val interface{}) string { + if gotypes.IsNil(val) { + return "" + } + switch v := val.(type) { + case string: + return v + case int8, int16, int, int32, int64, uint8, uint16, uint, uint32, uint64: + return fmt.Sprintf("%d", v) + case float32, float64: + return fmt.Sprintf("%f", v) + case bool: + return fmt.Sprintf("%v", v) + case time.Time: + return timeutils.IsoTime(v) + case *string: + return *v + case *int8: + return fmt.Sprintf("%d", *v) + case *int16: + return fmt.Sprintf("%d", *v) + case *int: + return fmt.Sprintf("%d", *v) + case *int32: + return fmt.Sprintf("%d", *v) + case *int64: + return fmt.Sprintf("%d", *v) + case *uint8: + return fmt.Sprintf("%d", *v) + case *uint16: + return fmt.Sprintf("%d", *v) + case *uint: + return fmt.Sprintf("%d", *v) + case *uint32: + return fmt.Sprintf("%d", *v) + case *uint64: + return fmt.Sprintf("%d", *v) + case *float32: + return fmt.Sprintf("%f", *v) + case *float64: + return fmt.Sprintf("%f", *v) + case *time.Time: + return timeutils.IsoTime(*v) + case tristate.TriState: + return v.String() + case *tristate.TriState: + return (*v).String() + } + if reflect.ValueOf(val).Kind() == reflect.String { + return val.(string) + } + return jsonutils.Marshal(val).String() +} diff --git a/vendor/yunion.io/x/sqlchemy/subquery.go b/vendor/yunion.io/x/sqlchemy/subquery.go index ee60682b27..46e8687de9 100644 --- a/vendor/yunion.io/x/sqlchemy/subquery.go +++ b/vendor/yunion.io/x/sqlchemy/subquery.go @@ -62,6 +62,11 @@ func (sqf *SSubQueryField) Variables() []interface{} { return nil } +// ConvertFromValue implementation of SSubQueryField for IQueryField +func (sqf *SSubQueryField) ConvertFromValue(val interface{}) interface{} { + return sqf.field.ConvertFromValue(val) +} + // database implementation of SSubQueryField for IQueryField func (sqf *SSubQueryField) database() *SDatabase { return sqf.query.database() diff --git a/vendor/yunion.io/x/sqlchemy/table.go b/vendor/yunion.io/x/sqlchemy/table.go index d3fb891324..7eac721c8d 100644 --- a/vendor/yunion.io/x/sqlchemy/table.go +++ b/vendor/yunion.io/x/sqlchemy/table.go @@ -424,6 +424,11 @@ func (c *STableField) Variables() []interface{} { return nil } +// ConvertFromValue implementation of STableField for IQueryField +func (c *STableField) ConvertFromValue(val interface{}) interface{} { + return c.spec.ConvertFromValue(val) +} + // database implementation of STableField for IQueryField func (c *STableField) database() *SDatabase { return c.table.database() diff --git a/vendor/yunion.io/x/sqlchemy/union.go b/vendor/yunion.io/x/sqlchemy/union.go index 0289817363..32edcb076c 100644 --- a/vendor/yunion.io/x/sqlchemy/union.go +++ b/vendor/yunion.io/x/sqlchemy/union.go @@ -67,6 +67,17 @@ func (sqf *SUnionQueryField) Variables() []interface{} { return nil } +// ConvertFromValue implementation of SUnionQueryField for IQueryField +func (sqf *SUnionQueryField) ConvertFromValue(val interface{}) interface{} { + for _, query := range sqf.union.queries { + field := query.Field(sqf.name) + if field != nil { + return field.ConvertFromValue(val) + } + } + return val +} + func (sqf *SUnionQueryField) database() *SDatabase { return sqf.union.database() }