1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- package model
- import (
- "fmt"
- "hash/crc32"
- "gorm.io/gorm"
- )
- const (
- NodeCnt = 16384 //2^14
- NodeMask = 0x3fff
- NodeBit = 14
- )
- var (
- TblCnt uint = 4
- )
- func calcDbTable(id uint) (tbl uint) {
- // nodeId := id % NodeCnt //16384 总表数
- tbl = id % TblCnt //实际表数 4
- if tbl == 0 {
- tbl = TblCnt
- }
- return
- }
- func subTableI(gId int64, baseTableName string) string {
- node := gId & NodeMask
- tb := calcDbTable(uint(node))
- name := baseTableName
- fmt.Printf("%v_%d", name, tb)
- return fmt.Sprintf("%v_%d", name, tb)
- }
- func GetAccountTable(accId int64, baseTableName string) string {
- node := accId & NodeMask
- tb := calcDbTable(uint(node))
- name := baseTableName
- fmt.Printf("%v_%d", name, tb)
- return fmt.Sprintf("%v_%d", name, tb)
- }
- func subTableS(key string, baseTableName string) string {
- node := hashNameCode(key)
- tb := calcDbTable(node)
- name := baseTableName
- return fmt.Sprintf("%v_%d", name, tb)
- }
- func hashNameCode(name string) uint {
- n := crc32.ChecksumIEEE([]byte(name))
- return uint(n % NodeCnt)
- }
- // UserAccountTable gormDB的scopes, 根据传入id来获取对应的表名
- func UserAccountTable(m *UserAccount, accId int64) func(tx *gorm.DB) *gorm.DB {
- return func(tx *gorm.DB) *gorm.DB {
- return tx.Table(subTableI(accId, m.TableName()))
- }
- }
- func UserAccountTableByKey(m *UserAccount, key string) func(tx *gorm.DB) *gorm.DB {
- return func(tx *gorm.DB) *gorm.DB {
- return tx.Table(subTableS(key, m.TableName()))
- }
- }
|