Skip to content

Instantly share code, notes, and snippets.

@sma
Created January 26, 2024 13:19
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sma/4f56086fc5c8aeb91984a945b1ce3f07 to your computer and use it in GitHub Desktop.
Save sma/4f56086fc5c8aeb91984a945b1ce3f07 to your computer and use it in GitHub Desktop.
A simple key-value store w/persistent sqlite3 database.
/// 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