Skip to content

Commit 5082207

Browse files
committed
Don't notify read-only transactions
1 parent 06b5367 commit 5082207

File tree

2 files changed

+22
-10
lines changed

2 files changed

+22
-10
lines changed

GRDB/Core/Database.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,9 @@ public final class Database: CustomStringConvertible, CustomDebugStringConvertib
233233
setupDefaultFunctions()
234234
setupDefaultCollations()
235235
setupAuthorizer()
236-
observationBroker.installCommitAndRollbackHooks()
236+
if !configuration.readonly {
237+
observationBroker.installCommitAndRollbackHooks()
238+
}
237239
try activateExtendedCodes()
238240

239241
#if SQLITE_HAS_CODEC

GRDB/Core/TransactionObserver.swift

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -220,8 +220,7 @@ class DatabaseObservationBroker {
220220

221221
/// Prepares observation of changes that are about to be performed by the statement.
222222
func statementWillExecute(_ statement: Statement) {
223-
// If any observer observes row deletions, we'll have to disable
224-
if transactionObservations.isEmpty == false {
223+
if !database.isReadOnly && !transactionObservations.isEmpty {
225224
// As statement executes, it may trigger database changes that will
226225
// be notified to transaction observers. As a consequence, observers
227226
// may disable themselves with stopObservingDatabaseChangesUntilNextTransaction()
@@ -310,7 +309,7 @@ class DatabaseObservationBroker {
310309
// SQLITE_CONSTRAINT error)
311310
databaseDidRollback(notifyTransactionObservers: false)
312311
case .cancelledCommit(let error):
313-
databaseDidRollback(notifyTransactionObservers: true)
312+
databaseDidRollback(notifyTransactionObservers: !database.isReadOnly)
314313
throw error
315314
default:
316315
break
@@ -382,7 +381,7 @@ class DatabaseObservationBroker {
382381
case .commit:
383382
databaseDidCommit()
384383
case .rollback:
385-
databaseDidRollback(notifyTransactionObservers: true)
384+
databaseDidRollback(notifyTransactionObservers: !database.isReadOnly)
386385
default:
387386
break
388387
}
@@ -391,6 +390,8 @@ class DatabaseObservationBroker {
391390
#if SQLITE_ENABLE_PREUPDATE_HOOK
392391
// Called from sqlite3_preupdate_hook
393392
private func databaseWillChange(with event: DatabasePreUpdateEvent) {
393+
assert(!database.isReadOnly, "Read-only transactions are not notified")
394+
394395
if savepointStack.isEmpty {
395396
// Notify now
396397
for (observation, predicate) in statementObservations where predicate.evaluate(event) {
@@ -405,6 +406,8 @@ class DatabaseObservationBroker {
405406

406407
// Called from sqlite3_update_hook
407408
private func databaseDidChange(with event: DatabaseEvent) {
409+
assert(!database.isReadOnly, "Read-only transactions are not notified")
410+
408411
// We're about to call the databaseDidChange(with:) method of
409412
// transaction observers. In this method, observers may disable
410413
// themselves with stopObservingDatabaseChangesUntilNextTransaction()
@@ -430,18 +433,23 @@ class DatabaseObservationBroker {
430433
// Called from sqlite3_commit_hook and databaseDidCommitEmptyDeferredTransaction()
431434
private func databaseWillCommit() throws {
432435
notifyBufferedEvents()
433-
for observation in transactionObservations {
434-
try observation.databaseWillCommit()
436+
if !database.isReadOnly {
437+
for observation in transactionObservations {
438+
try observation.databaseWillCommit()
439+
}
435440
}
436441
}
437442

438443
// Called from statementDidExecute
439444
private func databaseDidCommit() {
440445
savepointStack.clear()
441446

442-
for observation in transactionObservations {
443-
observation.databaseDidCommit(database)
447+
if !database.isReadOnly {
448+
for observation in transactionObservations {
449+
observation.databaseDidCommit(database)
450+
}
444451
}
452+
445453
databaseDidEndTransaction()
446454
}
447455

@@ -485,7 +493,7 @@ class DatabaseObservationBroker {
485493
try databaseWillCommit()
486494
databaseDidCommit()
487495
} catch {
488-
databaseDidRollback(notifyTransactionObservers: true)
496+
databaseDidRollback(notifyTransactionObservers: !database.isReadOnly)
489497
throw error
490498
}
491499
}
@@ -495,6 +503,7 @@ class DatabaseObservationBroker {
495503
savepointStack.clear()
496504

497505
if notifyTransactionObservers {
506+
assert(!database.isReadOnly, "Read-only transactions are not notified")
498507
for observation in transactionObservations {
499508
observation.databaseDidRollback(database)
500509
}
@@ -566,6 +575,7 @@ class DatabaseObservationBroker {
566575
savepointStack.clear()
567576

568577
for (event, statementObservations) in eventsBuffer {
578+
assert(statementObservations.isEmpty || !database.isReadOnly, "Read-only transactions are not notified")
569579
for (observation, predicate) in statementObservations where predicate.evaluate(event) {
570580
event.send(to: observation)
571581
}

0 commit comments

Comments
 (0)