Load db in memeory and flush db to disk #4 #15

This commit is contained in:
Chakib Ben Ziane 2017-11-14 17:55:19 +01:00
parent 8321b36ff7
commit 3d5d344976
2 changed files with 59 additions and 13 deletions

66
db.go
View File

@ -5,6 +5,12 @@ import (
"log"
_ "github.com/mattn/go-sqlite3"
sqlite3 "github.com/mattn/go-sqlite3"
)
const (
DB_LOCAL_PATH = "bookmarks.db"
DB_MEM_PATH = "file::memory:?cache=shared"
)
var (
@ -14,32 +20,30 @@ var (
const (
CREATE_DB_SCHEMA = `CREATE TABLE if not exists bookmarks (
id integer PRIMARY KEY,
URL text NOT NULL UNIQUE)`
URL text NOT NULL UNIQUE,
metadata text default '',
tags text default '',
desc text default '',
flags integer default 0
)`
)
// TODO: Use context when making call from request/api
func initInMemoryDb() {
//sqlite3conn := []*sqlite3.SQLiteConn{}
var err error
//var tx *sql.Tx
db, err = sql.Open("sqlite3", "file::memory:?cache=shared")
db, err = sql.Open("sqlite3", DB_MEM_PATH)
debugPrint("in memory db opened")
logPanic(err)
_, err = db.Exec(CREATE_DB_SCHEMA)
logPanic(err)
//tx, err = db.Begin()
//logPanic(err)
//tx.Exec(CREATE_DB_SCHEMA)
//tx.Commit()
}
func initdb() {
func initDB() {
debugPrint("[NotImplemented] initialize local db if not exists or load it")
// Check if db exists locally
@ -53,7 +57,7 @@ func initdb() {
func testInMemoryDb() {
debugPrint("test in memory")
db, err := sql.Open("sqlite3", "file::memory:?cache=shared")
db, err := sql.Open("sqlite3", DB_MEM_PATH)
defer db.Close()
rows, err := db.Query("select URL from bookmarks")
defer rows.Close()
@ -64,3 +68,41 @@ func testInMemoryDb() {
log.Println(URL)
}
}
func flushToDisk() {
/// Flush in memory sqlite db to disk
/// should happen as often as possible to
/// avoid losing data
debugPrint("Flushing to disk")
conns := []*sqlite3.SQLiteConn{}
sql.Register("sqlite_with_backup",
&sqlite3.SQLiteDriver{
ConnectHook: func(conn *sqlite3.SQLiteConn) error {
conns = append(conns, conn)
return nil
},
})
memDb, err := sql.Open("sqlite_with_backup", DB_MEM_PATH)
logPanic(err)
defer memDb.Close()
memDb.Ping()
bkDb, err := sql.Open("sqlite_with_backup", DB_LOCAL_PATH)
defer bkDb.Close()
logPanic(err)
bkDb.Ping()
bk, err := conns[1].Backup("main", conns[0], "main")
logPanic(err)
_, err = bk.Step(-1)
logPanic(err)
bk.Finish()
}

View File

@ -12,8 +12,12 @@ const (
)
func main() {
initdb()
// Initialize sqlite database available in global `db` variable
initDB()
flushToDisk()
defer db.Close()
watcher, err := fsnotify.NewWatcher()
if err != nil {