Skip to content

Commit 0a707e0

Browse files
committed
replace native functions in SQLiteConnection with calls to native wrapper around org.xerial:sqlite-jdbc's NativeDB
1 parent 168d65d commit 0a707e0

File tree

6 files changed

+253
-87
lines changed

6 files changed

+253
-87
lines changed

build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,7 @@ dependencies {
164164
implementation("org.jetbrains.kotlinx:kotlinx-serialization-core:1.3.2")
165165
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.3.2")
166166
implementation("com.squareup.okhttp:okhttp:2.7.5")
167+
implementation("org.xerial:sqlite-jdbc:3.44.1.0")
167168
// firebase dependencies
168169
implementation("android.arch.lifecycle:common:1.1.1")
169170
implementation("io.grpc:grpc-protobuf-lite:1.52.1")

src/main/java/android/database/sqlite/SQLiteConnection.java

Lines changed: 42 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,6 @@
2020

2121
package android.database.sqlite;
2222

23-
import android.database.sqlite.CloseGuard;
24-
2523
import android.database.Cursor;
2624
import android.database.CursorWindow;
2725
import android.database.DatabaseUtils;
@@ -33,12 +31,13 @@
3331
import android.util.Log;
3432
import android.util.LruCache;
3533
import android.util.Printer;
34+
import org.sqlite.core.NativeDB;
35+
import org.sqlite.core.NativeKt;
3636

3737
import java.text.SimpleDateFormat;
3838
import java.util.ArrayList;
3939
import java.util.Date;
4040
import java.util.Map;
41-
import java.util.regex.Pattern;
4241

4342
/**
4443
* Represents a SQLite database connection.
@@ -109,7 +108,7 @@ public final class SQLiteConnection implements CancellationSignal.OnCancelListen
109108
private final OperationLog mRecentOperations = new OperationLog();
110109

111110
// The native SQLiteConnection pointer. (FOR INTERNAL USE ONLY)
112-
private long mConnectionPtr;
111+
private NativeDB mConnectionPtr;
113112

114113
private boolean mOnlyAllowReadOnlyOperations;
115114

@@ -118,49 +117,8 @@ public final class SQLiteConnection implements CancellationSignal.OnCancelListen
118117
// times we have attempted to attach a cancellation signal to the connection so that
119118
// we can ensure that we detach the signal at the right time.
120119
private int mCancellationSignalAttachCount;
121-
122-
private static native long nativeOpen(String path, int openFlags, String label,
123-
boolean enableTrace, boolean enableProfile);
124-
private static native void nativeClose(long connectionPtr);
125-
private static native void nativeRegisterCustomFunction(long connectionPtr,
126-
SQLiteCustomFunction function);
127-
private static native void nativeRegisterLocalizedCollators(long connectionPtr, String locale);
128-
private static native long nativePrepareStatement(long connectionPtr, String sql);
129-
private static native void nativeFinalizeStatement(long connectionPtr, long statementPtr);
130-
private static native int nativeGetParameterCount(long connectionPtr, long statementPtr);
131-
private static native boolean nativeIsReadOnly(long connectionPtr, long statementPtr);
132-
private static native int nativeGetColumnCount(long connectionPtr, long statementPtr);
133-
private static native String nativeGetColumnName(long connectionPtr, long statementPtr,
134-
int index);
135-
private static native void nativeBindNull(long connectionPtr, long statementPtr,
136-
int index);
137-
private static native void nativeBindLong(long connectionPtr, long statementPtr,
138-
int index, long value);
139-
private static native void nativeBindDouble(long connectionPtr, long statementPtr,
140-
int index, double value);
141-
private static native void nativeBindString(long connectionPtr, long statementPtr,
142-
int index, String value);
143-
private static native void nativeBindBlob(long connectionPtr, long statementPtr,
144-
int index, byte[] value);
145-
private static native void nativeResetStatementAndClearBindings(
146-
long connectionPtr, long statementPtr);
147-
private static native void nativeExecute(long connectionPtr, long statementPtr);
148-
private static native long nativeExecuteForLong(long connectionPtr, long statementPtr);
149-
private static native String nativeExecuteForString(long connectionPtr, long statementPtr);
150-
private static native int nativeExecuteForBlobFileDescriptor(
151-
long connectionPtr, long statementPtr);
152-
private static native int nativeExecuteForChangedRowCount(long connectionPtr, long statementPtr);
153-
private static native long nativeExecuteForLastInsertedRowId(
154-
long connectionPtr, long statementPtr);
155-
private static native long nativeExecuteForCursorWindow(
156-
long connectionPtr, long statementPtr, CursorWindow win,
157-
int startPos, int requiredPos, boolean countAllRows);
158-
private static native int nativeGetDbLookaside(long connectionPtr);
159-
private static native void nativeCancel(long connectionPtr);
160-
private static native void nativeResetCancel(long connectionPtr, boolean cancelable);
161-
162-
private static native boolean nativeHasCodec();
163-
public static boolean hasCodec(){ return nativeHasCodec(); }
120+
121+
public static boolean hasCodec(){ return NativeKt.HasCodec(); }
164122

165123
private SQLiteConnection(SQLiteConnectionPool pool,
166124
SQLiteDatabaseConfiguration configuration,
@@ -178,7 +136,7 @@ private SQLiteConnection(SQLiteConnectionPool pool,
178136
@Override
179137
protected void finalize() throws Throwable {
180138
try {
181-
if (mPool != null && mConnectionPtr != 0) {
139+
if (mPool != null && mConnectionPtr != null) {
182140
mPool.onConnectionLeaked();
183141
}
184142

@@ -211,23 +169,23 @@ void close() {
211169
}
212170

213171
private void open() {
214-
mConnectionPtr = nativeOpen(mConfiguration.path, mConfiguration.openFlags,
172+
mConnectionPtr = NativeKt.Open(mConfiguration.path, mConfiguration.openFlags,
215173
mConfiguration.label,
216174
SQLiteDebug.DEBUG_SQL_STATEMENTS, SQLiteDebug.DEBUG_SQL_TIME);
217175

218176
setPageSize();
219177
setForeignKeyModeFromConfiguration();
220178
setJournalSizeLimit();
221179
setAutoCheckpointInterval();
222-
if( !nativeHasCodec() ){
180+
if(!NativeKt.HasCodec() ){
223181
setWalModeFromConfiguration();
224182
setLocaleFromConfiguration();
225183
}
226184
// Register custom functions.
227185
final int functionCount = mConfiguration.customFunctions.size();
228186
for (int i = 0; i < functionCount; i++) {
229187
SQLiteCustomFunction function = mConfiguration.customFunctions.get(i);
230-
nativeRegisterCustomFunction(mConnectionPtr, function);
188+
NativeKt.RegisterCustomFunction(mConnectionPtr, function);
231189
}
232190
}
233191

@@ -239,12 +197,12 @@ private void dispose(boolean finalized) {
239197
mCloseGuard.close();
240198
}
241199

242-
if (mConnectionPtr != 0) {
200+
if (mConnectionPtr != null) {
243201
final int cookie = mRecentOperations.beginOperation("close", null, null);
244202
try {
245203
mPreparedStatementCache.evictAll();
246-
nativeClose(mConnectionPtr);
247-
mConnectionPtr = 0;
204+
NativeKt.Close(mConnectionPtr);
205+
mConnectionPtr = null;
248206
} finally {
249207
mRecentOperations.endOperation(cookie);
250208
}
@@ -364,7 +322,7 @@ private void setLocaleFromConfiguration() {
364322

365323
// Register the localized collators.
366324
final String newLocale = mConfiguration.locale.toString();
367-
nativeRegisterLocalizedCollators(mConnectionPtr, newLocale);
325+
NativeKt.RegisterLocalizedCollators(mConnectionPtr, newLocale);
368326

369327
// If the database is read-only, we cannot modify the android metadata table
370328
// or existing indexes.
@@ -390,7 +348,7 @@ private void setLocaleFromConfiguration() {
390348
execute("DELETE FROM android_metadata", null, null);
391349
execute("INSERT INTO android_metadata (locale) VALUES(?)",
392350
new Object[] { newLocale }, null);
393-
execute("REINDEX LOCALIZED", null, null);
351+
// execute("REINDEX LOCALIZED", null, null);
394352
success = true;
395353
} finally {
396354
execute(success ? "COMMIT" : "ROLLBACK", null, null);
@@ -402,7 +360,7 @@ private void setLocaleFromConfiguration() {
402360
}
403361

404362
public void enableLocalizedCollators(){
405-
if( nativeHasCodec() ){
363+
if( NativeKt.HasCodec() ){
406364
setLocaleFromConfiguration();
407365
}
408366
}
@@ -416,7 +374,7 @@ void reconfigure(SQLiteDatabaseConfiguration configuration) {
416374
for (int i = 0; i < functionCount; i++) {
417375
SQLiteCustomFunction function = configuration.customFunctions.get(i);
418376
if (!mConfiguration.customFunctions.contains(function)) {
419-
nativeRegisterCustomFunction(mConnectionPtr, function);
377+
NativeKt.RegisterCustomFunction(mConnectionPtr, function);
420378
}
421379
}
422380

@@ -516,14 +474,14 @@ public void prepare(String sql, SQLiteStatementInfo outStatementInfo) {
516474
outStatementInfo.numParameters = statement.mNumParameters;
517475
outStatementInfo.readOnly = statement.mReadOnly;
518476

519-
final int columnCount = nativeGetColumnCount(
477+
final int columnCount = NativeKt.GetColumnCount(
520478
mConnectionPtr, statement.mStatementPtr);
521479
if (columnCount == 0) {
522480
outStatementInfo.columnNames = EMPTY_STRING_ARRAY;
523481
} else {
524482
outStatementInfo.columnNames = new String[columnCount];
525483
for (int i = 0; i < columnCount; i++) {
526-
outStatementInfo.columnNames[i] = nativeGetColumnName(
484+
outStatementInfo.columnNames[i] = NativeKt.GetColumnName(
527485
mConnectionPtr, statement.mStatementPtr, i);
528486
}
529487
}
@@ -565,7 +523,7 @@ public void execute(String sql, Object[] bindArgs,
565523
applyBlockGuardPolicy(statement);
566524
attachCancellationSignal(cancellationSignal);
567525
try {
568-
nativeExecute(mConnectionPtr, statement.mStatementPtr);
526+
NativeKt.Execute(mConnectionPtr, statement.mStatementPtr);
569527
} finally {
570528
detachCancellationSignal(cancellationSignal);
571529
}
@@ -608,7 +566,7 @@ public long executeForLong(String sql, Object[] bindArgs,
608566
applyBlockGuardPolicy(statement);
609567
attachCancellationSignal(cancellationSignal);
610568
try {
611-
return nativeExecuteForLong(mConnectionPtr, statement.mStatementPtr);
569+
return NativeKt.ExecuteForLong(mConnectionPtr, statement.mStatementPtr);
612570
} finally {
613571
detachCancellationSignal(cancellationSignal);
614572
}
@@ -651,7 +609,7 @@ public String executeForString(String sql, Object[] bindArgs,
651609
applyBlockGuardPolicy(statement);
652610
attachCancellationSignal(cancellationSignal);
653611
try {
654-
return nativeExecuteForString(mConnectionPtr, statement.mStatementPtr);
612+
return NativeKt.ExecuteForString(mConnectionPtr, statement.mStatementPtr);
655613
} finally {
656614
detachCancellationSignal(cancellationSignal);
657615
}
@@ -697,7 +655,7 @@ public ParcelFileDescriptor executeForBlobFileDescriptor(String sql, Object[] bi
697655
applyBlockGuardPolicy(statement);
698656
attachCancellationSignal(cancellationSignal);
699657
try {
700-
int fd = nativeExecuteForBlobFileDescriptor(
658+
int fd = NativeKt.ExecuteForBlobFileDescriptor(
701659
mConnectionPtr, statement.mStatementPtr);
702660
return fd >= 0 ? ParcelFileDescriptor.adoptFd(fd) : null;
703661
} finally {
@@ -744,7 +702,7 @@ public int executeForChangedRowCount(String sql, Object[] bindArgs,
744702
applyBlockGuardPolicy(statement);
745703
attachCancellationSignal(cancellationSignal);
746704
try {
747-
changedRows = nativeExecuteForChangedRowCount(
705+
changedRows = NativeKt.ExecuteForChangedRowCount(
748706
mConnectionPtr, statement.mStatementPtr);
749707
return changedRows;
750708
} finally {
@@ -792,7 +750,7 @@ public long executeForLastInsertedRowId(String sql, Object[] bindArgs,
792750
applyBlockGuardPolicy(statement);
793751
attachCancellationSignal(cancellationSignal);
794752
try {
795-
return nativeExecuteForLastInsertedRowId(
753+
return NativeKt.ExecuteForLastInsertedRowId(
796754
mConnectionPtr, statement.mStatementPtr);
797755
} finally {
798756
detachCancellationSignal(cancellationSignal);
@@ -855,7 +813,7 @@ public int executeForCursorWindow(String sql, Object[] bindArgs,
855813
applyBlockGuardPolicy(statement);
856814
attachCancellationSignal(cancellationSignal);
857815
try {
858-
final long result = nativeExecuteForCursorWindow(
816+
final long result = NativeKt.ExecuteForCursorWindow(
859817
mConnectionPtr, statement.mStatementPtr, window,
860818
startPos, requiredPos, countAllRows);
861819
actualPos = (int)(result >> 32);
@@ -899,11 +857,11 @@ private PreparedStatement acquirePreparedStatement(String sql) {
899857
skipCache = true;
900858
}
901859

902-
final long statementPtr = nativePrepareStatement(mConnectionPtr, sql);
860+
final long statementPtr = NativeKt.PrepareStatement(mConnectionPtr, sql);
903861
try {
904-
final int numParameters = nativeGetParameterCount(mConnectionPtr, statementPtr);
862+
final int numParameters = NativeKt.GetParameterCount(mConnectionPtr, statementPtr);
905863
final int type = DatabaseUtils.getSqlStatementType(sql);
906-
final boolean readOnly = nativeIsReadOnly(mConnectionPtr, statementPtr);
864+
final boolean readOnly = NativeKt.IsReadOnly(mConnectionPtr, statementPtr);
907865
statement = obtainPreparedStatement(sql, statementPtr, numParameters, type, readOnly);
908866
if (!skipCache && isCacheable(type)) {
909867
mPreparedStatementCache.put(sql, statement);
@@ -913,7 +871,7 @@ private PreparedStatement acquirePreparedStatement(String sql) {
913871
// Finalize the statement if an exception occurred and we did not add
914872
// it to the cache. If it is already in the cache, then leave it there.
915873
if (statement == null || !statement.mInCache) {
916-
nativeFinalizeStatement(mConnectionPtr, statementPtr);
874+
NativeKt.FinalizeStatement(mConnectionPtr, statementPtr);
917875
}
918876
throw ex;
919877
}
@@ -925,7 +883,7 @@ private void releasePreparedStatement(PreparedStatement statement) {
925883
statement.mInUse = false;
926884
if (statement.mInCache) {
927885
try {
928-
nativeResetStatementAndClearBindings(mConnectionPtr, statement.mStatementPtr);
886+
NativeKt.ResetStatementAndClearBindings(mConnectionPtr, statement.mStatementPtr);
929887
} catch (SQLiteException ex) {
930888
// The statement could not be reset due to an error. Remove it from the cache.
931889
// When remove() is called, the cache will invoke its entryRemoved() callback,
@@ -945,7 +903,7 @@ private void releasePreparedStatement(PreparedStatement statement) {
945903
}
946904

947905
private void finalizePreparedStatement(PreparedStatement statement) {
948-
nativeFinalizeStatement(mConnectionPtr, statement.mStatementPtr);
906+
NativeKt.FinalizeStatement(mConnectionPtr, statement.mStatementPtr);
949907
recyclePreparedStatement(statement);
950908
}
951909

@@ -956,7 +914,7 @@ private void attachCancellationSignal(CancellationSignal cancellationSignal) {
956914
mCancellationSignalAttachCount += 1;
957915
if (mCancellationSignalAttachCount == 1) {
958916
// Reset cancellation flag before executing the statement.
959-
nativeResetCancel(mConnectionPtr, true /*cancelable*/);
917+
NativeKt.ResetCancel(mConnectionPtr, true /*cancelable*/);
960918

961919
// After this point, onCancel() may be called concurrently.
962920
cancellationSignal.setOnCancelListener(this);
@@ -974,7 +932,7 @@ private void detachCancellationSignal(CancellationSignal cancellationSignal) {
974932
cancellationSignal.setOnCancelListener(null);
975933

976934
// Reset cancellation flag after executing the statement.
977-
nativeResetCancel(mConnectionPtr, false /*cancelable*/);
935+
NativeKt.ResetCancel(mConnectionPtr, false /*cancelable*/);
978936
}
979937
}
980938
}
@@ -986,7 +944,7 @@ private void detachCancellationSignal(CancellationSignal cancellationSignal) {
986944
// that the SQLite connection is still alive.
987945
@Override
988946
public void onCancel() {
989-
nativeCancel(mConnectionPtr);
947+
NativeKt.Cancel(mConnectionPtr);
990948
}
991949

992950
private void bindArguments(PreparedStatement statement, Object[] bindArgs) {
@@ -1005,28 +963,28 @@ private void bindArguments(PreparedStatement statement, Object[] bindArgs) {
1005963
final Object arg = bindArgs[i];
1006964
switch (DatabaseUtils.getTypeOfObject(arg)) {
1007965
case Cursor.FIELD_TYPE_NULL:
1008-
nativeBindNull(mConnectionPtr, statementPtr, i + 1);
966+
NativeKt.BindNull(mConnectionPtr, statementPtr, i + 1);
1009967
break;
1010968
case Cursor.FIELD_TYPE_INTEGER:
1011-
nativeBindLong(mConnectionPtr, statementPtr, i + 1,
969+
NativeKt.BindLong(mConnectionPtr, statementPtr, i + 1,
1012970
((Number)arg).longValue());
1013971
break;
1014972
case Cursor.FIELD_TYPE_FLOAT:
1015-
nativeBindDouble(mConnectionPtr, statementPtr, i + 1,
973+
NativeKt.BindDouble(mConnectionPtr, statementPtr, i + 1,
1016974
((Number)arg).doubleValue());
1017975
break;
1018976
case Cursor.FIELD_TYPE_BLOB:
1019-
nativeBindBlob(mConnectionPtr, statementPtr, i + 1, (byte[])arg);
977+
NativeKt.BindBlob(mConnectionPtr, statementPtr, i + 1, (byte[])arg);
1020978
break;
1021979
case Cursor.FIELD_TYPE_STRING:
1022980
default:
1023981
if (arg instanceof Boolean) {
1024982
// Provide compatibility with legacy applications which may pass
1025983
// Boolean values in bind args.
1026-
nativeBindLong(mConnectionPtr, statementPtr, i + 1,
984+
NativeKt.BindLong(mConnectionPtr, statementPtr, i + 1,
1027985
((Boolean)arg).booleanValue() ? 1 : 0);
1028986
} else {
1029-
nativeBindString(mConnectionPtr, statementPtr, i + 1, arg.toString());
987+
NativeKt.BindString(mConnectionPtr, statementPtr, i + 1, arg.toString());
1030988
}
1031989
break;
1032990
}
@@ -1078,7 +1036,7 @@ public void dump(Printer printer, boolean verbose) {
10781036
void dumpUnsafe(Printer printer, boolean verbose) {
10791037
printer.println("Connection #" + mConnectionId + ":");
10801038
if (verbose) {
1081-
printer.println(" connectionPtr: 0x" + Long.toHexString(mConnectionPtr));
1039+
printer.println(" connectionPtr: 0x" + Long.toHexString(mConnectionPtr.hashCode()));
10821040
}
10831041
printer.println(" isPrimaryConnection: " + mIsPrimaryConnection);
10841042
printer.println(" onlyAllowReadOnlyOperations: " + mOnlyAllowReadOnlyOperations);
@@ -1115,7 +1073,7 @@ String describeCurrentOperationUnsafe() {
11151073
*/
11161074
void collectDbStats(ArrayList<DbStats> dbStatsList) {
11171075
// Get information about the main database.
1118-
int lookaside = nativeGetDbLookaside(mConnectionPtr);
1076+
int lookaside = NativeKt.GetDbLookaside(mConnectionPtr);
11191077
long pageCount = 0;
11201078
long pageSize = 0;
11211079
try {

src/main/java/com/google/firebase/FirebasePlatform.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,5 +23,5 @@ abstract class FirebasePlatform {
2323

2424
abstract fun log(msg: String)
2525

26-
open fun getDatabasePath(name: String): File = File(System.getProperty("java.io.tmpdir"))
26+
open fun getDatabasePath(name: String): File = File("${System.getProperty("java.io.tmpdir")}${File.separatorChar}$name")
2727
}

0 commit comments

Comments
 (0)