diff semicongine/storage.nim @ 1199:ba1af13233ee compiletime-tests

add: working main-renderloop
author sam <sam@basx.dev>
date Sat, 13 Jul 2024 23:27:12 +0700
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/semicongine/storage.nim	Sat Jul 13 23:27:12 2024 +0700
@@ -0,0 +1,53 @@
+import ./thirdparty/db_connector/db_sqlite
+
+const STORAGE_NAME = Path("storage.db")
+const DEFAULT_KEY_VALUE_TABLE_NAME = "shelf"
+
+type
+  StorageType* = enum
+    SystemStorage
+    UserStorage
+    # ? level storage type ?
+
+var db: Table[StorageType, DbConn]
+
+proc path(storageType: StorageType): Path =
+  case storageType:
+    of SystemStorage:
+      Path(getAppDir()) / STORAGE_NAME
+    of UserStorage:
+      string(Path(getDataDir()) / Path(AppName())).createDir()
+      Path(getDataDir()) / Path(AppName()) / STORAGE_NAME
+
+proc ensureExists(storageType: StorageType) =
+  if storageType in db:
+    return
+  db[storageType] = open(string(storageType.path), "", "", "")
+
+proc ensureExists(storageType: StorageType, table: string) =
+  storageType.ensureExists()
+  db[storageType].exec(sql(&"""CREATE TABLE IF NOT EXISTS {table} (
+    key TEXT NOT NULL UNIQUE,
+    value TEXT NOT NULL
+  )"""))
+
+proc Store*[T](storageType: StorageType, key: string, value: T, table = DEFAULT_KEY_VALUE_TABLE_NAME) =
+  storageType.ensureExists(table)
+  db[storageType].exec(sql(&"""INSERT INTO {table} VALUES(?, ?)
+  ON CONFLICT(key) DO UPDATE SET value=excluded.value
+  """), key, $$value)
+
+proc Load*[T](storageType: StorageType, key: string, default: T, table = DEFAULT_KEY_VALUE_TABLE_NAME): T =
+  storageType.ensureExists(table)
+  let dbResult = db[storageType].getValue(sql(&"""SELECT value FROM {table} WHERE key = ? """), key)
+  if dbResult == "":
+    return default
+  return to[T](dbResult)
+
+proc List*[T](storageType: StorageType, table = DEFAULT_KEY_VALUE_TABLE_NAME): seq[string] =
+  storageType.ensureExists(table)
+  for row in db[storageType].fastRows(sql(&"""SELECT key FROM {table}""")):
+    result.add row[0]
+
+proc Purge*(storageType: StorageType) =
+  storageType.path().string.removeFile()