zitadel/internal/database/database.go
Silvan e38abdcdf3
perf: query data AS OF SYSTEM TIME (#5231)
Queries the data in the storage layser at the timestamp when the call hit the API layer
2023-02-27 22:36:43 +01:00

87 lines
1.8 KiB
Go

package database
import (
"database/sql"
"reflect"
_ "github.com/zitadel/zitadel/internal/database/cockroach"
"github.com/zitadel/zitadel/internal/database/dialect"
_ "github.com/zitadel/zitadel/internal/database/postgres"
"github.com/zitadel/zitadel/internal/errors"
)
type Config struct {
Dialects map[string]interface{} `mapstructure:",remain"`
connector dialect.Connector
}
func (c *Config) SetConnector(connector dialect.Connector) {
c.connector = connector
}
type DB struct {
*sql.DB
dialect.Database
}
func Connect(config Config, useAdmin bool) (*DB, error) {
client, err := config.connector.Connect(useAdmin)
if err != nil {
return nil, err
}
if err := client.Ping(); err != nil {
return nil, errors.ThrowPreconditionFailed(err, "DATAB-0pIWD", "Errors.Database.Connection.Failed")
}
return &DB{
DB: client,
Database: config.connector,
}, nil
}
func DecodeHook(from, to reflect.Value) (interface{}, error) {
if to.Type() != reflect.TypeOf(Config{}) {
return from.Interface(), nil
}
configuredDialects, ok := from.Interface().(map[string]interface{})
if !ok {
return from.Interface(), nil
}
configuredDialect := dialect.SelectByConfig(configuredDialects)
configs := make([]interface{}, 0, len(configuredDialects)-1)
for name, dialectConfig := range configuredDialects {
if !configuredDialect.Matcher.MatchName(name) {
continue
}
configs = append(configs, dialectConfig)
}
connector, err := configuredDialect.Matcher.Decode(configs)
if err != nil {
return nil, err
}
return Config{connector: connector}, nil
}
func (c Config) DatabaseName() string {
return c.connector.DatabaseName()
}
func (c Config) Username() string {
return c.connector.Username()
}
func (c Config) Password() string {
return c.connector.Password()
}
func (c Config) Type() string {
return c.connector.Type()
}