db.go

 1// SPDX-FileCopyrightText: Amolith <amolith@secluded.site>
 2//
 3// SPDX-License-Identifier: Apache-2.0
 4
 5package db
 6
 7import (
 8	"database/sql"
 9	_ "embed"
10	"errors"
11	"sync"
12
13	_ "modernc.org/sqlite"
14)
15
16//go:embed sql/schema.sql
17var schema string
18
19var mutex = &sync.Mutex{}
20
21// Open opens a connection to the SQLite database
22func Open(dbPath string) (*sql.DB, error) {
23	return sql.Open("sqlite", "file:"+dbPath+"?_pragma=journal_mode%3DWAL")
24}
25
26// VerifySchema checks whether the schema has been initialised and initialises it
27// if not
28func InitialiseDatabase(dbConn *sql.DB) error {
29	var name string
30	err := dbConn.QueryRow("SELECT name FROM sqlite_master WHERE type='table' AND name='users'").Scan(&name)
31	if err != nil && errors.Is(err, sql.ErrNoRows) {
32		mutex.Lock()
33		defer mutex.Unlock()
34		if _, err := dbConn.Exec(schema); err != nil {
35			return err
36		}
37		return nil
38	}
39	return err
40}