@@ -57,60 +57,9 @@ base class DatabaseImplementation implements CommonDatabase {
57
57
58
58
final FinalizableDatabase finalizable;
59
59
60
- late final _StreamHandlers <SqliteUpdate , void Function ()> _updates =
61
- _StreamHandlers (
62
- database: this ,
63
- register: () {
64
- database.sqlite3_update_hook ((kind, tableName, rowId) {
65
- SqliteUpdateKind updateKind;
66
-
67
- switch (kind) {
68
- case SQLITE_INSERT :
69
- updateKind = SqliteUpdateKind .insert;
70
- break ;
71
- case SQLITE_UPDATE :
72
- updateKind = SqliteUpdateKind .update;
73
- break ;
74
- case SQLITE_DELETE :
75
- updateKind = SqliteUpdateKind .delete;
76
- break ;
77
- default :
78
- return ;
79
- }
80
-
81
- final update = SqliteUpdate (updateKind, tableName, rowId);
82
- _updates.deliverAsyncEvent (update);
83
- });
84
- },
85
- unregister: () => database.sqlite3_update_hook (null ),
86
- );
87
- late final _StreamHandlers <void , void Function ()> _rollbacks =
88
- _StreamHandlers (
89
- database: this ,
90
- register: () => database.sqlite3_rollback_hook (() {
91
- _rollbacks.deliverAsyncEvent (null );
92
- }),
93
- unregister: () => database.sqlite3_rollback_hook (null ),
94
- );
95
- late final _StreamHandlers <void , VoidPredicate > _commits = _StreamHandlers (
96
- database: this ,
97
- register: () => database.sqlite3_commit_hook (() {
98
- var complete = true ;
99
- if (_commits.syncCallback case final callback? ) {
100
- complete = callback ();
101
- }
102
-
103
- if (complete) {
104
- _commits.deliverAsyncEvent (null );
105
- // There's no reason to deliver a rollback event if the synchronous
106
- // handler determined that the transaction should be reverted, sqlite3
107
- // will emit a rollbacke event for us.
108
- }
109
-
110
- return complete ? 0 : 1 ;
111
- }),
112
- unregister: () => database.sqlite3_commit_hook (null ),
113
- );
60
+ _StreamHandlers <SqliteUpdate , void Function ()>? _updates;
61
+ _StreamHandlers <void , void Function ()>? _rollbacks;
62
+ _StreamHandlers <void , VoidPredicate >? _commits;
114
63
115
64
var _isClosed = false ;
116
65
@@ -157,6 +106,67 @@ base class DatabaseImplementation implements CommonDatabase {
157
106
}
158
107
}
159
108
109
+ _StreamHandlers <SqliteUpdate , void Function ()> _updatesHandler () {
110
+ return _updates ?? = _StreamHandlers (
111
+ database: this ,
112
+ register: () {
113
+ database.sqlite3_update_hook ((kind, tableName, rowId) {
114
+ SqliteUpdateKind updateKind;
115
+
116
+ switch (kind) {
117
+ case SQLITE_INSERT :
118
+ updateKind = SqliteUpdateKind .insert;
119
+ break ;
120
+ case SQLITE_UPDATE :
121
+ updateKind = SqliteUpdateKind .update;
122
+ break ;
123
+ case SQLITE_DELETE :
124
+ updateKind = SqliteUpdateKind .delete;
125
+ break ;
126
+ default :
127
+ return ;
128
+ }
129
+
130
+ final update = SqliteUpdate (updateKind, tableName, rowId);
131
+ _updates! .deliverAsyncEvent (update);
132
+ });
133
+ },
134
+ unregister: () => database.sqlite3_update_hook (null ),
135
+ );
136
+ }
137
+
138
+ _StreamHandlers <void , void Function ()> _rollbackHandler () {
139
+ return _rollbacks ?? = _StreamHandlers (
140
+ database: this ,
141
+ register: () => database.sqlite3_rollback_hook (() {
142
+ _rollbacks! .deliverAsyncEvent (null );
143
+ }),
144
+ unregister: () => database.sqlite3_rollback_hook (null ),
145
+ );
146
+ }
147
+
148
+ _StreamHandlers <void , VoidPredicate > _commitHandler () {
149
+ return _commits ?? = _StreamHandlers (
150
+ database: this ,
151
+ register: () => database.sqlite3_commit_hook (() {
152
+ var complete = true ;
153
+ if (_commits! .syncCallback case final callback? ) {
154
+ complete = callback ();
155
+ }
156
+
157
+ if (complete) {
158
+ _commits! .deliverAsyncEvent (null );
159
+ // There's no reason to deliver a rollback event if the synchronous
160
+ // handler determined that the transaction should be reverted, sqlite3
161
+ // will emit a rollbacke event for us.
162
+ }
163
+
164
+ return complete ? 0 : 1 ;
165
+ }),
166
+ unregister: () => database.sqlite3_commit_hook (null ),
167
+ );
168
+ }
169
+
160
170
Uint8List _validateAndEncodeFunctionName (String functionName) {
161
171
final functionNameBytes = utf8.encode (functionName);
162
172
@@ -277,9 +287,9 @@ base class DatabaseImplementation implements CommonDatabase {
277
287
disposeFinalizer.detach (this );
278
288
_isClosed = true ;
279
289
280
- _updates.close ();
281
- _commits.close ();
282
- _rollbacks.close ();
290
+ _updates? .close ();
291
+ _commits? .close ();
292
+ _rollbacks? .close ();
283
293
284
294
database.sqlite3_update_hook (null );
285
295
database.sqlite3_commit_hook (null );
@@ -457,20 +467,20 @@ base class DatabaseImplementation implements CommonDatabase {
457
467
}
458
468
459
469
@override
460
- Stream <SqliteUpdate > get updates => _updates .stream;
470
+ Stream <SqliteUpdate > get updates => _updatesHandler () .stream;
461
471
462
472
@override
463
- Stream <void > get rollbacks => _rollbacks .stream;
473
+ Stream <void > get rollbacks => _rollbackHandler () .stream;
464
474
465
475
@override
466
- Stream <void > get commits => _commits .stream;
476
+ Stream <void > get commits => _commitHandler () .stream;
467
477
468
478
@override
469
- VoidPredicate ? get commitFilter => _commits .syncCallback;
479
+ VoidPredicate ? get commitFilter => _commitHandler () .syncCallback;
470
480
471
481
@override
472
482
set commitFilter (VoidPredicate ? commitFilter) {
473
- _commits .syncCallback = commitFilter;
483
+ _commitHandler () .syncCallback = commitFilter;
474
484
}
475
485
}
476
486
0 commit comments