2017-11-13 18:14:59 +00:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"database/sql"
|
|
|
|
"log"
|
|
|
|
|
|
|
|
_ "github.com/mattn/go-sqlite3"
|
2017-11-14 16:55:19 +00:00
|
|
|
sqlite3 "github.com/mattn/go-sqlite3"
|
|
|
|
)
|
|
|
|
|
|
|
|
const (
|
|
|
|
DB_LOCAL_PATH = "bookmarks.db"
|
|
|
|
DB_MEM_PATH = "file::memory:?cache=shared"
|
2017-11-13 18:14:59 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
var (
|
|
|
|
db *sql.DB
|
|
|
|
)
|
|
|
|
|
|
|
|
const (
|
|
|
|
CREATE_DB_SCHEMA = `CREATE TABLE if not exists bookmarks (
|
|
|
|
id integer PRIMARY KEY,
|
2017-11-14 16:55:19 +00:00
|
|
|
URL text NOT NULL UNIQUE,
|
|
|
|
metadata text default '',
|
|
|
|
tags text default '',
|
|
|
|
desc text default '',
|
|
|
|
flags integer default 0
|
|
|
|
)`
|
2017-11-13 18:14:59 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
// TODO: Use context when making call from request/api
|
|
|
|
func initInMemoryDb() {
|
2017-11-14 16:55:19 +00:00
|
|
|
//sqlite3conn := []*sqlite3.SQLiteConn{}
|
2017-11-13 18:14:59 +00:00
|
|
|
|
|
|
|
var err error
|
|
|
|
|
2017-11-14 16:55:19 +00:00
|
|
|
db, err = sql.Open("sqlite3", DB_MEM_PATH)
|
2017-11-13 18:14:59 +00:00
|
|
|
debugPrint("in memory db opened")
|
|
|
|
logPanic(err)
|
|
|
|
|
|
|
|
_, err = db.Exec(CREATE_DB_SCHEMA)
|
|
|
|
logPanic(err)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2017-11-14 16:55:19 +00:00
|
|
|
func initDB() {
|
2017-11-13 18:14:59 +00:00
|
|
|
debugPrint("[NotImplemented] initialize local db if not exists or load it")
|
|
|
|
// Check if db exists locally
|
|
|
|
|
|
|
|
// If does not exit create new one in memory
|
|
|
|
// Then flush to disk
|
|
|
|
|
|
|
|
// If exists locally, load to memory
|
|
|
|
initInMemoryDb()
|
|
|
|
}
|
|
|
|
|
|
|
|
func testInMemoryDb() {
|
|
|
|
|
|
|
|
debugPrint("test in memory")
|
2017-11-14 16:55:19 +00:00
|
|
|
db, err := sql.Open("sqlite3", DB_MEM_PATH)
|
2017-11-13 18:14:59 +00:00
|
|
|
defer db.Close()
|
|
|
|
rows, err := db.Query("select URL from bookmarks")
|
|
|
|
defer rows.Close()
|
|
|
|
logPanic(err)
|
|
|
|
var URL string
|
|
|
|
for rows.Next() {
|
|
|
|
rows.Scan(&URL)
|
|
|
|
log.Println(URL)
|
|
|
|
}
|
|
|
|
}
|
2017-11-14 16:55:19 +00:00
|
|
|
|
|
|
|
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()
|
|
|
|
|
|
|
|
}
|