@@ -444,6 +444,7 @@ protected void onAllReferencesReleased() {
444
444
* @param lockingEnabled set to true to enable locks, false otherwise
445
445
*/
446
446
public void setLockingEnabled (boolean lockingEnabled ) {
447
+ /* XXX TBD check if open? */
447
448
mLockingEnabled = lockingEnabled ;
448
449
}
449
450
@@ -741,6 +742,7 @@ public void setTransactionSuccessful() {
741
742
* return true if there is a transaction pending
742
743
*/
743
744
public boolean inTransaction () {
745
+ /* XXX TBD check if open? */
744
746
return mLock .getHoldCount () > 0 ;
745
747
}
746
748
@@ -750,6 +752,7 @@ public boolean inTransaction() {
750
752
* @return true, if this thread is holding the database lock.
751
753
*/
752
754
public boolean isDbLockedByCurrentThread () {
755
+ /* XXX TBD check if open? */
753
756
return mLock .isHeldByCurrentThread ();
754
757
}
755
758
@@ -948,6 +951,7 @@ public static SQLiteDatabase openDatabase(String path, String password, CursorFa
948
951
return openDatabase (path , password .toCharArray (), factory , flags , null );
949
952
}
950
953
954
+ <<<<<<< HEAD
951
955
/**
952
956
* Open the database according to the flags {@link #OPEN_READWRITE}
953
957
* {@link #OPEN_READONLY} {@link #CREATE_IF_NECESSARY} and/or {@link #NO_LOCALIZED_COLLATORS}.
@@ -991,7 +995,7 @@ public static SQLiteDatabase openDatabase(String path, char[] password, CursorFa
991
995
* @throws IllegalArgumentException if the database path is null
992
996
*/
993
997
public static SQLiteDatabase openDatabase (String path , String password , CursorFactory factory , int flags , SQLiteDatabaseHook hook ) {
994
- return openDatabase (path , password .toCharArray (), factory , flags , hook );
998
+ return openDatabase (path , password .toCharArray (), factory , flags , hook , new DefaultDatabaseErrorHandler () );
995
999
}
996
1000
997
1001
/**
@@ -1015,6 +1019,21 @@ public static SQLiteDatabase openDatabase(String path, String password, CursorFa
1015
1019
* @throws IllegalArgumentException if the database path is null
1016
1020
*/
1017
1021
public static SQLiteDatabase openDatabase (String path , char [] password , CursorFactory factory , int flags , SQLiteDatabaseHook hook ) {
1022
+ return openDatabase (path , password , factory , flags , hook , new DefaultDatabaseErrorHandler ());
1023
+ }
1024
+
1025
+ public static SQLiteDatabase openDatabase (String path , String password , CursorFactory factory , int flags ,
1026
+ SQLiteDatabaseHook databaseHook , DatabaseErrorHandler errorHandler ) {
1027
+ return openDatabase (path , password .toCharArray (), factory , flags , databaseHook , new DefaultDatabaseErrorHandler ());
1028
+ }
1029
+
1030
+ public static SQLiteDatabase openDatabase (String path , String password , CursorFactory factory , int flags ,
1031
+ SQLiteDatabaseHook databaseHook , DatabaseErrorHandler errorHandler ) {
1032
+ return openDatabase (path , password .toCharArray (), factory , flags , databaseHook , errorHandler );
1033
+ }
1034
+
1035
+ public static SQLiteDatabase openDatabase (String path , char [] password , CursorFactory factory , int flags ,
1036
+ SQLiteDatabaseHook databaseHook , DatabaseErrorHandler errorHandler ) {
1018
1037
SQLiteDatabase sqliteDatabase = null ;
1019
1038
1020
1039
try {
@@ -1031,13 +1050,43 @@ public static SQLiteDatabase openDatabase(String path, char[] password, CursorFa
1031
1050
} catch (SQLiteDatabaseCorruptException e ) {
1032
1051
// Try to recover from this, if we can.
1033
1052
// TODO: should we do this for other open failures?
1053
+
1054
+ Log .e (TAG , "Calling error handler for corrupt database " + path , e );
1055
+ // XXX Chris TODO TODO:
1056
+ try {
1057
+ errorHandler .onCorruption (new SQLiteDatabase (path )); // HORRIBLE HACK to support DatabaseErrorHandler API
1058
+ } catch (Exception e2 ) {
1059
+ Log .e (TAG , "error handler failed with exception" , e2 );
1060
+ //throw e;
1061
+
1062
+ synchronized (sActiveDatabases ) {
1063
+ sActiveDatabases .put (sqliteDatabase , null );
1064
+ }
1065
+ sqliteDatabase = openDatabase (path , password , factory , flags , databaseHook , errorHandler );
1066
+ }
1067
+ return sqliteDatabase ;
1068
+ }
1069
+
1070
+ <<<<<<< HEAD
1071
+ // Try to recover from this, if we can.
1072
+ // TODO: should we do this for other open failures?
1034
1073
Log .e (TAG , "Deleting and re-creating corrupt database " + path , e );
1035
1074
// EventLog.writeEvent(EVENT_DB_CORRUPT, path);
1036
1075
1076
+ =======
1077
+ Log .e (TAG , "Calling error handler for corrupt database " + path , e );
1078
+ try {
1079
+ errorHandler .onCorruption (new SQLiteDatabase (path )); // HORRIBLE HACK to support DatabaseErrorHandler API
1080
+ } catch (Exception e2 ) {
1081
+ Log .e (TAG , "error handler failed with exception" , e2 );
1082
+ //throw e;
1083
+ >>>>>>> d3e4c49 ... Updated changes with optional corrupt database handler (ref : sqlcipher /android -database -sqlcipher #169 )
1037
1084
if (!path .equalsIgnoreCase (":memory" )) {
1038
1085
// delete is only for non-memory database files
1086
+ Log .e (TAG , "delete and recreate" , e );
1039
1087
new File (path ).delete ();
1040
1088
}
1089
+ <<<<<<< HEAD
1041
1090
1042
1091
sqliteDatabase = new SQLiteDatabase (path , factory , flags );
1043
1092
@@ -1047,14 +1096,22 @@ public static SQLiteDatabase openDatabase(String path, char[] password, CursorFa
1047
1096
1048
1097
synchronized (sActiveDatabases ) {
1049
1098
sActiveDatabases .put (sqliteDatabase , null );
1099
+ =======
1100
+ }
1101
+ sqliteDatabase = openDatabase (path , password , factory , flags , databaseHook , errorHandler );
1102
+ >>>>>>> d3e4c49 ... Updated changes with optional corrupt database handler (ref : sqlcipher /android -database -sqlcipher #169 )
1050
1103
}
1051
1104
return sqliteDatabase ;
1052
1105
}
1053
1106
1107
+ <<<<<<< HEAD
1054
1108
/**
1055
1109
* Equivalent to openDatabase(file.getPath(), password, factory, CREATE_IF_NECESSARY, databaseHook).
1056
1110
*/
1057
1111
public static SQLiteDatabase openOrCreateDatabase (File file , String password , CursorFactory factory , SQLiteDatabaseHook databaseHook ){
1112
+ =======
1113
+ public static SQLiteDatabase openOrCreateDatabase (File file , String password , CursorFactory factory , SQLiteDatabaseHook databaseHook ) {
1114
+ >>>>>>> d3e4c49 ... Updated changes with optional corrupt database handler (ref : sqlcipher /android -database -sqlcipher #169 )
1058
1115
return openOrCreateDatabase (file .getPath (), password , factory , databaseHook );
1059
1116
}
1060
1117
@@ -1065,13 +1122,31 @@ public static SQLiteDatabase openOrCreateDatabase(String path, String password,
1065
1122
return openDatabase (path , password , factory , CREATE_IF_NECESSARY , databaseHook );
1066
1123
}
1067
1124
1125
+ <<<<<<< HEAD
1068
1126
/**
1069
1127
* Equivalent to openDatabase(path, password, factory, CREATE_IF_NECESSARY, databaseHook).
1070
1128
*/
1129
+ =======
1130
+ public static SQLiteDatabase openOrCreateDatabase (File file , String password , CursorFactory factory , SQLiteDatabaseHook databaseHook ,
1131
+ DatabaseErrorHandler errorHandler ) {
1132
+ return openDatabase (file .getPath (), password .toCharArray (), factory , CREATE_IF_NECESSARY , databaseHook , errorHandler );
1133
+ }
1134
+
1135
+ public static SQLiteDatabase openOrCreateDatabase (String path , String password , CursorFactory factory , SQLiteDatabaseHook databaseHook ,
1136
+ DatabaseErrorHandler errorHandler ) {
1137
+ return openDatabase (path , password .toCharArray (), factory , CREATE_IF_NECESSARY , databaseHook , errorHandler );
1138
+ }
1139
+
1140
+ >>>>>>> d3e4c49 ... Updated changes with optional corrupt database handler (ref : sqlcipher /android -database -sqlcipher #169 )
1071
1141
public static SQLiteDatabase openOrCreateDatabase (String path , char [] password , CursorFactory factory , SQLiteDatabaseHook databaseHook ) {
1072
1142
return openDatabase (path , password , factory , CREATE_IF_NECESSARY , databaseHook );
1073
1143
}
1074
1144
1145
+ public static SQLiteDatabase openOrCreateDatabase (String path , char [] password , CursorFactory factory , SQLiteDatabaseHook databaseHook ,
1146
+ DatabaseErrorHandler errorHandler ) {
1147
+ return openDatabase (path , password , factory , CREATE_IF_NECESSARY , databaseHook , errorHandler );
1148
+ }
1149
+
1075
1150
/**
1076
1151
* Equivalent to openDatabase(file.getPath(), password, factory, CREATE_IF_NECESSARY).
1077
1152
*/
@@ -1305,6 +1380,14 @@ public void setPageSize(long numBytes) {
1305
1380
* syncable table
1306
1381
*/
1307
1382
public void markTableSyncable (String table , String deletedTable ) {
1383
+ // XXX TBD TODO:
1384
+ /* Protect against HORRIBLE HACK to support DatabaseErrorHandler API: */
1385
+ /*
1386
+ if (!isOpen()) {
1387
+ throw new IllegalStateException("database not open");
1388
+ }
1389
+ */
1390
+
1308
1391
markTableSyncable (table , "_id" , table , deletedTable );
1309
1392
}
1310
1393
@@ -1321,6 +1404,14 @@ public void markTableSyncable(String table, String deletedTable) {
1321
1404
*/
1322
1405
public void markTableSyncable (String table , String foreignKey ,
1323
1406
String updateTable ) {
1407
+ // XXX TBD TODO:
1408
+ /* Protect against HORRIBLE HACK to support DatabaseErrorHandler API: */
1409
+ /*
1410
+ if (!isOpen()) {
1411
+ throw new IllegalStateException("database not open");
1412
+ }
1413
+ */
1414
+
1324
1415
markTableSyncable (table , foreignKey , updateTable , null );
1325
1416
}
1326
1417
@@ -1870,7 +1961,7 @@ public long insertWithOnConflict(String table, String nullColumnHack,
1870
1961
}
1871
1962
return insertedRowId ;
1872
1963
} catch (SQLiteDatabaseCorruptException e ) {
1873
- onCorruption ();
1964
+ onCorruptionFromInsert ();
1874
1965
throw e ;
1875
1966
} finally {
1876
1967
if (statement != null ) {
@@ -2237,6 +2328,20 @@ private void openDatabaseInternal(char[] password, SQLiteDatabaseHook databaseHo
2237
2328
}
2238
2329
}
2239
2330
2331
+ /**
2332
+ * Private constructor for HORRIBLE HACK to support DatabaseErrorHandler API
2333
+ * (SQLiteDatabase from this [private] constructor will never connect to a real database)
2334
+ *
2335
+ * @param path The full path to the database (will be available for DatabaseErrorHandler)
2336
+ */
2337
+ private SQLiteDatabase (String path ) {
2338
+ mPath = path ;
2339
+ /* These other members _should_ project certain public functions from this HORRIBLE HACK. */
2340
+ mFlags = OPEN_READONLY ; /* treat corrupt database as "read-only" */
2341
+ mSlowQueryThreshold = -1 ;
2342
+ /* NOTE: mNativeHandle is expected to be and remain 0 to indicate this handle is (never) open. */
2343
+ }
2344
+
2240
2345
private String getTime () {
2241
2346
return new SimpleDateFormat ("yyyy-MM-dd HH:mm:ss.SSS " ).format (System .currentTimeMillis ());
2242
2347
}
@@ -2257,6 +2362,7 @@ public boolean isOpen() {
2257
2362
}
2258
2363
2259
2364
public boolean needUpgrade (int newVersion ) {
2365
+ /* NOTE: getVersion() will throw if database is not open. */
2260
2366
return newVersion > getVersion ();
2261
2367
}
2262
2368
@@ -2350,6 +2456,8 @@ private String getPathForLogs() {
2350
2456
return mPathForLogs ;
2351
2457
}
2352
2458
2459
+ // XXX TODO check HH??
2460
+
2353
2461
/**
2354
2462
* Sets the locale for this database. Does nothing if this database has
2355
2463
* the NO_LOCALIZED_COLLATORS flag set or was opened read only.
0 commit comments