@@ -10,6 +10,9 @@ import 'package:quiver/core.dart';
10
10
11
11
final _logger = Logger ('database_access' );
12
12
13
+ const whereIsNull = Object ();
14
+ const whereIsNotNull = Object ();
15
+
13
16
class DatabaseTransactionBase <TABLES extends TablesBase > {
14
17
DatabaseTransactionBase (this ._conn, this .tables);
15
18
@@ -49,26 +52,35 @@ class DatabaseTransactionBase<TABLES extends TablesBase> {
49
52
50
53
Future <int > executeUpdate (
51
54
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,
54
57
bool setContainsOptional = false ,
55
58
}) async {
56
59
_assertColumnNames (set );
57
60
_assertColumnNames (where);
58
61
// 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.' );
63
64
}
65
+ assert (! setContainsOptional || set .values.whereType <Optional >().isEmpty);
66
+ final setArgs = setContainsOptional ? flattenOptionals (set ) : set ;
64
67
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 ' );
68
80
return await execute (
69
81
'UPDATE $table SET $setStatement WHERE $whereStatement ' ,
70
82
values: {
71
- ...set .map ((key, value) => MapEntry ('s$key ' , value)),
83
+ ...setArgs .map ((key, value) => MapEntry ('s$key ' , value)),
72
84
...where.map ((key, value) => MapEntry ('w$key ' , value)),
73
85
},
74
86
expectedResultCount: 1 );
0 commit comments