drift/moor_flutter/lib/moor_flutter.dart

132 lines
3.5 KiB
Dart
Raw Normal View History

2019-03-09 07:37:22 -08:00
/// Flutter implementation for the moor database. This library merely provides
/// a thin level of abstraction between the
/// [sqflite](https://pub.dartlang.org/packages/sqflite) library and
2019-03-09 07:37:22 -08:00
/// [moor](https://github.com/simolus3/moor)
library moor_flutter;
import 'dart:async';
import 'package:meta/meta.dart';
import 'package:path/path.dart';
2019-03-09 07:37:22 -08:00
import 'package:moor/moor.dart';
import 'package:moor/backends.dart';
2019-03-10 04:00:25 -07:00
import 'package:sqflite/sqflite.dart' as s;
2019-03-09 07:37:22 -08:00
export 'package:moor_flutter/src/animated_list.dart';
2019-03-27 10:15:29 -07:00
export 'package:moor/moor.dart';
class _SqfliteDelegate extends DatabaseDelegate with _SqfliteExecutor {
int _loadedSchemaVersion;
@override
s.Database db;
2019-03-10 04:00:25 -07:00
final bool inDbFolder;
final String path;
2019-02-17 02:32:54 -08:00
_SqfliteDelegate(this.inDbFolder, this.path);
2019-02-17 02:32:54 -08:00
@override
DbVersionDelegate get versionDelegate {
return OnOpenVersionDelegate(() => Future.value(_loadedSchemaVersion));
2019-03-10 04:00:25 -07:00
}
@override
TransactionDelegate get transactionDelegate =>
_SqfliteTransactionDelegate(this);
2019-03-10 04:00:25 -07:00
@override
Future<bool> get isOpen => Future.value(db != null);
2019-03-10 04:00:25 -07:00
@override
Future<void> open([GeneratedDatabase db]) async {
String resolvedPath;
if (inDbFolder) {
resolvedPath = join(await s.getDatabasesPath(), path);
} else {
resolvedPath = path;
}
// default value when no migration happened
_loadedSchemaVersion = db.schemaVersion;
this.db = await s.openDatabase(
resolvedPath,
version: db.schemaVersion,
onCreate: (db, version) {
_loadedSchemaVersion = 0;
},
onUpgrade: (db, from, to) {
_loadedSchemaVersion = from;
},
);
2019-03-10 04:00:25 -07:00
}
}
class _SqfliteTransactionDelegate extends SupportedTransactionDelegate {
final _SqfliteDelegate delegate;
_SqfliteTransactionDelegate(this.delegate);
2019-03-10 04:00:25 -07:00
@override
void startTransaction(Future<void> Function(QueryDelegate) run) {
delegate.db.transaction((transaction) async {
final executor = _SqfliteTransactionExecutor(transaction);
await run(executor);
});
2019-03-10 04:00:25 -07:00
}
}
2019-03-10 04:00:25 -07:00
class _SqfliteTransactionExecutor extends QueryDelegate with _SqfliteExecutor {
2019-03-10 04:00:25 -07:00
@override
final s.DatabaseExecutor db;
_SqfliteTransactionExecutor(this.db);
}
mixin _SqfliteExecutor on QueryDelegate {
s.DatabaseExecutor get db;
2019-04-19 13:45:38 -07:00
@override
Future<void> runBatched(List<BatchedStatement> statements) async {
final batch = db.batch();
for (var statement in statements) {
for (var boundVariables in statement.variables) {
batch.execute(statement.sql, boundVariables);
}
}
await batch.commit(noResult: true);
}
@override
Future<void> runCustom(String statement, List args) {
return db.execute(statement);
2019-02-17 02:32:54 -08:00
}
@override
Future<int> runInsert(String statement, List args) {
return db.rawInsert(statement, args);
}
@override
Future<QueryResult> runSelect(String statement, List args) async {
final result = await db.rawQuery(statement, args);
return QueryResult.fromRows(result);
}
@override
Future<int> runUpdate(String statement, List args) {
return db.rawUpdate(statement, args);
}
}
/// A query executor that uses sqflite internally.
class FlutterQueryExecutor extends DelegatedDatabase {
FlutterQueryExecutor({@required String path, bool logStatements})
: super(_SqfliteDelegate(false, path), logStatements: logStatements);
FlutterQueryExecutor.inDatabaseFolder(
{@required String path, bool logStatements})
: super(_SqfliteDelegate(true, path), logStatements: logStatements);
}