add schema deploy module
This commit is contained in:
@@ -1,6 +1,83 @@
|
||||
package cmd
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"errors"
|
||||
"fmt"
|
||||
"log"
|
||||
|
||||
"git.trj.tw/golang/mtfosbot/module/schema"
|
||||
|
||||
"git.trj.tw/golang/mtfosbot/model"
|
||||
)
|
||||
|
||||
// DBTool - deploy database schemas
|
||||
func DBTool() {
|
||||
db := model.GetDB()
|
||||
if db == nil {
|
||||
log.Fatal(errors.New("database object is nil"))
|
||||
}
|
||||
|
||||
dbver, err := schema.ReadVersions()
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
version := -1
|
||||
|
||||
vcExists := false
|
||||
// check version_ctrl table exists
|
||||
row := db.QueryRowx(`select exists(select 1 from "information_schema"."tables" where "table_schema" = $1 and "table_name" = $2) as exists`, "public", "version_ctrl")
|
||||
err = row.Scan(&vcExists)
|
||||
if err != nil && err != sql.ErrNoRows {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
// read max version
|
||||
if vcExists {
|
||||
row := db.QueryRowx(`select max(version) as version from "public"."version_ctrl"`)
|
||||
err := row.Scan(&version)
|
||||
if err != nil && err != sql.ErrNoRows {
|
||||
log.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
fmt.Println("Database Schema Version is ", version)
|
||||
var vers []schema.VersionInfo
|
||||
for _, v := range dbver.Versions {
|
||||
if v.Version > version {
|
||||
vers = append(vers, v)
|
||||
}
|
||||
}
|
||||
if len(vers) == 0 {
|
||||
return
|
||||
}
|
||||
|
||||
tx, err := db.Beginx()
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
for _, v := range vers {
|
||||
fmt.Printf("Run Version: %d, FileName: %s\n", v.Version, v.File)
|
||||
query, err := schema.ReadSchema(v.File)
|
||||
if err != nil {
|
||||
tx.Rollback()
|
||||
log.Fatal(err)
|
||||
}
|
||||
// run schema file
|
||||
_, err = tx.Exec(query)
|
||||
if err != nil {
|
||||
tx.Rollback()
|
||||
log.Fatal(err)
|
||||
}
|
||||
// insert version ctrl
|
||||
_, err = tx.Exec(`insert into "public"."version_ctrl" ("version", "ctime", "querystr") values ($1, now(), $2)`, v.Version, query)
|
||||
if err != nil {
|
||||
tx.Rollback()
|
||||
log.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
tx.Commit()
|
||||
}
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
package schema
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
)
|
||||
|
||||
// DBVersions -
|
||||
type DBVersions struct {
|
||||
Versions []VersionInfo `json:"versions"`
|
||||
Test []VersionInfo `json:"test"`
|
||||
}
|
||||
|
||||
// VersionInfo -
|
||||
type VersionInfo struct {
|
||||
File string `json:"file"`
|
||||
Version int `json:"version"`
|
||||
}
|
||||
|
||||
// ReadVersions -
|
||||
func ReadVersions() (dbver DBVersions, err error) {
|
||||
f, err := Asset("schema/dbVersion.json")
|
||||
if err != nil {
|
||||
return dbver, err
|
||||
}
|
||||
|
||||
err = json.Unmarshal(f, &dbver)
|
||||
return
|
||||
}
|
||||
|
||||
// ReadSchema -
|
||||
func ReadSchema(name string) (q string, err error) {
|
||||
if len(name) == 0 {
|
||||
return "", errors.New("name is empty")
|
||||
}
|
||||
f, err := Asset(fmt.Sprintf("schema/%s", name))
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
q = string(f)
|
||||
return
|
||||
}
|
||||
Reference in New Issue
Block a user