mirror of https://github.com/AMT-Cheif/drift.git
Persist changes in web backend
This commit is contained in:
parent
535c5ed871
commit
0e6ed25cd5
|
@ -5,6 +5,7 @@
|
||||||
library moor_web;
|
library moor_web;
|
||||||
|
|
||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
|
import 'dart:convert';
|
||||||
import 'dart:html';
|
import 'dart:html';
|
||||||
import 'dart:indexed_db';
|
import 'dart:indexed_db';
|
||||||
import 'dart:js';
|
import 'dart:js';
|
||||||
|
@ -17,3 +18,4 @@ import 'moor.dart';
|
||||||
export 'moor.dart';
|
export 'moor.dart';
|
||||||
|
|
||||||
part 'src/web/sql_js.dart';
|
part 'src/web/sql_js.dart';
|
||||||
|
part 'src/web/binary_string_conversion.dart';
|
||||||
|
|
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
|
@ -79,8 +79,10 @@ class WebDatabase extends QueryExecutor {
|
||||||
db.close();
|
db.close();
|
||||||
|
|
||||||
final sql = await _initializedWasm.future;
|
final sql = await _initializedWasm.future;
|
||||||
|
final restored = _restoreDb();
|
||||||
// var db = new SQL.Database()
|
// var db = new SQL.Database()
|
||||||
_database = JsObject(sql['Database'] as JsFunction);
|
_database = JsObject(sql['Database'] as JsFunction,
|
||||||
|
restored != null ? [restored] : const []);
|
||||||
assert(() {
|
assert(() {
|
||||||
// set the window.db variable to make debugging easier
|
// set the window.db variable to make debugging easier
|
||||||
context['db'] = _database;
|
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
|
@override
|
||||||
Future<void> runBatched(List<BatchedStatement> statements) {
|
Future<void> runBatched(List<BatchedStatement> statements) {
|
||||||
throw StateError(
|
throw StateError(
|
||||||
|
@ -141,21 +161,29 @@ class WebDatabase extends QueryExecutor {
|
||||||
@override
|
@override
|
||||||
Future<int> runDelete(String statement, List args) {
|
Future<int> runDelete(String statement, List args) {
|
||||||
_runSimple(statement, args);
|
_runSimple(statement, args);
|
||||||
return Future.value(_getModifiedRows());
|
return _handlePotentialUpdate();
|
||||||
}
|
|
||||||
|
|
||||||
@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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<int> runUpdate(String statement, List args) {
|
Future<int> runUpdate(String statement, List args) {
|
||||||
_runSimple(statement, 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
|
@override
|
||||||
|
|
Loading…
Reference in New Issue