GoBroke/cachedb/funcs.go
2024-12-20 01:29:56 -05:00

74 lines
1.4 KiB
Go

package cachedb
import (
`os`
`path/filepath`
`github.com/jmoiron/sqlx`
_ `github.com/mattn/go-sqlite3`
`r00t2.io/gobroke/conf`
`r00t2.io/sysutils/paths`
)
/*
NewCache returns a Cache from path to SQLite file `db` (or ":memory:" for an in-memory one).
It will be created if it doesn't exist for persistent caches.
*/
func NewCache(db string, perms *conf.Perms) (c *Cache, err error) {
var cache Cache
var exists bool
switch db {
case ":memory:":
// NO-OP for now; exists should be false, but it is since it's zero-val.
default:
if perms == nil {
perms = new(conf.Perms)
if err = perms.SetMissing(); err != nil {
return
}
}
if exists, err = paths.RealPathExists(&db); err != nil {
return
}
if !exists {
if err = os.MkdirAll(filepath.Dir(db), *perms.ParentDir.Mode); err != nil {
return
}
if err = os.WriteFile(db, nil, *perms.File.Mode); err != nil {
return
}
}
if err = perms.Chown(filepath.Dir(db)); err != nil {
return
}
if err = perms.Chmod(filepath.Dir(db), !exists); err != nil {
return
}
if err = perms.Chown(db); err != nil {
return
}
if err = perms.Chmod(db, !exists); err != nil {
return
}
}
if cache.db, err = sqlx.Connect("sqlite3", db); err != nil {
return
}
if !exists {
// New DB, so write the schema.
if _, err = cache.db.Exec(string(schemaBytes)); err != nil {
return
}
}
c = &cache
return
}