@@ -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
159157func (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
169167func (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
209208func (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
221220func (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
284283func (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
376350func (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
444414func (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
531510func 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
566545func (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
571554func (c *STimeTypeColumn) GetTTL() (int, string) {
0 commit comments