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}