Compare commits

...

3 commits
v1.2.0 ... main

Author SHA1 Message Date
b83c7b1e17 Made Version function public 2024-05-10 08:11:47 +02:00
08df526c02 Added schema to logging 2024-01-02 07:57:46 +01:00
95335125d3 Added configurable schema 2023-12-30 17:40:34 +01:00
2 changed files with 25 additions and 18 deletions

View file

@ -29,6 +29,7 @@ import (
// An upgrader verifies the schema for one or more databases and upgrades them if possible.
type Upgrader struct {
schema string
databases map[string]Database
logCallback func(string, string)
sqlCallback func(string, int) ([]byte, bool)

View file

@ -14,7 +14,14 @@ func defaultCallback(topic, msg string) {// {{{
}// }}}
// NewUpgrader creates an upgrader with an empty list of databases.
func NewUpgrader() (upgrader Upgrader) {// {{{
func NewUpgrader(schema ...string) (upgrader Upgrader) {// {{{
// Using a variadic function for backward compatibility.
if len(schema) > 0 {
upgrader.schema = schema[0]
} else {
upgrader.schema = "_db"
}
upgrader.logCallback = defaultCallback
upgrader.databases = map[string]Database{}
return
@ -36,13 +43,13 @@ func (upgrader *Upgrader) Version(dbName string) (version int, err error) {// {{
return
}
version, err = dbase.version()
version, err = dbase.Version()
return
}// }}}
func (dbase Database) createSchemaTable() (err error) {// {{{
dbase.upgrader.logCallback("create", fmt.Sprintf("%s, _db.schema", dbase.DbName))
_, err = dbase.db.Exec(`CREATE SCHEMA "_db"`)
dbase.upgrader.logCallback("create", fmt.Sprintf("%s, %s.schema", dbase.DbName, dbase.upgrader.schema))
_, err = dbase.db.Exec(`CREATE SCHEMA "`+dbase.upgrader.schema+`"`)
// Error code 42P06 "duplicate_schema" is an OK error,
// table can still be missing and created.
@ -52,7 +59,7 @@ func (dbase Database) createSchemaTable() (err error) {// {{{
}
_, err = dbase.db.Exec(`
CREATE TABLE "_db"."schema" (
CREATE TABLE "`+dbase.upgrader.schema+`"."schema" (
version int4 NOT NULL,
updated timestamp NOT NULL DEFAULT NOW(),
@ -62,7 +69,7 @@ func (dbase Database) createSchemaTable() (err error) {// {{{
return
}// }}}
func (dbase Database) appendSchemaVersion(version int) (err error) {// {{{
_, err = dbase.db.Exec(`INSERT INTO _db.schema(version) VALUES($1)`, version)
_, err = dbase.db.Exec(`INSERT INTO `+dbase.upgrader.schema+`.schema(version) VALUES($1)`, version)
return
}// }}}
@ -72,7 +79,7 @@ func (dbase Database) verifySchemaTable() (err error) {// {{{
`SELECT EXISTS (
SELECT FROM pg_catalog.pg_class c
JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE n.nspname = '_db'
WHERE n.nspname = '`+dbase.upgrader.schema+`'
AND c.relname = 'schema'
)`,
); err != nil {
@ -94,7 +101,7 @@ func (dbase Database) verifySchemaTable() (err error) {// {{{
func (dbase Database) verifySchemaEntry() (err error) {// {{{
var version int
var row *sql.Row
row = dbase.db.QueryRow(`SELECT version FROM _db.schema LIMIT 1`)
row = dbase.db.QueryRow(`SELECT version FROM `+dbase.upgrader.schema+`.schema LIMIT 1`)
err = row.Scan(&version)
if err == sql.ErrNoRows {
@ -104,10 +111,10 @@ func (dbase Database) verifySchemaEntry() (err error) {// {{{
return
}// }}}
func (dbase Database) version() (version int, err error) {// {{{
func (dbase Database) Version() (version int, err error) {// {{{
var rows *sql.Rows
rows, err = dbase.db.Query(
`SELECT version FROM _db.schema ORDER BY version DESC LIMIT 1`,
`SELECT version FROM `+dbase.upgrader.schema+`.schema ORDER BY version DESC LIMIT 1`,
)
if err != nil {
return
@ -117,14 +124,13 @@ func (dbase Database) version() (version int, err error) {// {{{
if rows.Next() {
err = rows.Scan(&version)
} else {
err = fmt.Errorf(`Database "%s" is missing an entry in _db.schema`, dbase.DbName)
err = fmt.Errorf(`Database "%s" is missing an entry in `+dbase.upgrader.schema+`.schema`, dbase.DbName)
}
return
}// }}}
// AddDatabase sets a database up for the Run() function with verifying/creating the _db.schema table.
func (upgrader Upgrader) AddDatabase(host string, port int, dbName, user, pass string) (err error) {// {{{
var db Database
func (upgrader Upgrader) AddDatabase(host string, port int, dbName, user, pass string) (db Database, err error) {// {{{
if db, err = newDatabase(host, port, dbName, user, pass); err != nil {
return
}
@ -144,11 +150,11 @@ func (upgrader Upgrader) Run() (err error) {// {{{
var version int
for dbName, dbase := range upgrader.databases {
version, err = dbase.version()
version, err = dbase.Version()
if err != nil {
return
}
upgrader.logCallback("version", fmt.Sprintf("%s: %d", dbName, version))
upgrader.logCallback("version", fmt.Sprintf("%s.%s: %d", dbName, upgrader.schema, version))
for {
version++
@ -157,7 +163,7 @@ func (upgrader Upgrader) Run() (err error) {// {{{
break
}
upgrader.logCallback("exec", fmt.Sprintf("%s: %d", dbName, version))
upgrader.logCallback("exec", fmt.Sprintf("%s.%s: %d", dbName, upgrader.schema, version))
if _, err = dbase.db.Exec(string(sql)); err != nil {
return
}