mirror of https://git.envs.net/envs/getwtxt.git
99 lines
2.1 KiB
Go
99 lines
2.1 KiB
Go
/*
|
|
Copyright (c) 2019 Ben Morrison (gbmor)
|
|
|
|
This file is part of Getwtxt.
|
|
|
|
Getwtxt is free software: you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
Getwtxt is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with Getwtxt. If not, see <https://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
package svc // import "github.com/getwtxt/getwtxt/svc"
|
|
|
|
import (
|
|
"log"
|
|
"time"
|
|
|
|
"github.com/syndtr/goleveldb/leveldb"
|
|
"golang.org/x/sys/unix"
|
|
)
|
|
|
|
// Everything in this file is database-agnostic.
|
|
// Functions and types related to specific kinds
|
|
// of databases will be in their own respective
|
|
// files, such as:
|
|
// - leveldb.go
|
|
// - sqlite.go
|
|
|
|
// Abstraction to allow several different
|
|
// databases to be used interchangeably.
|
|
type dbase interface {
|
|
push() error
|
|
pull()
|
|
}
|
|
|
|
// Opens a new connection to the specified
|
|
// database, then reads it into memory.
|
|
func initDatabase() {
|
|
var db dbase
|
|
confObj.Mu.RLock()
|
|
dbpath := confObj.DBPath
|
|
confObj.Mu.RUnlock()
|
|
|
|
switch confObj.DBType {
|
|
|
|
case "leveldb":
|
|
lvl, err := leveldb.OpenFile(dbpath, nil)
|
|
errFatal("", err)
|
|
db = &dbLevel{db: lvl}
|
|
|
|
case "sqlite":
|
|
db = initSqlite()
|
|
|
|
}
|
|
|
|
dbChan <- db
|
|
pullDB()
|
|
}
|
|
|
|
// Close the database connection.
|
|
func killDB() {
|
|
db := <-dbChan
|
|
switch dbType := db.(type) {
|
|
case *dbLevel:
|
|
errLog("", dbType.db.Close())
|
|
case *dbSqlite:
|
|
errLog("", dbType.db.Close())
|
|
}
|
|
}
|
|
|
|
// Pushes the registry's cache data
|
|
// to a local database for safe keeping.
|
|
func pushDB() error {
|
|
db := <-dbChan
|
|
err := db.push()
|
|
dbChan <- db
|
|
|
|
unix.Sync()
|
|
|
|
return err
|
|
}
|
|
|
|
// Reads the database from disk into memory.
|
|
func pullDB() {
|
|
start := time.Now()
|
|
db := <-dbChan
|
|
db.pull()
|
|
dbChan <- db
|
|
log.Printf("Database pull took: %v\n", time.Since(start))
|
|
}
|