/ db / db.go
db.go
 1  // SPDX-FileCopyrightText: Amolith <amolith@secluded.site>
 2  //
 3  // SPDX-License-Identifier: Apache-2.0
 4  
 5  package db
 6  
 7  import (
 8  	"database/sql"
 9  	_ "embed"
10  	"errors"
11  	"sync"
12  
13  	_ "modernc.org/sqlite"
14  )
15  
16  //go:embed sql/schema.sql
17  var schema string
18  
19  var mutex = &sync.Mutex{}
20  
21  // Open opens a connection to the SQLite database
22  func 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
28  func 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  }