@@ -9,13 +9,15 @@ import kotlinx.coroutines.sync.Mutex
99import kotlinx.coroutines.sync.withLock
1010
1111public interface ConnectionPool : AutoCloseable {
12+ public val configuration: AndroidxSqliteConfiguration
13+
1214 public fun acquireWriterConnection (): SQLiteConnection
1315 public fun releaseWriterConnection ()
1416 public fun acquireReaderConnection (): SQLiteConnection
1517 public fun releaseReaderConnection (connection : SQLiteConnection )
16- public fun setForeignKeyConstraintsEnabled (isForeignKeyConstraintsEnabled : Boolean )
1718 public fun setJournalMode (journalMode : SqliteJournalMode )
18- public fun setSync (sync : SqliteSync )
19+ public fun updateForeignKeyConstraintsEnabled (isForeignKeyConstraintsEnabled : Boolean )
20+ public fun updateSync (sync : SqliteSync )
1921}
2022
2123internal class AndroidxDriverConnectionPool (
@@ -29,14 +31,14 @@ internal class AndroidxDriverConnectionPool(
2931 val connection : Lazy <SQLiteConnection >,
3032 )
3133
32- private var configuration by atomic(configuration)
34+ override var configuration by atomic(configuration)
3335
3436 private val name by lazy { nameProvider() }
3537
3638 private val writerConnection: SQLiteConnection by lazy {
3739 connectionFactory
3840 .createConnection(name)
39- .withConfiguration (configuration)
41+ .withWriterConfiguration (configuration)
4042 }
4143
4244 private val writerMutex = Mutex ()
@@ -56,7 +58,7 @@ internal class AndroidxDriverConnectionPool(
5658 lazy {
5759 connectionFactory
5860 .createConnection(name)
59- .withConfiguration (configuration)
61+ .withReaderConfiguration (configuration)
6062 },
6163 ),
6264 )
@@ -108,32 +110,27 @@ internal class AndroidxDriverConnectionPool(
108110 }
109111 }
110112
111- override fun setForeignKeyConstraintsEnabled ( isForeignKeyConstraintsEnabled : Boolean ) {
113+ override fun setJournalMode ( journalMode : SqliteJournalMode ) {
112114 configuration = configuration.copy(
113- isForeignKeyConstraintsEnabled = isForeignKeyConstraintsEnabled ,
115+ journalMode = journalMode ,
114116 )
115117
116- val foreignKeys = if (isForeignKeyConstraintsEnabled) " ON" else " OFF"
117- runPragmaOnAllConnections(" PRAGMA foreign_keys = $foreignKeys ;" )
118+ runPragmaOnAllCreatedConnections(" PRAGMA journal_mode = ${configuration.journalMode.value} ;" )
118119 }
119120
120- override fun setJournalMode ( journalMode : SqliteJournalMode ) {
121+ override fun updateForeignKeyConstraintsEnabled ( isForeignKeyConstraintsEnabled : Boolean ) {
121122 configuration = configuration.copy(
122- journalMode = journalMode ,
123+ isForeignKeyConstraintsEnabled = isForeignKeyConstraintsEnabled ,
123124 )
124-
125- runPragmaOnAllConnections(" PRAGMA journal_mode = ${configuration.journalMode.value} ;" )
126125 }
127126
128- override fun setSync (sync : SqliteSync ) {
127+ override fun updateSync (sync : SqliteSync ) {
129128 configuration = configuration.copy(
130129 sync = sync,
131130 )
132-
133- runPragmaOnAllConnections(" PRAGMA synchronous = ${configuration.sync.value} ;" )
134131 }
135132
136- private fun runPragmaOnAllConnections (sql : String ) {
133+ private fun runPragmaOnAllCreatedConnections (sql : String ) {
137134 val writer = acquireWriterConnection()
138135 try {
139136 writer.execSQL(sql)
@@ -180,12 +177,12 @@ internal class PassthroughConnectionPool(
180177 nameProvider : () -> String ,
181178 configuration : AndroidxSqliteConfiguration ,
182179) : ConnectionPool {
183- private var configuration by atomic(configuration)
180+ override var configuration by atomic(configuration)
184181
185182 private val name by lazy { nameProvider() }
186183
187184 private val delegatedConnection: SQLiteConnection by lazy {
188- connectionFactory.createConnection(name).withConfiguration (configuration)
185+ connectionFactory.createConnection(name).withWriterConfiguration (configuration)
189186 }
190187
191188 override fun acquireWriterConnection () = delegatedConnection
@@ -196,15 +193,6 @@ internal class PassthroughConnectionPool(
196193
197194 override fun releaseReaderConnection (connection : SQLiteConnection ) {}
198195
199- override fun setForeignKeyConstraintsEnabled (isForeignKeyConstraintsEnabled : Boolean ) {
200- configuration = configuration.copy(
201- isForeignKeyConstraintsEnabled = isForeignKeyConstraintsEnabled,
202- )
203-
204- val foreignKeys = if (isForeignKeyConstraintsEnabled) " ON" else " OFF"
205- delegatedConnection.execSQL(" PRAGMA foreign_keys = $foreignKeys ;" )
206- }
207-
208196 override fun setJournalMode (journalMode : SqliteJournalMode ) {
209197 configuration = configuration.copy(
210198 journalMode = journalMode,
@@ -217,20 +205,24 @@ internal class PassthroughConnectionPool(
217205 delegatedConnection.execSQL(" PRAGMA foreign_keys = $foreignKeys ;" )
218206 }
219207
220- override fun setSync ( sync : SqliteSync ) {
208+ override fun updateForeignKeyConstraintsEnabled ( isForeignKeyConstraintsEnabled : Boolean ) {
221209 configuration = configuration.copy(
222- sync = sync ,
210+ isForeignKeyConstraintsEnabled = isForeignKeyConstraintsEnabled ,
223211 )
212+ }
224213
225- delegatedConnection.execSQL(" PRAGMA synchronous = ${configuration.sync.value} ;" )
214+ override fun updateSync (sync : SqliteSync ) {
215+ configuration = configuration.copy(
216+ sync = sync,
217+ )
226218 }
227219
228220 override fun close () {
229221 delegatedConnection.close()
230222 }
231223}
232224
233- private fun SQLiteConnection.withConfiguration (
225+ private fun SQLiteConnection.withWriterConfiguration (
234226 configuration : AndroidxSqliteConfiguration ,
235227): SQLiteConnection = this .apply {
236228 // copy the configuration for thread safety
@@ -243,3 +235,10 @@ private fun SQLiteConnection.withConfiguration(
243235 execSQL(" PRAGMA foreign_keys = $foreignKeys ;" )
244236 }
245237}
238+
239+ private fun SQLiteConnection.withReaderConfiguration (
240+ configuration : AndroidxSqliteConfiguration ,
241+ ): SQLiteConnection = this .apply {
242+ // copy the configuration for thread safety
243+ execSQL(" PRAGMA journal_mode = ${configuration.copy().journalMode.value} ;" )
244+ }
0 commit comments