1199
|
1 import ./thirdparty/db_connector/db_sqlite
|
|
2
|
|
3 const STORAGE_NAME = Path("storage.db")
|
|
4 const DEFAULT_KEY_VALUE_TABLE_NAME = "shelf"
|
|
5
|
|
6 type
|
|
7 StorageType* = enum
|
|
8 SystemStorage
|
|
9 UserStorage
|
|
10 # ? level storage type ?
|
|
11
|
|
12 var db: Table[StorageType, DbConn]
|
|
13
|
|
14 proc path(storageType: StorageType): Path =
|
|
15 case storageType:
|
|
16 of SystemStorage:
|
|
17 Path(getAppDir()) / STORAGE_NAME
|
|
18 of UserStorage:
|
|
19 string(Path(getDataDir()) / Path(AppName())).createDir()
|
|
20 Path(getDataDir()) / Path(AppName()) / STORAGE_NAME
|
|
21
|
|
22 proc ensureExists(storageType: StorageType) =
|
|
23 if storageType in db:
|
|
24 return
|
|
25 db[storageType] = open(string(storageType.path), "", "", "")
|
|
26
|
|
27 proc ensureExists(storageType: StorageType, table: string) =
|
|
28 storageType.ensureExists()
|
|
29 db[storageType].exec(sql(&"""CREATE TABLE IF NOT EXISTS {table} (
|
|
30 key TEXT NOT NULL UNIQUE,
|
|
31 value TEXT NOT NULL
|
|
32 )"""))
|
|
33
|
|
34 proc Store*[T](storageType: StorageType, key: string, value: T, table = DEFAULT_KEY_VALUE_TABLE_NAME) =
|
|
35 storageType.ensureExists(table)
|
|
36 db[storageType].exec(sql(&"""INSERT INTO {table} VALUES(?, ?)
|
|
37 ON CONFLICT(key) DO UPDATE SET value=excluded.value
|
|
38 """), key, $$value)
|
|
39
|
|
40 proc Load*[T](storageType: StorageType, key: string, default: T, table = DEFAULT_KEY_VALUE_TABLE_NAME): T =
|
|
41 storageType.ensureExists(table)
|
|
42 let dbResult = db[storageType].getValue(sql(&"""SELECT value FROM {table} WHERE key = ? """), key)
|
|
43 if dbResult == "":
|
|
44 return default
|
|
45 return to[T](dbResult)
|
|
46
|
|
47 proc List*[T](storageType: StorageType, table = DEFAULT_KEY_VALUE_TABLE_NAME): seq[string] =
|
|
48 storageType.ensureExists(table)
|
|
49 for row in db[storageType].fastRows(sql(&"""SELECT key FROM {table}""")):
|
|
50 result.add row[0]
|
|
51
|
|
52 proc Purge*(storageType: StorageType) =
|
|
53 storageType.path().string.removeFile()
|