Created
January 26, 2024 13:19
-
-
Save sma/4f56086fc5c8aeb91984a945b1ce3f07 to your computer and use it in GitHub Desktop.
A simple key-value store w/persistent sqlite3 database.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/// A simple key-value store w/persistent sqlite3 database. | |
class KV { | |
KV._(this._db); | |
final Database _db; | |
static Future<KV> open(String name) async { | |
return KV._(sqlite3.open(name)..execute('create table if not exists kv (k text primary key, v jsonb)')); | |
} | |
Future<Object?> get(String key) async { | |
final value = _db.select('select * from kv where k=?', [key]).singleOrNull?.columnAt(1); | |
return value == null ? null : json.decode(value); | |
} | |
Future<Object?> set(String key, Object? value) async { | |
_db.execute('begin'); | |
try { | |
final old = await get(key); | |
if (value == null) { | |
_db.execute('delete from kv where k=?', [key]); | |
} else { | |
_db.execute('insert or replace into kv (k,v) values (?,json(?))', [key, json.encode(value)]); | |
} | |
return old; | |
} finally { | |
_db.execute('commit'); | |
} | |
} | |
Stream<(String, Object?)> list(String prefix) async* { | |
for (final row in _db.select('select * from kv where k like ?', ['$prefix%'])) { | |
yield (row.columnAt(0), json.decode(row.columnAt(1))); | |
} | |
} | |
Future<void> dispose() async => _db.dispose(); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment