Visitar URL original
Merge branch 'master' into beta · sqlcipher/sqlcipher-android@6dd67e8 · GitHub
Skip to content

Commit 6dd67e8

Browse files
committed
Merge branch 'master' into beta
2 parents 73ea06a + 8dbff38 commit 6dd67e8

7 files changed

Lines changed: 84 additions & 6 deletions

File tree

‎sqlcipher/src/androidTest/java/net/zetetic/database/sqlcipher/driver/SQLCipherConnectionTests.kt‎

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,23 @@
11
package net.zetetic.database.sqlcipher.driver
22

33
import android.content.Context
4+
import android.database.Cursor
5+
import androidx.sqlite.SQLITE_DATA_BLOB
6+
import androidx.sqlite.SQLITE_DATA_FLOAT
7+
import androidx.sqlite.SQLITE_DATA_INTEGER
8+
import androidx.sqlite.SQLITE_DATA_NULL
9+
import androidx.sqlite.SQLITE_DATA_TEXT
410
import androidx.sqlite.SQLiteConnection
511
import androidx.sqlite.execSQL
612
import androidx.test.ext.junit.runners.AndroidJUnit4
713
import androidx.test.platform.app.InstrumentationRegistry
8-
import kotlinx.coroutines.test.runTest
914
import net.zetetic.database.sqlcipher.SQLiteDatabase
1015
import org.junit.After
1116
import org.junit.Assert.assertArrayEquals
1217
import org.junit.Assert.assertEquals
1318
import org.junit.Assert.assertFalse
19+
import org.junit.Assert.assertNotNull
20+
import org.junit.Assert.assertNull
1421
import org.junit.Assert.assertThrows
1522
import org.junit.Assert.assertTrue
1623
import org.junit.Before
@@ -156,6 +163,18 @@ class SQLCipherConnectionTests {
156163
}
157164
}
158165

166+
@Test
167+
fun shouldReportColumnTypesUsingSqliteDataConstants() {
168+
connection.prepare("SELECT NULL, 1, 1.5, 'text', x'00'").use { statement ->
169+
assertTrue(statement.step())
170+
assertEquals(SQLITE_DATA_NULL, statement.getColumnType(0))
171+
assertEquals(SQLITE_DATA_INTEGER, statement.getColumnType(1))
172+
assertEquals(SQLITE_DATA_FLOAT, statement.getColumnType(2))
173+
assertEquals(SQLITE_DATA_TEXT, statement.getColumnType(3))
174+
assertEquals(SQLITE_DATA_BLOB, statement.getColumnType(4))
175+
}
176+
}
177+
159178
@Test
160179
fun shouldRoundTripDataThroughStandardStatement() {
161180
connection.prepare("INSERT INTO t (id, v) VALUES (?, ?)").use { statement ->
@@ -233,6 +252,32 @@ class SQLCipherConnectionTests {
233252
}
234253
}
235254

255+
@Test
256+
fun shouldCloseCursorWhenStatementClosedAfterStep() {
257+
database.execSQL(
258+
"INSERT INTO t (id, v) VALUES (?, ?);",
259+
arrayOf<Any>(1, "one"))
260+
val statement = SQLCipherStatement(
261+
database,
262+
"SELECT id, v FROM t;")
263+
assertTrue(statement.step())
264+
265+
val cursor = getCursor(statement)
266+
assertNotNull(cursor)
267+
assertFalse(cursor!!.isClosed)
268+
269+
statement.close()
270+
271+
assertTrue(cursor.isClosed)
272+
assertNull(getCursor(statement))
273+
}
274+
275+
private fun getCursor(statement: SQLCipherStatement): Cursor? {
276+
val field = SQLCipherStatement::class.java.getDeclaredField("cursor")
277+
field.isAccessible = true
278+
return field.get(statement) as Cursor?
279+
}
280+
236281
private fun exec(sql: String) {
237282
connection.prepare(sql).use { it.step() }
238283
}

‎sqlcipher/src/androidTest/java/net/zetetic/database/sqlcipher/driver/SupportAPIRoomTest.kt‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,15 @@ class SupportAPIRoomTest {
176176
assertThat(db.getSupportWrapper().isWriteAheadLoggingEnabled, `is`(true))
177177
}
178178

179+
@Test
180+
fun shouldReadNullColumnThroughSupportWrapperCursor() {
181+
db.getSupportWrapper().query("SELECT NULL AS empty_value, 'x' AS present_value").use { cursor ->
182+
assertThat(cursor.moveToFirst(), `is`(true))
183+
assertThat(cursor.isNull(0), `is`(true))
184+
assertThat(cursor.getString(1), `is`("x"))
185+
}
186+
}
187+
179188
@Database(entities = [User::class], version = 1, exportSchema = false)
180189
abstract class AppDatabase : RoomDatabase() {
181190
abstract fun userDao(): UserDao

‎sqlcipher/src/main/java/net/zetetic/database/sqlcipher/SQLiteConnectionPool.java‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -759,10 +759,12 @@ private void cancelConnectionWaiterLocked(ConnectionWaiter waiter) {
759759
// Can't throw.
760760
private void logConnectionPoolBusyLocked(long waitMillis, int connectionFlags) {
761761
final Thread thread = Thread.currentThread();
762+
@SuppressWarnings("deprecation")
763+
final long threadId = thread.getId();
762764
StringBuilder msg = new StringBuilder();
763765
msg.append("The connection pool for database '").append(mConfiguration.label);
764766
msg.append("' has been unable to grant a connection to thread ");
765-
msg.append(thread.getId()).append(" (").append(thread.getName()).append(") ");
767+
msg.append(threadId).append(" (").append(thread.getName()).append(") ");
766768
msg.append("with flags 0x").append(Integer.toHexString(connectionFlags));
767769
msg.append(" for ").append(waitMillis * 0.001f).append(" seconds.\n");
768770

‎sqlcipher/src/main/java/net/zetetic/database/sqlcipher/driver/SQLCipherStatement.java‎

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import android.database.Cursor;
44

55
import androidx.annotation.NonNull;
6+
import androidx.sqlite.SQLite;
67
import androidx.sqlite.SQLiteStatement;
78
import android.database.SQLException;
89

@@ -115,7 +116,24 @@ public String getColumnName(
115116
@Override
116117
public int getColumnType(
117118
int index) {
118-
return requireCursor().getType(index);
119+
return toSqliteDataType(requireCursor().getType(index));
120+
}
121+
122+
private static int toSqliteDataType(int cursorFieldType) {
123+
switch (cursorFieldType) {
124+
case Cursor.FIELD_TYPE_NULL:
125+
return SQLite.SQLITE_DATA_NULL;
126+
case Cursor.FIELD_TYPE_INTEGER:
127+
return SQLite.SQLITE_DATA_INTEGER;
128+
case Cursor.FIELD_TYPE_FLOAT:
129+
return SQLite.SQLITE_DATA_FLOAT;
130+
case Cursor.FIELD_TYPE_STRING:
131+
return SQLite.SQLITE_DATA_TEXT;
132+
case Cursor.FIELD_TYPE_BLOB:
133+
return SQLite.SQLITE_DATA_BLOB;
134+
default:
135+
throw new SQLException("unknown cursor field type " + cursorFieldType);
136+
}
119137
}
120138

121139
@Override
@@ -154,6 +172,10 @@ public void clearBindings() {
154172

155173
@Override
156174
public void close() {
175+
if (cursor != null) {
176+
cursor.close();
177+
cursor = null;
178+
}
157179
closed = true;
158180
}
159181

Submodule src updated 1054 files

‎sqlcipher/src/main/jni/sqlcipher/Android.mk‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ LOCAL_C_INCLUDES += $(LOCAL_PATH) \
6666

6767
LOCAL_MODULE:= libsqlcipher
6868
LOCAL_LDLIBS += -ldl -llog
69-
LOCAL_LDFLAGS += -Wl,-z,max-page-size=16384
69+
LOCAL_LDFLAGS += -Wl,-z,max-page-size=16384 -Wl,-z,common-page-size=16384
7070
ifeq ($(findstring SSL,$(LOCAL_CFLAGS)),SSL)
7171
LOCAL_STATIC_LIBRARIES += static-libcrypto
7272
else

0 commit comments

Comments
 (0)