decred.org/dcrdex@v1.0.5/server/db/driver.go (about)

     1  // This code is available on the terms of the project LICENSE.md file,
     2  // also available online at https://blueoakcouncil.org/license/1.0.0.
     3  
     4  package db
     5  
     6  import (
     7  	"context"
     8  	"fmt"
     9  	"sync"
    10  
    11  	"decred.org/dcrdex/dex"
    12  )
    13  
    14  var (
    15  	driversMtx sync.Mutex
    16  	drivers    = make(map[string]Driver)
    17  )
    18  
    19  // Driver is the interface required of all DB drivers. Open should create a
    20  // DEXArchivist and verify connectivity with the asset's chain server.
    21  type Driver interface {
    22  	Open(ctx context.Context, cfg any) (DEXArchivist, error)
    23  	UseLogger(logger dex.Logger)
    24  }
    25  
    26  // Register should be called by the init function of an DB driver's package.
    27  func Register(name string, driver Driver) {
    28  	driversMtx.Lock()
    29  	defer driversMtx.Unlock()
    30  
    31  	if driver == nil {
    32  		panic("db: Register driver is nil")
    33  	}
    34  	if _, dup := drivers[name]; dup {
    35  		panic("db: Register called twice for asset driver " + name)
    36  	}
    37  	drivers[name] = driver
    38  }
    39  
    40  // Open loads the named DB driver with the provided configuration.
    41  func Open(ctx context.Context, name string, cfg any) (DEXArchivist, error) {
    42  	driversMtx.Lock()
    43  	drv, ok := drivers[name]
    44  	driversMtx.Unlock()
    45  	if !ok {
    46  		return nil, fmt.Errorf("db: unknown database driver %q", name)
    47  	}
    48  	return drv.Open(ctx, cfg)
    49  }
    50  
    51  // UseLogger sets the logger to use for all of the DB Drivers.
    52  func UseLogger(logger dex.Logger) {
    53  	driversMtx.Lock()
    54  	for _, drv := range drivers {
    55  		drv.UseLogger(logger)
    56  	}
    57  	driversMtx.Unlock()
    58  }