1
0
Fork 0
mirror of https://github.com/documize/community.git synced 2025-07-25 08:09:43 +02:00

Refactoring of database init code

This commit is contained in:
Harvey Kandola 2018-09-12 20:03:34 +01:00
parent d7fea2125f
commit 3bccd6a537
7 changed files with 155 additions and 134 deletions

6
core/env/flags.go vendored
View file

@ -80,8 +80,8 @@ func ParseFlags() (f Flags) {
register(&port, "port", false, "http/https port number")
register(&forcePort2SSL, "forcesslport", false, "redirect given http port number to TLS")
register(&siteMode, "offline", false, "set to '1' for OFFLINE mode")
register(&dbType, "dbtype", false, "set to database type mysql|percona|mariadb")
register(&dbConn, "db", true, `'username:password@protocol(hostname:port)/databasename" for example "fred:bloggs@tcp(localhost:3306)/documize"`)
register(&dbType, "dbtype", true, "specify the database provider: mysql|percona|mariadb|postgressql")
register(&dbConn, "db", true, `'database specific connection string for example "user:password@tcp(localhost:3306)/dbname"`)
parse("db")
@ -92,7 +92,7 @@ func ParseFlags() (f Flags) {
f.SiteMode = siteMode
f.SSLCertFile = certFile
f.SSLKeyFile = keyFile
f.DBType = dbType
f.DBType = strings.ToLower(dbType)
return f
}

114
core/env/runtime.go vendored
View file

@ -12,48 +12,126 @@
// Package env provides runtime, server level setup and configuration
package env
import "github.com/jmoiron/sqlx"
import (
"github.com/jmoiron/sqlx"
"strings"
)
// SQL-STORE: DbVariant needs to be struct like: name, delims, std params and conn string method
// Runtime provides access to database, logger and other server-level scoped objects.
// Use Context for per-request values.
type Runtime struct {
Flags Flags
Db *sqlx.DB
DbVariant DbVariant
Log Logger
Product ProdInfo
Flags Flags
Db *sqlx.DB
Storage StoreProvider
Log Logger
Product ProdInfo
}
const (
// SiteModeNormal serves app
SiteModeNormal = ""
// SiteModeOffline serves offline.html
SiteModeOffline = "1"
// SiteModeSetup tells Ember to serve setup route
SiteModeSetup = "2"
// SiteModeBadDB redirects to db-error.html page
SiteModeBadDB = "3"
)
// DbVariant details SQL database variant
type DbVariant string
// StoreType represents name of database system
type StoreType string
const (
// DbVariantMySQL is MySQL
DbVariantMySQL DbVariant = "MySQL"
// DBVariantPercona is Percona
DBVariantPercona DbVariant = "Percona"
// DBVariantMariaDB is MariaDB
DBVariantMariaDB DbVariant = "MariaDB"
// DBVariantMSSQL is Microsoft SQL Server
DBVariantMSSQL DbVariant = "MSSQL"
// DBVariantPostgreSQL is PostgreSQL
DBVariantPostgreSQL DbVariant = "PostgreSQL"
// StoreTypeMySQL is MySQL
StoreTypeMySQL StoreType = "MySQL"
// StoreTypePercona is Percona
StoreTypePercona StoreType = "Percona"
// StoreTypeMariaDB is MariaDB
StoreTypeMariaDB StoreType = "MariaDB"
// StoreTypePostgreSQL is PostgreSQL
StoreTypePostgreSQL StoreType = "PostgreSQL"
// StoreTypeMSSQL is Microsoft SQL Server
StoreTypeMSSQL StoreType = "MSSQL"
)
// StoreProvider contains database specific details
type StoreProvider struct {
// Type identifies storage provider
Type StoreType
// SQL driver name used to open DB connection.
DriverName string
// Database connection string parameters that must be present before connecting to DB
Params map[string]string
// Example holds storage provider specific connection string format
// used in error messages
Example string
}
// ConnectionString returns provider specific DB connection string
// complete with default parameters.
func (s *StoreProvider) ConnectionString(cs string) string {
switch s.Type {
case StoreTypePostgreSQL:
return "pg"
case StoreTypeMSSQL:
return "sql server"
case StoreTypeMySQL, StoreTypeMariaDB, StoreTypePercona:
queryBits := strings.Split(cs, "?")
ret := queryBits[0] + "?"
retFirst := true
if len(queryBits) == 2 {
paramBits := strings.Split(queryBits[1], "&")
for _, pb := range paramBits {
found := false
if assignBits := strings.Split(pb, "="); len(assignBits) == 2 {
_, found = s.Params[strings.TrimSpace(assignBits[0])]
}
if !found { // if we can't work out what it is, put it through
if retFirst {
retFirst = false
} else {
ret += "&"
}
ret += pb
}
}
}
for k, v := range s.Params {
if retFirst {
retFirst = false
} else {
ret += "&"
}
ret += k + "=" + v
}
return ret
}
return ""
}
const (
// CommunityEdition is AGPL product variant
CommunityEdition = "Community"
// EnterpriseEdition is commercial licensed product variant
EnterpriseEdition = "Enterprise"
)