user_account_scope.go 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. package model
  2. import (
  3. "fmt"
  4. "hash/crc32"
  5. "gorm.io/gorm"
  6. )
  7. const (
  8. NodeCnt = 16384 //2^14
  9. NodeMask = 0x3fff
  10. NodeBit = 14
  11. )
  12. var (
  13. TblCnt uint = 4
  14. )
  15. func calcDbTable(id uint) (tbl uint) {
  16. // nodeId := id % NodeCnt //16384 总表数
  17. tbl = id % TblCnt //实际表数 4
  18. if tbl == 0 {
  19. tbl = TblCnt
  20. }
  21. return
  22. }
  23. func subTableI(gId int64, baseTableName string) string {
  24. node := gId & NodeMask
  25. tb := calcDbTable(uint(node))
  26. name := baseTableName
  27. fmt.Printf("%v_%d", name, tb)
  28. return fmt.Sprintf("%v_%d", name, tb)
  29. }
  30. func GetAccountTable(accId int64, baseTableName string) string {
  31. node := accId & NodeMask
  32. tb := calcDbTable(uint(node))
  33. name := baseTableName
  34. fmt.Printf("%v_%d", name, tb)
  35. return fmt.Sprintf("%v_%d", name, tb)
  36. }
  37. func subTableS(key string, baseTableName string) string {
  38. node := hashNameCode(key)
  39. tb := calcDbTable(node)
  40. name := baseTableName
  41. return fmt.Sprintf("%v_%d", name, tb)
  42. }
  43. func hashNameCode(name string) uint {
  44. n := crc32.ChecksumIEEE([]byte(name))
  45. return uint(n % NodeCnt)
  46. }
  47. // UserAccountTable gormDB的scopes, 根据传入id来获取对应的表名
  48. func UserAccountTable(m *UserAccount, accId int64) func(tx *gorm.DB) *gorm.DB {
  49. return func(tx *gorm.DB) *gorm.DB {
  50. return tx.Table(subTableI(accId, m.TableName()))
  51. }
  52. }
  53. func UserAccountTableByKey(m *UserAccount, key string) func(tx *gorm.DB) *gorm.DB {
  54. return func(tx *gorm.DB) *gorm.DB {
  55. return tx.Table(subTableS(key, m.TableName()))
  56. }
  57. }