part of 'package:moor/moor_web.dart'; JsObject _alasql = context['alasql'] as JsObject; class AlaSqlDatabase extends QueryExecutor { JsObject _database; final bool logStatements; final String name; Completer _opening; AlaSqlDatabase(this.name, {this.logStatements = false}) { if (_alasql == null) { throw UnsupportedError('Could not access the alasql javascript library. ' 'The moor documentation contains instructions on how to setup moor ' 'the web, which might help you fix this.'); } _database = JsObject(_alasql['Database'] as JsFunction); } @override TransactionExecutor beginTransaction() { throw StateError('Transactions are not currently supported with AlaSQL'); } @override Future ensureOpen() async { if (_opening == null) { _opening = Completer(); await _openInternal(); _opening.complete(); } else { await _opening.future; } return true; } Future _openInternal() async { // todo handle possible injection vulnerability of $name await _run('CREATE INDEXEDDB DATABASE IF NOT EXISTS `$name`;', const []); await _run('ATTACH INDEXEDDB DATABASE `$name`;', const []); await _run('USE `$name`;', const []); } @override Future runBatched(List statements) { throw StateError( 'Batched statements are not currently supported with AlaSQL'); } Future _run(String query, List variables) { JsObject promise; if (variables.isEmpty) { promise = _database.callMethod('promise', [query]) as JsObject; } else { promise = _database .callMethod('promise', [query, JsArray.from(variables)]) as JsObject; } return promiseToFuture(promise); } @override Future runCustom(String statement) { _run(statement, const []); return Future.value(); } @override Future runDelete(String statement, List args) { return Future.value(_run(statement, args) as int); } @override Future runInsert(String statement, List args) { // todo (needs api change). We need to know the table and column name // to get the last insert id in AlaSQL. See https://github.com/agershun/alasql/wiki/AUTOINCREMENT _run(statement, args); return Future.value(42); } @override Future>> runSelect(String statement, List args) { // TODO: implement runSelect return null; } @override Future runUpdate(String statement, List args) { return Future.value(_run(statement, args) as int); } }