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  }