diff options
Diffstat (limited to 'storage/init.go')
-rw-r--r-- | storage/init.go | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/storage/init.go b/storage/init.go new file mode 100644 index 0000000..9894c5b --- /dev/null +++ b/storage/init.go @@ -0,0 +1,63 @@ +package storage + +import ( + "database/sql" + "fmt" + "log" + + _ "github.com/mattn/go-sqlite3" +) + +// initErr will log the error and close the database connection if +// necessary. +func initErr(db *DB, err error) { + if db.Conn != nil { + db.Conn.Close() + } + log.Fatalf("Initialization Error :: %s", err.Error()) +} + +func initDB(db *DB) { + var err error + + db.Path = fmt.Sprintf("%s/grus.db", GetDir()) + + db.Conn, err = sql.Open("sqlite3", db.Path) + if err != nil { + log.Printf("storage/init.go: %s\n", + "Failed to open database connection") + initErr(db, err) + } + + sqlstmt := []string{ + `CREATE TABLE IF NOT EXISTS words ( + word TEXT PRIMARY KEY NOT NULL, + sorted TEXT NOT NULL);`, + `INSERT INTO words(word, lexical) + values("grus", "grsu");`, + } + + // We range over statements and execute them one by one, this + // is during initialization so it doesn't matter if it takes + // few more ms. This way we know which statement caused the + // program to fail. + for _, s := range sqlstmt { + stmt, err := db.Conn.Prepare(s) + + if err != nil { + log.Printf("storage/init.go: %s\n", + "failed to prepare statement") + log.Println(s) + initErr(db, err) + } + + _, err = stmt.Exec() + stmt.Close() + if err != nil { + log.Printf("storage/init.go: %s\n", + "failed to execute statement") + log.Println(s) + initErr(db, err) + } + } +} |