Skip to content

Commit 753acd6

Browse files
author
Qiu Jian
committed
fix: IQueryField support ConvertFromValue
1 parent 2f8e0af commit 753acd6

14 files changed

Lines changed: 741 additions & 151 deletions

File tree

backends/clickhouse/column.go

Lines changed: 44 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,11 @@ import (
2020
"fmt"
2121
"reflect"
2222
"strconv"
23-
"strings"
2423
"time"
2524

2625
"yunion.io/x/log"
2726
"yunion.io/x/pkg/gotypes"
2827
"yunion.io/x/pkg/tristate"
29-
"yunion.io/x/pkg/util/timeutils"
3028
"yunion.io/x/pkg/utils"
3129

3230
"yunion.io/x/sqlchemy"
@@ -157,8 +155,8 @@ func (c *SBooleanColumn) DefinitionString() string {
157155

158156
// ConvertFromString implementation of SBooleanColumn for IColumnSpec
159157
func (c *SBooleanColumn) ConvertFromString(str string) interface{} {
160-
switch strings.ToLower(str) {
161-
case "true", "yes", "on", "ok", "1":
158+
switch sqlchemy.ConvertValueToBool(str) {
159+
case true:
162160
return uint8(1)
163161
default:
164162
return uint8(0)
@@ -167,11 +165,12 @@ func (c *SBooleanColumn) ConvertFromString(str string) interface{} {
167165

168166
// ConvertFromValue implementation of STristateColumn for IColumnSpec
169167
func (c *SBooleanColumn) ConvertFromValue(val interface{}) interface{} {
170-
bVal := val.(bool)
171-
if bVal {
168+
switch sqlchemy.ConvertValueToBool(val) {
169+
case true:
172170
return uint8(1)
171+
default:
172+
return uint8(0)
173173
}
174-
return uint8(0)
175174
}
176175

177176
// IsZero implementation of SBooleanColumn for IColumnSpec
@@ -207,24 +206,24 @@ func (c *STristateColumn) DefinitionString() string {
207206

208207
// ConvertFromString implementation of STristateColumn for IColumnSpec
209208
func (c *STristateColumn) ConvertFromString(str string) interface{} {
210-
switch strings.ToLower(str) {
211-
case "true", "yes", "on", "ok", "1":
209+
switch sqlchemy.ConvertValueToTriState(str) {
210+
case tristate.True:
212211
return uint8(1)
213-
case "none", "null", "unknown":
214-
return sql.NullInt32{}
215-
default:
212+
case tristate.False:
216213
return uint8(0)
214+
default:
215+
return sql.NullInt32{}
217216
}
218217
}
219218

220219
// ConvertFromValue implementation of STristateColumn for IColumnSpec
221220
func (c *STristateColumn) ConvertFromValue(val interface{}) interface{} {
222-
bVal := val.(tristate.TriState)
223-
if bVal == tristate.True {
221+
switch sqlchemy.ConvertValueToTriState(val) {
222+
case tristate.True:
224223
return uint8(1)
225-
} else if bVal == tristate.False {
224+
case tristate.False:
226225
return uint8(0)
227-
} else {
226+
default:
228227
return sql.NullInt32{}
229228
}
230229
}
@@ -282,37 +281,12 @@ func (c *SIntegerColumn) IsZero(val interface{}) bool {
282281

283282
// ConvertFromString implementation of STristateColumn for IColumnSpec
284283
func (c *SIntegerColumn) ConvertFromString(str string) interface{} {
285-
ctype := c.SBaseColumn.ColType()
286-
if ctype[0] == 'U' {
287-
// unsigned
288-
val, _ := strconv.ParseUint(str, 10, 64)
289-
switch ctype {
290-
case "UInt8":
291-
return uint8(val)
292-
case "UInt16":
293-
return uint16(val)
294-
case "UInt32":
295-
return uint32(val)
296-
case "UInt64":
297-
return val
298-
default:
299-
panic(fmt.Sprintf("unsupported type %s", ctype))
300-
}
301-
} else {
302-
val, _ := strconv.ParseInt(str, 10, 64)
303-
switch ctype {
304-
case "Int8":
305-
return int8(val)
306-
case "Int16":
307-
return int16(val)
308-
case "Int32":
309-
return int32(val)
310-
case "Int64":
311-
return val
312-
default:
313-
panic(fmt.Sprintf("unsupported type %s", ctype))
314-
}
315-
}
284+
return sqlchemy.ConvertValueToInteger(str)
285+
}
286+
287+
// ConvertFromValue implementation of SIntegerColumn for IColumnSpec
288+
func (c *SIntegerColumn) ConvertFromValue(val interface{}) interface{} {
289+
return sqlchemy.ConvertValueToInteger(val)
316290
}
317291

318292
// IsAutoVersion implements IsAutoVersion for IColumnSpec
@@ -374,16 +348,12 @@ func (c *SFloatColumn) IsZero(val interface{}) bool {
374348

375349
// ConvertFromString implementation of STristateColumn for IColumnSpec
376350
func (c *SFloatColumn) ConvertFromString(str string) interface{} {
377-
ctype := c.SBaseColumn.ColType()
378-
val, _ := strconv.ParseFloat(str, 64)
379-
switch ctype {
380-
case "Float32":
381-
return float32(val)
382-
case "Float64":
383-
return val
384-
default:
385-
panic(fmt.Sprintf("unsupported type %s", ctype))
386-
}
351+
return sqlchemy.ConvertValueToFloat(str)
352+
}
353+
354+
// ConvertFromValue implementation of SFloatColumn for IColumnSpec
355+
func (c *SFloatColumn) ConvertFromValue(val interface{}) interface{} {
356+
return sqlchemy.ConvertValueToFloat(val)
387357
}
388358

389359
// NewFloatColumn returns an instance of SFloatColumn
@@ -442,8 +412,12 @@ func (c *SDecimalColumn) IsZero(val interface{}) bool {
442412

443413
// ConvertFromString implementation of STristateColumn for IColumnSpec
444414
func (c *SDecimalColumn) ConvertFromString(str string) interface{} {
445-
val, _ := strconv.ParseFloat(str, 64)
446-
return val
415+
return sqlchemy.ConvertValueToFloat(str)
416+
}
417+
418+
// ConvertFromValue implementation of SDecimalColumn for IColumnSpec
419+
func (c *SDecimalColumn) ConvertFromValue(val interface{}) interface{} {
420+
return sqlchemy.ConvertValueToFloat(val)
447421
}
448422

449423
// NewDecimalColumn returns an instance of SDecimalColumn
@@ -527,6 +501,11 @@ func (c *STextColumn) ConvertFromString(str string) interface{} {
527501
return str
528502
}
529503

504+
// ConvertFromValue implementation of STextColumn for IColumnSpec
505+
func (c *STextColumn) ConvertFromValue(val interface{}) interface{} {
506+
return sqlchemy.ConvertValueToString(val)
507+
}
508+
530509
// NewTextColumn return an instance of STextColumn
531510
func NewTextColumn(name string, sqlType string, tagmap map[string]string, isPointer bool) STextColumn {
532511
return STextColumn{
@@ -564,8 +543,12 @@ func (c *STimeTypeColumn) IsZero(val interface{}) bool {
564543

565544
// ConvertFromString implementation of STristateColumn for IColumnSpec
566545
func (c *STimeTypeColumn) ConvertFromString(str string) interface{} {
567-
tm, _ := timeutils.ParseTimeStr(str)
568-
return tm
546+
return sqlchemy.ConvertValueToTime(str)
547+
}
548+
549+
// ConvertFromValue implementation of STimeTypeColumn for IColumnSpec
550+
func (c *STimeTypeColumn) ConvertFromValue(val interface{}) interface{} {
551+
return sqlchemy.ConvertValueToTime(val)
569552
}
570553

571554
func (c *STimeTypeColumn) GetTTL() (int, string) {

backends/clickhouse/sync.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ func (clickhouse *SClickhouseBackend) CommitTableChangeSQL(ts sqlchemy.ITableSpe
164164
if oldTtlSpec != newTtlSpec {
165165
if oldTtlSpec.Count > 0 && newTtlSpec.Count == 0 {
166166
// remove
167-
sql := fmt.Sprintf("REMOVE TTL")
167+
sql := "REMOVE TTL"
168168
alters = append(alters, sql)
169169
} else {
170170
// alter

backends/dameng/column.go

Lines changed: 43 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,11 @@ import (
2020
"fmt"
2121
"reflect"
2222
"strconv"
23-
"strings"
2423
"time"
2524

2625
"yunion.io/x/log"
2726
"yunion.io/x/pkg/gotypes"
2827
"yunion.io/x/pkg/tristate"
29-
"yunion.io/x/pkg/util/timeutils"
3028
"yunion.io/x/pkg/utils"
3129

3230
"yunion.io/x/sqlchemy"
@@ -85,8 +83,8 @@ func (c *SBooleanColumn) DefinitionString() string {
8583

8684
// ConvertFromString implementation of SBooleanColumn for IColumnSpec
8785
func (c *SBooleanColumn) ConvertFromString(str string) interface{} {
88-
switch strings.ToLower(str) {
89-
case "true", "yes", "on", "ok", "1":
86+
switch sqlchemy.ConvertValueToBool(str) {
87+
case true:
9088
return 1
9189
default:
9290
return 0
@@ -95,16 +93,12 @@ func (c *SBooleanColumn) ConvertFromString(str string) interface{} {
9593

9694
// ConvertFromValue implementation of STristateColumn for IColumnSpec
9795
func (c *SBooleanColumn) ConvertFromValue(val interface{}) interface{} {
98-
var bVal bool
99-
if c.IsPointer() {
100-
bVal = *val.(*bool)
101-
} else {
102-
bVal = val.(bool)
103-
}
104-
if bVal {
96+
switch sqlchemy.ConvertValueToBool(val) {
97+
case true:
10598
return 1
99+
default:
100+
return 0
106101
}
107-
return 0
108102
}
109103

110104
// IsZero implementation of SBooleanColumn for IColumnSpec
@@ -140,24 +134,24 @@ func (c *STristateColumn) DefinitionString() string {
140134

141135
// ConvertFromString implementation of STristateColumn for IColumnSpec
142136
func (c *STristateColumn) ConvertFromString(str string) interface{} {
143-
switch strings.ToLower(str) {
144-
case "true", "yes", "on", "ok", "1":
137+
switch sqlchemy.ConvertValueToTriState(str) {
138+
case tristate.True:
145139
return 1
146-
case "none", "null", "unknown":
147-
return sql.NullInt32{}
148-
default:
140+
case tristate.False:
149141
return 0
142+
default:
143+
return sql.NullInt32{}
150144
}
151145
}
152146

153147
// ConvertFromValue implementation of STristateColumn for IColumnSpec
154148
func (c *STristateColumn) ConvertFromValue(val interface{}) interface{} {
155-
bVal := val.(tristate.TriState)
156-
if bVal == tristate.True {
149+
switch sqlchemy.ConvertValueToTriState(val) {
150+
case tristate.True:
157151
return 1
158-
} else if bVal == tristate.False {
152+
case tristate.False:
159153
return 0
160-
} else {
154+
default:
161155
return sql.NullInt32{}
162156
}
163157
}
@@ -234,8 +228,12 @@ func (c *SIntegerColumn) IsZero(val interface{}) bool {
234228

235229
// ConvertFromString implementation of SBooleanColumn for IColumnSpec
236230
func (c *SIntegerColumn) ConvertFromString(str string) interface{} {
237-
val, _ := strconv.ParseInt(str, 10, 64)
238-
return val
231+
return sqlchemy.ConvertValueToInteger(str)
232+
}
233+
234+
// ConvertFromValue implementation of SIntegerColumn for IColumnSpec
235+
func (c *SIntegerColumn) ConvertFromValue(val interface{}) interface{} {
236+
return sqlchemy.ConvertValueToInteger(val)
239237
}
240238

241239
func (c *SIntegerColumn) IsAutoVersion() bool {
@@ -335,8 +333,12 @@ func (c *SFloatColumn) IsZero(val interface{}) bool {
335333

336334
// ConvertFromString implementation of SBooleanColumn for IColumnSpec
337335
func (c *SFloatColumn) ConvertFromString(str string) interface{} {
338-
val, _ := strconv.ParseFloat(str, 64)
339-
return val
336+
return sqlchemy.ConvertValueToFloat(str)
337+
}
338+
339+
// ConvertFromValue implementation of SFloatColumn for IColumnSpec
340+
func (c *SFloatColumn) ConvertFromValue(val interface{}) interface{} {
341+
return sqlchemy.ConvertValueToFloat(val)
340342
}
341343

342344
// NewFloatColumn returns an instance of SFloatColumn
@@ -392,8 +394,12 @@ func (c *SDecimalColumn) IsZero(val interface{}) bool {
392394

393395
// ConvertFromString implementation of SBooleanColumn for IColumnSpec
394396
func (c *SDecimalColumn) ConvertFromString(str string) interface{} {
395-
val, _ := strconv.ParseFloat(str, 64)
396-
return val
397+
return sqlchemy.ConvertValueToFloat(str)
398+
}
399+
400+
// ConvertFromValue implementation of SDecimalColumn for IColumnSpec
401+
func (c *SDecimalColumn) ConvertFromValue(val interface{}) interface{} {
402+
return sqlchemy.ConvertValueToFloat(val)
397403
}
398404

399405
// NewDecimalColumn returns an instance of SDecimalColumn
@@ -451,6 +457,11 @@ func (c *STextColumn) ConvertFromString(str string) interface{} {
451457
return str
452458
}
453459

460+
// ConvertFromValue implementation of STextColumn for IColumnSpec
461+
func (c *STextColumn) ConvertFromValue(val interface{}) interface{} {
462+
return sqlchemy.ConvertValueToString(val)
463+
}
464+
454465
func (c *STextColumn) IsString() bool {
455466
return true
456467
}
@@ -498,8 +509,11 @@ func (c *STimeTypeColumn) ColType() string {
498509

499510
// ConvertFromString implementation of SBooleanColumn for IColumnSpec
500511
func (c *STimeTypeColumn) ConvertFromString(str string) interface{} {
501-
tm, _ := timeutils.ParseTimeStr(str)
502-
return tm
512+
return sqlchemy.ConvertValueToTime(str)
513+
}
514+
515+
func (c *STimeTypeColumn) ConvertFromValue(val interface{}) interface{} {
516+
return sqlchemy.ConvertValueToTime(val)
503517
}
504518

505519
// NewTimeTypeColumn return an instance of STimeTypeColumn

0 commit comments

Comments
 (0)