1
0
Fork 0
mirror of https://github.com/documize/community.git synced 2025-07-24 15:49:44 +02:00

Make API work with new schema

This commit is contained in:
Harvey Kandola 2018-09-19 16:03:29 +01:00
parent 28342fcf5e
commit 4f0cc2f616
48 changed files with 1218 additions and 1097 deletions

View file

@ -73,36 +73,20 @@ func Check(runtime *env.Runtime) bool {
return false
}
{ // if there are no rows in the database, enter set-up mode
var flds []string
if err := runtime.Db.Select(&flds, runtime.StoreProvider.QueryTableList()); err != nil {
msg := fmt.Sprintf("Database: unable to get database table list ")
runtime.Log.Error(msg, err)
web.SiteInfo.Issue = msg + err.Error()
runtime.Flags.SiteMode = env.SiteModeBadDB
return false
}
if strings.TrimSpace(flds[0]) == "0" {
runtime.Log.Info("Database: starting setup mode for empty database")
runtime.Flags.SiteMode = env.SiteModeSetup
return false
}
// if there are no rows in the database, enter set-up mode
var flds []string
if err := runtime.Db.Select(&flds, runtime.StoreProvider.QueryTableList()); err != nil {
msg := fmt.Sprintf("Database: unable to get database table list ")
runtime.Log.Error(msg, err)
web.SiteInfo.Issue = msg + err.Error()
runtime.Flags.SiteMode = env.SiteModeBadDB
return false
}
// Ensure no missing tables.
var tables = []string{"account", "attachment", "document",
"label", "organization", "page", "revision", "search", "user"}
for _, table := range tables {
var result []string
if err := runtime.Db.Select(&result, fmt.Sprintf("SELECT COUNT(*) FROM %s ;", table)); err != nil {
msg := fmt.Sprintf("Database: missing table %s", table)
runtime.Log.Error(msg, err)
web.SiteInfo.Issue = msg
runtime.Flags.SiteMode = env.SiteModeBadDB
return false
}
if strings.TrimSpace(flds[0]) == "0" {
runtime.Log.Info("Database: starting setup mode for empty database")
runtime.Flags.SiteMode = env.SiteModeSetup
return false
}
// We have good database, so proceed with app boot process.

View file

@ -16,7 +16,7 @@ import (
"regexp"
"strconv"
"strings"
"time"
// "time"
"github.com/documize/community/core/env"
"github.com/jmoiron/sqlx"
@ -24,7 +24,7 @@ import (
// InstallUpgrade creates new database or upgrades existing database.
func InstallUpgrade(runtime *env.Runtime, existingDB bool) (err error) {
amLeader := false
// amLeader := false
// Get all SQL scripts.
scripts, err := LoadScripts()
@ -40,7 +40,7 @@ func InstallUpgrade(runtime *env.Runtime, existingDB bool) (err error) {
return
}
runtime.Log.Info(fmt.Sprintf("Database: loaded %d SQL scripts for provider %s", len(dbTypeScripts), runtime.StoreProvider.Type()))
runtime.Log.Info(fmt.Sprintf("Database: loaded %d SQL scripts for provider %s", len(dbTypeScripts), runtime.StoreProvider.Type()))
// Get current database version.
currentVersion := 0
@ -62,51 +62,77 @@ func InstallUpgrade(runtime *env.Runtime, existingDB bool) (err error) {
}
}
if existingDB {
var err error
amLeader, err = Lock(runtime, len(toProcess))
if err != nil {
runtime.Log.Error("Database: failed to lock existing database for processing", err)
}
} else {
// New installation hopes that you are only spinning up one instance of Documize.
// Assumption: nobody will perform the intial setup in a clustered environment.
amLeader = true
// For MySQL type there was major new schema introduced in v24.
// We check for this release and bypass usual locking code
// because tables have changed.
legacyMigration := runtime.StoreProvider.Type() == env.StoreTypeMySQL &&
currentVersion > 0 && currentVersion < 25 && len(toProcess) >= 26 && toProcess[len(toProcess)-1].Version == 25
if legacyMigration {
// Bypass all DB locking/checking processes as these look for new schema
// which we are about to install.
toProcess = toProcess[len(toProcess)-1:]
}
tx, err := runtime.Db.Beginx()
if err != nil {
return Unlock(runtime, tx, err, amLeader)
return err
}
// If currently running process is database leader then we perform upgrade.
if amLeader {
runtime.Log.Info(fmt.Sprintf("Database: %d SQL scripts to process", len(toProcess)))
err = runScripts(runtime, tx, toProcess)
if err != nil {
runtime.Log.Error("Database: error processing SQL script", err)
}
return Unlock(runtime, tx, err, amLeader)
}
// If currently running process is a slave instance then we wait for migration to complete.
targetVersion := toProcess[len(toProcess)-1].Version
for targetVersion != currentVersion {
time.Sleep(time.Second)
runtime.Log.Info("Database: slave instance polling for upgrade process completion")
err = runScripts(runtime, tx, toProcess)
if err != nil {
runtime.Log.Error("Database: error processing SQL scripts", err)
tx.Rollback()
// Get database version and check again.
currentVersion, err = CurrentVersion(runtime)
if err != nil {
return Unlock(runtime, tx, err, amLeader)
}
}
return Unlock(runtime, tx, nil, amLeader)
tx.Commit()
return nil
// New style schema
// if existingDB {
// amLeader, err = Lock(runtime, len(toProcess))
// if err != nil {
// runtime.Log.Error("Database: failed to lock existing database for processing", err)
// }
// } else {
// // New installation hopes that you are only spinning up one instance of Documize.
// // Assumption: nobody will perform the intial setup in a clustered environment.
// amLeader = true
// }
// tx, err := runtime.Db.Beginx()
// if err != nil {
// return Unlock(runtime, tx, err, amLeader)
// }
// // If currently running process is database leader then we perform upgrade.
// if amLeader {
// runtime.Log.Info(fmt.Sprintf("Database: %d SQL scripts to process", len(toProcess)))
// err = runScripts(runtime, tx, toProcess)
// if err != nil {
// runtime.Log.Error("Database: error processing SQL script", err)
// }
// return Unlock(runtime, tx, err, amLeader)
// }
// // If currently running process is a slave instance then we wait for migration to complete.
// targetVersion := toProcess[len(toProcess)-1].Version
// for targetVersion != currentVersion {
// time.Sleep(time.Second)
// runtime.Log.Info("Database: slave instance polling for upgrade process completion")
// tx.Rollback()
// // Get database version and check again.
// currentVersion, err = CurrentVersion(runtime)
// if err != nil {
// return Unlock(runtime, tx, err, amLeader)
// }
// }
// return Unlock(runtime, tx, nil, amLeader)
}
// Run SQL scripts to instal or upgrade this database.
@ -117,12 +143,23 @@ func runScripts(runtime *env.Runtime, tx *sqlx.Tx, scripts []Script) (err error)
err = executeSQL(tx, runtime.StoreProvider.Type(), runtime.StoreProvider.TypeVariant(), script.Script)
if err != nil {
runtime.Log.Error(fmt.Sprintf("error executing script version %d", script.Version), err)
return err
}
// Record the fact we have processed this database script version.
_, err = tx.Exec(runtime.StoreProvider.QueryRecordVersionUpgrade(script.Version))
if err != nil {
// For MySQL we try the legacy DB checks.
if runtime.StoreProvider.Type() == env.StoreTypeMySQL {
runtime.Log.Error(fmt.Sprintf("Database: attempting legacy fallback for script version %d", script.Version), err)
_, err = tx.Exec(runtime.StoreProvider.QueryRecordVersionUpgradeLegacy(script.Version))
if err != nil {
return err
}
}
return err
}
}
@ -143,6 +180,7 @@ func executeSQL(tx *sqlx.Tx, st env.StoreType, variant string, SQLfile []byte) e
_, err := tx.Exec(stmt)
if err != nil {
fmt.Println("sql statement error:", stmt)
return err
}
}
@ -175,12 +213,16 @@ func getStatements(bytes []byte) (stmts []string) {
// CurrentVersion returns number that represents the current database version number.
// For example 23 represents the 23rd iteration of the database.
func CurrentVersion(runtime *env.Runtime) (version int, err error) {
row := runtime.Db.QueryRow(runtime.StoreProvider.QueryGetDatabaseVersion())
currentVersion := "0"
var currentVersion string
row := runtime.Db.QueryRow(runtime.StoreProvider.QueryGetDatabaseVersion())
err = row.Scan(&currentVersion)
if err != nil {
currentVersion = "0"
// For MySQL we try the legacy DB checks.
if runtime.StoreProvider.Type() == env.StoreTypeMySQL {
row := runtime.Db.QueryRow(runtime.StoreProvider.QueryGetDatabaseVersionLegacy())
err = row.Scan(&currentVersion)
}
}
return extractVersionNumber(currentVersion), nil

View file

@ -29,10 +29,11 @@ RENAME TABLE
`userevent` TO dmz_audit_log,
`useraction` TO dmz_action;
-- field renaming
ALTER TABLE `dmz_org`
ALTER TABLE dmz_org
CHANGE `refid` `c_refid` CHAR(16) NOT NULL,
CHANGE `company` `c_refid` VARCHAR(500) NOT NULL,
CHANGE `company` `c_company` VARCHAR(500) NOT NULL,
CHANGE `title` `c_title` VARCHAR(500) NOT NULL,
CHANGE `message` `c_message` VARCHAR(500) NOT NULL,
CHANGE `domain` `c_domain` VARCHAR(200) NOT NULL DEFAULT '',
@ -48,7 +49,7 @@ ALTER TABLE `dmz_org`
CHANGE `created` `c_created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
CHANGE `revised` `c_revised` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;
ALTER TABLE `dmz_space`
ALTER TABLE dmz_space
CHANGE `refid` `c_refid` CHAR(16) NOT NULL,
CHANGE `orgid` `c_orgid` CHAR(16) NOT NULL,
CHANGE `userid` `c_userid` CHAR(16) NOT NULL DEFAULT '',
@ -59,7 +60,7 @@ ALTER TABLE `dmz_space`
CHANGE `created` `c_created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
CHANGE `revised` `c_revised` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;
ALTER TABLE `dmz_category`
ALTER TABLE dmz_category
CHANGE `refid` `c_refid` CHAR(16) NOT NULL,
CHANGE `orgid` `c_orgid` CHAR(16) NOT NULL,
CHANGE `labelid` `c_spaceid` CHAR(16) NOT NULL,
@ -67,7 +68,7 @@ ALTER TABLE `dmz_category`
CHANGE `created` `c_created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
CHANGE `revised` `c_revised` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;
ALTER TABLE `dmz_category_member`
ALTER TABLE dmz_category_member
CHANGE `refid` `c_refid` CHAR(16) NOT NULL,
CHANGE `orgid` `c_orgid` CHAR(16) NOT NULL,
CHANGE `labelid` `c_spaceid` CHAR(16) NOT NULL,
@ -76,7 +77,7 @@ ALTER TABLE `dmz_category_member`
CHANGE `created` `c_created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
CHANGE `revised` `c_revised` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;
ALTER TABLE `dmz_group`
ALTER TABLE dmz_group
CHANGE `refid` `c_refid` CHAR(16) NOT NULL,
CHANGE `orgid` `c_orgid` CHAR(16) NOT NULL,
CHANGE `role` `c_name` VARCHAR(50) NOT NULL DEFAULT '',
@ -84,12 +85,13 @@ ALTER TABLE `dmz_group`
CHANGE `created` `c_created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
CHANGE `revised` `c_revised` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;
ALTER TABLE `dmz_group_member`
ALTER TABLE dmz_group_member
CHANGE `orgid` `c_orgid` CHAR(16) NOT NULL,
CHANGE `roleid` `c_groupid` CHAR(16) NOT NULL,
CHANGE `userid` `c_userid` CHAR(16) NOT NULL;
ALTER TABLE `dmz_permission`
ALTER TABLE dmz_permission
CHANGE `orgid` `c_orgid` CHAR(16) NOT NULL,
CHANGE `who` `c_who` VARCHAR(30) NOT NULL,
CHANGE `whoid` `c_whoid` CHAR(16) NOT NULL DEFAULT '',
@ -99,7 +101,8 @@ ALTER TABLE `dmz_permission`
CHANGE `refid` `c_refid` CHAR(16) NOT NULL,
CHANGE `created` `c_created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;
ALTER TABLE `dmz_doc`
ALTER TABLE dmz_doc
CHANGE `refid` `c_refid` CHAR(16) NOT NULL,
CHANGE `orgid` `c_orgid` CHAR(16) NOT NULL,
CHANGE `labelid` `c_spaceid` CHAR(16) NOT NULL,
@ -121,7 +124,7 @@ ALTER TABLE `dmz_doc`
CHANGE `created` `c_created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
CHANGE `revised` `c_revised` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;
ALTER TABLE `dmz_doc_share`
ALTER TABLE dmz_doc_share
CHANGE `orgid` `c_orgid` CHAR(16) NOT NULL,
CHANGE `documentid` `c_docid` CHAR(16) NOT NULL,
CHANGE `userid` `c_userid` CHAR(16) DEFAULT '',
@ -133,7 +136,7 @@ ALTER TABLE `dmz_doc_share`
CHANGE `active` `c_active` BOOL NOT NULL DEFAULT 1,
CHANGE `created` `c_created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;
ALTER TABLE `dmz_doc_vote`
ALTER TABLE dmz_doc_vote
CHANGE `refid` `c_refid` CHAR(16) NOT NULL,
CHANGE `orgid` `c_orgid` CHAR(16) NOT NULL,
CHANGE `documentid` `c_docid` CHAR(16) NOT NULL,
@ -142,7 +145,7 @@ ALTER TABLE `dmz_doc_vote`
CHANGE `created` `c_created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
CHANGE `revised` `c_revised` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;
ALTER TABLE `dmz_doc_comment`
ALTER TABLE dmz_doc_comment
CHANGE `refid` `c_refid` CHAR(16) NOT NULL,
CHANGE `orgid` `c_orgid` CHAR(16) NOT NULL,
CHANGE `documentid` `c_docid` CHAR(16) NOT NULL,
@ -151,7 +154,7 @@ ALTER TABLE `dmz_doc_comment`
CHANGE `feedback` `c_feedback` LONGTEXT,
CHANGE `created` `c_created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;
ALTER TABLE `dmz_doc_attachment`
ALTER TABLE dmz_doc_attachment
CHANGE `refid` `c_refid` CHAR(16) NOT NULL,
CHANGE `orgid` `c_orgid` CHAR(16) NOT NULL,
CHANGE `documentid` `c_docid` CHAR(16) NOT NULL,
@ -163,7 +166,7 @@ ALTER TABLE `dmz_doc_attachment`
CHANGE `created` `c_created` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
CHANGE `revised` `c_revised` TIMESTAMP DEFAULT CURRENT_TIMESTAMP;
ALTER TABLE `dmz_doc_link`
ALTER TABLE dmz_doc_link
CHANGE `refid` `c_refid` CHAR(16) NOT NULL,
CHANGE `orgid` `c_orgid` CHAR(16) NOT NULL,
CHANGE `folderid` `c_spaceid` CHAR(16) NOT NULL,
@ -178,7 +181,7 @@ ALTER TABLE `dmz_doc_link`
CHANGE `created` `c_created` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
CHANGE `revised` `c_revised` TIMESTAMP DEFAULT CURRENT_TIMESTAMP;
ALTER TABLE `dmz_section`
ALTER TABLE dmz_section
CHANGE `refid` `c_refid` CHAR(16) NOT NULL,
CHANGE `orgid` `c_orgid` CHAR(16) NOT NULL,
CHANGE `documentid` `c_docid` CHAR(16) NOT NULL,
@ -196,7 +199,7 @@ ALTER TABLE `dmz_section`
CHANGE `created` `c_created` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
CHANGE `revised` `c_revised` TIMESTAMP DEFAULT CURRENT_TIMESTAMP;
ALTER TABLE `dmz_section_meta`
ALTER TABLE dmz_section_meta
CHANGE `orgid` `c_orgid` CHAR(16) NOT NULL,
CHANGE `documentid` `c_docid` CHAR(16) NOT NULL,
CHANGE `userid` `c_userid` CHAR(16) NOT NULL DEFAULT '',
@ -207,7 +210,7 @@ ALTER TABLE `dmz_section_meta`
CHANGE `created` `c_created` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
CHANGE `revised` `c_revised` TIMESTAMP DEFAULT CURRENT_TIMESTAMP;
ALTER TABLE `dmz_section_template`
ALTER TABLE dmz_section_template
CHANGE `refid` `c_refid` CHAR(16) NOT NULL,
CHANGE `orgid` `c_orgid` CHAR(16) NOT NULL,
CHANGE `labelid` `c_spaceid` CHAR(16) DEFAULT '',
@ -224,7 +227,7 @@ ALTER TABLE `dmz_section_template`
CHANGE `created` `c_created` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
CHANGE `revised` `c_revised` TIMESTAMP DEFAULT CURRENT_TIMESTAMP;
ALTER TABLE `dmz_section_revision`
ALTER TABLE dmz_section_revision
CHANGE `refid` `c_refid` CHAR(16) NOT NULL,
CHANGE `orgid` `c_orgid` CHAR(16) NOT NULL,
CHANGE `documentid` `c_docid` CHAR(16) NOT NULL,
@ -240,7 +243,7 @@ ALTER TABLE `dmz_section_revision`
CHANGE `created` `c_created` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
CHANGE `revised` `c_revised` TIMESTAMP DEFAULT CURRENT_TIMESTAMP;
ALTER TABLE `dmz_user`
ALTER TABLE dmz_user
CHANGE `refid` `c_refid` CHAR(16) NOT NULL,
CHANGE `firstname` `c_firstname` VARCHAR(500) NOT NULL DEFAULT '',
CHANGE `lastname` `c_lastname` VARCHAR(500) NOT NULL DEFAULT '',
@ -255,7 +258,7 @@ ALTER TABLE `dmz_user`
CHANGE `created` `c_created` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
CHANGE `revised` `c_revised` TIMESTAMP DEFAULT CURRENT_TIMESTAMP;
ALTER TABLE `dmz_user_account`
ALTER TABLE dmz_user_account
CHANGE `refid` `c_refid` CHAR(16) NOT NULL,
CHANGE `orgid` `c_orgid` CHAR(16) NOT NULL,
CHANGE `userid` `c_userid` CHAR(16) NOT NULL,
@ -267,7 +270,7 @@ ALTER TABLE `dmz_user_account`
CHANGE `created` `c_created` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
CHANGE `revised` `c_revised` TIMESTAMP DEFAULT CURRENT_TIMESTAMP;
ALTER TABLE `dmz_user_activity`
ALTER TABLE dmz_user_activity
CHANGE `orgid` `c_orgid` CHAR(16) NOT NULL,
CHANGE `userid` `c_userid` CHAR(16) NOT NULL,
CHANGE `labelid` `c_spaceid` CHAR(16) NOT NULL,
@ -278,17 +281,17 @@ ALTER TABLE `dmz_user_activity`
CHANGE `metadata` `c_metadata` VARCHAR(1000) NOT NULL DEFAULT '',
CHANGE `created` `c_created` TIMESTAMP DEFAULT CURRENT_TIMESTAMP;
ALTER TABLE `dmz_user_config`
ALTER TABLE dmz_user_config
CHANGE `orgid` `c_orgid` CHAR(16) NOT NULL,
CHANGE `userid` `c_userid` CHAR(16) NOT NULL,
CHANGE `key` `c_key` CHAR(200) NOT NULL,
CHANGE `config` `c_config` JSON;
ALTER TABLE `dmz_config`
ALTER TABLE dmz_config
CHANGE `key` `c_key` CHAR(200) NOT NULL,
CHANGE `config` `c_config` JSON;
ALTER TABLE `dmz_pin`
ALTER TABLE dmz_pin
CHANGE `refid` `c_refid` CHAR(16) NOT NULL,
CHANGE `orgid` `c_orgid` CHAR(16) NOT NULL,
CHANGE `userid` `c_userid` CHAR(16) DEFAULT '',
@ -299,7 +302,7 @@ ALTER TABLE `dmz_pin`
CHANGE `created` `c_created` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
CHANGE `revised` `c_revised` TIMESTAMP DEFAULT CURRENT_TIMESTAMP;
ALTER TABLE `dmz_search`
ALTER TABLE dmz_search
CHANGE `orgid` `c_orgid` CHAR(16) NOT NULL,
CHANGE `documentid` `c_docid` CHAR(16) NOT NULL,
CHANGE `itemid` `c_itemid` CHAR(16) NOT NULL DEFAULT '',
@ -307,14 +310,14 @@ ALTER TABLE `dmz_search`
CHANGE `content` `c_content` LONGTEXT,
CHANGE `created` `c_created` TIMESTAMP DEFAULT CURRENT_TIMESTAMP;
ALTER TABLE `dmz_audit_log`
ALTER TABLE dmz_audit_log
CHANGE `orgid` `c_orgid` CHAR(16) NOT NULL,
CHANGE `userid` `c_userid` CHAR(16) NOT NULL,
CHANGE `eventtype` `c_eventtype` VARCHAR(100) NOT NULL DEFAULT '',
CHANGE `ip` `c_ip` VARCHAR(39) NOT NULL DEFAULT '',
CHANGE `created` `c_created` TIMESTAMP DEFAULT CURRENT_TIMESTAMP;
ALTER TABLE `dmz_action`
ALTER TABLE dmz_action
CHANGE `refid` `c_refid` CHAR(16) NOT NULL,
CHANGE `orgid` `c_orgid` CHAR(16) NOT NULL,
CHANGE `documentid` `c_docid` CHAR(16) NOT NULL,