Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | In SQLITE_HAS_CODEC builds, do not initialize the LOCALIZED collation automatically (as if the SQLiteDatabase.NO_LOCALIZED_COLLATORS flag was set). Require apps to call the enableLocalizedCollators() method to explicitly initialize it. This gives the app an opportunity to execute a PRAGMA statement to configure an encryption key before the database is first accessed. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
9c4a073c3bc186182f0ca952a3259189 |
User & Date: | dan 2013-12-24 12:07:09.461 |
Context
2013-12-24
| ||
18:51 | Add extra SEE tests. And fix problems revealed by the same. (check-in: 0b5fd0b0d3 user: dan tags: trunk) | |
12:07 | In SQLITE_HAS_CODEC builds, do not initialize the LOCALIZED collation automatically (as if the SQLiteDatabase.NO_LOCALIZED_COLLATORS flag was set). Require apps to call the enableLocalizedCollators() method to explicitly initialize it. This gives the app an opportunity to execute a PRAGMA statement to configure an encryption key before the database is first accessed. (check-in: 9c4a073c3b user: dan tags: trunk) | |
2013-12-23
| ||
07:33 | Add extra required utility functions to ExtraUtils.java. (check-in: be6acc5363 user: dan tags: trunk) | |
Changes
Changes to jni/Android.mk.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_CFLAGS += -DHAVE_CONFIG_H -DKHTML_NO_EXCEPTIONS -DGKWQ_NO_JAVA LOCAL_CFLAGS += -DNO_SUPPORT_JS_BINDING -DQT_NO_WHEELEVENT -DKHTML_NO_XBL LOCAL_CFLAGS += -U__APPLE__ LOCAL_CFLAGS += -Wno-unused-parameter -Wno-int-to-pointer-cast LOCAL_CFLAGS += -Wno-maybe-uninitialized -Wno-parentheses LOCAL_CPPFLAGS += -Wno-conversion-null ifeq ($(TARGET_ARCH), arm) LOCAL_CFLAGS += -DPACKED="__attribute__ ((packed))" else LOCAL_CFLAGS += -DPACKED="" endif LOCAL_SRC_FILES:= \ android_database_SQLiteCommon.cpp \ android_database_SQLiteConnection.cpp \ android_database_SQLiteGlobal.cpp \ android_database_SQLiteDebug.cpp \ | > | > > > > > > > | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_CFLAGS += -DHAVE_CONFIG_H -DKHTML_NO_EXCEPTIONS -DGKWQ_NO_JAVA LOCAL_CFLAGS += -DNO_SUPPORT_JS_BINDING -DQT_NO_WHEELEVENT -DKHTML_NO_XBL LOCAL_CFLAGS += -U__APPLE__ LOCAL_CFLAGS += -Wno-unused-parameter -Wno-int-to-pointer-cast LOCAL_CFLAGS += -Wno-maybe-uninitialized -Wno-parentheses LOCAL_CPPFLAGS += -Wno-conversion-null ifeq ($(TARGET_ARCH), arm) LOCAL_CFLAGS += -DPACKED="__attribute__ ((packed))" else LOCAL_CFLAGS += -DPACKED="" endif LOCAL_SRC_FILES:= \ android_database_SQLiteCommon.cpp \ android_database_SQLiteConnection.cpp \ android_database_SQLiteGlobal.cpp \ android_database_SQLiteDebug.cpp \ JNIHelp.cpp JniConstants.cpp # # For a SEE build, add the SEE sources to the tree and uncomment the first # two of the following three lines. # LOCAL_SRC_FILES += sqlite3-see.c LOCAL_CFLAGS += -DSQLITE_HAS_CODEC # LOCAL_SRC_FILES += sqlite3.c LOCAL_C_INCLUDES += nativehelper/ LOCAL_MODULE:= libsqliteX LOCAL_LDLIBS += -ldl -llog include $(BUILD_SHARED_LIBRARY) |
︙ | ︙ |
Changes to jni/android_database_SQLiteConnection.cpp.
︙ | ︙ | |||
849 850 851 852 853 854 855 856 857 858 859 860 861 862 | sqlite3_progress_handler(connection->db, 4, sqliteProgressHandlerCallback, connection); } else { sqlite3_progress_handler(connection->db, 0, NULL, NULL); } } static JNINativeMethod sMethods[] = { /* name, signature, funcPtr */ { "nativeOpen", "(Ljava/lang/String;ILjava/lang/String;ZZ)I", (void*)nativeOpen }, { "nativeClose", "(I)V", | > > > > > > > > | 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 | sqlite3_progress_handler(connection->db, 4, sqliteProgressHandlerCallback, connection); } else { sqlite3_progress_handler(connection->db, 0, NULL, NULL); } } static jboolean nativeHasCodec(JNIEnv* env, jobject clazz){ #ifdef SQLITE_HAS_CODEC return true; #else return false; #endif } static JNINativeMethod sMethods[] = { /* name, signature, funcPtr */ { "nativeOpen", "(Ljava/lang/String;ILjava/lang/String;ZZ)I", (void*)nativeOpen }, { "nativeClose", "(I)V", |
︙ | ︙ | |||
905 906 907 908 909 910 911 912 913 914 915 916 917 918 | (void*)nativeExecuteForCursorWindow }, { "nativeGetDbLookaside", "(I)I", (void*)nativeGetDbLookaside }, { "nativeCancel", "(I)V", (void*)nativeCancel }, { "nativeResetCancel", "(IZ)V", (void*)nativeResetCancel }, }; #define FIND_CLASS(var, className) \ var = env->FindClass(className); \ LOG_FATAL_IF(! var, "Unable to find class " className); #define GET_METHOD_ID(var, clazz, methodName, fieldDescriptor) \ | > > | 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 | (void*)nativeExecuteForCursorWindow }, { "nativeGetDbLookaside", "(I)I", (void*)nativeGetDbLookaside }, { "nativeCancel", "(I)V", (void*)nativeCancel }, { "nativeResetCancel", "(IZ)V", (void*)nativeResetCancel }, { "nativeHasCodec", "()Z", (void*)nativeHasCodec }, }; #define FIND_CLASS(var, className) \ var = env->FindClass(className); \ LOG_FATAL_IF(! var, "Unable to find class " className); #define GET_METHOD_ID(var, clazz, methodName, fieldDescriptor) \ |
︙ | ︙ |
Changes to src/org/sqlite/app/customsqlite/CustomSqlite.java.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | package org.sqlite.app.customsqlite; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.TextView; import org.sqlite.database.sqlite.SQLiteDatabase; import org.sqlite.database.sqlite.SQLiteStatement; import android.database.Cursor; /* import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteStatement; */ public class CustomSqlite extends Activity { private TextView myTV; /* Text view widget */ private int myNTest; /* Number of tests attempted */ private int myNErr; /* Number of tests failed */ /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); myTV = (TextView)findViewById(R.id.tv_widget); | > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | package org.sqlite.app.customsqlite; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.TextView; import java.io.File; import java.lang.InterruptedException; import org.sqlite.database.sqlite.SQLiteDatabase; import org.sqlite.database.sqlite.SQLiteStatement; import android.database.Cursor; /* import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteStatement; */ public class CustomSqlite extends Activity { private TextView myTV; /* Text view widget */ private int myNTest; /* Number of tests attempted */ private int myNErr; /* Number of tests failed */ File DB_PATH; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); myTV = (TextView)findViewById(R.id.tv_widget); |
︙ | ︙ | |||
56 57 58 59 60 61 62 63 64 65 66 67 | } else { myNErr++; myTV.append("FAILED\n"); myTV.append(" res= \"" + res + "\"\n"); myTV.append(" expected=\"" + expected + "\"\n"); } } /* ** Use a Cursor to loop through the results of a SELECT query. */ public void csr_test_1(){ | > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 | } else { myNErr++; myTV.append("FAILED\n"); myTV.append(" res= \"" + res + "\"\n"); myTV.append(" expected=\"" + expected + "\"\n"); } } /* ** Test that a database connection may be accessed from a second thread. */ public void thread_test_1(){ SQLiteDatabase.deleteDatabase(DB_PATH); final SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(DB_PATH, null); String db_path2 = DB_PATH.toString() + "2"; db.execSQL("CREATE TABLE t1(x, y)"); db.execSQL("INSERT INTO t1 VALUES (1, 2), (3, 4)"); Thread t = new Thread( new Runnable() { public void run() { SQLiteStatement st = db.compileStatement("SELECT sum(x+y) FROM t1"); String res = st.simpleQueryForString(); test_result("thread_test_1", res, "10"); } }); t.start(); try { t.join(); } catch (InterruptedException e) { } } /* ** Use a Cursor to loop through the results of a SELECT query. */ public void csr_test_1(){ SQLiteDatabase.deleteDatabase(DB_PATH); SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(DB_PATH, null); String res = ""; db.execSQL("CREATE TABLE t1(x)"); db.execSQL("INSERT INTO t1 VALUES ('one'), ('two'), ('three')"); Cursor c = db.rawQuery("SELECT x FROM t1", null); if( c!=null ){ boolean bRes; for(bRes=c.moveToFirst(); bRes; bRes=c.moveToNext()){ String x = c.getString(0); res = res + "." + x; } }else{ test_warning("csr_test_1", "c==NULL"); } test_result("csr_test_1", res, ".one.two.three"); } /* ** Check that using openSeeDatabase() creates encrypted databases. */ public void see_test_1(){ SQLiteDatabase.deleteDatabase(DB_PATH); String res = ""; SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(DB_PATH, null); db.execSQL("PRAGMA key = 'secretkey'"); db.execSQL("CREATE TABLE t1(x)"); db.execSQL("INSERT INTO t1 VALUES ('one'), ('two'), ('three')"); Cursor c = db.rawQuery("SELECT x FROM t1", null); if( c!=null ){ boolean bRes; for(bRes=c.moveToFirst(); bRes; bRes=c.moveToNext()){ String x = c.getString(0); res = res + "." + x; } }else{ test_warning("see_test_1", "c==NULL"); } test_result("see_test_1", res, ".one.two.three"); } public void run_the_tests(View view){ System.loadLibrary("sqliteX"); DB_PATH = getApplicationContext().getDatabasePath("test.db"); DB_PATH.mkdirs(); myTV.setText(""); myNErr = 0; myNTest = 0; try { report_version(); csr_test_1(); thread_test_1(); see_test_1(); myTV.append("\n" + myNErr + " errors from " + myNTest + " tests\n"); } catch(Exception e) { myTV.append("Exception: " + e.toString() + "\n"); myTV.append(android.util.Log.getStackTraceString(e) + "\n"); } } } |
Changes to src/org/sqlite/database/sqlite/SQLiteConnection.java.
︙ | ︙ | |||
154 155 156 157 158 159 160 161 162 163 164 165 166 167 | private static native long nativeExecuteForCursorWindow( int connectionPtr, int statementPtr, CursorWindow win, int startPos, int requiredPos, boolean countAllRows); private static native int nativeGetDbLookaside(int connectionPtr); private static native void nativeCancel(int connectionPtr); private static native void nativeResetCancel(int connectionPtr, boolean cancelable); private SQLiteConnection(SQLiteConnectionPool pool, SQLiteDatabaseConfiguration configuration, int connectionId, boolean primaryConnection) { mPool = pool; mConfiguration = new SQLiteDatabaseConfiguration(configuration); mConnectionId = connectionId; mIsPrimaryConnection = primaryConnection; | > > > | 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 | private static native long nativeExecuteForCursorWindow( int connectionPtr, int statementPtr, CursorWindow win, int startPos, int requiredPos, boolean countAllRows); private static native int nativeGetDbLookaside(int connectionPtr); private static native void nativeCancel(int connectionPtr); private static native void nativeResetCancel(int connectionPtr, boolean cancelable); private static native boolean nativeHasCodec(); public static boolean hasCodec(){ return nativeHasCodec(); } private SQLiteConnection(SQLiteConnectionPool pool, SQLiteDatabaseConfiguration configuration, int connectionId, boolean primaryConnection) { mPool = pool; mConfiguration = new SQLiteDatabaseConfiguration(configuration); mConnectionId = connectionId; mIsPrimaryConnection = primaryConnection; |
︙ | ︙ | |||
212 213 214 215 216 217 218 | SQLiteDebug.DEBUG_SQL_STATEMENTS, SQLiteDebug.DEBUG_SQL_TIME); setPageSize(); setForeignKeyModeFromConfiguration(); setWalModeFromConfiguration(); setJournalSizeLimit(); setAutoCheckpointInterval(); | > | > | 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 | SQLiteDebug.DEBUG_SQL_STATEMENTS, SQLiteDebug.DEBUG_SQL_TIME); setPageSize(); setForeignKeyModeFromConfiguration(); setWalModeFromConfiguration(); setJournalSizeLimit(); setAutoCheckpointInterval(); if( !nativeHasCodec() ){ setLocaleFromConfiguration(); } // Register custom functions. final int functionCount = mConfiguration.customFunctions.size(); for (int i = 0; i < functionCount; i++) { SQLiteCustomFunction function = mConfiguration.customFunctions.get(i); nativeRegisterCustomFunction(mConnectionPtr, function); } |
︙ | ︙ | |||
391 392 393 394 395 396 397 398 399 400 401 402 403 404 | execute(success ? "COMMIT" : "ROLLBACK", null, null); } } catch (RuntimeException ex) { throw new SQLiteException("Failed to change locale for db '" + mConfiguration.label + "' to '" + newLocale + "'.", ex); } } // Called by SQLiteConnectionPool only. void reconfigure(SQLiteDatabaseConfiguration configuration) { mOnlyAllowReadOnlyOperations = false; // Register custom functions. final int functionCount = configuration.customFunctions.size(); | > > > > > > | 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 | execute(success ? "COMMIT" : "ROLLBACK", null, null); } } catch (RuntimeException ex) { throw new SQLiteException("Failed to change locale for db '" + mConfiguration.label + "' to '" + newLocale + "'.", ex); } } public void enableLocalizedCollators(){ if( nativeHasCodec() ){ setLocaleFromConfiguration(); } } // Called by SQLiteConnectionPool only. void reconfigure(SQLiteDatabaseConfiguration configuration) { mOnlyAllowReadOnlyOperations = false; // Register custom functions. final int functionCount = configuration.customFunctions.size(); |
︙ | ︙ | |||
416 417 418 419 420 421 422 | & SQLiteDatabase.ENABLE_WRITE_AHEAD_LOGGING) != 0; boolean localeChanged = !configuration.locale.equals(mConfiguration.locale); // Update configuration parameters. mConfiguration.updateParametersFrom(configuration); // Update prepared statement cache size. | | | 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 | & SQLiteDatabase.ENABLE_WRITE_AHEAD_LOGGING) != 0; boolean localeChanged = !configuration.locale.equals(mConfiguration.locale); // Update configuration parameters. mConfiguration.updateParametersFrom(configuration); // Update prepared statement cache size. /* mPreparedStatementCache.resize(configuration.maxSqlCacheSize); */ // Update foreign key mode. if (foreignKeyModeChanged) { setForeignKeyModeFromConfiguration(); } // Update WAL. |
︙ | ︙ |
Changes to src/org/sqlite/database/sqlite/SQLiteConnectionPool.java.
︙ | ︙ | |||
987 988 989 990 991 992 993 994 995 996 997 998 999 1000 | waiter.mThread = null; waiter.mSql = null; waiter.mAssignedConnection = null; waiter.mException = null; waiter.mNonce += 1; mConnectionWaiterPool = waiter; } /** * Dumps debugging information about this connection pool. * * @param printer The printer to receive the dump, not null. * @param verbose True to dump more verbose information. */ | > > > > > > > > > > > | 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 | waiter.mThread = null; waiter.mSql = null; waiter.mAssignedConnection = null; waiter.mException = null; waiter.mNonce += 1; mConnectionWaiterPool = waiter; } public void enableLocalizedCollators() { synchronized (mLock) { if( !mAcquiredConnections.isEmpty() || mAvailablePrimaryConnection==null ) { throw new IllegalStateException( "Cannot enable localized collators while database is in use" ); } mAvailablePrimaryConnection.enableLocalizedCollators(); } } /** * Dumps debugging information about this connection pool. * * @param printer The printer to receive the dump, not null. * @param verbose True to dump more verbose information. */ |
︙ | ︙ |
Changes to src/org/sqlite/database/sqlite/SQLiteDatabase.java.
︙ | ︙ | |||
2187 2188 2189 2190 2191 2192 2193 2194 | * This can be used to create a function that can be called from * sqlite3 database triggers. * @hide */ public interface CustomFunction { public void callback(String[] args); } } | > > > > > > > > | 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 | * This can be used to create a function that can be called from * sqlite3 database triggers. * @hide */ public interface CustomFunction { public void callback(String[] args); } public static boolean hasCodec() { return SQLiteConnection.hasCodec(); } public void enableLocalizedCollators() { mConnectionPoolLocked.enableLocalizedCollators(); } } |