fix(region): vendor update (#22453)

This commit is contained in:
屈轩
2025-04-23 14:12:07 +08:00
committed by GitHub
parent 2858568942
commit 0dc71bfa7e
25 changed files with 816 additions and 216 deletions
+1 -1
View File
@@ -100,7 +100,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
)
+2 -2
View File
@@ -1395,7 +1395,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=
+2
View File
@@ -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)
+2
View File
@@ -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,
}
+2
View File
@@ -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,
+2
View File
@@ -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)
+1 -2
View File
@@ -1910,7 +1910,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
@@ -1937,7 +1936,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
-15
View File
@@ -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"
-24
View File
@@ -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()))
}
+7 -7
View File
@@ -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,
+46 -57
View File
@@ -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) {
+46 -11
View File
@@ -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)
}
}
}
+41 -29
View File
@@ -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
+1 -1
View File
@@ -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"
}
+49 -33
View File
@@ -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
+18 -21
View File
@@ -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
+15 -9
View File
@@ -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
}
+29 -4
View File
@@ -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
+3
View File
@@ -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
}
+9
View File
@@ -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()
+5
View File
@@ -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
}
+514
View File
@@ -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()
}
+5
View File
@@ -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()
+5
View File
@@ -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()
+11
View File
@@ -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()
}