Persist changes in web backend

This commit is contained in:
Simon Binder 2019-07-03 22:41:14 +02:00
parent 535c5ed871
commit 0e6ed25cd5
No known key found for this signature in database
GPG Key ID: 7891917E4147B8C0
3 changed files with 86 additions and 11 deletions

View File

@ -5,6 +5,7 @@
library moor_web;
import 'dart:async';
import 'dart:convert';
import 'dart:html';
import 'dart:indexed_db';
import 'dart:js';
@ -17,3 +18,4 @@ import 'moor.dart';
export 'moor.dart';
part 'src/web/sql_js.dart';
part 'src/web/binary_string_conversion.dart';

View File

@ -0,0 +1,45 @@
part of 'package:moor/moor_web.dart';
/*
const _bin2str = _BinaryStringConversion();
class _BinaryStringConversion extends Encoding {
const _BinaryStringConversion();
@override
Converter<List<int>, String> get decoder => const _Bin2String();
@override
Converter<String, List<int>> get encoder => const _String2Bin();
@override
String get name => 'bin';
}
class _String2Bin extends Converter<String, Uint8List> {
const _String2Bin();
@override
Uint8List convert(String input) {
final codeUnits = input.codeUnits;
final list = Uint8List(codeUnits.length);
for (var i = 0; i < codeUnits.length; i++) {
list[i] = i;
}
return list;
}
}
class _Bin2String extends Converter<List<int>, String> {
const _Bin2String();
@override
String convert(List<int> input) {
final buffer = StringBuffer();
for (var byte in input) {
buffer.writeCharCode(byte);
}
return buffer.toString();
}
}
*/

View File

@ -79,8 +79,10 @@ class WebDatabase extends QueryExecutor {
db.close();
final sql = await _initializedWasm.future;
final restored = _restoreDb();
// var db = new SQL.Database()
_database = JsObject(sql['Database'] as JsFunction);
_database = JsObject(sql['Database'] as JsFunction,
restored != null ? [restored] : const []);
assert(() {
// set the window.db variable to make debugging easier
context['db'] = _database;
@ -99,6 +101,24 @@ class WebDatabase extends QueryExecutor {
}
}
String get _persistenceKey => 'moor_db_str_$name';
// todo base64 works, but is very slow. Figure out why bin2str is broken
Uint8List _restoreDb() {
final raw = window.localStorage[_persistenceKey];
if (raw != null) {
return base64.decode(raw);
}
return null;
}
void _storeDb() {
final data = _database.callMethod('export') as Uint8List;
final binStr = base64.encode(data);
window.localStorage[_persistenceKey] = binStr;
}
@override
Future<void> runBatched(List<BatchedStatement> statements) {
throw StateError(
@ -141,21 +161,29 @@ class WebDatabase extends QueryExecutor {
@override
Future<int> runDelete(String statement, List args) {
_runSimple(statement, args);
return Future.value(_getModifiedRows());
}
@override
Future<int> runInsert(String statement, List args) {
// todo get last insert id
// _runSimple("INSERT INTO todo_entries (content) VALUES ('test')", const []);
_runSimple(statement, args);
return Future.value(42);
return _handlePotentialUpdate();
}
@override
Future<int> runUpdate(String statement, List args) {
_runSimple(statement, args);
return Future.value(_getModifiedRows());
return _handlePotentialUpdate();
}
Future<int> _handlePotentialUpdate() {
final modified = _getModifiedRows();
if (modified > 0) {
_storeDb();
}
return Future.value(modified);
}
@override
Future<int> runInsert(String statement, List args) {
// todo get last insert id
_runSimple(statement, args);
_handlePotentialUpdate();
return Future.value(42);
}
@override