github.com/ravendb/ravendb-go-client@v0.0.0-20240229102137-4474ee7aa0fa/multi_database_hi_lo_id_generator.go (about) 1 package ravendb 2 3 import "sync" 4 5 // MultiDatabaseHiLoIDGenerator manages per-database HiLoKeyGenerotr 6 type MultiDatabaseHiLoIDGenerator struct { 7 store *DocumentStore 8 conventions *DocumentConventions 9 // string -> *MultiTypeHiLoIDGenerator 10 _generators sync.Map 11 } 12 13 // NewMultiDatabaseHiLoIDGenerator creates new MultiDatabaseHiLoKeyGenerator 14 func NewMultiDatabaseHiLoIDGenerator(store *DocumentStore, conventions *DocumentConventions) *MultiDatabaseHiLoIDGenerator { 15 return &MultiDatabaseHiLoIDGenerator{ 16 store: store, 17 conventions: conventions, 18 } 19 } 20 21 // GenerateDocumentID generates id 22 func (g *MultiDatabaseHiLoIDGenerator) GenerateDocumentID(dbName string, entity interface{}) (string, error) { 23 if dbName == "" { 24 dbName = g.store.database 25 } 26 panicIf(dbName == "", "expected non-empty dbName") 27 generatorI, ok := g._generators.Load(dbName) 28 var generator *MultiTypeHiLoIDGenerator 29 if !ok { 30 generator = NewMultiTypeHiLoIDGenerator(g.store, dbName, g.conventions) 31 g._generators.Store(dbName, generator) 32 } else { 33 generator = generatorI.(*MultiTypeHiLoIDGenerator) 34 } 35 return generator.GenerateDocumentID(entity) 36 } 37 38 // ReturnUnusedRange returns unused range for all generators 39 func (g *MultiDatabaseHiLoIDGenerator) ReturnUnusedRange() { 40 cb := func(key, value interface{}) bool { 41 generator := value.(*MultiTypeHiLoIDGenerator) 42 generator.ReturnUnusedRange() 43 return true 44 } 45 g._generators.Range(cb) 46 }