45 lines
967 B
Go
45 lines
967 B
Go
|
|
package storage
|
||
|
|
|
||
|
|
import (
|
||
|
|
"database/sql"
|
||
|
|
"fmt"
|
||
|
|
"internal-tools-server/models"
|
||
|
|
"log"
|
||
|
|
)
|
||
|
|
|
||
|
|
var db *sql.DB
|
||
|
|
|
||
|
|
var StorageEngine DataStore
|
||
|
|
|
||
|
|
// DataStore defines the interface that all db implementations must implement.
|
||
|
|
type DataStore interface {
|
||
|
|
ExecuteQuery(query string) ([]models.Component, error)
|
||
|
|
}
|
||
|
|
|
||
|
|
type DataStoreFactory func() (DataStore, error)
|
||
|
|
|
||
|
|
var datastoreFactories = make(map[string]DataStoreFactory)
|
||
|
|
|
||
|
|
func Register(name string, factory DataStoreFactory) {
|
||
|
|
if factory == nil {
|
||
|
|
log.Panicf("Datastore factory %s does not exist.", name)
|
||
|
|
}
|
||
|
|
_, registered := datastoreFactories[name]
|
||
|
|
if registered {
|
||
|
|
log.Printf("Datastore factory %s already registered. Ignoring.", name)
|
||
|
|
}
|
||
|
|
datastoreFactories[name] = factory
|
||
|
|
}
|
||
|
|
|
||
|
|
func init() {
|
||
|
|
Register("postgres", InitPostgresDb)
|
||
|
|
}
|
||
|
|
|
||
|
|
func CreateDatastore(name string) (DataStore, error) {
|
||
|
|
engine, ok := datastoreFactories[name]
|
||
|
|
if !ok {
|
||
|
|
return nil, fmt.Errorf("Invalid data store name: %s", name)
|
||
|
|
}
|
||
|
|
return engine()
|
||
|
|
}
|