package org.commcare.android.shadows; import android.content.ContentValues; import android.database.Cursor; import net.sqlcipher.DatabaseErrorHandler; import net.sqlcipher.SQLException; import net.sqlcipher.database.SQLiteDatabase.CursorFactory; import net.sqlcipher.database.SQLiteDatabaseHook; import net.sqlcipher.database.SQLiteException; import net.sqlcipher.database.SQLiteStatement; import org.robolectric.annotation.Implementation; import org.robolectric.annotation.Implements; import java.util.Locale; import java.util.Map; /** * @author ctsims */ @Implements(net.sqlcipher.database.SQLiteDatabase.class) public class SQLiteDatabaseNative { private android.database.sqlite.SQLiteDatabase db; public void __constructor__(String path, char[] password, CursorFactory factory, int flags) { db = android.database.sqlite.SQLiteDatabase.openDatabase(path, null, flags); } public void __constructor__(String path, char[] password, CursorFactory factory, int flags, SQLiteDatabaseHook hook) { db = android.database.sqlite.SQLiteDatabase.openDatabase(path, null, flags); } public void __constructor__(String path, CursorFactory factory, int flags, DatabaseErrorHandler errorHandler) { db = android.database.sqlite.SQLiteDatabase.openDatabase(path, null, flags); } public SQLiteDatabaseNative() { } @Implementation public void beginTransaction() { db.beginTransaction(); } @Implementation public void changePassword(char[] password) throws SQLiteException { } @Implementation public void changePassword(String password) throws SQLiteException { } @Implementation public void close() { db.close(); } @Implementation public SQLiteStatement compileStatement(String sql) throws SQLException { throw new UnsupportedOperationException("Can't use compiled statements on mock db"); } @Implementation public int delete(String arg0, String arg1, String[] arg2) { return db.delete(arg0, arg1, arg2); } @Implementation public void endTransaction() { db.endTransaction(); } @Implementation public void execSQL(String arg0, Object[] arg1) throws SQLException { db.execSQL(arg0, arg1); } @Implementation public void execSQL(String arg0) throws SQLException { db.execSQL(arg0); } @Implementation public synchronized int getMaxSqlCacheSize() { return -1; } @Implementation public long getMaximumSize() { return db.getMaximumSize(); } @Implementation public long getPageSize() { return db.getPageSize(); } @Implementation public Map<String, String> getSyncedTables() { return db.getSyncedTables(); } @Implementation public int getVersion() { return db.getVersion(); } @Implementation public boolean inTransaction() { return db.inTransaction(); } @Implementation public long insert(String arg0, String arg1, ContentValues arg2) { return db.insert(arg0, arg1, arg2); } @Implementation public long insertOrThrow(String table, String nullColumnHack, ContentValues values) throws SQLException { return db.insertOrThrow(table, nullColumnHack, values); } @Implementation public long insertWithOnConflict(String arg0, String arg1, ContentValues arg2, int arg3) { return db.insertWithOnConflict(arg0, arg1, arg2, arg3); } @Implementation public boolean isDbLockedByCurrentThread() { return db.isDbLockedByCurrentThread(); } @Implementation public boolean isDbLockedByOtherThreads() { return db.isDbLockedByOtherThreads(); } @Implementation public boolean isInCompiledSqlCache(String sql) { return false; } @Implementation public boolean isOpen() { return db.isOpen(); } @Implementation public boolean isReadOnly() { return db.isReadOnly(); } @Implementation public void markTableSyncable(String table, String foreignKey, String updateTable) { db.markTableSyncable(table, foreignKey, updateTable); } @Implementation public void markTableSyncable(String table, String deletedTable) { db.markTableSyncable(table, deletedTable); } @Implementation public boolean needUpgrade(int newVersion) { return db.needUpgrade(newVersion); } @Implementation protected void onAllReferencesReleased() { } @Implementation public void purgeFromCompiledSqlCache(String sql) { } @Implementation public Cursor query(boolean distinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit) { return new SQLiteCursorNative((android.database.sqlite.SQLiteCursor)db.query(distinct, table, columns, selection, selectionArgs, groupBy, having, orderBy, limit)); } @Implementation public Cursor query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit) { return new SQLiteCursorNative((android.database.sqlite.SQLiteCursor)db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy, limit)); } @Implementation public Cursor query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy) { return new SQLiteCursorNative((android.database.sqlite.SQLiteCursor)db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy)); } @Implementation public Cursor queryWithFactory(CursorFactory cursorFactory, boolean distinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit) { throw new UnsupportedOperationException("Can't perform queries with a factor in the mock db"); } @Implementation public void rawExecSQL(String arg0) { //Mostly Done for Pragma commands and such, just skip and we'll see if it //goes badly } @Implementation public Cursor rawQuery(String sql, String[] selectionArgs, int initialRead, int maxRead) { throw new UnsupportedOperationException("Mock DB cannot support raw Query with this signature"); } @Implementation public Cursor rawQuery(String sql, String[] selectionArgs) { return new SQLiteCursorNative((android.database.sqlite.SQLiteCursor)db.rawQuery(sql, selectionArgs)); } @Implementation public Cursor rawQueryWithFactory(CursorFactory arg0, String arg1, String[] arg2, String arg3) { throw new UnsupportedOperationException("Can't perform queries with a factor in the mock db"); } @Implementation public long replace(String arg0, String arg1, ContentValues arg2) { return db.replace(arg0, arg1, arg2); } @Implementation public long replaceOrThrow(String table, String nullColumnHack, ContentValues initialValues) throws SQLException { return db.replaceOrThrow(table, nullColumnHack, initialValues); } @Implementation public void resetCompiledSqlCache() { } @Implementation public void setLocale(Locale locale) { db.setLocale(locale); } @Implementation public void setLockingEnabled(boolean lockingEnabled) { db.setLockingEnabled(lockingEnabled); } @Implementation public synchronized void setMaxSqlCacheSize(int cacheSize) { db.setMaxSqlCacheSize(cacheSize); } @Implementation public long setMaximumSize(long arg0) { return db.setMaximumSize(arg0); } @Implementation public void setPageSize(long numBytes) { db.setPageSize(numBytes); } @Implementation public void setTransactionSuccessful() { db.setTransactionSuccessful(); } @Implementation public void setVersion(int version) { db.setVersion(version); } @Implementation public int status(int operation, boolean reset) { throw new UnsupportedOperationException("Mock DB cannot support status operation"); } @Implementation public int update(String table, ContentValues values, String whereClause, String[] whereArgs) { return db.update(table, values, whereClause, whereArgs); } @Implementation public int updateWithOnConflict(String arg0, ContentValues arg1, String arg2, String[] arg3, int arg4) { return db.updateWithOnConflict(arg0, arg1, arg2, arg3, arg4); } @Implementation public boolean yieldIfContended() { return db.yieldIfContended(); } @Implementation public boolean yieldIfContendedSafely() { return db.yieldIfContendedSafely(); } @Implementation public boolean yieldIfContendedSafely(long sleepAfterYieldDelay) { return db.yieldIfContendedSafely(sleepAfterYieldDelay); } }