github.com/codingeasygo/util@v0.0.0-20231206062002-1ce2f004b7d9/xsql/xsql.go (about)

     1  package xsql
     2  
     3  import (
     4  	"database/sql/driver"
     5  	"encoding/json"
     6  	"fmt"
     7  	"reflect"
     8  	"strconv"
     9  	"strings"
    10  	"time"
    11  
    12  	"github.com/codingeasygo/util/converter"
    13  	"github.com/codingeasygo/util/xmap"
    14  	"github.com/codingeasygo/util/xtime"
    15  )
    16  
    17  type ArrayConverter interface {
    18  	DbArray() string
    19  	InArray() string
    20  }
    21  
    22  // Time is database value to parse data from database and parset time.Time to timestamp on json mashal
    23  type Time time.Time
    24  
    25  // TimeUnix will return time by timestamp
    26  func TimeUnix(timestamp int64) Time {
    27  	return Time(time.Unix(0, timestamp*1e6))
    28  }
    29  
    30  // TimeZero will return zero time
    31  func TimeZero() Time {
    32  	return Time(time.Unix(0, 0*1e6))
    33  }
    34  
    35  // TimeNow return current Time
    36  func TimeNow() Time {
    37  	return Time(time.Now())
    38  }
    39  
    40  // TimeStartOfToday return 00:00:00 of today
    41  func TimeStartOfToday() Time {
    42  	return Time(xtime.TimeStartOfToday())
    43  }
    44  
    45  // TimeStartOfWeek return 00:00:00 of week
    46  func TimeStartOfWeek() Time {
    47  	return Time(xtime.TimeStartOfWeek())
    48  }
    49  
    50  // TimeStartOfMonth return 00:00:00 of today
    51  func TimeStartOfMonth() Time {
    52  	return Time(xtime.TimeStartOfMonth())
    53  }
    54  
    55  // Timestamp return timestamp
    56  func (t Time) Timestamp() int64 {
    57  	return time.Time(t).Local().UnixNano() / 1e6
    58  }
    59  
    60  // MarshalJSON marshal time to string
    61  func (t *Time) MarshalJSON() ([]byte, error) {
    62  	raw := t.Timestamp()
    63  	if raw < 0 {
    64  		return []byte("0"), nil
    65  	}
    66  	stamp := fmt.Sprintf("%v", raw)
    67  	return []byte(stamp), nil
    68  }
    69  
    70  // UnmarshalJSON unmarshal string to time
    71  func (t *Time) UnmarshalJSON(bys []byte) (err error) {
    72  	val := strings.TrimSpace(string(bys))
    73  	if val == "null" {
    74  		return
    75  	}
    76  	timestamp, err := strconv.ParseInt(val, 10, 64)
    77  	if err == nil {
    78  		*t = Time(time.Unix(0, timestamp*1e6))
    79  	}
    80  	return
    81  }
    82  
    83  // Scan is sql.Sanner
    84  func (t *Time) Scan(src interface{}) (err error) {
    85  	if src != nil {
    86  		if timeSrc, ok := src.(time.Time); ok {
    87  			*t = Time(timeSrc)
    88  		}
    89  	}
    90  	return
    91  }
    92  
    93  // Value will parse to json value
    94  func (t *Time) Value() (driver.Value, error) {
    95  	if t == nil {
    96  		return time.Timer{}, nil
    97  	}
    98  	return time.Time(*t), nil
    99  }
   100  
   101  func (t *Time) IsNil() bool { return t == nil }
   102  
   103  func (t *Time) IsZero() bool { return t == nil || t.Timestamp() <= 0 }
   104  
   105  func (t *Time) Set(v interface{}) (err error) {
   106  	switch v := v.(type) {
   107  	case int64:
   108  		*t = TimeUnix(v)
   109  	case Time:
   110  		*t = v
   111  	case *Time:
   112  		*t = *v
   113  	case time.Time:
   114  		*t = Time(v)
   115  	case *time.Time:
   116  		*t = Time(*v)
   117  	default:
   118  		err = fmt.Errorf("%v=>%v is not supported", reflect.TypeOf(v), reflect.TypeOf(t))
   119  	}
   120  	return
   121  }
   122  
   123  func (t Time) AsTime() time.Time {
   124  	return time.Time(t)
   125  }
   126  
   127  func (t Time) String() string {
   128  	return time.Time(t).String()
   129  }
   130  
   131  // M is database value to parse json data to map value
   132  type M map[string]interface{}
   133  
   134  // RawMap will return raw map value
   135  func (m M) RawMap() map[string]interface{} {
   136  	return m
   137  }
   138  
   139  // Scan is sql.Sanner
   140  func (m *M) Scan(src interface{}) (err error) {
   141  	if src != nil {
   142  		if jsonSrc, ok := src.(string); ok {
   143  			err = json.Unmarshal([]byte(jsonSrc), m)
   144  		} else {
   145  			err = fmt.Errorf("the %v,%v is not string", reflect.TypeOf(src), src)
   146  		}
   147  	}
   148  	return
   149  }
   150  
   151  // Value will parse to json value
   152  func (m M) Value() (driver.Value, error) {
   153  	if m == nil {
   154  		return "{}", nil
   155  	}
   156  	bys, err := json.Marshal(m)
   157  	return string(bys), err
   158  }
   159  
   160  func (m M) AsMap() xmap.M { return xmap.M(m) }
   161  
   162  func (m M) IsNil() bool { return m == nil }
   163  
   164  func (m M) IsZero() bool { return len(m) == 0 }
   165  
   166  func (m *M) Set(v interface{}) (err error) {
   167  	value, err := xmap.MapVal(v)
   168  	if err == nil {
   169  		*m = M(value)
   170  	}
   171  	return
   172  }
   173  
   174  // MArray is database value to parse json data to map value
   175  type MArray []M
   176  
   177  // Scan is sql.Sanner
   178  func (m *MArray) Scan(src interface{}) (err error) {
   179  	if src != nil {
   180  		if jsonSrc, ok := src.(string); ok {
   181  			err = json.Unmarshal([]byte(jsonSrc), m)
   182  		} else {
   183  			err = fmt.Errorf("the %v,%v is not string", reflect.TypeOf(src), src)
   184  		}
   185  	}
   186  	return
   187  }
   188  
   189  // Value will parse to json value
   190  func (m MArray) Value() (driver.Value, error) {
   191  	if m == nil {
   192  		return "[]", nil
   193  	}
   194  	bys, err := json.Marshal(m)
   195  	return string(bys), err
   196  }
   197  
   198  func (m MArray) DbArray() string {
   199  	if m == nil {
   200  		return "[]"
   201  	}
   202  	bys, _ := json.Marshal(m)
   203  	return string(bys)
   204  }
   205  
   206  func (m MArray) InArray() string {
   207  	if m == nil {
   208  		return "[]"
   209  	}
   210  	bys, _ := json.Marshal(m)
   211  	return string(bys)
   212  }
   213  
   214  func (m MArray) IsNil() bool { return m == nil }
   215  
   216  func (m MArray) IsZero() bool { return len(m) == 0 }
   217  
   218  func (m *MArray) Set(v interface{}) (err error) {
   219  	valueList, err := xmap.ArrayMapVal(v)
   220  	if err == nil {
   221  		for _, value := range valueList {
   222  			*m = append(*m, M(value))
   223  		}
   224  	}
   225  	return
   226  }
   227  
   228  func sqlScan(src, dst interface{}, strConvert func(str string) (xerr error)) (err error) {
   229  	if src == nil {
   230  		return
   231  	}
   232  	str, ok := src.(string)
   233  	if !ok {
   234  		err = fmt.Errorf("the %v,%v is not string", reflect.TypeOf(src), src)
   235  		return
   236  	}
   237  	if len(str) < 1 || str == "null" {
   238  		return
   239  	}
   240  	if strings.HasPrefix(str, "[") {
   241  		err = json.Unmarshal([]byte(str), dst)
   242  		if err != nil {
   243  			err = fmt.Errorf("unmarshal fail with %v by :%v", err, str)
   244  		}
   245  		return
   246  	}
   247  	if strings.HasPrefix(str, ",") {
   248  		str = strings.TrimSpace(str)
   249  		str = strings.Trim(str, ",")
   250  		if len(str) > 0 {
   251  			err = strConvert(str)
   252  		}
   253  		return
   254  	}
   255  	err = fmt.Errorf("the %v,%v is not invalid format", reflect.TypeOf(src), src)
   256  	return
   257  }
   258  
   259  // IntArray is database value to parse data to []int64 value
   260  type IntArray []int
   261  
   262  func AsIntArray(v interface{}) IntArray {
   263  	vals, err := converter.ArrayIntVal(v)
   264  	if err != nil {
   265  		panic(err)
   266  	}
   267  	return IntArray(vals)
   268  }
   269  
   270  // Scan is sql.Sanner
   271  func (i *IntArray) Scan(src interface{}) (err error) {
   272  	err = sqlScan(src, i, func(str string) (xerr error) {
   273  		*i, xerr = converter.ArrayIntVal(str)
   274  		return
   275  	})
   276  	return
   277  }
   278  
   279  // Value is driver.Valuer
   280  func (i IntArray) Value() (driver.Value, error) {
   281  	if i == nil {
   282  		return "[]", nil
   283  	}
   284  	bys, err := json.Marshal(i)
   285  	return string(bys), err
   286  }
   287  
   288  func (i IntArray) Len() int {
   289  	return len(i)
   290  }
   291  func (i IntArray) Less(a, b int) bool {
   292  	return i[a] < i[b]
   293  }
   294  func (i IntArray) Swap(a, b int) {
   295  	i[a], i[b] = i[b], i[a]
   296  }
   297  
   298  // HavingOne will check if array having one value in vals
   299  func (i IntArray) HavingOne(vals ...int) bool {
   300  	for _, v0 := range i {
   301  		for _, v1 := range vals {
   302  			if v0 == v1 {
   303  				return true
   304  			}
   305  		}
   306  	}
   307  	return false
   308  }
   309  
   310  // Join will parset to database array
   311  func (i IntArray) Join(sep string) (res string) {
   312  	res = converter.JoinSafe(i, sep, converter.JoinPolicyDefault)
   313  	return
   314  }
   315  
   316  // DbArray will join value to database array
   317  func (i IntArray) DbArray() (res string) {
   318  	res = "{" + i.Join(",") + "}"
   319  	return
   320  }
   321  
   322  // InArray will join value to database array
   323  func (i IntArray) InArray() (res string) {
   324  	res = i.Join(",")
   325  	return
   326  }
   327  
   328  // StrArray will join value to string array by comma
   329  func (i IntArray) StrArray() (res string) {
   330  	res = "," + i.Join(",") + ","
   331  	return
   332  }
   333  
   334  // RemoveDuplicate will remove duplicate and copy item to new array
   335  func (i IntArray) RemoveDuplicate() IntArray {
   336  	var arr IntArray
   337  	m := map[int]bool{}
   338  	for _, v := range i {
   339  		if m[v] {
   340  			continue
   341  		}
   342  		m[v] = true
   343  		arr = append(arr, v)
   344  	}
   345  	return arr
   346  }
   347  
   348  // AsPtrArray will convet normla to ptr
   349  func (i IntArray) AsPtrArray() (vals IntPtrArray) {
   350  	for _, v := range i {
   351  		vals = append(vals, converter.IntPtr(v))
   352  	}
   353  	return
   354  }
   355  
   356  func (i IntArray) IsNil() bool { return i == nil }
   357  
   358  func (i IntArray) IsZero() bool { return len(i) == 0 }
   359  
   360  // IntPtrArray is database value to parse data to []int64 value
   361  type IntPtrArray []*int
   362  
   363  func AsIntPtrArray(v interface{}) (array IntPtrArray) {
   364  	return AsIntArray(v).AsPtrArray()
   365  }
   366  
   367  // Scan is sql.Sanner
   368  func (i *IntPtrArray) Scan(src interface{}) (err error) {
   369  	err = sqlScan(src, i, func(str string) (xerr error) {
   370  		vals, xerr := converter.ArrayIntVal(str)
   371  		if xerr == nil {
   372  			*i = IntArray(vals).AsPtrArray()
   373  		}
   374  		return
   375  	})
   376  	return
   377  }
   378  
   379  // Value is driver.Valuer
   380  func (i IntPtrArray) Value() (driver.Value, error) {
   381  	if i == nil {
   382  		return "[]", nil
   383  	}
   384  	bys, err := json.Marshal(i)
   385  	return string(bys), err
   386  }
   387  
   388  func (i IntPtrArray) Len() int {
   389  	return len(i)
   390  }
   391  func (i IntPtrArray) Less(a, b int) bool {
   392  	return i[a] == nil || (i[b] != nil && *i[a] < *i[b])
   393  }
   394  func (i IntPtrArray) Swap(a, b int) {
   395  	i[a], i[b] = i[b], i[a]
   396  }
   397  
   398  // HavingOne will check if array having one value in vals
   399  func (i IntPtrArray) HavingOne(vals ...int) bool {
   400  	for _, v0 := range i {
   401  		for _, v1 := range vals {
   402  			if v0 != nil && *v0 == v1 {
   403  				return true
   404  			}
   405  		}
   406  	}
   407  	return false
   408  }
   409  
   410  // Join will parset to database array
   411  func (i IntPtrArray) Join(sep string) (res string) {
   412  	res = converter.JoinSafe(i, sep, converter.JoinPolicyDefault)
   413  	return
   414  }
   415  
   416  // DbArray will join value to database array
   417  func (i IntPtrArray) DbArray() (res string) {
   418  	res = "{" + i.Join(",") + "}"
   419  	return
   420  }
   421  
   422  // InArray will join value to database array
   423  func (i IntPtrArray) InArray() (res string) {
   424  	res = i.Join(",")
   425  	return
   426  }
   427  
   428  // StrArray will join value to string array by comma
   429  func (i IntPtrArray) StrArray() (res string) {
   430  	res = "," + i.Join(",") + ","
   431  	return
   432  }
   433  
   434  // RemoveDuplicate will remove duplicate and copy item to new array
   435  func (i IntPtrArray) RemoveDuplicate() IntPtrArray {
   436  	var arr IntPtrArray
   437  	m := map[int]bool{}
   438  	for _, v := range i {
   439  		if v == nil || m[*v] {
   440  			continue
   441  		}
   442  		m[*v] = true
   443  		arr = append(arr, v)
   444  	}
   445  	return arr
   446  }
   447  
   448  // AsArray will convet ptr to normal, skip nil
   449  func (i IntPtrArray) AsArray() (vals IntArray) {
   450  	for _, v := range i {
   451  		if v == nil {
   452  			continue
   453  		}
   454  		vals = append(vals, *v)
   455  	}
   456  	return
   457  }
   458  
   459  func (i IntPtrArray) IsNil() bool { return i == nil }
   460  
   461  func (i IntPtrArray) IsZero() bool { return len(i) == 0 }
   462  
   463  type IntNilZero struct {
   464  	V *int
   465  }
   466  
   467  func NewIntNilZero(v int) IntNilZero {
   468  	return IntNilZero{V: &v}
   469  }
   470  
   471  // Scan is sql.Sanner
   472  func (i *IntNilZero) Scan(src interface{}) (err error) {
   473  	v, err := converter.IntVal(src)
   474  	i.V = &v
   475  	return
   476  }
   477  
   478  // Value is driver.Valuer
   479  func (i IntNilZero) Value() (driver.Value, error) {
   480  	if i.V == nil {
   481  		return 0, nil
   482  	}
   483  	return i.V, nil
   484  }
   485  
   486  func (i *IntNilZero) UnmarshalJSON(data []byte) (err error) {
   487  	v, err := converter.IntVal(string(data))
   488  	i.V = &v
   489  	return
   490  }
   491  
   492  func (i IntNilZero) MarshalJSON() ([]byte, error) {
   493  	if i.V == nil {
   494  		return []byte("0"), nil
   495  	}
   496  	return []byte(fmt.Sprintf("%d", *i.V)), nil
   497  }
   498  
   499  func (i *IntNilZero) IsNil() bool { return i == nil }
   500  
   501  func (i *IntNilZero) IsZero() bool { return i == nil }
   502  
   503  func (i *IntNilZero) Int64() (v int) {
   504  	if i.V != nil {
   505  		v = int(*i.V)
   506  	}
   507  	return
   508  }
   509  
   510  // Int64Array is database value to parse data to []int64 value
   511  type Int64Array []int64
   512  
   513  func AsInt64Array(v interface{}) Int64Array {
   514  	vals, err := converter.ArrayInt64Val(v)
   515  	if err != nil {
   516  		panic(err)
   517  	}
   518  	return Int64Array(vals)
   519  }
   520  
   521  // Scan is sql.Sanner
   522  func (i *Int64Array) Scan(src interface{}) (err error) {
   523  	err = sqlScan(src, i, func(str string) (xerr error) {
   524  		*i, xerr = converter.ArrayInt64Val(str)
   525  		return
   526  	})
   527  	return
   528  }
   529  
   530  // Value is driver.Valuer
   531  func (i Int64Array) Value() (driver.Value, error) {
   532  	if i == nil {
   533  		return "[]", nil
   534  	}
   535  	bys, err := json.Marshal(i)
   536  	return string(bys), err
   537  }
   538  
   539  func (i Int64Array) Len() int {
   540  	return len(i)
   541  }
   542  func (i Int64Array) Less(a, b int) bool {
   543  	return i[a] < i[b]
   544  }
   545  func (i Int64Array) Swap(a, b int) {
   546  	i[a], i[b] = i[b], i[a]
   547  }
   548  
   549  // HavingOne will check if array having one value in vals
   550  func (i Int64Array) HavingOne(vals ...int64) bool {
   551  	for _, v0 := range i {
   552  		for _, v1 := range vals {
   553  			if v0 == v1 {
   554  				return true
   555  			}
   556  		}
   557  	}
   558  	return false
   559  }
   560  
   561  // Join will parset to database array
   562  func (i Int64Array) Join(sep string) (res string) {
   563  	res = converter.JoinSafe(i, sep, converter.JoinPolicyDefault)
   564  	return
   565  }
   566  
   567  // DbArray will join value to database array
   568  func (i Int64Array) DbArray() (res string) {
   569  	res = "{" + i.Join(",") + "}"
   570  	return
   571  }
   572  
   573  // InArray will join value to database array
   574  func (i Int64Array) InArray() (res string) {
   575  	res = i.Join(",")
   576  	return
   577  }
   578  
   579  // StrArray will join value to string array by comma
   580  func (i Int64Array) StrArray() (res string) {
   581  	res = "," + i.Join(",") + ","
   582  	return
   583  }
   584  
   585  // RemoveDuplicate will remove duplicate and copy item to new array
   586  func (i Int64Array) RemoveDuplicate() Int64Array {
   587  	var arr Int64Array
   588  	m := map[int64]bool{}
   589  	for _, v := range i {
   590  		if m[v] {
   591  			continue
   592  		}
   593  		m[v] = true
   594  		arr = append(arr, v)
   595  	}
   596  	return arr
   597  }
   598  
   599  // AsPtrArray will convet normla to ptr
   600  func (i Int64Array) AsPtrArray() (vals Int64PtrArray) {
   601  	for _, v := range i {
   602  		vals = append(vals, converter.Int64Ptr(v))
   603  	}
   604  	return
   605  }
   606  
   607  func (i Int64Array) IsNil() bool { return i == nil }
   608  
   609  func (i Int64Array) IsZero() bool { return len(i) == 0 }
   610  
   611  // Int64PtrArray is database value to parse data to []int64 value
   612  type Int64PtrArray []*int64
   613  
   614  func AsInt64PtrArray(v interface{}) Int64PtrArray {
   615  	return AsInt64Array(v).AsPtrArray()
   616  }
   617  
   618  // Scan is sql.Sanner
   619  func (i *Int64PtrArray) Scan(src interface{}) (err error) {
   620  	err = sqlScan(src, i, func(str string) (xerr error) {
   621  		vals, xerr := converter.ArrayInt64Val(str)
   622  		if xerr == nil {
   623  			*i = Int64Array(vals).AsPtrArray()
   624  		}
   625  		return
   626  	})
   627  	return
   628  }
   629  
   630  // Value is driver.Valuer
   631  func (i Int64PtrArray) Value() (driver.Value, error) {
   632  	if i == nil {
   633  		return "[]", nil
   634  	}
   635  	bys, err := json.Marshal(i)
   636  	return string(bys), err
   637  }
   638  
   639  func (i Int64PtrArray) Len() int {
   640  	return len(i)
   641  }
   642  func (i Int64PtrArray) Less(a, b int) bool {
   643  	return i[a] == nil || (i[b] != nil && *i[a] < *i[b])
   644  }
   645  func (i Int64PtrArray) Swap(a, b int) {
   646  	i[a], i[b] = i[b], i[a]
   647  }
   648  
   649  // HavingOne will check if array having one value in vals
   650  func (i Int64PtrArray) HavingOne(vals ...int64) bool {
   651  	for _, v0 := range i {
   652  		for _, v1 := range vals {
   653  			if v0 != nil && *v0 == v1 {
   654  				return true
   655  			}
   656  		}
   657  	}
   658  	return false
   659  }
   660  
   661  // Join will parset to database array
   662  func (i Int64PtrArray) Join(sep string) (res string) {
   663  	res = converter.JoinSafe(i, sep, converter.JoinPolicyDefault)
   664  	return
   665  }
   666  
   667  // DbArray will join value to database array
   668  func (i Int64PtrArray) DbArray() (res string) {
   669  	res = "{" + i.Join(",") + "}"
   670  	return
   671  }
   672  
   673  // InArray will join value to database array
   674  func (i Int64PtrArray) InArray() (res string) {
   675  	res = i.Join(",")
   676  	return
   677  }
   678  
   679  // StrArray will join value to string array by comma
   680  func (i Int64PtrArray) StrArray() (res string) {
   681  	res = "," + i.Join(",") + ","
   682  	return
   683  }
   684  
   685  // RemoveDuplicate will remove duplicate and copy item to new array
   686  func (i Int64PtrArray) RemoveDuplicate() Int64PtrArray {
   687  	var arr Int64PtrArray
   688  	m := map[int64]bool{}
   689  	for _, v := range i {
   690  		if v == nil || m[*v] {
   691  			continue
   692  		}
   693  		m[*v] = true
   694  		arr = append(arr, v)
   695  	}
   696  	return arr
   697  }
   698  
   699  // AsArray will convet ptr to normal, skip nil
   700  func (i Int64PtrArray) AsArray() (vals Int64Array) {
   701  	for _, v := range i {
   702  		if v == nil {
   703  			continue
   704  		}
   705  		vals = append(vals, *v)
   706  	}
   707  	return
   708  }
   709  
   710  func (i Int64PtrArray) IsNil() bool { return i == nil }
   711  
   712  func (i Int64PtrArray) IsZero() bool { return len(i) == 0 }
   713  
   714  type Int64NilZero struct {
   715  	V *int64
   716  }
   717  
   718  func NewInt64NilZero(v int64) Int64NilZero {
   719  	return Int64NilZero{V: &v}
   720  }
   721  
   722  // Scan is sql.Sanner
   723  func (i *Int64NilZero) Scan(src interface{}) (err error) {
   724  	v, err := converter.Int64Val(src)
   725  	i.V = &v
   726  	return
   727  }
   728  
   729  // Value is driver.Valuer
   730  func (i Int64NilZero) Value() (driver.Value, error) {
   731  	if i.V == nil {
   732  		return 0, nil
   733  	}
   734  	return i.V, nil
   735  }
   736  
   737  func (i *Int64NilZero) UnmarshalJSON(data []byte) (err error) {
   738  	v, err := converter.Int64Val(string(data))
   739  	i.V = &v
   740  	return
   741  }
   742  
   743  func (i Int64NilZero) MarshalJSON() ([]byte, error) {
   744  	if i.V == nil {
   745  		return []byte("0"), nil
   746  	}
   747  	return []byte(fmt.Sprintf("%d", *i.V)), nil
   748  }
   749  
   750  func (i *Int64NilZero) IsNil() bool { return i == nil }
   751  
   752  func (i *Int64NilZero) IsZero() bool { return i == nil }
   753  
   754  func (i *Int64NilZero) Int64() (v int64) {
   755  	if i.V != nil {
   756  		v = int64(*i.V)
   757  	}
   758  	return
   759  }
   760  
   761  // Float64Array is database value to parse data to []int64 value
   762  type Float64Array []float64
   763  
   764  func AsFloat64Array(v interface{}) Float64Array {
   765  	vals, err := converter.ArrayFloat64Val(v)
   766  	if err != nil {
   767  		panic(err)
   768  	}
   769  	return Float64Array(vals)
   770  }
   771  
   772  // Scan is sql.Sanner
   773  func (f *Float64Array) Scan(src interface{}) (err error) {
   774  	err = sqlScan(src, f, func(str string) (xerr error) {
   775  		*f, xerr = converter.ArrayFloat64Val(str)
   776  		return
   777  	})
   778  	return
   779  }
   780  
   781  // Value is driver.Valuer
   782  func (f Float64Array) Value() (driver.Value, error) {
   783  	if f == nil {
   784  		return "[]", nil
   785  	}
   786  	bys, err := json.Marshal(f)
   787  	return string(bys), err
   788  }
   789  
   790  func (f Float64Array) Len() int {
   791  	return len(f)
   792  }
   793  func (f Float64Array) Less(a, b int) bool {
   794  	return f[a] < f[b]
   795  }
   796  func (f Float64Array) Swap(a, b int) {
   797  	f[a], f[b] = f[b], f[a]
   798  }
   799  
   800  // HavingOne will check if array having one value in vals
   801  func (f Float64Array) HavingOne(vals ...float64) bool {
   802  	for _, v0 := range f {
   803  		for _, v1 := range vals {
   804  			if v0 == v1 {
   805  				return true
   806  			}
   807  		}
   808  	}
   809  	return false
   810  }
   811  
   812  // Join will parset to database array
   813  func (f Float64Array) Join(sep string) (res string) {
   814  	res = converter.JoinSafe(f, sep, converter.JoinPolicyDefault)
   815  	return
   816  }
   817  
   818  // DbArray will join value to database array
   819  func (f Float64Array) DbArray() (res string) {
   820  	res = "{" + f.Join(",") + "}"
   821  	return
   822  }
   823  
   824  // InArray will join value to database array
   825  func (f Float64Array) InArray() (res string) {
   826  	res = f.Join(",")
   827  	return
   828  }
   829  
   830  // StrArray will join value to string array by comma
   831  func (i Float64Array) StrArray() (res string) {
   832  	res = "," + i.Join(",") + ","
   833  	return
   834  }
   835  
   836  // RemoveDuplicate will remove duplicate and copy item to new array
   837  func (f Float64Array) RemoveDuplicate() Float64Array {
   838  	var arr Float64Array
   839  	m := map[float64]bool{}
   840  	for _, v := range f {
   841  		if m[v] {
   842  			continue
   843  		}
   844  		m[v] = true
   845  		arr = append(arr, v)
   846  	}
   847  	return arr
   848  }
   849  
   850  // AsPtrArray will convet normla to ptr
   851  func (f Float64Array) AsPtrArray() (vals Float64PtrArray) {
   852  	for _, v := range f {
   853  		vals = append(vals, converter.Float64Ptr(v))
   854  	}
   855  	return
   856  }
   857  
   858  func (f Float64Array) IsNil() bool { return f == nil }
   859  
   860  func (f Float64Array) IsZero() bool { return len(f) == 0 }
   861  
   862  // Float64PtrArray is database value to parse data to []int64 value
   863  type Float64PtrArray []*float64
   864  
   865  func AsFloat64PtrArray(v interface{}) Float64PtrArray {
   866  	return AsFloat64Array(v).AsPtrArray()
   867  }
   868  
   869  // Scan is sql.Sanner
   870  func (f *Float64PtrArray) Scan(src interface{}) (err error) {
   871  	err = sqlScan(src, f, func(str string) (xerr error) {
   872  		vals, xerr := converter.ArrayFloat64Val(str)
   873  		if xerr == nil {
   874  			*f = Float64Array(vals).AsPtrArray()
   875  		}
   876  		return
   877  	})
   878  	return
   879  }
   880  
   881  // Value is driver.Valuer
   882  func (f Float64PtrArray) Value() (driver.Value, error) {
   883  	if f == nil {
   884  		return "[]", nil
   885  	}
   886  	bys, err := json.Marshal(f)
   887  	return string(bys), err
   888  }
   889  
   890  func (f Float64PtrArray) Len() int {
   891  	return len(f)
   892  }
   893  func (f Float64PtrArray) Less(a, b int) bool {
   894  	return f[a] == nil || (f[b] != nil && *f[a] < *f[b])
   895  }
   896  func (f Float64PtrArray) Swap(a, b int) {
   897  	f[a], f[b] = f[b], f[a]
   898  }
   899  
   900  // HavingOne will check if array having one value in vals
   901  func (f Float64PtrArray) HavingOne(vals ...float64) bool {
   902  	for _, v0 := range f {
   903  		for _, v1 := range vals {
   904  			if v0 != nil && *v0 == v1 {
   905  				return true
   906  			}
   907  		}
   908  	}
   909  	return false
   910  }
   911  
   912  // Join will parset to database array
   913  func (f Float64PtrArray) Join(sep string) (res string) {
   914  	res = converter.JoinSafe(f, sep, converter.JoinPolicyDefault)
   915  	return
   916  }
   917  
   918  // DbArray will join value to database array
   919  func (f Float64PtrArray) DbArray() (res string) {
   920  	res = "{" + f.Join(",") + "}"
   921  	return
   922  }
   923  
   924  // InArray will join value to database array
   925  func (f Float64PtrArray) InArray() (res string) {
   926  	res = f.Join(",")
   927  	return
   928  }
   929  
   930  // StrArray will join value to string array by comma
   931  func (i Float64PtrArray) StrArray() (res string) {
   932  	res = "," + i.Join(",") + ","
   933  	return
   934  }
   935  
   936  // RemoveDuplicate will remove duplicate and copy item to new array
   937  func (f Float64PtrArray) RemoveDuplicate() Float64PtrArray {
   938  	var arr Float64PtrArray
   939  	m := map[float64]bool{}
   940  	for _, v := range f {
   941  		if v == nil || m[*v] {
   942  			continue
   943  		}
   944  		m[*v] = true
   945  		arr = append(arr, v)
   946  	}
   947  	return arr
   948  }
   949  
   950  // AsArray will convet ptr to normal, skip nil
   951  func (f Float64PtrArray) AsArray() (vals Float64Array) {
   952  	for _, v := range f {
   953  		if v == nil {
   954  			continue
   955  		}
   956  		vals = append(vals, *v)
   957  	}
   958  	return
   959  }
   960  
   961  func (f Float64PtrArray) IsNil() bool { return f == nil }
   962  
   963  func (f Float64PtrArray) IsZero() bool { return len(f) == 0 }
   964  
   965  type Float64NilZero struct {
   966  	V *float64
   967  }
   968  
   969  func NewFloat64NilZero(v float64) Float64NilZero {
   970  	return Float64NilZero{V: &v}
   971  }
   972  
   973  // Scan is sql.Sanner
   974  func (f *Float64NilZero) Scan(src interface{}) (err error) {
   975  	v, err := converter.Float64Val(src)
   976  	f.V = &v
   977  	return
   978  }
   979  
   980  // Value is driver.Valuer
   981  func (f Float64NilZero) Value() (driver.Value, error) {
   982  	if f.V == nil {
   983  		return 0, nil
   984  	}
   985  	return f.V, nil
   986  }
   987  
   988  func (f *Float64NilZero) UnmarshalJSON(data []byte) (err error) {
   989  	v, err := converter.Float64Val(string(data))
   990  	f.V = &v
   991  	return
   992  }
   993  
   994  func (f Float64NilZero) MarshalJSON() ([]byte, error) {
   995  	if f.V == nil {
   996  		return []byte("0"), nil
   997  	}
   998  	return []byte(fmt.Sprintf("%f", *f.V)), nil
   999  }
  1000  
  1001  func (f *Float64NilZero) IsNil() bool { return f == nil }
  1002  
  1003  func (f *Float64NilZero) IsZero() bool { return f == nil }
  1004  
  1005  func (f *Float64NilZero) Float64() (v float64) {
  1006  	if f.V != nil {
  1007  		v = float64(*f.V)
  1008  	}
  1009  	return
  1010  }
  1011  
  1012  // StringArray is database value to parse data to []string value
  1013  type StringArray []string
  1014  
  1015  func AsStringArray(v interface{}) StringArray {
  1016  	vals, err := converter.ArrayStringVal(v)
  1017  	if err != nil {
  1018  		panic(err)
  1019  	}
  1020  	return StringArray(vals)
  1021  }
  1022  
  1023  // Scan is sql.Sanner
  1024  func (s *StringArray) Scan(src interface{}) (err error) {
  1025  	err = sqlScan(src, s, func(str string) (xerr error) {
  1026  		*s, xerr = converter.ArrayStringVal(str)
  1027  		return
  1028  	})
  1029  	return
  1030  }
  1031  
  1032  // Value will parse to json value
  1033  func (s StringArray) Value() (driver.Value, error) {
  1034  	if s == nil {
  1035  		return "[]", nil
  1036  	}
  1037  	bys, err := json.Marshal(s)
  1038  	return string(bys), err
  1039  }
  1040  
  1041  func (s StringArray) Len() int {
  1042  	return len(s)
  1043  }
  1044  func (s StringArray) Less(a, b int) bool {
  1045  	return s[a] < s[b]
  1046  }
  1047  func (s StringArray) Swap(a, b int) {
  1048  	s[a], s[b] = s[b], s[a]
  1049  }
  1050  
  1051  // HavingOne will check if array having one value in vals
  1052  func (s StringArray) HavingOne(vals ...string) bool {
  1053  	for _, v0 := range s {
  1054  		for _, v1 := range vals {
  1055  			if v0 == v1 {
  1056  				return true
  1057  			}
  1058  		}
  1059  	}
  1060  	return false
  1061  }
  1062  
  1063  // Join will parset to database array
  1064  func (s StringArray) Join(sep string) (res string) {
  1065  	res = converter.JoinSafe(s, sep, converter.JoinPolicyDefault)
  1066  	return
  1067  }
  1068  
  1069  // DbArray will join value to database array
  1070  func (s StringArray) DbArray() (res string) {
  1071  	res = "{" + s.Join(",") + "}"
  1072  	return
  1073  }
  1074  
  1075  // InArray will join value to database array
  1076  func (s StringArray) InArray() (res string) {
  1077  	res = "'" + s.Join("','") + "'"
  1078  	return
  1079  }
  1080  
  1081  // StrArray will join value to string array by comma
  1082  func (s StringArray) StrArray() (res string) {
  1083  	res = "," + s.Join(",") + ","
  1084  	return
  1085  }
  1086  
  1087  // RemoveDuplicate will remove duplicate and copy item to new array
  1088  func (s StringArray) RemoveDuplicate(trim, empty bool) StringArray {
  1089  	var arr StringArray
  1090  	m := map[string]bool{}
  1091  	for _, v := range s {
  1092  		nv := v
  1093  		if trim {
  1094  			nv = strings.TrimSpace(v)
  1095  		}
  1096  		if empty && len(nv) < 1 {
  1097  			continue
  1098  		}
  1099  		if m[nv] {
  1100  			continue
  1101  		}
  1102  		m[nv] = true
  1103  		arr = append(arr, nv)
  1104  	}
  1105  	return arr
  1106  }
  1107  
  1108  // RemoveEmpty will remove empty and copy item to new array
  1109  func (s StringArray) RemoveEmpty(trim bool) StringArray {
  1110  	var arr StringArray
  1111  	for _, v := range s {
  1112  		nv := v
  1113  		if trim {
  1114  			nv = strings.TrimSpace(v)
  1115  		}
  1116  		if len(nv) < 1 {
  1117  			continue
  1118  		}
  1119  		arr = append(arr, nv)
  1120  	}
  1121  	return arr
  1122  }
  1123  
  1124  // AsPtrArray will convet normla to ptr
  1125  func (s StringArray) AsPtrArray() (vals StringPtrArray) {
  1126  	for _, v := range s {
  1127  		vals = append(vals, converter.StringPtr(v))
  1128  	}
  1129  	return
  1130  }
  1131  
  1132  func (s StringArray) IsNil() bool { return s == nil }
  1133  
  1134  func (s StringArray) IsZero() bool { return len(s) == 0 }
  1135  
  1136  // StringPtrArray is database value to parse data to []string value
  1137  type StringPtrArray []*string
  1138  
  1139  func AsStringPtrArray(v interface{}) StringPtrArray {
  1140  	return AsStringArray(v).AsPtrArray()
  1141  }
  1142  
  1143  // Scan is sql.Sanner
  1144  func (s *StringPtrArray) Scan(src interface{}) (err error) {
  1145  	err = sqlScan(src, s, func(str string) (xerr error) {
  1146  		vals, xerr := converter.ArrayStringVal(str)
  1147  		if xerr == nil {
  1148  			*s = StringArray(vals).AsPtrArray()
  1149  		}
  1150  		return
  1151  	})
  1152  	return
  1153  }
  1154  
  1155  // Value will parse to json value
  1156  func (s StringPtrArray) Value() (driver.Value, error) {
  1157  	if s == nil {
  1158  		return "[]", nil
  1159  	}
  1160  	bys, err := json.Marshal(s)
  1161  	return string(bys), err
  1162  }
  1163  
  1164  func (s StringPtrArray) Len() int {
  1165  	return len(s)
  1166  }
  1167  func (s StringPtrArray) Less(a, b int) bool {
  1168  	return s[a] == nil || (s[b] != nil && *s[a] < *s[b])
  1169  }
  1170  func (s StringPtrArray) Swap(a, b int) {
  1171  	s[a], s[b] = s[b], s[a]
  1172  }
  1173  
  1174  // HavingOne will check if array having one value in vals
  1175  func (s StringPtrArray) HavingOne(vals ...string) bool {
  1176  	for _, v0 := range s {
  1177  		for _, v1 := range vals {
  1178  			if v0 != nil && *v0 == v1 {
  1179  				return true
  1180  			}
  1181  		}
  1182  	}
  1183  	return false
  1184  }
  1185  
  1186  // Join will parset to database array
  1187  func (s StringPtrArray) Join(sep string) (res string) {
  1188  	res = converter.JoinSafe(s, sep, converter.JoinPolicyDefault)
  1189  	return
  1190  }
  1191  
  1192  // DbArray will join value to database array
  1193  func (s StringPtrArray) DbArray() (res string) {
  1194  	res = "{" + s.Join(",") + "}"
  1195  	return
  1196  }
  1197  
  1198  // InArray will join value to database array
  1199  func (s StringPtrArray) InArray() (res string) {
  1200  	res = "'" + s.Join("','") + "'"
  1201  	return
  1202  }
  1203  
  1204  // StrArray will join value to string array by comma
  1205  func (s StringPtrArray) StrArray() (res string) {
  1206  	res = "," + s.Join(",") + ","
  1207  	return
  1208  }
  1209  
  1210  // RemoveDuplicate will remove duplicate and copy item to new array
  1211  func (s StringPtrArray) RemoveDuplicate(trim, empty bool) StringPtrArray {
  1212  	var arr StringPtrArray
  1213  	m := map[string]bool{}
  1214  	for _, v := range s {
  1215  		if v == nil {
  1216  			continue
  1217  		}
  1218  		nv := v
  1219  		if trim {
  1220  			n := strings.TrimSpace(*v)
  1221  			nv = &n
  1222  		}
  1223  		if empty && len(*nv) < 1 {
  1224  			continue
  1225  		}
  1226  		if m[*nv] {
  1227  			continue
  1228  		}
  1229  		m[*nv] = true
  1230  		arr = append(arr, nv)
  1231  	}
  1232  	return arr
  1233  }
  1234  
  1235  // RemoveEmpty will remove empty and copy item to new array
  1236  func (s StringPtrArray) RemoveEmpty(trim bool) StringPtrArray {
  1237  	var arr StringPtrArray
  1238  	for _, v := range s {
  1239  		if v == nil {
  1240  			continue
  1241  		}
  1242  		nv := v
  1243  		if trim {
  1244  			n := strings.TrimSpace(*v)
  1245  			nv = &n
  1246  		}
  1247  		if len(*nv) < 1 {
  1248  			continue
  1249  		}
  1250  		arr = append(arr, nv)
  1251  	}
  1252  	return arr
  1253  }
  1254  
  1255  // AsArray will convet ptr to normal, skip nil
  1256  func (s StringPtrArray) AsArray() (vals StringArray) {
  1257  	for _, v := range s {
  1258  		if v == nil {
  1259  			continue
  1260  		}
  1261  		vals = append(vals, *v)
  1262  	}
  1263  	return
  1264  }
  1265  
  1266  func (s StringPtrArray) IsNil() bool { return s == nil }
  1267  
  1268  func (s StringPtrArray) IsZero() bool { return len(s) == 0 }
  1269  
  1270  type StringNilZero struct {
  1271  	V *string
  1272  }
  1273  
  1274  func NewStringNilZero(v string) StringNilZero {
  1275  	return StringNilZero{V: &v}
  1276  }
  1277  
  1278  // Scan is sql.Sanner
  1279  func (s *StringNilZero) Scan(src interface{}) (err error) {
  1280  	v, err := converter.StringVal(src)
  1281  	s.V = &v
  1282  	return
  1283  }
  1284  
  1285  // Value is driver.Valuer
  1286  func (s StringNilZero) Value() (driver.Value, error) {
  1287  	if s.V == nil {
  1288  		return 0, nil
  1289  	}
  1290  	return s.V, nil
  1291  }
  1292  
  1293  func (f *StringNilZero) UnmarshalJSON(data []byte) (err error) {
  1294  	v := strings.Trim(string(data), `"`)
  1295  	f.V = &v
  1296  	return
  1297  }
  1298  
  1299  func (s StringNilZero) MarshalJSON() ([]byte, error) {
  1300  	if s.V == nil {
  1301  		return []byte(`""`), nil
  1302  	}
  1303  	return []byte(fmt.Sprintf(`"%v"`, *s.V)), nil
  1304  }
  1305  
  1306  func (s *StringNilZero) IsNil() bool { return s == nil }
  1307  
  1308  func (s *StringNilZero) IsZero() bool { return s == nil }
  1309  
  1310  func (s *StringNilZero) String() (v string) {
  1311  	if s != nil {
  1312  		v = string(*s.V)
  1313  	}
  1314  	return
  1315  }