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 "fmt"
12 "sync"
13
14 // Import SQLite driver for database connectivity.
15 _ "modernc.org/sqlite"
16)
17
18//go:embed sql/schema.sql
19var schema string
20
21var mutex = &sync.Mutex{}
22
23// Open opens a connection to the SQLite database.
24func Open(dbPath string) (*sql.DB, error) {
25 db, err := sql.Open("sqlite", "file:"+dbPath+"?_pragma=journal_mode%3DWAL")
26 if err != nil {
27 return nil, fmt.Errorf("failed to open database: %w", err)
28 }
29
30 return db, nil
31}
32
33// VerifySchema checks whether the schema has been initialised and initialises it
34// if not.
35func InitialiseDatabase(dbConn *sql.DB) error {
36 var name string
37
38 err := dbConn.QueryRow("SELECT name FROM sqlite_master WHERE type='table' AND name='users'").Scan(&name)
39 if err != nil && errors.Is(err, sql.ErrNoRows) {
40 mutex.Lock()
41 defer mutex.Unlock()
42
43 if _, err := dbConn.Exec(schema); err != nil {
44 return fmt.Errorf("failed to execute SQL: %w", err)
45 }
46
47 return nil
48 }
49
50 if err != nil {
51 return fmt.Errorf("failed to scan row: %w", err)
52 }
53
54 return nil
55}