github.com/kotovmak/go-admin@v1.1.1/modules/db/types.go (about) 1 // Copyright 2019 GoAdmin Core Team. All rights reserved. 2 // Use of this source code is governed by a Apache-2.0 style 3 // license that can be found in the LICENSE file. 4 5 package db 6 7 import ( 8 "fmt" 9 "html/template" 10 "strconv" 11 ) 12 13 // DatabaseType is the database field type. 14 type DatabaseType string 15 16 const ( 17 // ================================= 18 // integer 19 // ================================= 20 21 Int DatabaseType = "INT" 22 Tinyint DatabaseType = "TINYINT" 23 Mediumint DatabaseType = "MEDIUMINT" 24 Smallint DatabaseType = "SMALLINT" 25 Bigint DatabaseType = "BIGINT" 26 Bit DatabaseType = "BIT" 27 Int8 DatabaseType = "INT8" 28 Int4 DatabaseType = "INT4" 29 Int2 DatabaseType = "INT2" 30 31 Integer DatabaseType = "INTEGER" 32 Numeric DatabaseType = "NUMERIC" 33 Smallserial DatabaseType = "SMALLSERIAL" 34 Serial DatabaseType = "SERIAL" 35 Bigserial DatabaseType = "BIGSERIAL" 36 Money DatabaseType = "MONEY" 37 38 // ================================= 39 // float 40 // ================================= 41 42 Real DatabaseType = "REAL" 43 Float DatabaseType = "FLOAT" 44 Float4 DatabaseType = "FLOAT4" 45 Float8 DatabaseType = "FLOAT8" 46 Double DatabaseType = "DOUBLE" 47 Decimal DatabaseType = "DECIMAL" 48 49 Doubleprecision DatabaseType = "DOUBLEPRECISION" 50 51 // ================================= 52 // string 53 // ================================= 54 55 Date DatabaseType = "DATE" 56 Time DatabaseType = "TIME" 57 Year DatabaseType = "YEAR" 58 Datetime DatabaseType = "DATETIME" 59 Timestamp DatabaseType = "TIMESTAMP" 60 61 Text DatabaseType = "TEXT" 62 Longtext DatabaseType = "LONGTEXT" 63 Mediumtext DatabaseType = "MEDIUMTEXT" 64 Tinytext DatabaseType = "TINYTEXT" 65 66 Varchar DatabaseType = "VARCHAR" 67 Char DatabaseType = "CHAR" 68 Bpchar DatabaseType = "BPCHAR" 69 JSON DatabaseType = "JSON" 70 71 Blob DatabaseType = "BLOB" 72 Tinyblob DatabaseType = "TINYBLOB" 73 Mediumblob DatabaseType = "MEDIUMBLOB" 74 Longblob DatabaseType = "LONGBLOB" 75 76 Interval DatabaseType = "INTERVAL" 77 Boolean DatabaseType = "BOOLEAN" 78 Bool DatabaseType = "BOOL" 79 80 Point DatabaseType = "POINT" 81 Line DatabaseType = "LINE" 82 Lseg DatabaseType = "LSEG" 83 Box DatabaseType = "BOX" 84 Path DatabaseType = "PATH" 85 Polygon DatabaseType = "POLYGON" 86 Circle DatabaseType = "CIRCLE" 87 88 Cidr DatabaseType = "CIDR" 89 Inet DatabaseType = "INET" 90 Macaddr DatabaseType = "MACADDR" 91 92 Character DatabaseType = "CHARACTER" 93 Varyingcharacter DatabaseType = "VARYINGCHARACTER" 94 Nchar DatabaseType = "NCHAR" 95 Nativecharacter DatabaseType = "NATIVECHARACTER" 96 Nvarchar DatabaseType = "NVARCHAR" 97 Clob DatabaseType = "CLOB" 98 99 Binary DatabaseType = "BINARY" 100 Varbinary DatabaseType = "VARBINARY" 101 Enum DatabaseType = "ENUM" 102 Set DatabaseType = "SET" 103 104 Geometry DatabaseType = "GEOMETRY" 105 106 Multilinestring DatabaseType = "MULTILINESTRING" 107 Multipolygon DatabaseType = "MULTIPOLYGON" 108 Linestring DatabaseType = "LINESTRING" 109 Multipoint DatabaseType = "MULTIPOINT" 110 Geometrycollection DatabaseType = "GEOMETRYCOLLECTION" 111 112 Name DatabaseType = "NAME" 113 UUID DatabaseType = "UUID" 114 115 Timestamptz DatabaseType = "TIMESTAMPTZ" 116 Timetz DatabaseType = "TIMETZ" 117 ) 118 119 // DT turn the string value into DatabaseType. 120 func DT(s string) DatabaseType { 121 return DatabaseType(s) 122 } 123 124 // GetDTAndCheck check the DatabaseType. 125 func GetDTAndCheck(s string) DatabaseType { 126 ss := DatabaseType(s) 127 if !Contains(ss, BoolTypeList) && 128 !Contains(ss, IntTypeList) && 129 !Contains(ss, FloatTypeList) && 130 !Contains(ss, UintTypeList) && 131 !Contains(ss, StringTypeList) { 132 panic("wrong type: " + s) 133 } 134 return ss 135 } 136 137 var ( 138 // StringTypeList is a DatabaseType list of string. 139 StringTypeList = []DatabaseType{Date, Time, Year, Datetime, Timestamptz, Timestamp, Timetz, 140 Varchar, Char, Mediumtext, Longtext, Tinytext, 141 Text, JSON, Blob, Tinyblob, Mediumblob, Longblob, 142 Interval, Point, Bpchar, 143 Line, Lseg, Box, Path, Polygon, Circle, Cidr, Inet, Macaddr, Character, Varyingcharacter, 144 Nchar, Nativecharacter, Nvarchar, Clob, Binary, Varbinary, Enum, Set, Geometry, Multilinestring, 145 Multipolygon, Linestring, Multipoint, Geometrycollection, Name, UUID, Timestamptz, 146 Name, UUID, Inet} 147 148 // BoolTypeList is a DatabaseType list of bool. 149 BoolTypeList = []DatabaseType{Bool, Boolean} 150 151 // IntTypeList is a DatabaseType list of integer. 152 IntTypeList = []DatabaseType{Int4, Int2, Int8, 153 Int, 154 Tinyint, 155 Mediumint, 156 Smallint, 157 Smallserial, Serial, Bigserial, 158 Integer, 159 Bigint} 160 161 // FloatTypeList is a DatabaseType list of float. 162 FloatTypeList = []DatabaseType{Float, Float4, Float8, Double, Real, Doubleprecision} 163 164 // UintTypeList is a DatabaseType list of uint. 165 UintTypeList = []DatabaseType{Decimal, Bit, Money, Numeric} 166 ) 167 168 // Contains check the given DatabaseType is in the list or not. 169 func Contains(v DatabaseType, a []DatabaseType) bool { 170 for _, i := range a { 171 if i == v { 172 return true 173 } 174 } 175 return false 176 } 177 178 // Value is a string. 179 type Value string 180 181 // ToInt64 turn the string to a int64. 182 func (v Value) ToInt64() int64 { 183 value, err := strconv.ParseInt(string(v), 10, 64) 184 if err != nil { 185 panic("wrong value") 186 } 187 return value 188 } 189 190 // String return the string value. 191 func (v Value) String() string { 192 return string(v) 193 } 194 195 // HTML return the template.HTML value. 196 func (v Value) HTML() template.HTML { 197 return template.HTML(v) 198 } 199 200 func GetValueFromDatabaseType(typ DatabaseType, value interface{}, json bool) Value { 201 if json { 202 return GetValueFromJSONOfDatabaseType(typ, value) 203 } else { 204 return GetValueFromSQLOfDatabaseType(typ, value) 205 } 206 } 207 208 // GetValueFromDatabaseType return Value of given DatabaseType and interface. 209 func GetValueFromSQLOfDatabaseType(typ DatabaseType, value interface{}) Value { 210 switch { 211 case Contains(typ, StringTypeList): 212 if v, ok := value.(string); ok { 213 return Value(v) 214 } 215 if v2, ok2 := value.([]byte); ok2 { 216 return Value(string(v2)) 217 } 218 return "" 219 case Contains(typ, BoolTypeList): 220 if v, ok := value.(bool); ok { 221 if v { 222 return "true" 223 } 224 return "false" 225 } 226 if v, ok := value.(int64); ok { 227 if v == 0 { 228 return "false" 229 } 230 return "true" 231 } 232 return "false" 233 case Contains(typ, IntTypeList): 234 if v, ok := value.(int64); ok { 235 return Value(fmt.Sprintf("%d", v)) 236 } 237 return "0" 238 case Contains(typ, FloatTypeList): 239 if v, ok := value.(float64); ok { 240 return Value(fmt.Sprintf("%f", v)) 241 } 242 return "0" 243 case Contains(typ, UintTypeList): 244 if v, ok := value.([]uint8); ok { 245 return Value(string(v)) 246 } 247 return "0" 248 } 249 panic("wrong type:" + string(typ)) 250 } 251 252 // GetValueFromJSONOfDatabaseType return Value of given DatabaseType and interface from JSON string value. 253 func GetValueFromJSONOfDatabaseType(typ DatabaseType, value interface{}) Value { 254 switch { 255 case Contains(typ, StringTypeList): 256 if v, ok := value.(string); ok { 257 return Value(v) 258 } 259 return "" 260 case Contains(typ, BoolTypeList): 261 if v, ok := value.(bool); ok { 262 if v { 263 return "true" 264 } 265 return "false" 266 } 267 return "false" 268 case Contains(typ, IntTypeList): 269 if v, ok := value.(float64); ok { 270 return Value(fmt.Sprintf("%d", int64(v))) 271 } 272 return Value(fmt.Sprintf("%d", value)) 273 case Contains(typ, FloatTypeList): 274 return Value(fmt.Sprintf("%f", value)) 275 case Contains(typ, UintTypeList): 276 if v, ok := value.([]uint8); ok { 277 return Value(string(v)) 278 } 279 return "0" 280 } 281 panic("wrong type:" + string(typ)) 282 }