aboutsummaryrefslogtreecommitdiff
path: root/src/server/database/database.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/database/database.go')
-rw-r--r--src/server/database/database.go74
1 files changed, 74 insertions, 0 deletions
diff --git a/src/server/database/database.go b/src/server/database/database.go
new file mode 100644
index 0000000..0b5bb4f
--- /dev/null
+++ b/src/server/database/database.go
@@ -0,0 +1,74 @@
+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()
+}