registry.go

 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}