Skip to content

Commit 9a43a06

Browse files
committed
Avoid dart2js issue with late final fields
1 parent 8e18f84 commit 9a43a06

File tree

1 file changed

+72
-62
lines changed

1 file changed

+72
-62
lines changed

sqlite3/lib/src/implementation/database.dart

Lines changed: 72 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -57,60 +57,9 @@ base class DatabaseImplementation implements CommonDatabase {
5757

5858
final FinalizableDatabase finalizable;
5959

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;
11463

11564
var _isClosed = false;
11665

@@ -157,6 +106,67 @@ base class DatabaseImplementation implements CommonDatabase {
157106
}
158107
}
159108

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+
160170
Uint8List _validateAndEncodeFunctionName(String functionName) {
161171
final functionNameBytes = utf8.encode(functionName);
162172

@@ -277,9 +287,9 @@ base class DatabaseImplementation implements CommonDatabase {
277287
disposeFinalizer.detach(this);
278288
_isClosed = true;
279289

280-
_updates.close();
281-
_commits.close();
282-
_rollbacks.close();
290+
_updates?.close();
291+
_commits?.close();
292+
_rollbacks?.close();
283293

284294
database.sqlite3_update_hook(null);
285295
database.sqlite3_commit_hook(null);
@@ -457,20 +467,20 @@ base class DatabaseImplementation implements CommonDatabase {
457467
}
458468

459469
@override
460-
Stream<SqliteUpdate> get updates => _updates.stream;
470+
Stream<SqliteUpdate> get updates => _updatesHandler().stream;
461471

462472
@override
463-
Stream<void> get rollbacks => _rollbacks.stream;
473+
Stream<void> get rollbacks => _rollbackHandler().stream;
464474

465475
@override
466-
Stream<void> get commits => _commits.stream;
476+
Stream<void> get commits => _commitHandler().stream;
467477

468478
@override
469-
VoidPredicate? get commitFilter => _commits.syncCallback;
479+
VoidPredicate? get commitFilter => _commitHandler().syncCallback;
470480

471481
@override
472482
set commitFilter(VoidPredicate? commitFilter) {
473-
_commits.syncCallback = commitFilter;
483+
_commitHandler().syncCallback = commitFilter;
474484
}
475485
}
476486

0 commit comments

Comments
 (0)