Mercurial > games > semicongine
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()