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}