aboutsummaryrefslogtreecommitdiff
path: root/src/server/database/database.go
blob: 0b5bb4f573bcf8cd936b9d9e94296710abceceaf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
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()
}