| |
| |
| |
|
|
| package db |
|
|
| import ( |
| "fmt" |
| "html/template" |
| "strconv" |
| ) |
|
|
| |
| type DatabaseType string |
|
|
| const ( |
| |
| |
| |
|
|
| Int DatabaseType = "INT" |
| Tinyint DatabaseType = "TINYINT" |
| Mediumint DatabaseType = "MEDIUMINT" |
| Smallint DatabaseType = "SMALLINT" |
| Bigint DatabaseType = "BIGINT" |
| Bit DatabaseType = "BIT" |
| Int8 DatabaseType = "INT8" |
| Int4 DatabaseType = "INT4" |
| Int2 DatabaseType = "INT2" |
|
|
| Integer DatabaseType = "INTEGER" |
| Numeric DatabaseType = "NUMERIC" |
| Smallserial DatabaseType = "SMALLSERIAL" |
| Serial DatabaseType = "SERIAL" |
| Bigserial DatabaseType = "BIGSERIAL" |
| Money DatabaseType = "MONEY" |
|
|
| |
| |
| |
|
|
| Real DatabaseType = "REAL" |
| Float DatabaseType = "FLOAT" |
| Float4 DatabaseType = "FLOAT4" |
| Float8 DatabaseType = "FLOAT8" |
| Double DatabaseType = "DOUBLE" |
| Decimal DatabaseType = "DECIMAL" |
|
|
| Doubleprecision DatabaseType = "DOUBLEPRECISION" |
|
|
| |
| |
| |
|
|
| Date DatabaseType = "DATE" |
| Time DatabaseType = "TIME" |
| Year DatabaseType = "YEAR" |
| Datetime DatabaseType = "DATETIME" |
| Timestamp DatabaseType = "TIMESTAMP" |
|
|
| Text DatabaseType = "TEXT" |
| Longtext DatabaseType = "LONGTEXT" |
| Mediumtext DatabaseType = "MEDIUMTEXT" |
| Tinytext DatabaseType = "TINYTEXT" |
|
|
| Varchar DatabaseType = "VARCHAR" |
| Char DatabaseType = "CHAR" |
| Bpchar DatabaseType = "BPCHAR" |
| JSON DatabaseType = "JSON" |
|
|
| Blob DatabaseType = "BLOB" |
| Tinyblob DatabaseType = "TINYBLOB" |
| Mediumblob DatabaseType = "MEDIUMBLOB" |
| Longblob DatabaseType = "LONGBLOB" |
|
|
| Interval DatabaseType = "INTERVAL" |
| Boolean DatabaseType = "BOOLEAN" |
| Bool DatabaseType = "BOOL" |
|
|
| Point DatabaseType = "POINT" |
| Line DatabaseType = "LINE" |
| Lseg DatabaseType = "LSEG" |
| Box DatabaseType = "BOX" |
| Path DatabaseType = "PATH" |
| Polygon DatabaseType = "POLYGON" |
| Circle DatabaseType = "CIRCLE" |
|
|
| Cidr DatabaseType = "CIDR" |
| Inet DatabaseType = "INET" |
| Macaddr DatabaseType = "MACADDR" |
|
|
| Character DatabaseType = "CHARACTER" |
| Varyingcharacter DatabaseType = "VARYINGCHARACTER" |
| Nchar DatabaseType = "NCHAR" |
| Nativecharacter DatabaseType = "NATIVECHARACTER" |
| Nvarchar DatabaseType = "NVARCHAR" |
| Clob DatabaseType = "CLOB" |
|
|
| Binary DatabaseType = "BINARY" |
| Varbinary DatabaseType = "VARBINARY" |
| Enum DatabaseType = "ENUM" |
| Set DatabaseType = "SET" |
|
|
| Geometry DatabaseType = "GEOMETRY" |
|
|
| Multilinestring DatabaseType = "MULTILINESTRING" |
| Multipolygon DatabaseType = "MULTIPOLYGON" |
| Linestring DatabaseType = "LINESTRING" |
| Multipoint DatabaseType = "MULTIPOINT" |
| Geometrycollection DatabaseType = "GEOMETRYCOLLECTION" |
|
|
| Name DatabaseType = "NAME" |
| UUID DatabaseType = "UUID" |
|
|
| Timestamptz DatabaseType = "TIMESTAMPTZ" |
| Timetz DatabaseType = "TIMETZ" |
| ) |
|
|
| |
| func DT(s string) DatabaseType { |
| return DatabaseType(s) |
| } |
|
|
| |
| func GetDTAndCheck(s string) DatabaseType { |
| ss := DatabaseType(s) |
| if !Contains(ss, BoolTypeList) && |
| !Contains(ss, IntTypeList) && |
| !Contains(ss, FloatTypeList) && |
| !Contains(ss, UintTypeList) && |
| !Contains(ss, StringTypeList) { |
| panic("wrong type: " + s) |
| } |
| return ss |
| } |
|
|
| var ( |
| |
| StringTypeList = []DatabaseType{Date, Time, Year, Datetime, Timestamptz, Timestamp, Timetz, |
| Varchar, Char, Mediumtext, Longtext, Tinytext, |
| Text, JSON, Blob, Tinyblob, Mediumblob, Longblob, |
| Interval, Point, Bpchar, |
| Line, Lseg, Box, Path, Polygon, Circle, Cidr, Inet, Macaddr, Character, Varyingcharacter, |
| Nchar, Nativecharacter, Nvarchar, Clob, Binary, Varbinary, Enum, Set, Geometry, Multilinestring, |
| Multipolygon, Linestring, Multipoint, Geometrycollection, Name, UUID, Timestamptz, |
| Name, UUID, Inet} |
|
|
| |
| BoolTypeList = []DatabaseType{Bool, Boolean} |
|
|
| |
| IntTypeList = []DatabaseType{Int4, Int2, Int8, |
| Int, |
| Tinyint, |
| Mediumint, |
| Smallint, |
| Smallserial, Serial, Bigserial, |
| Integer, |
| Bigint} |
|
|
| |
| FloatTypeList = []DatabaseType{Float, Float4, Float8, Double, Real, Doubleprecision} |
|
|
| |
| UintTypeList = []DatabaseType{Decimal, Bit, Money, Numeric} |
| ) |
|
|
| |
| func Contains(v DatabaseType, a []DatabaseType) bool { |
| for _, i := range a { |
| if i == v { |
| return true |
| } |
| } |
| return false |
| } |
|
|
| |
| type Value string |
|
|
| |
| func (v Value) ToInt64() int64 { |
| value, err := strconv.ParseInt(string(v), 10, 64) |
| if err != nil { |
| panic("wrong value") |
| } |
| return value |
| } |
|
|
| |
| func (v Value) String() string { |
| return string(v) |
| } |
|
|
| |
| func (v Value) HTML() template.HTML { |
| return template.HTML(v) |
| } |
|
|
| func GetValueFromDatabaseType(typ DatabaseType, value interface{}, json bool) Value { |
| if json { |
| return GetValueFromJSONOfDatabaseType(typ, value) |
| } else { |
| return GetValueFromSQLOfDatabaseType(typ, value) |
| } |
| } |
|
|
| |
| func GetValueFromSQLOfDatabaseType(typ DatabaseType, value interface{}) Value { |
| switch { |
| case Contains(typ, StringTypeList): |
| if v, ok := value.(string); ok { |
| return Value(v) |
| } |
| if v2, ok2 := value.([]byte); ok2 { |
| return Value(string(v2)) |
| } |
| return "" |
| case Contains(typ, BoolTypeList): |
| if v, ok := value.(bool); ok { |
| if v { |
| return "true" |
| } |
| return "false" |
| } |
| if v, ok := value.(int64); ok { |
| if v == 0 { |
| return "false" |
| } |
| return "true" |
| } |
| return "false" |
| case Contains(typ, IntTypeList): |
| if v, ok := value.(int64); ok { |
| return Value(fmt.Sprintf("%d", v)) |
| } |
| return "0" |
| case Contains(typ, FloatTypeList): |
| if v, ok := value.(float64); ok { |
| return Value(fmt.Sprintf("%f", v)) |
| } |
| return "0" |
| case Contains(typ, UintTypeList): |
| if v, ok := value.([]uint8); ok { |
| return Value(string(v)) |
| } |
| return "0" |
| } |
| panic("wrong type:" + string(typ)) |
| } |
|
|
| |
| func GetValueFromJSONOfDatabaseType(typ DatabaseType, value interface{}) Value { |
| switch { |
| case Contains(typ, StringTypeList): |
| if v, ok := value.(string); ok { |
| return Value(v) |
| } |
| return "" |
| case Contains(typ, BoolTypeList): |
| if v, ok := value.(bool); ok { |
| if v { |
| return "true" |
| } |
| return "false" |
| } |
| return "false" |
| case Contains(typ, IntTypeList): |
| if v, ok := value.(float64); ok { |
| return Value(fmt.Sprintf("%d", int64(v))) |
| } |
| return Value(fmt.Sprintf("%d", value)) |
| case Contains(typ, FloatTypeList): |
| return Value(fmt.Sprintf("%f", value)) |
| case Contains(typ, UintTypeList): |
| if v, ok := value.([]uint8); ok { |
| return Value(string(v)) |
| } |
| return "0" |
| } |
| panic("wrong type:" + string(typ)) |
| } |
|
|