1package db
2
3import (
4 "context"
5 "errors"
6 "sync"
7)
8
9var (
10 registry = map[string]Database{}
11 mtx = sync.Mutex{}
12
13 // ErrNotFound is returned when a database is not found.
14 ErrNotFound = errors.New("database not found")
15)
16
17// Register registers a database.
18func Register(name string, db Database) {
19 mtx.Lock()
20 defer mtx.Unlock()
21 registry[name] = db
22}
23
24// Get returns a database.
25func Get(name string) Database {
26 mtx.Lock()
27 defer mtx.Unlock()
28 return registry[name]
29}
30
31// List returns a list of registered databases.
32func List() []string {
33 mtx.Lock()
34 defer mtx.Unlock()
35 dbs := make([]string, 0)
36 for name := range registry {
37 dbs = append(dbs, name)
38 }
39 return dbs
40}
41
42// New returns a new database.
43func New(ctx context.Context, name string, dataSource string) (Database, error) {
44 mtx.Lock()
45 defer mtx.Unlock()
46 db := registry[name]
47 if db == nil {
48 return nil, ErrNotFound
49 }
50 return db.Open(ctx, dataSource)
51}