package database import ( "database/sql" "log" // We're using sqlite3 because we want to make deploying the project easy. // (ie, no need to set up a postgres server for a little forum application). _ "github.com/mattn/go-sqlite3" ) var db *sql.DB // Initialises the tables in the database (if they do not exist). func setup_db(db *sql.DB) error { // FIXME executing multiple queries with one statement is definitely slower // than a single query with multiple statments. IDK if our sqlite3 driver // supports this, but a rewrite is needed if it does. statements := [...]string{ ("CREATE TABLE IF NOT EXISTS Users(" + "uid INTEGER PRIMARY KEY AUTOINCREMENT," + "email TEXT NOT NULL UNIQUE," + "username TEXT," + "password_hash TEXT NOT NULL," + "password_salt TEXT NOT NULL);"), ("CREATE TABLE IF NOT EXISTS Posts(" + "uid INTEGER PRIMARY KEY AUTOINCREMENT," + "author INTEGER NOT NULL," + "parent INTEGER," + "time INTEGER NOT NULL," + "subreact TEXT NOT NULL," + "title TEXT NOT NULL," + "contents TEXT NOT NULL," + "thumbnail BLOB NOT NULL," + "image BLOB NOT NULL," + "FOREIGN KEY (author) REFERENCES Users (uid)," + "FOREIGN KEY (parent) REFERENCES Posts (uid));"), } for _, statement := range statements { _, err := db.Exec(statement) if err != nil { return err } } return nil } // Call to initialise the database global var. func Init(path string) { var err error db, err = sql.Open("sqlite3", path) if err != nil { log.Fatal(err) } err = db.Ping() if err != nil { log.Fatal(err) } err = setup_db(db) if err != nil { log.Fatal(err) } } func GetDb() *sql.DB { return db } // Call to close connection to database. func Close() { db.Close() }