1
0
mirror of https://github.com/moparisthebest/k-9 synced 2024-11-30 05:02:26 -05:00

Quick hack to log all SQL queries

This commit is contained in:
cketti 2013-07-11 04:02:50 +02:00
parent c0479fb59a
commit 6cf8789d04
4 changed files with 204 additions and 79 deletions

View File

@ -32,7 +32,6 @@ import android.content.ContentValues;
import android.content.Context;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.net.Uri;
import android.util.Log;
@ -207,7 +206,7 @@ public class LocalStore extends Store implements Serializable {
}
@Override
public void doDbUpgrade(final SQLiteDatabase db) {
public void doDbUpgrade(final LoggingSQLiteDatabase db) {
try {
upgradeDatabase(db);
} catch (Exception e) {
@ -217,7 +216,7 @@ public class LocalStore extends Store implements Serializable {
}
}
private void upgradeDatabase(final SQLiteDatabase db) {
private void upgradeDatabase(final LoggingSQLiteDatabase db) {
Log.i(K9.LOG_TAG, String.format("Upgrading database from version %d to version %d",
db.getVersion(), DB_VERSION));
@ -703,7 +702,7 @@ public class LocalStore extends Store implements Serializable {
}
}
private void update41Metadata(final SQLiteDatabase db, SharedPreferences prefs, int id, String name) {
private void update41Metadata(final LoggingSQLiteDatabase db, SharedPreferences prefs, int id, String name) {
Folder.FolderClass displayClass = Folder.FolderClass.NO_CLASS;
@ -755,7 +754,7 @@ public class LocalStore extends Store implements Serializable {
return database.execute(false, new DbCallback<Long>() {
@Override
public Long doDbWork(final SQLiteDatabase db) {
public Long doDbWork(final LoggingSQLiteDatabase db) {
final File[] files = attachmentDirectory.listFiles();
long attachmentLength = 0;
for (File file : files) {
@ -776,7 +775,7 @@ public class LocalStore extends Store implements Serializable {
database.execute(false, new DbCallback<Void>() {
@Override
public Void doDbWork(final SQLiteDatabase db) throws WrappedException {
public Void doDbWork(final LoggingSQLiteDatabase db) throws WrappedException {
db.execSQL("VACUUM");
return null;
}
@ -804,7 +803,7 @@ public class LocalStore extends Store implements Serializable {
// been deleted locally. They take up insignificant space
database.execute(false, new DbCallback<Void>() {
@Override
public Void doDbWork(final SQLiteDatabase db) {
public Void doDbWork(final LoggingSQLiteDatabase db) {
// Delete entries from 'threads' table
db.execSQL("DELETE FROM threads WHERE message_id IN " +
"(SELECT id FROM messages WHERE deleted = 0 AND uid NOT LIKE 'Local%')");
@ -833,7 +832,7 @@ public class LocalStore extends Store implements Serializable {
public int getMessageCount() throws MessagingException {
return database.execute(false, new DbCallback<Integer>() {
@Override
public Integer doDbWork(final SQLiteDatabase db) {
public Integer doDbWork(final LoggingSQLiteDatabase db) {
Cursor cursor = null;
try {
cursor = db.rawQuery("SELECT COUNT(*) FROM messages", null);
@ -849,7 +848,7 @@ public class LocalStore extends Store implements Serializable {
public int getFolderCount() throws MessagingException {
return database.execute(false, new DbCallback<Integer>() {
@Override
public Integer doDbWork(final SQLiteDatabase db) {
public Integer doDbWork(final LoggingSQLiteDatabase db) {
Cursor cursor = null;
try {
cursor = db.rawQuery("SELECT COUNT(*) FROM folders", null);
@ -878,7 +877,7 @@ public class LocalStore extends Store implements Serializable {
try {
database.execute(false, new DbCallback < List <? extends Folder >> () {
@Override
public List <? extends Folder > doDbWork(final SQLiteDatabase db) throws WrappedException {
public List <? extends Folder > doDbWork(final LoggingSQLiteDatabase db) throws WrappedException {
Cursor cursor = null;
try {
@ -932,7 +931,7 @@ public class LocalStore extends Store implements Serializable {
private void pruneCachedAttachments(final boolean force) throws MessagingException {
database.execute(false, new DbCallback<Void>() {
@Override
public Void doDbWork(final SQLiteDatabase db) throws WrappedException {
public Void doDbWork(final LoggingSQLiteDatabase db) throws WrappedException {
if (force) {
ContentValues cv = new ContentValues();
cv.putNull("content_uri");
@ -999,7 +998,7 @@ public class LocalStore extends Store implements Serializable {
cv.put("visible_limit", Integer.toString(visibleLimit));
database.execute(false, new DbCallback<Void>() {
@Override
public Void doDbWork(final SQLiteDatabase db) throws WrappedException {
public Void doDbWork(final LoggingSQLiteDatabase db) throws WrappedException {
db.update("folders", cv, null, null);
return null;
}
@ -1009,7 +1008,7 @@ public class LocalStore extends Store implements Serializable {
public ArrayList<PendingCommand> getPendingCommands() throws UnavailableStorageException {
return database.execute(false, new DbCallback<ArrayList<PendingCommand>>() {
@Override
public ArrayList<PendingCommand> doDbWork(final SQLiteDatabase db) throws WrappedException {
public ArrayList<PendingCommand> doDbWork(final LoggingSQLiteDatabase db) throws WrappedException {
Cursor cursor = null;
try {
cursor = db.query("pending_commands",
@ -1049,7 +1048,7 @@ public class LocalStore extends Store implements Serializable {
cv.put("arguments", Utility.combine(command.arguments, ','));
database.execute(false, new DbCallback<Void>() {
@Override
public Void doDbWork(final SQLiteDatabase db) throws WrappedException {
public Void doDbWork(final LoggingSQLiteDatabase db) throws WrappedException {
db.insert("pending_commands", "command", cv);
return null;
}
@ -1062,7 +1061,7 @@ public class LocalStore extends Store implements Serializable {
public void removePendingCommand(final PendingCommand command) throws UnavailableStorageException {
database.execute(false, new DbCallback<Void>() {
@Override
public Void doDbWork(final SQLiteDatabase db) throws WrappedException {
public Void doDbWork(final LoggingSQLiteDatabase db) throws WrappedException {
db.delete("pending_commands", "id = ?", new String[] { Long.toString(command.mId) });
return null;
}
@ -1072,7 +1071,7 @@ public class LocalStore extends Store implements Serializable {
public void removePendingCommands() throws UnavailableStorageException {
database.execute(false, new DbCallback<Void>() {
@Override
public Void doDbWork(final SQLiteDatabase db) throws WrappedException {
public Void doDbWork(final LoggingSQLiteDatabase db) throws WrappedException {
db.delete("pending_commands", null, null);
return null;
}
@ -1147,7 +1146,7 @@ public class LocalStore extends Store implements Serializable {
final ArrayList<LocalMessage> messages = new ArrayList<LocalMessage>();
final int j = database.execute(false, new DbCallback<Integer>() {
@Override
public Integer doDbWork(final SQLiteDatabase db) throws WrappedException {
public Integer doDbWork(final LoggingSQLiteDatabase db) throws WrappedException {
Cursor cursor = null;
int i = 0;
try {
@ -1204,7 +1203,7 @@ public class LocalStore extends Store implements Serializable {
public AttachmentInfo getAttachmentInfo(final String attachmentId) throws UnavailableStorageException {
return database.execute(false, new DbCallback<AttachmentInfo>() {
@Override
public AttachmentInfo doDbWork(final SQLiteDatabase db) throws WrappedException {
public AttachmentInfo doDbWork(final LoggingSQLiteDatabase db) throws WrappedException {
String name;
String type;
int size;
@ -1245,7 +1244,7 @@ public class LocalStore extends Store implements Serializable {
public void createFolders(final List<LocalFolder> foldersToCreate, final int visibleLimit) throws UnavailableStorageException {
database.execute(true, new DbCallback<Void>() {
@Override
public Void doDbWork(final SQLiteDatabase db) throws WrappedException {
public Void doDbWork(final LoggingSQLiteDatabase db) throws WrappedException {
for (LocalFolder folder : foldersToCreate) {
String name = folder.getName();
final LocalFolder.PreferencesHolder prefHolder = folder.new PreferencesHolder();
@ -1366,7 +1365,7 @@ public class LocalStore extends Store implements Serializable {
try {
database.execute(false, new DbCallback<Void>() {
@Override
public Void doDbWork(final SQLiteDatabase db) throws WrappedException {
public Void doDbWork(final LoggingSQLiteDatabase db) throws WrappedException {
Cursor cursor = null;
try {
String baseQuery = "SELECT " + GET_FOLDER_COLS + " FROM folders ";
@ -1440,7 +1439,7 @@ public class LocalStore extends Store implements Serializable {
public boolean exists() throws MessagingException {
return database.execute(false, new DbCallback<Boolean>() {
@Override
public Boolean doDbWork(final SQLiteDatabase db) throws WrappedException {
public Boolean doDbWork(final LoggingSQLiteDatabase db) throws WrappedException {
Cursor cursor = null;
try {
cursor = db.rawQuery("SELECT id FROM folders "
@ -1495,7 +1494,7 @@ public class LocalStore extends Store implements Serializable {
try {
return database.execute(false, new DbCallback<Integer>() {
@Override
public Integer doDbWork(final SQLiteDatabase db) throws WrappedException {
public Integer doDbWork(final LoggingSQLiteDatabase db) throws WrappedException {
try {
open(OpenMode.READ_WRITE);
} catch (MessagingException e) {
@ -1528,7 +1527,7 @@ public class LocalStore extends Store implements Serializable {
try {
return database.execute(false, new DbCallback<Integer>() {
@Override
public Integer doDbWork(final SQLiteDatabase db) throws WrappedException {
public Integer doDbWork(final LoggingSQLiteDatabase db) throws WrappedException {
int unreadMessageCount = 0;
Cursor cursor = db.query("messages", new String[] { "SUM(read=0)" },
"folder_id = ? AND (empty IS NULL OR empty != 1) AND deleted = 0",
@ -1559,7 +1558,7 @@ public class LocalStore extends Store implements Serializable {
try {
return database.execute(false, new DbCallback<Integer>() {
@Override
public Integer doDbWork(final SQLiteDatabase db) throws WrappedException {
public Integer doDbWork(final LoggingSQLiteDatabase db) throws WrappedException {
int flaggedMessageCount = 0;
Cursor cursor = db.query("messages", new String[] { "SUM(flagged)" },
"folder_id = ? AND (empty IS NULL OR empty != 1) AND deleted = 0",
@ -1644,7 +1643,7 @@ public class LocalStore extends Store implements Serializable {
try {
database.execute(false, new DbCallback<Void>() {
@Override
public Void doDbWork(final SQLiteDatabase db) throws WrappedException {
public Void doDbWork(final LoggingSQLiteDatabase db) throws WrappedException {
try {
open(OpenMode.READ_WRITE);
} catch (MessagingException e) {
@ -1815,7 +1814,7 @@ public class LocalStore extends Store implements Serializable {
try {
database.execute(false, new DbCallback<Void>() {
@Override
public Void doDbWork(final SQLiteDatabase db) throws WrappedException {
public Void doDbWork(final LoggingSQLiteDatabase db) throws WrappedException {
try {
open(OpenMode.READ_WRITE);
if (fp.contains(FetchProfile.Item.BODY)) {
@ -2020,7 +2019,7 @@ public class LocalStore extends Store implements Serializable {
private void populateHeaders(final List<LocalMessage> messages) throws UnavailableStorageException {
database.execute(false, new DbCallback<Void>() {
@Override
public Void doDbWork(final SQLiteDatabase db) throws WrappedException, UnavailableStorageException {
public Void doDbWork(final LoggingSQLiteDatabase db) throws WrappedException, UnavailableStorageException {
Cursor cursor = null;
if (messages.isEmpty()) {
return null;
@ -2066,7 +2065,7 @@ public class LocalStore extends Store implements Serializable {
try {
return database.execute(false, new DbCallback<String>() {
@Override
public String doDbWork(final SQLiteDatabase db) throws WrappedException, UnavailableStorageException {
public String doDbWork(final LoggingSQLiteDatabase db) throws WrappedException, UnavailableStorageException {
try {
open(OpenMode.READ_WRITE);
Cursor cursor = null;
@ -2100,7 +2099,7 @@ public class LocalStore extends Store implements Serializable {
try {
return database.execute(false, new DbCallback<LocalMessage>() {
@Override
public LocalMessage doDbWork(final SQLiteDatabase db) throws WrappedException, UnavailableStorageException {
public LocalMessage doDbWork(final LoggingSQLiteDatabase db) throws WrappedException, UnavailableStorageException {
try {
open(OpenMode.READ_WRITE);
LocalMessage message = new LocalMessage(uid, LocalFolder.this);
@ -2144,7 +2143,7 @@ public class LocalStore extends Store implements Serializable {
try {
return database.execute(false, new DbCallback<Message[]>() {
@Override
public Message[] doDbWork(final SQLiteDatabase db) throws WrappedException, UnavailableStorageException {
public Message[] doDbWork(final LoggingSQLiteDatabase db) throws WrappedException, UnavailableStorageException {
try {
open(OpenMode.READ_WRITE);
return LocalStore.this.getMessages(
@ -2206,7 +2205,7 @@ public class LocalStore extends Store implements Serializable {
try {
database.execute(false, new DbCallback<Void>() {
@Override
public Void doDbWork(final SQLiteDatabase db) throws WrappedException, UnavailableStorageException {
public Void doDbWork(final LoggingSQLiteDatabase db) throws WrappedException, UnavailableStorageException {
try {
lDestFolder.open(OpenMode.READ_WRITE);
for (Message message : msgs) {
@ -2330,7 +2329,7 @@ public class LocalStore extends Store implements Serializable {
public Message storeSmallMessage(final Message message, final Runnable runnable) throws MessagingException {
return database.execute(true, new DbCallback<Message>() {
@Override
public Message doDbWork(final SQLiteDatabase db) throws WrappedException, UnavailableStorageException {
public Message doDbWork(final LoggingSQLiteDatabase db) throws WrappedException, UnavailableStorageException {
try {
appendMessages(new Message[] { message });
final String uid = message.getUid();
@ -2366,7 +2365,7 @@ public class LocalStore extends Store implements Serializable {
try {
database.execute(true, new DbCallback<Void>() {
@Override
public Void doDbWork(final SQLiteDatabase db) throws WrappedException, UnavailableStorageException {
public Void doDbWork(final LoggingSQLiteDatabase db) throws WrappedException, UnavailableStorageException {
for (Message message : messages) {
try {
message.destroy();
@ -2382,7 +2381,7 @@ public class LocalStore extends Store implements Serializable {
}
}
private ThreadInfo getThreadInfo(SQLiteDatabase db, String messageId, boolean onlyEmpty) {
private ThreadInfo getThreadInfo(LoggingSQLiteDatabase db, String messageId, boolean onlyEmpty) {
String sql = "SELECT t.id, t.message_id, t.root, t.parent " +
"FROM messages m " +
"LEFT JOIN threads t ON (t.message_id = m.id) " +
@ -2431,7 +2430,7 @@ public class LocalStore extends Store implements Serializable {
final Map<String, String> uidMap = new HashMap<String, String>();
database.execute(true, new DbCallback<Void>() {
@Override
public Void doDbWork(final SQLiteDatabase db) throws WrappedException, UnavailableStorageException {
public Void doDbWork(final LoggingSQLiteDatabase db) throws WrappedException, UnavailableStorageException {
try {
for (Message message : messages) {
if (!(message instanceof MimeMessage)) {
@ -2599,7 +2598,7 @@ public class LocalStore extends Store implements Serializable {
try {
database.execute(false, new DbCallback<Void>() {
@Override
public Void doDbWork(final SQLiteDatabase db) throws WrappedException, UnavailableStorageException {
public Void doDbWork(final LoggingSQLiteDatabase db) throws WrappedException, UnavailableStorageException {
try {
message.buildMimeRepresentation();
@ -2677,7 +2676,7 @@ public class LocalStore extends Store implements Serializable {
private void saveHeaders(final long id, final MimeMessage message) throws MessagingException {
database.execute(true, new DbCallback<Void>() {
@Override
public Void doDbWork(final SQLiteDatabase db) throws WrappedException, UnavailableStorageException {
public Void doDbWork(final LoggingSQLiteDatabase db) throws WrappedException, UnavailableStorageException {
deleteHeaders(id);
for (String name : message.getHeaderNames()) {
@ -2709,7 +2708,7 @@ public class LocalStore extends Store implements Serializable {
private void deleteHeaders(final long id) throws UnavailableStorageException {
database.execute(false, new DbCallback<Void>() {
@Override
public Void doDbWork(final SQLiteDatabase db) throws WrappedException, UnavailableStorageException {
public Void doDbWork(final LoggingSQLiteDatabase db) throws WrappedException, UnavailableStorageException {
db.execSQL("DELETE FROM headers WHERE message_id = ?", new Object[]
{ id });
return null;
@ -2729,7 +2728,7 @@ public class LocalStore extends Store implements Serializable {
try {
database.execute(true, new DbCallback<Void>() {
@Override
public Void doDbWork(final SQLiteDatabase db) throws WrappedException, UnavailableStorageException {
public Void doDbWork(final LoggingSQLiteDatabase db) throws WrappedException, UnavailableStorageException {
try {
long attachmentId = -1;
Uri contentUri = null;
@ -2908,7 +2907,7 @@ public class LocalStore extends Store implements Serializable {
cv.put("uid", message.getUid());
database.execute(false, new DbCallback<Void>() {
@Override
public Void doDbWork(final SQLiteDatabase db) throws WrappedException, UnavailableStorageException {
public Void doDbWork(final LoggingSQLiteDatabase db) throws WrappedException, UnavailableStorageException {
db.update("messages", cv, "id = ?", new String[]
{ Long.toString(message.mId) });
return null;
@ -2928,7 +2927,7 @@ public class LocalStore extends Store implements Serializable {
try {
database.execute(true, new DbCallback<Void>() {
@Override
public Void doDbWork(final SQLiteDatabase db) throws WrappedException,
public Void doDbWork(final LoggingSQLiteDatabase db) throws WrappedException,
UnavailableStorageException {
for (Message message : messages) {
@ -2991,7 +2990,7 @@ public class LocalStore extends Store implements Serializable {
try {
database.execute(false, new DbCallback<Void>() {
@Override
public Void doDbWork(final SQLiteDatabase db) throws WrappedException {
public Void doDbWork(final LoggingSQLiteDatabase db) throws WrappedException {
try {
// Get UIDs for all messages to delete
Cursor cursor = db.query("messages", new String[] { "uid" },
@ -3035,7 +3034,7 @@ public class LocalStore extends Store implements Serializable {
try {
database.execute(false, new DbCallback<Void>() {
@Override
public Void doDbWork(final SQLiteDatabase db) throws WrappedException, UnavailableStorageException {
public Void doDbWork(final LoggingSQLiteDatabase db) throws WrappedException, UnavailableStorageException {
try {
// We need to open the folder first to make sure we've got it's id
open(OpenMode.READ_ONLY);
@ -3073,7 +3072,7 @@ public class LocalStore extends Store implements Serializable {
open(OpenMode.READ_WRITE);
database.execute(false, new DbCallback<Void>() {
@Override
public Void doDbWork(final SQLiteDatabase db) throws WrappedException, UnavailableStorageException {
public Void doDbWork(final LoggingSQLiteDatabase db) throws WrappedException, UnavailableStorageException {
Cursor attachmentsCursor = null;
try {
String accountUuid = mAccount.getUuid();
@ -3117,7 +3116,7 @@ public class LocalStore extends Store implements Serializable {
try {
database.execute(false, new DbCallback<Void>() {
@Override
public Void doDbWork(final SQLiteDatabase db) throws WrappedException, UnavailableStorageException {
public Void doDbWork(final LoggingSQLiteDatabase db) throws WrappedException, UnavailableStorageException {
Cursor messagesCursor = null;
try {
messagesCursor = db.query("messages", new String[]
@ -3174,7 +3173,7 @@ public class LocalStore extends Store implements Serializable {
public void updateLastUid() throws MessagingException {
Integer lastUid = database.execute(false, new DbCallback<Integer>() {
@Override
public Integer doDbWork(final SQLiteDatabase db) {
public Integer doDbWork(final LoggingSQLiteDatabase db) {
Cursor cursor = null;
try {
open(OpenMode.READ_ONLY);
@ -3199,7 +3198,7 @@ public class LocalStore extends Store implements Serializable {
public Long getOldestMessageDate() throws MessagingException {
return database.execute(false, new DbCallback<Long>() {
@Override
public Long doDbWork(final SQLiteDatabase db) {
public Long doDbWork(final LoggingSQLiteDatabase db) {
Cursor cursor = null;
try {
open(OpenMode.READ_ONLY);
@ -3218,7 +3217,7 @@ public class LocalStore extends Store implements Serializable {
});
}
private ThreadInfo doMessageThreading(SQLiteDatabase db, Message message)
private ThreadInfo doMessageThreading(LoggingSQLiteDatabase db, Message message)
throws MessagingException {
long rootId = -1;
long parentId = -1;
@ -3327,7 +3326,7 @@ public class LocalStore extends Store implements Serializable {
try {
return database.execute(false, new DbCallback<List<Message>>() {
@Override
public List<Message> doDbWork(final SQLiteDatabase db) throws WrappedException {
public List<Message> doDbWork(final LoggingSQLiteDatabase db) throws WrappedException {
try {
open(OpenMode.READ_WRITE);
} catch (MessagingException e) {
@ -3651,7 +3650,7 @@ public class LocalStore extends Store implements Serializable {
try {
database.execute(true, new DbCallback<Void>() {
@Override
public Void doDbWork(final SQLiteDatabase db) throws WrappedException, UnavailableStorageException {
public Void doDbWork(final LoggingSQLiteDatabase db) throws WrappedException, UnavailableStorageException {
try {
if (flag == Flag.DELETED && set) {
delete();
@ -3697,7 +3696,7 @@ public class LocalStore extends Store implements Serializable {
try {
database.execute(true, new DbCallback<Void>() {
@Override
public Void doDbWork(final SQLiteDatabase db) throws WrappedException,
public Void doDbWork(final LoggingSQLiteDatabase db) throws WrappedException,
UnavailableStorageException {
String[] idArg = new String[] { Long.toString(mId) };
@ -3750,7 +3749,7 @@ public class LocalStore extends Store implements Serializable {
try {
database.execute(true, new DbCallback<Void>() {
@Override
public Void doDbWork(final SQLiteDatabase db) throws WrappedException,
public Void doDbWork(final LoggingSQLiteDatabase db) throws WrappedException,
UnavailableStorageException {
try {
LocalFolder localFolder = (LocalFolder) mFolder;
@ -3815,14 +3814,14 @@ public class LocalStore extends Store implements Serializable {
* Get ID of the the given message's parent if the parent is an empty message.
*
* @param db
* {@link SQLiteDatabase} instance to access the database.
* {@link LoggingSQLiteDatabase} instance to access the database.
* @param messageId
* The database ID of the message to get the parent for.
*
* @return Message ID of the parent message if there exists a parent and it is empty.
* Otherwise {@code -1}.
*/
private long getEmptyThreadParent(SQLiteDatabase db, long messageId) {
private long getEmptyThreadParent(LoggingSQLiteDatabase db, long messageId) {
Cursor cursor = db.rawQuery(
"SELECT m.id " +
"FROM threads t1 " +
@ -3842,13 +3841,13 @@ public class LocalStore extends Store implements Serializable {
* Check whether or not a message has child messages in the thread structure.
*
* @param db
* {@link SQLiteDatabase} instance to access the database.
* {@link LoggingSQLiteDatabase} instance to access the database.
* @param messageId
* The database ID of the message to get the children for.
*
* @return {@code true} if the message has children. {@code false} otherwise.
*/
private boolean hasThreadChildren(SQLiteDatabase db, long messageId) {
private boolean hasThreadChildren(LoggingSQLiteDatabase db, long messageId) {
Cursor cursor = db.rawQuery(
"SELECT COUNT(t2.id) " +
"FROM threads t1 " +
@ -3867,11 +3866,11 @@ public class LocalStore extends Store implements Serializable {
* Delete a message from the 'messages' and 'threads' tables.
*
* @param db
* {@link SQLiteDatabase} instance to access the database.
* {@link LoggingSQLiteDatabase} instance to access the database.
* @param messageId
* The database ID of the message to delete.
*/
private void deleteMessageRow(SQLiteDatabase db, long messageId) {
private void deleteMessageRow(LoggingSQLiteDatabase db, long messageId) {
String[] idArg = { Long.toString(messageId) };
// Delete the message
@ -4083,7 +4082,7 @@ public class LocalStore extends Store implements Serializable {
try {
database.execute(true, new DbCallback<Void>() {
@Override
public Void doDbWork(final SQLiteDatabase db) throws WrappedException,
public Void doDbWork(final LoggingSQLiteDatabase db) throws WrappedException,
UnavailableStorageException {
selectionCallback.doDbWork(db, selection.toString(),
@ -4127,7 +4126,7 @@ public class LocalStore extends Store implements Serializable {
* Execute the SQL statement.
*
* @param db
* Use this {@link SQLiteDatabase} instance for your SQL statement.
* Use this {@link LoggingSQLiteDatabase} instance for your SQL statement.
* @param selectionSet
* A partial selection string containing place holders for the argument list, e.g.
* {@code " IN (?,?,?)"} (starts with a space).
@ -4135,12 +4134,12 @@ public class LocalStore extends Store implements Serializable {
* The current subset of the argument list.
* @throws UnavailableStorageException
*/
void doDbWork(SQLiteDatabase db, String selectionSet, String[] selectionArgs)
void doDbWork(LoggingSQLiteDatabase db, String selectionSet, String[] selectionArgs)
throws UnavailableStorageException;
/**
* This will be executed after each invocation of
* {@link #doDbWork(SQLiteDatabase, String, String[])} (after the transaction has been
* {@link #doDbWork(LoggingSQLiteDatabase, String, String[])} (after the transaction has been
* committed).
*/
void postDbWork();
@ -4181,7 +4180,7 @@ public class LocalStore extends Store implements Serializable {
}
@Override
public void doDbWork(SQLiteDatabase db, String selectionSet, String[] selectionArgs)
public void doDbWork(LoggingSQLiteDatabase db, String selectionSet, String[] selectionArgs)
throws UnavailableStorageException {
db.update("messages", cv, "(empty IS NULL OR empty != 1) AND id" + selectionSet,
@ -4229,7 +4228,7 @@ public class LocalStore extends Store implements Serializable {
}
@Override
public void doDbWork(SQLiteDatabase db, String selectionSet, String[] selectionArgs)
public void doDbWork(LoggingSQLiteDatabase db, String selectionSet, String[] selectionArgs)
throws UnavailableStorageException {
db.execSQL("UPDATE messages SET " + flagColumn + " = " + ((newState) ? "1" : "0") +
@ -4281,7 +4280,7 @@ public class LocalStore extends Store implements Serializable {
}
@Override
public void doDbWork(SQLiteDatabase db, String selectionSet, String[] selectionArgs)
public void doDbWork(LoggingSQLiteDatabase db, String selectionSet, String[] selectionArgs)
throws UnavailableStorageException {
if (threadedList) {

View File

@ -22,7 +22,7 @@ public class LockableDatabase {
* HibernateCallback.
*
* @param <T>
* Return value type for {@link #doDbWork(SQLiteDatabase)}
* Return value type for {@link #doDbWork(LoggingSQLiteDatabase)}
*/
public static interface DbCallback<T> {
/**
@ -33,7 +33,7 @@ public class LockableDatabase {
* @throws WrappedException
* @throws UnavailableStorageException
*/
T doDbWork(SQLiteDatabase db) throws WrappedException, UnavailableStorageException;
T doDbWork(LoggingSQLiteDatabase db) throws WrappedException, UnavailableStorageException;
}
public static interface SchemaDefinition {
@ -42,7 +42,7 @@ public class LockableDatabase {
/**
* @param db Never <code>null</code>.
*/
void doDbUpgrade(SQLiteDatabase db);
void doDbUpgrade(LoggingSQLiteDatabase db);
}
/**
@ -106,7 +106,7 @@ public class LockableDatabase {
private String mStorageProviderId;
private SQLiteDatabase mDb;
private LoggingSQLiteDatabase mDb;
/**
* Reentrant read lock
*/
@ -265,7 +265,7 @@ public class LockableDatabase {
* Never <code>null</code>.
*
* @param <T>
* @return Whatever {@link DbCallback#doDbWork(SQLiteDatabase)} returns.
* @return Whatever {@link DbCallback#doDbWork(LoggingSQLiteDatabase)} returns.
* @throws UnavailableStorageException
*/
public <T> T execute(final boolean transactional, final DbCallback<T> callback) throws UnavailableStorageException {
@ -370,13 +370,14 @@ public class LockableDatabase {
lockWrite();
try {
final File databaseFile = prepareStorage(mStorageProviderId);
SQLiteDatabase db;
try {
if (StorageManager.InternalStorageProvider.ID.equals(mStorageProviderId)) {
// internal storage
mDb = application.openOrCreateDatabase(databaseFile.getName(), Context.MODE_PRIVATE, null);
db = application.openOrCreateDatabase(databaseFile.getName(), Context.MODE_PRIVATE, null);
} else {
// external storage
mDb = SQLiteDatabase.openOrCreateDatabase(databaseFile, null);
db = SQLiteDatabase.openOrCreateDatabase(databaseFile, null);
}
} catch (SQLiteException e) {
// try to gracefully handle DB corruption - see issue 2537
@ -384,12 +385,14 @@ public class LockableDatabase {
databaseFile.delete();
if (StorageManager.InternalStorageProvider.ID.equals(mStorageProviderId)) {
// internal storage
mDb = application.openOrCreateDatabase(databaseFile.getName(), Context.MODE_PRIVATE, null);
db = application.openOrCreateDatabase(databaseFile.getName(), Context.MODE_PRIVATE, null);
} else {
// external storage
mDb = SQLiteDatabase.openOrCreateDatabase(databaseFile, null);
db = SQLiteDatabase.openOrCreateDatabase(databaseFile, null);
}
}
mDb = new LoggingSQLiteDatabase(db);
if (mDb.getVersion() != mSchemaDefinition.getVersion()) {
mSchemaDefinition.doDbUpgrade(mDb);
}

View File

@ -0,0 +1,123 @@
package com.fsck.k9.mail.store;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.SystemClock;
import android.util.Log;
public class LoggingSQLiteDatabase {
private static final String LOG_TAG = "k9-sql";
private SQLiteDatabase mDatabase;
public LoggingSQLiteDatabase(SQLiteDatabase database) {
mDatabase = database;
}
public int getVersion() {
return mDatabase.getVersion();
}
public void close() {
mDatabase.close();
}
public void beginTransaction() {
mDatabase.beginTransaction();
}
public void setTransactionSuccessful() {
mDatabase.setTransactionSuccessful();
}
public void endTransaction() {
mDatabase.endTransaction();
}
public void setVersion(int version) {
mDatabase.setVersion(version);
}
public void execSQL(String sql) {
long start = SystemClock.elapsedRealtime();
mDatabase.execSQL(sql);
long end = SystemClock.elapsedRealtime();
Log.d(LOG_TAG, "execSQL [" + (end - start) + "ms]: " + sql);
}
public void execSQL(String sql, Object[] args) {
long start = SystemClock.elapsedRealtime();
mDatabase.execSQL(sql, args);
long end = SystemClock.elapsedRealtime();
Log.d(LOG_TAG, "execSQL [" + (end - start) + "ms]: " + sql);
}
public Cursor rawQuery(String sql, String[] selectionArgs) {
long start = SystemClock.elapsedRealtime();
Cursor cursor = mDatabase.rawQuery(sql, selectionArgs);
long end = SystemClock.elapsedRealtime();
// DB might be queried lazily; make sure query is performed now
cursor.getCount();
long end2 = SystemClock.elapsedRealtime();
Log.d(LOG_TAG, "rawQuery [" + (end - start) + "ms + " + (end2 - end) + "ms]: " + sql);
return cursor;
}
public int update(String table, ContentValues values, String whereClause, String[] whereArgs) {
long start = SystemClock.elapsedRealtime();
int rows = mDatabase.update(table, values, whereClause, whereArgs);
long end = SystemClock.elapsedRealtime();
Log.d(LOG_TAG, "update [" + (end - start) + "ms]: " + table);
return rows;
}
public Cursor query(String table, String[] columns, String selection, String[] selectionArgs,
String groupBy, String having, String orderBy) {
long start = SystemClock.elapsedRealtime();
Cursor cursor = mDatabase.query(table, columns, selection, selectionArgs, groupBy, having,
orderBy);
long end = SystemClock.elapsedRealtime();
// DB might be queried lazily; make sure query is performed now
cursor.getCount();
long end2 = SystemClock.elapsedRealtime();
Log.d(LOG_TAG, "query [" + (end - start) + "ms + " + (end2 - end) + "ms]: " + table + "; where= " + selection);
return cursor;
}
public long insert(String table, String nullColumnHack, ContentValues values) {
long start = SystemClock.elapsedRealtime();
long id = mDatabase.insert(table, nullColumnHack, values);
long end = SystemClock.elapsedRealtime();
Log.d(LOG_TAG, "insert [" + (end - start) + "ms]: " + table);
return id;
}
public int delete(String table, String whereClause, String[] whereArgs) {
long start = SystemClock.elapsedRealtime();
int rows = mDatabase.delete(table, whereClause, whereArgs);
long end = SystemClock.elapsedRealtime();
Log.d(LOG_TAG, "delete [" + (end - start) + "ms]: " + table);
return rows;
}
public long replace(String table, String nullColumnHack, ContentValues initialValues) {
long start = SystemClock.elapsedRealtime();
long id = mDatabase.replace(table, nullColumnHack, initialValues);
long end = SystemClock.elapsedRealtime();
Log.d(LOG_TAG, "replace [" + (end - start) + "ms]: " + table);
return id;
}
}

View File

@ -15,6 +15,7 @@ import com.fsck.k9.mail.store.LocalStore;
import com.fsck.k9.mail.store.LockableDatabase;
import com.fsck.k9.mail.store.LockableDatabase.DbCallback;
import com.fsck.k9.mail.store.LockableDatabase.WrappedException;
import com.fsck.k9.mail.store.LoggingSQLiteDatabase;
import com.fsck.k9.mail.store.UnavailableStorageException;
import com.fsck.k9.search.SqlQueryBuilder;
@ -26,7 +27,6 @@ import android.content.Context;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.CursorWrapper;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
/**
@ -300,7 +300,7 @@ public class EmailProvider extends ContentProvider {
try {
return database.execute(false, new DbCallback<Cursor>() {
@Override
public Cursor doDbWork(SQLiteDatabase db) throws WrappedException,
public Cursor doDbWork(LoggingSQLiteDatabase db) throws WrappedException,
UnavailableStorageException {
String where;
@ -370,7 +370,7 @@ public class EmailProvider extends ContentProvider {
try {
return database.execute(false, new DbCallback<Cursor>() {
@Override
public Cursor doDbWork(SQLiteDatabase db) throws WrappedException,
public Cursor doDbWork(LoggingSQLiteDatabase db) throws WrappedException,
UnavailableStorageException {
StringBuilder query = new StringBuilder();
@ -488,7 +488,7 @@ public class EmailProvider extends ContentProvider {
try {
return database.execute(false, new DbCallback<Cursor>() {
@Override
public Cursor doDbWork(SQLiteDatabase db) throws WrappedException,
public Cursor doDbWork(LoggingSQLiteDatabase db) throws WrappedException,
UnavailableStorageException {
StringBuilder query = new StringBuilder();
@ -587,7 +587,7 @@ public class EmailProvider extends ContentProvider {
try {
return database.execute(false, new DbCallback<Cursor>() {
@Override
public Cursor doDbWork(SQLiteDatabase db) throws WrappedException,
public Cursor doDbWork(LoggingSQLiteDatabase db) throws WrappedException,
UnavailableStorageException {
return db.rawQuery(sql.toString(), selectionArgs);