Early insert tests

This commit is contained in:
Simon Binder 2019-06-24 21:30:41 +02:00
parent 65ccd49d9a
commit 4ee7e84e8c
No known key found for this signature in database
GPG Key ID: 7891917E4147B8C0
8 changed files with 275 additions and 20 deletions

View File

@ -7,10 +7,13 @@ environment:
dependencies: dependencies:
moor: ^1.4.0 moor: ^1.4.0
dev_dependencies:
moor_generator:
build_runner: ^1.1.2
build_web_compilers: ^1.0.0
dependency_overrides: dependency_overrides:
moor: moor:
path: ../ path: ../
moor_generator:
dev_dependencies: path: ../../moor_generator
build_runner: ^1.1.2
build_web_compilers: ^1.0.0

View File

@ -0,0 +1,28 @@
import 'package:moor/moor.dart';
part 'database.g.dart';
@DataClassName('TodoEntry')
class TodoEntries extends Table {
IntColumn get id => integer().autoIncrement()();
TextColumn get content => text()();
DateTimeColumn get creationDate =>
dateTime().withDefault(currentDateAndTime)();
}
@UseMoor(tables: [TodoEntries])
class Database extends _$Database {
Database(QueryExecutor e) : super(e);
@override
int get schemaVersion => 1;
Stream<List<TodoEntry>> watchEntries() {
return select(todoEntries).watch();
}
void insert(String text) async {
await into(todoEntries).insert(TodoEntriesCompanion(content: Value(text)));
}
}

View File

@ -0,0 +1,206 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'database.dart';
// **************************************************************************
// MoorGenerator
// **************************************************************************
// ignore_for_file: unnecessary_brace_in_string_interps
class TodoEntry extends DataClass implements Insertable<TodoEntry> {
final int id;
final String content;
final DateTime creationDate;
TodoEntry(
{@required this.id, @required this.content, @required this.creationDate});
factory TodoEntry.fromData(Map<String, dynamic> data, GeneratedDatabase db,
{String prefix}) {
final effectivePrefix = prefix ?? '';
final intType = db.typeSystem.forDartType<int>();
final stringType = db.typeSystem.forDartType<String>();
final dateTimeType = db.typeSystem.forDartType<DateTime>();
return TodoEntry(
id: intType.mapFromDatabaseResponse(data['${effectivePrefix}id']),
content:
stringType.mapFromDatabaseResponse(data['${effectivePrefix}content']),
creationDate: dateTimeType
.mapFromDatabaseResponse(data['${effectivePrefix}creation_date']),
);
}
factory TodoEntry.fromJson(Map<String, dynamic> json,
{ValueSerializer serializer = const ValueSerializer.defaults()}) {
return TodoEntry(
id: serializer.fromJson<int>(json['id']),
content: serializer.fromJson<String>(json['content']),
creationDate: serializer.fromJson<DateTime>(json['creationDate']),
);
}
@override
Map<String, dynamic> toJson(
{ValueSerializer serializer = const ValueSerializer.defaults()}) {
return {
'id': serializer.toJson<int>(id),
'content': serializer.toJson<String>(content),
'creationDate': serializer.toJson<DateTime>(creationDate),
};
}
@override
T createCompanion<T extends UpdateCompanion<TodoEntry>>(bool nullToAbsent) {
return TodoEntriesCompanion(
id: id == null && nullToAbsent ? const Value.absent() : Value(id),
content: content == null && nullToAbsent
? const Value.absent()
: Value(content),
creationDate: creationDate == null && nullToAbsent
? const Value.absent()
: Value(creationDate),
) as T;
}
TodoEntry copyWith({int id, String content, DateTime creationDate}) =>
TodoEntry(
id: id ?? this.id,
content: content ?? this.content,
creationDate: creationDate ?? this.creationDate,
);
@override
String toString() {
return (StringBuffer('TodoEntry(')
..write('id: $id, ')
..write('content: $content, ')
..write('creationDate: $creationDate')
..write(')'))
.toString();
}
@override
int get hashCode => $mrjf($mrjc(
$mrjc($mrjc(0, id.hashCode), content.hashCode), creationDate.hashCode));
@override
bool operator ==(other) =>
identical(this, other) ||
(other is TodoEntry &&
other.id == id &&
other.content == content &&
other.creationDate == creationDate);
}
class TodoEntriesCompanion extends UpdateCompanion<TodoEntry> {
final Value<int> id;
final Value<String> content;
final Value<DateTime> creationDate;
const TodoEntriesCompanion({
this.id = const Value.absent(),
this.content = const Value.absent(),
this.creationDate = const Value.absent(),
});
}
class $TodoEntriesTable extends TodoEntries
with TableInfo<$TodoEntriesTable, TodoEntry> {
final GeneratedDatabase _db;
final String _alias;
$TodoEntriesTable(this._db, [this._alias]);
final VerificationMeta _idMeta = const VerificationMeta('id');
GeneratedIntColumn _id;
@override
GeneratedIntColumn get id => _id ??= _constructId();
GeneratedIntColumn _constructId() {
return GeneratedIntColumn('id', $tableName, false, hasAutoIncrement: true);
}
final VerificationMeta _contentMeta = const VerificationMeta('content');
GeneratedTextColumn _content;
@override
GeneratedTextColumn get content => _content ??= _constructContent();
GeneratedTextColumn _constructContent() {
return GeneratedTextColumn(
'content',
$tableName,
false,
);
}
final VerificationMeta _creationDateMeta =
const VerificationMeta('creationDate');
GeneratedDateTimeColumn _creationDate;
@override
GeneratedDateTimeColumn get creationDate =>
_creationDate ??= _constructCreationDate();
GeneratedDateTimeColumn _constructCreationDate() {
return GeneratedDateTimeColumn('creation_date', $tableName, false,
defaultValue: currentDateAndTime);
}
@override
List<GeneratedColumn> get $columns => [id, content, creationDate];
@override
$TodoEntriesTable get asDslTable => this;
@override
String get $tableName => _alias ?? 'todo_entries';
@override
final String actualTableName = 'todo_entries';
@override
VerificationContext validateIntegrity(TodoEntriesCompanion d,
{bool isInserting = false}) {
final context = VerificationContext();
if (d.id.present) {
context.handle(_idMeta, id.isAcceptableValue(d.id.value, _idMeta));
} else if (id.isRequired && isInserting) {
context.missing(_idMeta);
}
if (d.content.present) {
context.handle(_contentMeta,
content.isAcceptableValue(d.content.value, _contentMeta));
} else if (content.isRequired && isInserting) {
context.missing(_contentMeta);
}
if (d.creationDate.present) {
context.handle(
_creationDateMeta,
creationDate.isAcceptableValue(
d.creationDate.value, _creationDateMeta));
} else if (creationDate.isRequired && isInserting) {
context.missing(_creationDateMeta);
}
return context;
}
@override
Set<GeneratedColumn> get $primaryKey => {id};
@override
TodoEntry map(Map<String, dynamic> data, {String tablePrefix}) {
final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : null;
return TodoEntry.fromData(data, _db, prefix: effectivePrefix);
}
@override
Map<String, Variable> entityToSql(TodoEntriesCompanion d) {
final map = <String, Variable>{};
if (d.id.present) {
map['id'] = Variable<int, IntType>(d.id.value);
}
if (d.content.present) {
map['content'] = Variable<String, StringType>(d.content.value);
}
if (d.creationDate.present) {
map['creation_date'] =
Variable<DateTime, DateTimeType>(d.creationDate.value);
}
return map;
}
@override
$TodoEntriesTable createAlias(String alias) {
return $TodoEntriesTable(_db, alias);
}
}
abstract class _$Database extends GeneratedDatabase {
_$Database(QueryExecutor e) : super(const SqlTypeSystem.withDefaults(), e);
$TodoEntriesTable _todoEntries;
$TodoEntriesTable get todoEntries => _todoEntries ??= $TodoEntriesTable(this);
@override
List<TableInfo> get allTables => [todoEntries];
}

View File

@ -18,5 +18,10 @@
<div id="output"></div> <div id="output"></div>
<form id="add_todo_form">
<input type="text" id="description" />
<input type="submit">
</form>
</body> </body>
</html> </html>

View File

@ -1,22 +1,19 @@
import 'dart:html';
import 'package:moor/moor_web.dart'; import 'package:moor/moor_web.dart';
class TestDb extends GeneratedDatabase { import 'database.dart';
TestDb(QueryExecutor executor)
: super(const SqlTypeSystem.withDefaults(), executor);
@override
List<TableInfo<Table, DataClass>> get allTables => const [];
@override
int get schemaVersion => 1;
}
void main() async { void main() async {
final executor = AlaSqlDatabase('database'); final db = Database(AlaSqlDatabase('database'));
executor.databaseInfo = TestDb(executor); db.watchEntries().listen(print);
final result = await executor.doWhenOpened((e) { final content = querySelector('#description');
return e.runSelect('SELECT 1', const []);
(querySelector('#add_todo_form') as FormElement).onSubmit.listen((e) {
e.preventDefault();
db.insert(content.text);
content.text = '';
}); });
print(result);
} }

View File

@ -19,3 +19,4 @@ import 'moor.dart';
export 'moor.dart'; export 'moor.dart';
part 'src/web/alasql.dart'; part 'src/web/alasql.dart';
part 'src/web/functions.dart';

View File

@ -11,6 +11,8 @@ class AlaSqlDatabase extends QueryExecutor {
Completer<bool> _opening; Completer<bool> _opening;
AlaSqlDatabase(this.name, {this.logStatements = false}) { AlaSqlDatabase(this.name, {this.logStatements = false}) {
_registerFunctions();
if (_alasql == null) { if (_alasql == null) {
throw UnsupportedError('Could not access the alasql javascript library. ' throw UnsupportedError('Could not access the alasql javascript library. '
'The moor documentation contains instructions on how to setup moor ' 'The moor documentation contains instructions on how to setup moor '
@ -22,7 +24,8 @@ class AlaSqlDatabase extends QueryExecutor {
@override @override
TransactionExecutor beginTransaction() { TransactionExecutor beginTransaction() {
throw StateError('Transactions are not currently supported with AlaSQL'); throw StateError(
'Transactions are not currently supported with the AlaSQL backend');
} }
@override @override

View File

@ -0,0 +1,12 @@
part of 'package:moor/moor_web.dart';
final functions = _alasql['fn'] as JsObject;
void _registerFunctions() {
functions['strftime'] = allowInterop(_strftime);
}
int _strftime(String format, int i) {
// todo properly implement this
return DateTime.now().millisecondsSinceEpoch ~/ 1000;
}