Mercurial > games > semicongine
comparison semiconginev2/storage.nim @ 1218:56781cc0fc7c compiletime-tests
did: renamge main package
| author | sam <sam@basx.dev> |
|---|---|
| date | Wed, 17 Jul 2024 21:01:37 +0700 |
| parents | semicongine/storage.nim@ba1af13233ee |
| children |
comparison
equal
deleted
inserted
replaced
| 1217:f819a874058f | 1218:56781cc0fc7c |
|---|---|
| 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() |
