gosora/install/mysql.go
Azareal 5a43432b80 Replaced most of the uses of fmt with log.
Replaced the io.Writers with http.ResponseWriters.
Refactored the compiled template calls.
Redirect port 443 to port 80.
Catch more errors from templates.
Fixed a few mutexes which are never unlocked.
Eliminated an unnecessary parameter in InternalError()
Temporarily commented out users_penalties so that the installer will succeed.
A couple more template types can be remapped now.
Tweaked the theme.
2017-08-13 12:22:34 +01:00

152 lines
3.2 KiB
Go

/* Copyright Azareal 2017 - 2018 */
package main
import (
"fmt"
"bytes"
"strings"
"strconv"
"io/ioutil"
"path/filepath"
"database/sql"
"../query_gen/lib"
_ "github.com/go-sql-driver/mysql"
)
//var db_collation string = "utf8mb4_general_ci"
func _set_mysql_adapter() {
db_port = "3306"
init_database = _init_mysql
table_defs = _table_defs_mysql
initial_data = _initial_data_mysql
}
func _init_mysql() (err error) {
_db_password := db_password
if _db_password != "" {
_db_password = ":" + _db_password
}
db, err = sql.Open("mysql",db_username + _db_password + "@tcp(" + db_host + ":" + db_port + ")/")
if err != nil {
return err
}
// Make sure that the connection is alive..
err = db.Ping()
if err != nil {
return err
}
fmt.Println("Successfully connected to the database")
var waste string
err = db.QueryRow("SHOW DATABASES LIKE '" + db_name + "'").Scan(&waste)
if err != nil && err != sql.ErrNoRows {
return err
}
if err == sql.ErrNoRows {
fmt.Println("Unable to find the database. Attempting to create it")
_,err = db.Exec("CREATE DATABASE IF NOT EXISTS " + db_name + "")
if err != nil {
return err
}
fmt.Println("The database was successfully created")
}
fmt.Println("Switching to database " + db_name)
_, err = db.Exec("USE " + db_name)
if err != nil {
return err
}
// Ready the query builder
qgen.Builder.SetConn(db)
err = qgen.Builder.SetAdapter("mysql")
if err != nil {
return err
}
return nil
}
func _table_defs_mysql() error {
//fmt.Println("Creating the tables")
files, _ := ioutil.ReadDir("./schema/mysql/")
for _, f := range files {
if !strings.HasPrefix(f.Name(),"query_") {
continue
}
var table string
var ext string
table = strings.TrimPrefix(f.Name(),"query_")
ext = filepath.Ext(table)
if ext != ".sql" {
continue
}
table = strings.TrimSuffix(table,ext)
fmt.Println("Creating table '" + table + "'")
data, err := ioutil.ReadFile("./schema/mysql/" + f.Name())
if err != nil {
return err
}
data = bytes.TrimSpace(data)
_, err = db.Exec(string(data))
if err != nil {
fmt.Println("Failed query:",string(data))
return err
}
}
//fmt.Println("Finished creating the tables")
return nil
}
func _initial_data_mysql() error {
return nil // Coming Soon
fmt.Println("Seeding the tables")
data, err := ioutil.ReadFile("./schema/mysql/inserts.sql")
if err != nil {
return err
}
data = bytes.TrimSpace(data)
fmt.Println("Executing query",string(data))
_, err = db.Exec(string(data))
if err != nil {
return err
}
//fmt.Println("Finished inserting the database data")
return nil
}
func _mysql_seed_database() error {
fmt.Println("Opening the database seed file")
sqlContents, err := ioutil.ReadFile("./mysql.sql")
if err != nil {
return err
}
fmt.Println("Preparing installation queries")
sqlContents = bytes.TrimSpace(sqlContents)
statements := bytes.Split(sqlContents, []byte(";"))
for key, statement := range statements {
if len(statement) == 0 {
continue
}
fmt.Println("Executing query #" + strconv.Itoa(key) + " " + string(statement))
_, err = db.Exec(string(statement))
if err != nil {
return err
}
}
fmt.Println("Finished inserting the database data")
return nil
}