func()

in pkg/datasource/sql/types/image.go [207:271]


func (c *ColumnImage) UnmarshalJSON(data []byte) error {
	var err error
	tmpImage := make(map[string]interface{})
	if err := json.Unmarshal(data, &tmpImage); err != nil {
		return err
	}
	var (
		keyType     string
		columnType  int16
		columnName  string
		value       interface{}
		actualValue interface{}
	)
	keyType = tmpImage["keyType"].(string)
	columnType = int16(int64(tmpImage["type"].(float64)))
	columnName = tmpImage["name"].(string)
	value = tmpImage["value"]

	if value != nil {
		switch JDBCType(columnType) {
		case JDBCTypeReal: // 4 Bytes
			actualValue = value.(float32)
		case JDBCTypeDecimal, JDBCTypeDouble: // 8 Bytes
			actualValue = value.(float64)
		case JDBCTypeTinyInt: // 1 Bytes
			actualValue = int8(value.(float64))
		case JDBCTypeSmallInt: // 2 Bytes
			actualValue = int16(value.(float64))
		case JDBCTypeInteger: // 4 Bytes
			actualValue = int32(value.(float64))
		case JDBCTypeBigInt: // 8Bytes
			actualValue = int64(value.(float64))
		case JDBCTypeTimestamp: // 4 Bytes
			actualValue, err = time.Parse(time.RFC3339Nano, value.(string))
			if err != nil {
				return err
			}
		case JDBCTypeDate: // 3Bytes
			actualValue, err = time.Parse(time.RFC3339Nano, value.(string))
			if err != nil {
				return err
			}
		case JDBCTypeTime: // 3Bytes
			actualValue, err = time.Parse(time.RFC3339Nano, value.(string))
			if err != nil {
				return err
			}
		case JDBCTypeChar, JDBCTypeVarchar, JDBCTypeLongVarchar:
			var val []byte
			if val, err = base64.StdEncoding.DecodeString(value.(string)); err != nil {
				val = []byte(value.(string))
			}
			actualValue = string(val)
		case JDBCTypeBinary, JDBCTypeVarBinary, JDBCTypeLongVarBinary, JDBCTypeBit:
			actualValue = value
		}
	}
	*c = ColumnImage{
		KeyType:    ParseIndexType(keyType),
		ColumnName: columnName,
		ColumnType: JDBCType(columnType),
		Value:      actualValue,
	}
	return nil
}