|
1 | 1 | import XCTest
|
2 |
| -import GRDB |
| 2 | +@testable import GRDB |
3 | 3 |
|
4 | 4 | private class Observer : TransactionObserver {
|
5 | 5 | var lastCommittedEvents: [DatabaseEvent] = []
|
@@ -1784,4 +1784,89 @@ class TransactionObserverTests: GRDBTestCase {
|
1784 | 1784 | }
|
1785 | 1785 | }
|
1786 | 1786 | }
|
| 1787 | + |
| 1788 | + // MARK: - Read-Only Connection |
| 1789 | + |
| 1790 | + func testReadOnlyConnection() throws { |
| 1791 | + let dbQueue = try makeDatabaseQueue(filename: "database.sqlite") |
| 1792 | + try setupArtistDatabase(in: dbQueue) |
| 1793 | + |
| 1794 | + dbConfiguration.readonly = true |
| 1795 | + let readOnlyQueue = try makeDatabaseQueue(filename: "database.sqlite") |
| 1796 | + |
| 1797 | + let observer = Observer() |
| 1798 | + readOnlyQueue.add(transactionObserver: observer, extent: .databaseLifetime) |
| 1799 | + |
| 1800 | + try readOnlyQueue.inDatabase { db in |
| 1801 | + do { |
| 1802 | + try db.execute(sql: """ |
| 1803 | + BEGIN; |
| 1804 | + COMMIT; |
| 1805 | + """) |
| 1806 | + XCTAssertEqual(observer.didChangeCount, 0) |
| 1807 | + XCTAssertEqual(observer.willCommitCount, 0) |
| 1808 | + XCTAssertEqual(observer.didCommitCount, 0) |
| 1809 | + XCTAssertEqual(observer.didRollbackCount, 0) |
| 1810 | + #if SQLITE_ENABLE_PREUPDATE_HOOK |
| 1811 | + XCTAssertEqual(observer.willChangeCount, 0) |
| 1812 | + #endif |
| 1813 | + } |
| 1814 | + |
| 1815 | + do { |
| 1816 | + try db.execute(sql: """ |
| 1817 | + BEGIN; |
| 1818 | + SELECT * FROM artists; |
| 1819 | + COMMIT; |
| 1820 | + """) |
| 1821 | + XCTAssertEqual(observer.didChangeCount, 0) |
| 1822 | + XCTAssertEqual(observer.willCommitCount, 0) |
| 1823 | + XCTAssertEqual(observer.didCommitCount, 0) |
| 1824 | + XCTAssertEqual(observer.didRollbackCount, 0) |
| 1825 | + #if SQLITE_ENABLE_PREUPDATE_HOOK |
| 1826 | + XCTAssertEqual(observer.willChangeCount, 0) |
| 1827 | + #endif |
| 1828 | + } |
| 1829 | + } |
| 1830 | + } |
| 1831 | + |
| 1832 | + func testReadOnlyBlock() throws { |
| 1833 | + let dbQueue = try makeDatabaseQueue() |
| 1834 | + try setupArtistDatabase(in: dbQueue) |
| 1835 | + |
| 1836 | + let observer = Observer() |
| 1837 | + dbQueue.add(transactionObserver: observer, extent: .databaseLifetime) |
| 1838 | + |
| 1839 | + try dbQueue.inDatabase { db in |
| 1840 | + try db.readOnly { |
| 1841 | + do { |
| 1842 | + try db.execute(sql: """ |
| 1843 | + BEGIN; |
| 1844 | + COMMIT; |
| 1845 | + """) |
| 1846 | + XCTAssertEqual(observer.didChangeCount, 0) |
| 1847 | + XCTAssertEqual(observer.willCommitCount, 0) |
| 1848 | + XCTAssertEqual(observer.didCommitCount, 0) |
| 1849 | + XCTAssertEqual(observer.didRollbackCount, 0) |
| 1850 | + #if SQLITE_ENABLE_PREUPDATE_HOOK |
| 1851 | + XCTAssertEqual(observer.willChangeCount, 0) |
| 1852 | + #endif |
| 1853 | + } |
| 1854 | + |
| 1855 | + do { |
| 1856 | + try db.execute(sql: """ |
| 1857 | + BEGIN; |
| 1858 | + SELECT * FROM artists; |
| 1859 | + COMMIT; |
| 1860 | + """) |
| 1861 | + XCTAssertEqual(observer.didChangeCount, 0) |
| 1862 | + XCTAssertEqual(observer.willCommitCount, 0) |
| 1863 | + XCTAssertEqual(observer.didCommitCount, 0) |
| 1864 | + XCTAssertEqual(observer.didRollbackCount, 0) |
| 1865 | + #if SQLITE_ENABLE_PREUPDATE_HOOK |
| 1866 | + XCTAssertEqual(observer.willChangeCount, 0) |
| 1867 | + #endif |
| 1868 | + } |
| 1869 | + } |
| 1870 | + } |
| 1871 | + } |
1787 | 1872 | }
|
0 commit comments