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 }