Skip to content

Commit f85b64f

Browse files
authored
Merge pull request #1364 from couchbase/feature/issue_1352
Fixed #1352 - Crash when running with SQLCipher
2 parents 85f1c90 + 1cf603c commit f85b64f

4 files changed

Lines changed: 40 additions & 15 deletions

File tree

src/main/java/com/couchbase/lite/storage/SQLiteStorageEngineBase.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,14 @@ public abstract class SQLiteStorageEngineBase implements SQLiteStorageEngine {
4444

4545
abstract protected String getICUDatabasePath();
4646

47+
/**
48+
* Gets the connection pool size when in WAL mode.
49+
*
50+
* Maximum number of database connections opened and managed by framework layer
51+
* to handle queries on each database when using Write-Ahead Logging.
52+
*/
53+
abstract protected int getWALConnectionPoolSize();
54+
4755
@Override
4856
public boolean open(String path, SymmetricKey encryptionKey) throws SQLException {
4957
if(database != null && database.isOpen())
@@ -61,6 +69,7 @@ public boolean open(String path, SymmetricKey encryptionKey) throws SQLException
6169
SQLiteDatabase.setDatabasePlatformSupport(getDatabasePlatformSupport());
6270
database = SQLiteDatabase.openDatabase(path, null,
6371
SQLiteDatabase.CREATE_IF_NECESSARY | SQLiteDatabase.ENABLE_WRITE_AHEAD_LOGGING,
72+
getWALConnectionPoolSize(),
6473
null, new ConnectionListener());
6574
Log.v(Log.TAG_DATABASE, "%s: Opened Android sqlite db", this);
6675
} catch(SQLiteDatabaseCorruptException e) {

vendor/sqlite/src/java/com/couchbase/lite/internal/database/sqlite/SQLiteConnectionPool.java

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@
2222
package com.couchbase.lite.internal.database.sqlite;
2323

2424
import com.couchbase.lite.internal.database.CancellationSignal;
25-
import com.couchbase.lite.internal.database.log.DLog;
2625
import com.couchbase.lite.internal.database.OperationCanceledException;
26+
import com.couchbase.lite.internal.database.log.DLog;
2727
import com.couchbase.lite.internal.database.util.PrefixPrinter;
2828
import com.couchbase.lite.internal.database.util.Printer;
2929

@@ -152,7 +152,7 @@ private SQLiteConnectionPool(com.couchbase.lite.internal.database.sqlite.SQLiteD
152152
com.couchbase.lite.internal.database.sqlite.SQLiteConnectionListener connectionListener) {
153153
mConfiguration = new com.couchbase.lite.internal.database.sqlite.SQLiteDatabaseConfiguration(configuration);
154154
mConnectionListener = connectionListener;
155-
setMaxConnectionPoolSizeLocked();
155+
setMaxConnectionPoolSizeLocked(configuration.walConnectionPoolSize);
156156
}
157157

158158
@Override
@@ -309,11 +309,11 @@ public void reconfigure(com.couchbase.lite.internal.database.sqlite.SQLiteDataba
309309

310310
mAvailablePrimaryConnection = newPrimaryConnection;
311311
mConfiguration.updateParametersFrom(configuration);
312-
setMaxConnectionPoolSizeLocked();
312+
setMaxConnectionPoolSizeLocked(configuration.walConnectionPoolSize);
313313
} else {
314314
// Reconfigure the database connections in place.
315315
mConfiguration.updateParametersFrom(configuration);
316-
setMaxConnectionPoolSizeLocked();
316+
setMaxConnectionPoolSizeLocked(configuration.walConnectionPoolSize);
317317

318318
closeExcessConnectionsAndLogExceptionsLocked();
319319
reconfigureAllConnectionsLocked();
@@ -931,9 +931,12 @@ private static int getPriority(int connectionFlags) {
931931
return (connectionFlags & CONNECTION_FLAG_INTERACTIVE) != 0 ? 1 : 0;
932932
}
933933

934-
private void setMaxConnectionPoolSizeLocked() {
934+
private void setMaxConnectionPoolSizeLocked(int walConnectionPoolSize) {
935935
if ((mConfiguration.openFlags & com.couchbase.lite.internal.database.sqlite.SQLiteDatabase.ENABLE_WRITE_AHEAD_LOGGING) != 0) {
936-
mMaxConnectionPoolSize = com.couchbase.lite.internal.database.sqlite.SQLiteGlobal.getWALConnectionPoolSize();
936+
if (walConnectionPoolSize > 0)
937+
mMaxConnectionPoolSize = walConnectionPoolSize;
938+
else
939+
mMaxConnectionPoolSize = com.couchbase.lite.internal.database.sqlite.SQLiteGlobal.getWALConnectionPoolSize();
937940
} else {
938941
// TODO: We don't actually need to restrict the connection pool size to 1
939942
// for non-WAL databases. There might be reasons to use connection pooling

vendor/sqlite/src/java/com/couchbase/lite/internal/database/sqlite/SQLiteDatabase.java

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -246,11 +246,12 @@ protected SQLiteSession initialValue() {
246246
SQLiteNativeLibrary.load();
247247
}
248248

249-
private SQLiteDatabase(String path, int openFlags, CursorFactory cursorFactory,
250-
DatabaseErrorHandler errorHandler, com.couchbase.lite.internal.database.sqlite.SQLiteConnectionListener connectionListener) {
249+
private SQLiteDatabase(String path, int openFlags, int walConnectionPoolSize,
250+
CursorFactory cursorFactory,
251+
DatabaseErrorHandler errorHandler, com.couchbase.lite.internal.database.sqlite.SQLiteConnectionListener connectionListener) {
251252
mCursorFactory = cursorFactory;
252253
mErrorHandler = errorHandler;
253-
mConfigurationLocked = new com.couchbase.lite.internal.database.sqlite.SQLiteDatabaseConfiguration(path, openFlags);
254+
mConfigurationLocked = new com.couchbase.lite.internal.database.sqlite.SQLiteDatabaseConfiguration(path, openFlags, walConnectionPoolSize);
254255
mConnectionListener = connectionListener;
255256
}
256257

@@ -667,8 +668,8 @@ public static SQLiteDatabase openDatabase(String path, CursorFactory factory, in
667668
* @throws com.couchbase.lite.internal.database.sqlite.exception.SQLiteException if the database cannot be opened
668669
*/
669670
public static SQLiteDatabase openDatabase(String path, CursorFactory factory, int flags,
670-
DatabaseErrorHandler errorHandler) {
671-
return openDatabase(path, factory, flags, errorHandler, null);
671+
DatabaseErrorHandler errorHandler) {
672+
return openDatabase(path, factory, flags, 0, errorHandler, null);
672673
}
673674

674675
/**
@@ -682,14 +683,18 @@ public static SQLiteDatabase openDatabase(String path, CursorFactory factory, in
682683
* @param factory an optional factory class that is called to instantiate a
683684
* cursor when query is called, or null for default
684685
* @param flags to control database access mode
686+
* @param walConnectionPoolSize maximum connection pool size
685687
* @param errorHandler the {@link DatabaseErrorHandler} obj to be used to handle corruption
686688
* when sqlite reports database corruption
687689
* @return the newly opened database
688690
* @throws com.couchbase.lite.internal.database.sqlite.exception.SQLiteException if the database cannot be opened
689691
*/
690-
public static SQLiteDatabase openDatabase(String path, CursorFactory factory, int flags,
691-
DatabaseErrorHandler errorHandler, com.couchbase.lite.internal.database.sqlite.SQLiteConnectionListener connectionListener) {
692-
SQLiteDatabase db = new SQLiteDatabase(path, flags, factory, errorHandler, connectionListener);
692+
public static SQLiteDatabase openDatabase(
693+
String path, CursorFactory factory, int flags,
694+
int walConnectionPoolSize,
695+
DatabaseErrorHandler errorHandler,
696+
com.couchbase.lite.internal.database.sqlite.SQLiteConnectionListener connectionListener) {
697+
SQLiteDatabase db = new SQLiteDatabase(path, flags, walConnectionPoolSize, factory, errorHandler, connectionListener);
693698
db.open();
694699
return db;
695700
}

vendor/sqlite/src/java/com/couchbase/lite/internal/database/sqlite/SQLiteDatabaseConfiguration.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,21 +87,29 @@ public final class SQLiteDatabaseConfiguration {
8787
*/
8888
public boolean foreignKeyConstraintsEnabled;
8989

90+
/**
91+
* Maximum number of database connections opened and managed by framework layer
92+
* to handle queries on each database when using Write-Ahead Logging.
93+
*/
94+
public int walConnectionPoolSize = 0;
95+
9096
/**
9197
* Creates a database configuration with the required parameters for opening a
9298
* database and default values for all other parameters.
9399
*
94100
* @param path The database path.
95101
* @param openFlags Open flags for the database, such as {@link SQLiteDatabase#OPEN_READWRITE}.
102+
* @param walConnectionPoolSize
96103
*/
97-
public SQLiteDatabaseConfiguration(String path, int openFlags) {
104+
public SQLiteDatabaseConfiguration(String path, int openFlags, int walConnectionPoolSize) {
98105
if (path == null) {
99106
throw new IllegalArgumentException("path must not be null.");
100107
}
101108

102109
this.path = path;
103110
label = stripPathForLogs(path);
104111
this.openFlags = openFlags;
112+
this.walConnectionPoolSize = walConnectionPoolSize;
105113

106114
// Set default values for optional parameters.
107115
maxSqlCacheSize = 25;

0 commit comments

Comments
 (0)