Skip to content

Commit 53a7fcf

Browse files
committed
support for updating queries with where IS NULL / where IS NOT NULL
1 parent a3c6797 commit 53a7fcf

File tree

1 file changed

+22
-10
lines changed

1 file changed

+22
-10
lines changed

lib/src/database_access.dart

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ import 'package:quiver/core.dart';
1010

1111
final _logger = Logger('database_access');
1212

13+
const whereIsNull = Object();
14+
const whereIsNotNull = Object();
15+
1316
class DatabaseTransactionBase<TABLES extends TablesBase> {
1417
DatabaseTransactionBase(this._conn, this.tables);
1518

@@ -49,26 +52,35 @@ class DatabaseTransactionBase<TABLES extends TablesBase> {
4952

5053
Future<int> executeUpdate(
5154
String table, {
52-
required Map<String, Object?> set,
53-
required Map<String, Object> where,
55+
required final Map<String, Object?> set,
56+
required final Map<String, Object> where,
5457
bool setContainsOptional = false,
5558
}) async {
5659
_assertColumnNames(set);
5760
_assertColumnNames(where);
5861
// assert(!where.keys.any((key) => set.containsKey(key)));
59-
assert(!where.values.contains(null), 'where values must not be null.');
60-
assert(!setContainsOptional || set.values.whereType<Optional>().isEmpty);
61-
if (setContainsOptional) {
62-
set = flattenOptionals(set);
62+
if (where.values.contains(null)) {
63+
throw ArgumentError('where values must not be null.');
6364
}
65+
assert(!setContainsOptional || set.values.whereType<Optional>().isEmpty);
66+
final setArgs = setContainsOptional ? flattenOptionals(set) : set;
6467
final setStatement =
65-
set.entries.map((e) => '${e.key} = @s${e.key}').join(',');
66-
final whereStatement =
67-
where.entries.map((e) => '${e.key} = @w${e.key}').join(' AND ');
68+
setArgs.entries.map((e) => '${e.key} = @s${e.key}').join(',');
69+
final whereStatement = where.entries.map((e) {
70+
if (identical(e.value, whereIsNull)) {
71+
where.remove(e.key);
72+
return '${e.key} IS NULL';
73+
}
74+
if (identical(e.value, whereIsNotNull)) {
75+
where.remove(e.key);
76+
return '${e.key} IS NOT NULL';
77+
}
78+
return '${e.key} = @w${e.key}';
79+
}).join(' AND ');
6880
return await execute(
6981
'UPDATE $table SET $setStatement WHERE $whereStatement',
7082
values: {
71-
...set.map((key, value) => MapEntry('s$key', value)),
83+
...setArgs.map((key, value) => MapEntry('s$key', value)),
7284
...where.map((key, value) => MapEntry('w$key', value)),
7385
},
7486
expectedResultCount: 1);

0 commit comments

Comments
 (0)