github.com/altipla-consulting/ravendb-go-client@v0.1.3/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  }