You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
bit4sat/db/db.go

95 lines
1.4 KiB
Go

package db
import (
"fmt"
"log"
"net/url"
"os"
"path/filepath"
"git.sp4ke.com/sp4ke/bit4sat/utils"
"github.com/jmoiron/sqlx"
_ "github.com/mattn/go-sqlite3"
"github.com/mediocregopher/radix/v3"
)
const (
DBName = "bit4sat.sqlite"
DBPath = "db-storage"
DBPathEnv = "BIT4SAT_DB_PATH"
DBPragma = ` PRAGMA foreign_keys = ON; `
)
var (
DBOptions = map[string]string{
"_journal_mode": "WAL",
}
DB *Database
)
type Database struct {
Sql *sqlx.DB
Redis *radix.Pool
}
func (d *Database) Open() error {
dsnOptions := &url.Values{}
for k, v := range DBOptions {
dsnOptions.Set(k, v)
}
// Get db base path
path, set := os.LookupEnv(DBPathEnv)
if !set {
path = DBPath
}
// Create path if not exists
err := utils.Mkdir(path)
if err != nil {
log.Fatal(err)
}
path = filepath.Join(path, DBName)
//path = fmt.Sprintf("%s/%s", path, DBName)
dsn := fmt.Sprintf("file:%s?%s", path, dsnOptions.Encode())
log.Printf("Opening sqlite db %s\n", dsn)
d.Sql, err = sqlx.Open("sqlite3", dsn)
if err != nil {
log.Fatal(err)
}
// Execute Pragmas
d.Sql.MustExec(DBPragma)
return nil
}
func RollbackTx(tx *sqlx.Tx, callback func()) {
log.Println("Rolling back transactions !")
err := tx.Rollback()
if err != nil {
log.Fatal(err)
}
if callback != nil {
callback()
}
}
func init() {
DB = &Database{}
DB.Open()
var err error
DB.Redis, err = radix.NewPool("tcp", "redis:6379", 10)
if err != nil {
log.Fatal(err)
}
}