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 }