1c5afb16430a145f20d7c887e45f47b38687054daMarc Blank/* 2c5afb16430a145f20d7c887e45f47b38687054daMarc Blank * Copyright (C) 2012 The Android Open Source Project 3c5afb16430a145f20d7c887e45f47b38687054daMarc Blank * 4c5afb16430a145f20d7c887e45f47b38687054daMarc Blank * Licensed under the Apache License, Version 2.0 (the "License"); 5c5afb16430a145f20d7c887e45f47b38687054daMarc Blank * you may not use this file except in compliance with the License. 6c5afb16430a145f20d7c887e45f47b38687054daMarc Blank * You may obtain a copy of the License at 7c5afb16430a145f20d7c887e45f47b38687054daMarc Blank * 8c5afb16430a145f20d7c887e45f47b38687054daMarc Blank * http://www.apache.org/licenses/LICENSE-2.0 9c5afb16430a145f20d7c887e45f47b38687054daMarc Blank * 10c5afb16430a145f20d7c887e45f47b38687054daMarc Blank * Unless required by applicable law or agreed to in writing, software 11c5afb16430a145f20d7c887e45f47b38687054daMarc Blank * distributed under the License is distributed on an "AS IS" BASIS, 12c5afb16430a145f20d7c887e45f47b38687054daMarc Blank * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c5afb16430a145f20d7c887e45f47b38687054daMarc Blank * See the License for the specific language governing permissions and 14c5afb16430a145f20d7c887e45f47b38687054daMarc Blank * limitations under the License. 15c5afb16430a145f20d7c887e45f47b38687054daMarc Blank */ 16c5afb16430a145f20d7c887e45f47b38687054daMarc Blank 17c5afb16430a145f20d7c887e45f47b38687054daMarc Blankpackage com.android.email.provider; 18c5afb16430a145f20d7c887e45f47b38687054daMarc Blank 19c5afb16430a145f20d7c887e45f47b38687054daMarc Blankimport android.accounts.AccountManager; 20c5afb16430a145f20d7c887e45f47b38687054daMarc Blankimport android.content.ContentResolver; 21c5afb16430a145f20d7c887e45f47b38687054daMarc Blankimport android.content.ContentValues; 22c5afb16430a145f20d7c887e45f47b38687054daMarc Blankimport android.content.Context; 23c5afb16430a145f20d7c887e45f47b38687054daMarc Blankimport android.database.Cursor; 24c5afb16430a145f20d7c887e45f47b38687054daMarc Blankimport android.database.SQLException; 25c5afb16430a145f20d7c887e45f47b38687054daMarc Blankimport android.database.sqlite.SQLiteDatabase; 26c5afb16430a145f20d7c887e45f47b38687054daMarc Blankimport android.database.sqlite.SQLiteOpenHelper; 27c5afb16430a145f20d7c887e45f47b38687054daMarc Blankimport android.provider.CalendarContract; 28c5afb16430a145f20d7c887e45f47b38687054daMarc Blankimport android.provider.ContactsContract; 2932881e8dd375f16e6059452166503f7136f14ae5Paul Westbrookimport android.text.TextUtils; 30c5afb16430a145f20d7c887e45f47b38687054daMarc Blank 3132881e8dd375f16e6059452166503f7136f14ae5Paul Westbrookimport com.android.email.R; 32c5afb16430a145f20d7c887e45f47b38687054daMarc Blankimport com.android.email2.ui.MailActivityEmail; 33c5afb16430a145f20d7c887e45f47b38687054daMarc Blankimport com.android.emailcommon.mail.Address; 34c5afb16430a145f20d7c887e45f47b38687054daMarc Blankimport com.android.emailcommon.provider.Account; 35c5afb16430a145f20d7c887e45f47b38687054daMarc Blankimport com.android.emailcommon.provider.EmailContent; 36c5afb16430a145f20d7c887e45f47b38687054daMarc Blankimport com.android.emailcommon.provider.EmailContent.AccountColumns; 37c5afb16430a145f20d7c887e45f47b38687054daMarc Blankimport com.android.emailcommon.provider.EmailContent.Attachment; 38c5afb16430a145f20d7c887e45f47b38687054daMarc Blankimport com.android.emailcommon.provider.EmailContent.AttachmentColumns; 39c5afb16430a145f20d7c887e45f47b38687054daMarc Blankimport com.android.emailcommon.provider.EmailContent.Body; 40c5afb16430a145f20d7c887e45f47b38687054daMarc Blankimport com.android.emailcommon.provider.EmailContent.BodyColumns; 41c5afb16430a145f20d7c887e45f47b38687054daMarc Blankimport com.android.emailcommon.provider.EmailContent.HostAuthColumns; 42c5afb16430a145f20d7c887e45f47b38687054daMarc Blankimport com.android.emailcommon.provider.EmailContent.MailboxColumns; 43c5afb16430a145f20d7c887e45f47b38687054daMarc Blankimport com.android.emailcommon.provider.EmailContent.Message; 44c5afb16430a145f20d7c887e45f47b38687054daMarc Blankimport com.android.emailcommon.provider.EmailContent.MessageColumns; 45c5afb16430a145f20d7c887e45f47b38687054daMarc Blankimport com.android.emailcommon.provider.EmailContent.PolicyColumns; 46c5afb16430a145f20d7c887e45f47b38687054daMarc Blankimport com.android.emailcommon.provider.EmailContent.QuickResponseColumns; 47c5afb16430a145f20d7c887e45f47b38687054daMarc Blankimport com.android.emailcommon.provider.EmailContent.SyncColumns; 48c5afb16430a145f20d7c887e45f47b38687054daMarc Blankimport com.android.emailcommon.provider.HostAuth; 49c5afb16430a145f20d7c887e45f47b38687054daMarc Blankimport com.android.emailcommon.provider.Mailbox; 50ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Huimport com.android.emailcommon.provider.MessageChangeLogTable; 51ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Huimport com.android.emailcommon.provider.MessageMove; 52ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Huimport com.android.emailcommon.provider.MessageStateChange; 53c5afb16430a145f20d7c887e45f47b38687054daMarc Blankimport com.android.emailcommon.provider.Policy; 54c5afb16430a145f20d7c887e45f47b38687054daMarc Blankimport com.android.emailcommon.provider.QuickResponse; 55c5afb16430a145f20d7c887e45f47b38687054daMarc Blankimport com.android.emailcommon.service.LegacyPolicySet; 5621b2522d7f6b2bce8fc3382e6e532d4b4df1b140Yu Ping Huimport com.android.emailcommon.service.SyncWindow; 57c5afb16430a145f20d7c887e45f47b38687054daMarc Blankimport com.android.mail.providers.UIProvider; 5832881e8dd375f16e6059452166503f7136f14ae5Paul Westbrookimport com.android.mail.utils.LogUtils; 59c5afb16430a145f20d7c887e45f47b38687054daMarc Blankimport com.google.common.annotations.VisibleForTesting; 6032881e8dd375f16e6059452166503f7136f14ae5Paul Westbrookimport com.google.common.collect.ImmutableMap; 6132881e8dd375f16e6059452166503f7136f14ae5Paul Westbrook 6232881e8dd375f16e6059452166503f7136f14ae5Paul Westbrookimport java.util.Map; 63c5afb16430a145f20d7c887e45f47b38687054daMarc Blank 64c5afb16430a145f20d7c887e45f47b38687054daMarc Blankpublic final class DBHelper { 65c5afb16430a145f20d7c887e45f47b38687054daMarc Blank private static final String TAG = "EmailProvider"; 66c5afb16430a145f20d7c887e45f47b38687054daMarc Blank 6754347010fbbdd3ae1dea5b0e282514c640e16a5fMarc Blank private static final String LEGACY_SCHEME_IMAP = "imap"; 6854347010fbbdd3ae1dea5b0e282514c640e16a5fMarc Blank private static final String LEGACY_SCHEME_POP3 = "pop3"; 6954347010fbbdd3ae1dea5b0e282514c640e16a5fMarc Blank private static final String LEGACY_SCHEME_EAS = "eas"; 7054347010fbbdd3ae1dea5b0e282514c640e16a5fMarc Blank 7113ff5b86ac9314bbce09ae9e4ec381b6273a497bMartin Hibdon 72c5afb16430a145f20d7c887e45f47b38687054daMarc Blank private static final String WHERE_ID = EmailContent.RECORD_ID + "=?"; 73c5afb16430a145f20d7c887e45f47b38687054daMarc Blank 74c5afb16430a145f20d7c887e45f47b38687054daMarc Blank private static final String TRIGGER_MAILBOX_DELETE = 75c5afb16430a145f20d7c887e45f47b38687054daMarc Blank "create trigger mailbox_delete before delete on " + Mailbox.TABLE_NAME + 76c5afb16430a145f20d7c887e45f47b38687054daMarc Blank " begin" + 77c5afb16430a145f20d7c887e45f47b38687054daMarc Blank " delete from " + Message.TABLE_NAME + 78c5afb16430a145f20d7c887e45f47b38687054daMarc Blank " where " + MessageColumns.MAILBOX_KEY + "=old." + EmailContent.RECORD_ID + 79c5afb16430a145f20d7c887e45f47b38687054daMarc Blank "; delete from " + Message.UPDATED_TABLE_NAME + 80c5afb16430a145f20d7c887e45f47b38687054daMarc Blank " where " + MessageColumns.MAILBOX_KEY + "=old." + EmailContent.RECORD_ID + 81c5afb16430a145f20d7c887e45f47b38687054daMarc Blank "; delete from " + Message.DELETED_TABLE_NAME + 82c5afb16430a145f20d7c887e45f47b38687054daMarc Blank " where " + MessageColumns.MAILBOX_KEY + "=old." + EmailContent.RECORD_ID + 83c5afb16430a145f20d7c887e45f47b38687054daMarc Blank "; end"; 84c5afb16430a145f20d7c887e45f47b38687054daMarc Blank 85c5afb16430a145f20d7c887e45f47b38687054daMarc Blank private static final String TRIGGER_ACCOUNT_DELETE = 86c5afb16430a145f20d7c887e45f47b38687054daMarc Blank "create trigger account_delete before delete on " + Account.TABLE_NAME + 87c5afb16430a145f20d7c887e45f47b38687054daMarc Blank " begin delete from " + Mailbox.TABLE_NAME + 88c5afb16430a145f20d7c887e45f47b38687054daMarc Blank " where " + MailboxColumns.ACCOUNT_KEY + "=old." + EmailContent.RECORD_ID + 89c5afb16430a145f20d7c887e45f47b38687054daMarc Blank "; delete from " + HostAuth.TABLE_NAME + 90c5afb16430a145f20d7c887e45f47b38687054daMarc Blank " where " + EmailContent.RECORD_ID + "=old." + AccountColumns.HOST_AUTH_KEY_RECV + 91c5afb16430a145f20d7c887e45f47b38687054daMarc Blank "; delete from " + HostAuth.TABLE_NAME + 92c5afb16430a145f20d7c887e45f47b38687054daMarc Blank " where " + EmailContent.RECORD_ID + "=old." + AccountColumns.HOST_AUTH_KEY_SEND + 93c5afb16430a145f20d7c887e45f47b38687054daMarc Blank "; delete from " + Policy.TABLE_NAME + 94c5afb16430a145f20d7c887e45f47b38687054daMarc Blank " where " + EmailContent.RECORD_ID + "=old." + AccountColumns.POLICY_KEY + 95c5afb16430a145f20d7c887e45f47b38687054daMarc Blank "; end"; 96c5afb16430a145f20d7c887e45f47b38687054daMarc Blank 97c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Any changes to the database format *must* include update-in-place code. 98c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Original version: 3 99c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Version 4: Database wipe required; changing AccountManager interface w/Exchange 100c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Version 5: Database wipe required; changing AccountManager interface w/Exchange 101c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Version 6: Adding Message.mServerTimeStamp column 102c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Version 7: Replace the mailbox_delete trigger with a version that removes orphaned messages 103c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // from the Message_Deletes and Message_Updates tables 104c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Version 8: Add security flags column to accounts table 105c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Version 9: Add security sync key and signature to accounts table 106c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Version 10: Add meeting info to message table 107c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Version 11: Add content and flags to attachment table 108c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Version 12: Add content_bytes to attachment table. content is deprecated. 109c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Version 13: Add messageCount to Mailbox table. 110c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Version 14: Add snippet to Message table 111c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Version 15: Fix upgrade problem in version 14. 112c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Version 16: Add accountKey to Attachment table 113c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Version 17: Add parentKey to Mailbox table 114c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Version 18: Copy Mailbox.displayName to Mailbox.serverId for all IMAP & POP3 mailboxes. 115c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Column Mailbox.serverId is used for the server-side pathname of a mailbox. 116c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Version 19: Add Policy table; add policyKey to Account table and trigger to delete an 117c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Account's policy when the Account is deleted 118c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Version 20: Add new policies to Policy table 119c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Version 21: Add lastSeenMessageKey column to Mailbox table 120c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Version 22: Upgrade path for IMAP/POP accounts to integrate with AccountManager 121c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Version 23: Add column to mailbox table for time of last access 122c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Version 24: Add column to hostauth table for client cert alias 123c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Version 25: Added QuickResponse table 124c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Version 26: Update IMAP accounts to add FLAG_SUPPORTS_SEARCH flag 125c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Version 27: Add protocolSearchInfo to Message table 126c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Version 28: Add notifiedMessageId and notifiedMessageCount to Account 127c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Version 29: Add protocolPoliciesEnforced and protocolPoliciesUnsupported to Policy 128c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Version 30: Use CSV of RFC822 addresses instead of "packed" values 129c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Version 31: Add columns to mailbox for ui status/last result 130c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Version 32: Add columns to mailbox for last notified message key/count; insure not null 131c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // for "notified" columns 132c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Version 33: Add columns to attachment for ui provider columns 133c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Version 34: Add total count to mailbox 134c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Version 35: Set up defaults for lastTouchedCount for drafts and sent 135c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Version 36: mblank intentionally left this space 136c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Version 37: Add flag for settings support in folders 137c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Version 38&39: Add threadTopic to message (for future support) 138c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Version 39 is last Email1 version 139c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Version 100 is first Email2 version 140c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Version 101 SHOULD NOT BE USED 141c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Version 102&103: Add hierarchicalName to Mailbox 142c6089bc01f2ae49fb11904a4b4f222811358254fMarc Blank // Version 104&105: add syncData to Message 1437d5e2a7c08966ffd4a9e8c78f504cc4fd5be4216Marc Blank // Version 106: Add certificate to HostAuth 144b34608228f0b55e401415b67b8150ca9e00cee7dScott Kennedy // Version 107: Add a SEEN column to the message table 1459a95253846ccc7a94dd7d4c618ec2d808e2a4000Paul Westbrook // Version 108: Add a cachedFile column to the attachments table 14632881e8dd375f16e6059452166503f7136f14ae5Paul Westbrook // Version 109: Migrate the account so they have the correct account manager types 14721b2522d7f6b2bce8fc3382e6e532d4b4df1b140Yu Ping Hu // Version 110: Stop updating message_count, don't use auto lookback, and don't use 1485ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu // ping/push_hold sync states. Note that message_count updating is restored in 113. 149aa0ca16a27e4a56a029e5cdebf96de5723bd84b6Yu Ping Hu // Version 111: Delete Exchange account mailboxes. 150a54ee609cdb79ad3abdda2d7180a29617fa38610Yu Ping Hu // Version 112: Convert Mailbox syncInterval to a boolean (whether or not this mailbox 151a54ee609cdb79ad3abdda2d7180a29617fa38610Yu Ping Hu // syncs along with the account). 1525ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu // Version 113: Restore message_count to being useful. 153c75f5880ab70d9f4938727587696b864bb4ea02aMartin Hibdon // Version 114: Add lastFullSyncTime column 15452135c6e8750f19084695cdda78ffe34719c4b6cMartin Hibdon // Version 115: Add pingDuration column 155ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu // Version 116: Add MessageMove & MessageStateChange tables. 156e3a4a1b25dd20dfd69793ca953f3299bcf6f0501Yu Ping Hu // Version 117: Add trigger to delete duplicate messages on sync. 157e54d6957dbbd14d35a1858cb02959fd8f9bb0d37Tony Mantler // Version 118: Set syncInterval to 0 for all IMAP mailboxes 158cb30243fe1fa3a2f7540495cbeea470e77b539beMartin Hibdon // Version 119: Disable syncing of DRAFTS type folders. 159ac40b8648504ba5e4e2f8ad44ec2e5063a054cb3Martin Hibdon // Version 120: Changed duplicateMessage deletion trigger to ignore search mailboxes. 160c86fbb5bcbff72102f87747d94948f0749402229Martin Hibdon // Version 121: Add mainMailboxKey, which will be set for messages that are in the fake 161c86fbb5bcbff72102f87747d94948f0749402229Martin Hibdon // "search_results" folder to reflect the mailbox that the server considers 162c86fbb5bcbff72102f87747d94948f0749402229Martin Hibdon // the message to be in. Also, wipe out any stale search_result folders. 1637b7d7d5cb57c9f0e589b686511eabf3c73f96f00Yu Ping Hu // Version 122: Need to update Message_Updates and Message_Deletes to match previous. 16413ff5b86ac9314bbce09ae9e4ec381b6273a497bMartin Hibdon // Version 123: Changed the duplicateMesage deletion trigger to ignore accounts that aren't 16513ff5b86ac9314bbce09ae9e4ec381b6273a497bMartin Hibdon // exchange accounts. 16613ff5b86ac9314bbce09ae9e4ec381b6273a497bMartin Hibdon public static final int DATABASE_VERSION = 123; 167c5afb16430a145f20d7c887e45f47b38687054daMarc Blank 168c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Any changes to the database format *must* include update-in-place code. 169c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Original version: 2 170c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Version 3: Add "sourceKey" column 171c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Version 4: Database wipe required; changing AccountManager interface w/Exchange 172c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Version 5: Database wipe required; changing AccountManager interface w/Exchange 173c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Version 6: Adding Body.mIntroText column 174c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Version 7/8: Adding quoted text start pos 175c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Version 8 is last Email1 version 176c5afb16430a145f20d7c887e45f47b38687054daMarc Blank public static final int BODY_DATABASE_VERSION = 100; 177c5afb16430a145f20d7c887e45f47b38687054daMarc Blank 178c5afb16430a145f20d7c887e45f47b38687054daMarc Blank /* 179c5afb16430a145f20d7c887e45f47b38687054daMarc Blank * Internal helper method for index creation. 180c5afb16430a145f20d7c887e45f47b38687054daMarc Blank * Example: 181c5afb16430a145f20d7c887e45f47b38687054daMarc Blank * "create index message_" + MessageColumns.FLAG_READ 182c5afb16430a145f20d7c887e45f47b38687054daMarc Blank * + " on " + Message.TABLE_NAME + " (" + MessageColumns.FLAG_READ + ");" 183c5afb16430a145f20d7c887e45f47b38687054daMarc Blank */ 184c5afb16430a145f20d7c887e45f47b38687054daMarc Blank /* package */ 185c5afb16430a145f20d7c887e45f47b38687054daMarc Blank static String createIndex(String tableName, String columnName) { 186c5afb16430a145f20d7c887e45f47b38687054daMarc Blank return "create index " + tableName.toLowerCase() + '_' + columnName 187c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + " on " + tableName + " (" + columnName + ");"; 188c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 189c5afb16430a145f20d7c887e45f47b38687054daMarc Blank 1905ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu static void createMessageCountTriggers(final SQLiteDatabase db) { 1915ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu // Insert a message. 1925ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu db.execSQL("create trigger message_count_message_insert after insert on " + 1935ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu Message.TABLE_NAME + 1945ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu " begin update " + Mailbox.TABLE_NAME + " set " + MailboxColumns.MESSAGE_COUNT + 1955ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu '=' + MailboxColumns.MESSAGE_COUNT + "+1" + 1965ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu " where " + EmailContent.RECORD_ID + "=NEW." + MessageColumns.MAILBOX_KEY + 1975ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu "; end"); 1985ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu 1995ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu // Delete a message. 2005ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu db.execSQL("create trigger message_count_message_delete after delete on " + 2015ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu Message.TABLE_NAME + 2025ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu " begin update " + Mailbox.TABLE_NAME + " set " + MailboxColumns.MESSAGE_COUNT + 2035ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu '=' + MailboxColumns.MESSAGE_COUNT + "-1" + 2045ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu " where " + EmailContent.RECORD_ID + "=OLD." + MessageColumns.MAILBOX_KEY + 2055ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu "; end"); 2065ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu 2075ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu // Change a message's mailbox. 2085ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu db.execSQL("create trigger message_count_message_move after update of " + 2095ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu MessageColumns.MAILBOX_KEY + " on " + Message.TABLE_NAME + 2105ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu " begin update " + Mailbox.TABLE_NAME + " set " + MailboxColumns.MESSAGE_COUNT + 2115ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu '=' + MailboxColumns.MESSAGE_COUNT + "-1" + 2125ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu " where " + EmailContent.RECORD_ID + "=OLD." + MessageColumns.MAILBOX_KEY + 2135ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu "; update " + Mailbox.TABLE_NAME + " set " + MailboxColumns.MESSAGE_COUNT + 2145ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu '=' + MailboxColumns.MESSAGE_COUNT + "+1" + 2155ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu " where " + EmailContent.RECORD_ID + "=NEW." + MessageColumns.MAILBOX_KEY + 2165ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu "; end"); 2175ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu } 2185ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu 219ac40b8648504ba5e4e2f8ad44ec2e5063a054cb3Martin Hibdon static void dropDeleteDuplicateMessagesTrigger(final SQLiteDatabase db) { 220ac40b8648504ba5e4e2f8ad44ec2e5063a054cb3Martin Hibdon db.execSQL("drop trigger message_delete_duplicates_on_insert"); 221ac40b8648504ba5e4e2f8ad44ec2e5063a054cb3Martin Hibdon } 222ac40b8648504ba5e4e2f8ad44ec2e5063a054cb3Martin Hibdon 223e3a4a1b25dd20dfd69793ca953f3299bcf6f0501Yu Ping Hu /** 224e3a4a1b25dd20dfd69793ca953f3299bcf6f0501Yu Ping Hu * Add a trigger to delete duplicate server side messages before insertion. 22513ff5b86ac9314bbce09ae9e4ec381b6273a497bMartin Hibdon * This should delete any messages older messages that have the same serverId and account as 22613ff5b86ac9314bbce09ae9e4ec381b6273a497bMartin Hibdon * the new message, if: 22713ff5b86ac9314bbce09ae9e4ec381b6273a497bMartin Hibdon * Neither message is in a SEARCH type mailbox, and 22813ff5b86ac9314bbce09ae9e4ec381b6273a497bMartin Hibdon * The new message's mailbox's account is an exchange account. 22913ff5b86ac9314bbce09ae9e4ec381b6273a497bMartin Hibdon * 230ac40b8648504ba5e4e2f8ad44ec2e5063a054cb3Martin Hibdon * Here is the plain text of this sql: 231ac40b8648504ba5e4e2f8ad44ec2e5063a054cb3Martin Hibdon * create trigger message_delete_duplicates_on_insert before insert on 23213ff5b86ac9314bbce09ae9e4ec381b6273a497bMartin Hibdon * Message for each row when new.syncServerId is not null and 23313ff5b86ac9314bbce09ae9e4ec381b6273a497bMartin Hibdon * (select type from Mailbox where _id=new.mailboxKey) != 8 and 23413ff5b86ac9314bbce09ae9e4ec381b6273a497bMartin Hibdon * (select HostAuth.protocol from HostAuth, Account where 23513ff5b86ac9314bbce09ae9e4ec381b6273a497bMartin Hibdon * new.accountKey=account._id and account.hostAuthKeyRecv=hostAuth._id) = 'gEas' 23613ff5b86ac9314bbce09ae9e4ec381b6273a497bMartin Hibdon * begin delete from Message where new.syncServerId=syncSeverId and 237ac40b8648504ba5e4e2f8ad44ec2e5063a054cb3Martin Hibdon * new.accountKey=accountKey and 23813ff5b86ac9314bbce09ae9e4ec381b6273a497bMartin Hibdon * (select Mailbox.type from Mailbox where _id=mailboxKey) != 8; end 239e3a4a1b25dd20dfd69793ca953f3299bcf6f0501Yu Ping Hu */ 24013ff5b86ac9314bbce09ae9e4ec381b6273a497bMartin Hibdon static void createDeleteDuplicateMessagesTrigger(final Context context, 24113ff5b86ac9314bbce09ae9e4ec381b6273a497bMartin Hibdon final SQLiteDatabase db) { 242e3a4a1b25dd20dfd69793ca953f3299bcf6f0501Yu Ping Hu db.execSQL("create trigger message_delete_duplicates_on_insert before insert on " 243e3a4a1b25dd20dfd69793ca953f3299bcf6f0501Yu Ping Hu + Message.TABLE_NAME + " for each row when new." + SyncColumns.SERVER_ID 244ac40b8648504ba5e4e2f8ad44ec2e5063a054cb3Martin Hibdon + " is not null and " 24513ff5b86ac9314bbce09ae9e4ec381b6273a497bMartin Hibdon + "(select " + MailboxColumns.TYPE + " from " + Mailbox.TABLE_NAME 24613ff5b86ac9314bbce09ae9e4ec381b6273a497bMartin Hibdon + " where " + MailboxColumns.ID + "=new." 247ac40b8648504ba5e4e2f8ad44ec2e5063a054cb3Martin Hibdon + MessageColumns.MAILBOX_KEY + ")!=" + Mailbox.TYPE_SEARCH 24813ff5b86ac9314bbce09ae9e4ec381b6273a497bMartin Hibdon + " and (select " 24913ff5b86ac9314bbce09ae9e4ec381b6273a497bMartin Hibdon + HostAuth.TABLE_NAME + "." + HostAuthColumns.PROTOCOL + " from " 25013ff5b86ac9314bbce09ae9e4ec381b6273a497bMartin Hibdon + HostAuth.TABLE_NAME + "," + Account.TABLE_NAME 25113ff5b86ac9314bbce09ae9e4ec381b6273a497bMartin Hibdon + " where new." + MessageColumns.ACCOUNT_KEY 25213ff5b86ac9314bbce09ae9e4ec381b6273a497bMartin Hibdon + "=" + Account.TABLE_NAME + "." + AccountColumns.ID 25313ff5b86ac9314bbce09ae9e4ec381b6273a497bMartin Hibdon + " and " + Account.TABLE_NAME + "." + AccountColumns.HOST_AUTH_KEY_RECV 25413ff5b86ac9314bbce09ae9e4ec381b6273a497bMartin Hibdon + "=" + HostAuth.TABLE_NAME + "." + HostAuthColumns.ID 25513ff5b86ac9314bbce09ae9e4ec381b6273a497bMartin Hibdon + ")='" + context.getString(R.string.protocol_eas) + "'" 256ac40b8648504ba5e4e2f8ad44ec2e5063a054cb3Martin Hibdon + " begin delete from " + Message.TABLE_NAME + " where new." 257e3a4a1b25dd20dfd69793ca953f3299bcf6f0501Yu Ping Hu + SyncColumns.SERVER_ID + "=" + SyncColumns.SERVER_ID + " and new." 258ac40b8648504ba5e4e2f8ad44ec2e5063a054cb3Martin Hibdon + MessageColumns.ACCOUNT_KEY + "=" + MessageColumns.ACCOUNT_KEY 259ac40b8648504ba5e4e2f8ad44ec2e5063a054cb3Martin Hibdon + " and (select " + Mailbox.TABLE_NAME + "." + MailboxColumns.TYPE + " from " 260ac40b8648504ba5e4e2f8ad44ec2e5063a054cb3Martin Hibdon + Mailbox.TABLE_NAME + " where " + MailboxColumns.ID + "=" 261ac40b8648504ba5e4e2f8ad44ec2e5063a054cb3Martin Hibdon + MessageColumns.MAILBOX_KEY + ")!=" + Mailbox.TYPE_SEARCH +"; end"); 262e3a4a1b25dd20dfd69793ca953f3299bcf6f0501Yu Ping Hu } 263e3a4a1b25dd20dfd69793ca953f3299bcf6f0501Yu Ping Hu 26413ff5b86ac9314bbce09ae9e4ec381b6273a497bMartin Hibdon static void createMessageTable(Context context, SQLiteDatabase db) { 265c5afb16430a145f20d7c887e45f47b38687054daMarc Blank String messageColumns = MessageColumns.DISPLAY_NAME + " text, " 266c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + MessageColumns.TIMESTAMP + " integer, " 267c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + MessageColumns.SUBJECT + " text, " 268c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + MessageColumns.FLAG_READ + " integer, " 269c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + MessageColumns.FLAG_LOADED + " integer, " 270c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + MessageColumns.FLAG_FAVORITE + " integer, " 271c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + MessageColumns.FLAG_ATTACHMENT + " integer, " 272c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + MessageColumns.FLAGS + " integer, " 273c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + MessageColumns.DRAFT_INFO + " integer, " 274c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + MessageColumns.MESSAGE_ID + " text, " 275c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + MessageColumns.MAILBOX_KEY + " integer, " 276c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + MessageColumns.ACCOUNT_KEY + " integer, " 277c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + MessageColumns.FROM_LIST + " text, " 278c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + MessageColumns.TO_LIST + " text, " 279c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + MessageColumns.CC_LIST + " text, " 280c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + MessageColumns.BCC_LIST + " text, " 281c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + MessageColumns.REPLY_TO_LIST + " text, " 282c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + MessageColumns.MEETING_INFO + " text, " 283c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + MessageColumns.SNIPPET + " text, " 284c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + MessageColumns.PROTOCOL_SEARCH_INFO + " text, " 285c6089bc01f2ae49fb11904a4b4f222811358254fMarc Blank + MessageColumns.THREAD_TOPIC + " text, " 286b34608228f0b55e401415b67b8150ca9e00cee7dScott Kennedy + MessageColumns.SYNC_DATA + " text, " 287c86fbb5bcbff72102f87747d94948f0749402229Martin Hibdon + MessageColumns.FLAG_SEEN + " integer, " 288c86fbb5bcbff72102f87747d94948f0749402229Martin Hibdon + MessageColumns.MAIN_MAILBOX_KEY + " integer" 289c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + ");"; 290c5afb16430a145f20d7c887e45f47b38687054daMarc Blank 291c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // This String and the following String MUST have the same columns, except for the type 292c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // of those columns! 293c5afb16430a145f20d7c887e45f47b38687054daMarc Blank String createString = " (" + EmailContent.RECORD_ID + " integer primary key autoincrement, " 294c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + SyncColumns.SERVER_ID + " text, " 295c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + SyncColumns.SERVER_TIMESTAMP + " integer, " 296c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + messageColumns; 297c5afb16430a145f20d7c887e45f47b38687054daMarc Blank 298c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // For the updated and deleted tables, the id is assigned, but we do want to keep track 299c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // of the ORDER of updates using an autoincrement primary key. We use the DATA column 300c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // at this point; it has no other function 301c5afb16430a145f20d7c887e45f47b38687054daMarc Blank String altCreateString = " (" + EmailContent.RECORD_ID + " integer unique, " 302c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + SyncColumns.SERVER_ID + " text, " 303c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + SyncColumns.SERVER_TIMESTAMP + " integer, " 304c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + messageColumns; 305c5afb16430a145f20d7c887e45f47b38687054daMarc Blank 306c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // The three tables have the same schema 307c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("create table " + Message.TABLE_NAME + createString); 308c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("create table " + Message.UPDATED_TABLE_NAME + altCreateString); 309c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("create table " + Message.DELETED_TABLE_NAME + altCreateString); 310c5afb16430a145f20d7c887e45f47b38687054daMarc Blank 311c5afb16430a145f20d7c887e45f47b38687054daMarc Blank String indexColumns[] = { 312c5afb16430a145f20d7c887e45f47b38687054daMarc Blank MessageColumns.TIMESTAMP, 313c5afb16430a145f20d7c887e45f47b38687054daMarc Blank MessageColumns.FLAG_READ, 314c5afb16430a145f20d7c887e45f47b38687054daMarc Blank MessageColumns.FLAG_LOADED, 315c5afb16430a145f20d7c887e45f47b38687054daMarc Blank MessageColumns.MAILBOX_KEY, 316c5afb16430a145f20d7c887e45f47b38687054daMarc Blank SyncColumns.SERVER_ID 317c5afb16430a145f20d7c887e45f47b38687054daMarc Blank }; 318c5afb16430a145f20d7c887e45f47b38687054daMarc Blank 319c5afb16430a145f20d7c887e45f47b38687054daMarc Blank for (String columnName : indexColumns) { 320c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL(createIndex(Message.TABLE_NAME, columnName)); 321c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 322c5afb16430a145f20d7c887e45f47b38687054daMarc Blank 323c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Deleting a Message deletes all associated Attachments 324c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Deleting the associated Body cannot be done in a trigger, because the Body is stored 325c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // in a separate database, and trigger cannot operate on attached databases. 326c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("create trigger message_delete before delete on " + Message.TABLE_NAME + 327c5afb16430a145f20d7c887e45f47b38687054daMarc Blank " begin delete from " + Attachment.TABLE_NAME + 328c5afb16430a145f20d7c887e45f47b38687054daMarc Blank " where " + AttachmentColumns.MESSAGE_KEY + "=old." + EmailContent.RECORD_ID + 329c5afb16430a145f20d7c887e45f47b38687054daMarc Blank "; end"); 330c5afb16430a145f20d7c887e45f47b38687054daMarc Blank 331c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Add triggers to keep unread count accurate per mailbox 332c5afb16430a145f20d7c887e45f47b38687054daMarc Blank 333c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // NOTE: SQLite's before triggers are not safe when recursive triggers are involved. 334c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Use caution when changing them. 335c5afb16430a145f20d7c887e45f47b38687054daMarc Blank 336c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Insert a message; if flagRead is zero, add to the unread count of the message's mailbox 337c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("create trigger unread_message_insert before insert on " + Message.TABLE_NAME + 338c5afb16430a145f20d7c887e45f47b38687054daMarc Blank " when NEW." + MessageColumns.FLAG_READ + "=0" + 339c5afb16430a145f20d7c887e45f47b38687054daMarc Blank " begin update " + Mailbox.TABLE_NAME + " set " + MailboxColumns.UNREAD_COUNT + 340c5afb16430a145f20d7c887e45f47b38687054daMarc Blank '=' + MailboxColumns.UNREAD_COUNT + "+1" + 341c5afb16430a145f20d7c887e45f47b38687054daMarc Blank " where " + EmailContent.RECORD_ID + "=NEW." + MessageColumns.MAILBOX_KEY + 342c5afb16430a145f20d7c887e45f47b38687054daMarc Blank "; end"); 343c5afb16430a145f20d7c887e45f47b38687054daMarc Blank 344c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Delete a message; if flagRead is zero, decrement the unread count of the msg's mailbox 345c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("create trigger unread_message_delete before delete on " + Message.TABLE_NAME + 346c5afb16430a145f20d7c887e45f47b38687054daMarc Blank " when OLD." + MessageColumns.FLAG_READ + "=0" + 347c5afb16430a145f20d7c887e45f47b38687054daMarc Blank " begin update " + Mailbox.TABLE_NAME + " set " + MailboxColumns.UNREAD_COUNT + 348c5afb16430a145f20d7c887e45f47b38687054daMarc Blank '=' + MailboxColumns.UNREAD_COUNT + "-1" + 349c5afb16430a145f20d7c887e45f47b38687054daMarc Blank " where " + EmailContent.RECORD_ID + "=OLD." + MessageColumns.MAILBOX_KEY + 350c5afb16430a145f20d7c887e45f47b38687054daMarc Blank "; end"); 351c5afb16430a145f20d7c887e45f47b38687054daMarc Blank 352c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Change a message's mailbox 353c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("create trigger unread_message_move before update of " + 354c5afb16430a145f20d7c887e45f47b38687054daMarc Blank MessageColumns.MAILBOX_KEY + " on " + Message.TABLE_NAME + 355c5afb16430a145f20d7c887e45f47b38687054daMarc Blank " when OLD." + MessageColumns.FLAG_READ + "=0" + 356c5afb16430a145f20d7c887e45f47b38687054daMarc Blank " begin update " + Mailbox.TABLE_NAME + " set " + MailboxColumns.UNREAD_COUNT + 357c5afb16430a145f20d7c887e45f47b38687054daMarc Blank '=' + MailboxColumns.UNREAD_COUNT + "-1" + 358c5afb16430a145f20d7c887e45f47b38687054daMarc Blank " where " + EmailContent.RECORD_ID + "=OLD." + MessageColumns.MAILBOX_KEY + 359c5afb16430a145f20d7c887e45f47b38687054daMarc Blank "; update " + Mailbox.TABLE_NAME + " set " + MailboxColumns.UNREAD_COUNT + 360c5afb16430a145f20d7c887e45f47b38687054daMarc Blank '=' + MailboxColumns.UNREAD_COUNT + "+1" + 361c5afb16430a145f20d7c887e45f47b38687054daMarc Blank " where " + EmailContent.RECORD_ID + "=NEW." + MessageColumns.MAILBOX_KEY + 362c5afb16430a145f20d7c887e45f47b38687054daMarc Blank "; end"); 363c5afb16430a145f20d7c887e45f47b38687054daMarc Blank 364c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Change a message's read state 365c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("create trigger unread_message_read before update of " + 366c5afb16430a145f20d7c887e45f47b38687054daMarc Blank MessageColumns.FLAG_READ + " on " + Message.TABLE_NAME + 367c5afb16430a145f20d7c887e45f47b38687054daMarc Blank " when OLD." + MessageColumns.FLAG_READ + "!=NEW." + MessageColumns.FLAG_READ + 368c5afb16430a145f20d7c887e45f47b38687054daMarc Blank " begin update " + Mailbox.TABLE_NAME + " set " + MailboxColumns.UNREAD_COUNT + 369c5afb16430a145f20d7c887e45f47b38687054daMarc Blank '=' + MailboxColumns.UNREAD_COUNT + "+ case OLD." + MessageColumns.FLAG_READ + 370c5afb16430a145f20d7c887e45f47b38687054daMarc Blank " when 0 then -1 else 1 end" + 371c5afb16430a145f20d7c887e45f47b38687054daMarc Blank " where " + EmailContent.RECORD_ID + "=OLD." + MessageColumns.MAILBOX_KEY + 372c5afb16430a145f20d7c887e45f47b38687054daMarc Blank "; end"); 3735ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu 3745ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu // Add triggers to maintain message_count. 3755ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu createMessageCountTriggers(db); 37613ff5b86ac9314bbce09ae9e4ec381b6273a497bMartin Hibdon createDeleteDuplicateMessagesTrigger(context, db); 377c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 378c5afb16430a145f20d7c887e45f47b38687054daMarc Blank 37913ff5b86ac9314bbce09ae9e4ec381b6273a497bMartin Hibdon static void resetMessageTable(Context context, SQLiteDatabase db, 38013ff5b86ac9314bbce09ae9e4ec381b6273a497bMartin Hibdon int oldVersion, int newVersion) { 381c5afb16430a145f20d7c887e45f47b38687054daMarc Blank try { 382c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("drop table " + Message.TABLE_NAME); 383c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("drop table " + Message.UPDATED_TABLE_NAME); 384c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("drop table " + Message.DELETED_TABLE_NAME); 385c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } catch (SQLException e) { 386c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 38713ff5b86ac9314bbce09ae9e4ec381b6273a497bMartin Hibdon createMessageTable(context, db); 388c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 389c5afb16430a145f20d7c887e45f47b38687054daMarc Blank 390ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu /** 391ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu * Common columns for all {@link MessageChangeLogTable} tables. 392ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu */ 393ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu private static String MESSAGE_CHANGE_LOG_COLUMNS = 394ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu MessageChangeLogTable.ID + " integer primary key autoincrement, " 395ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu + MessageChangeLogTable.MESSAGE_KEY + " integer, " 396ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu + MessageChangeLogTable.SERVER_ID + " text, " 397ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu + MessageChangeLogTable.ACCOUNT_KEY + " integer, " 398ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu + MessageChangeLogTable.STATUS + " integer, "; 399ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu 400ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu /** 401ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu * Create indices common to all {@link MessageChangeLogTable} tables. 402ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu * @param db The {@link SQLiteDatabase}. 403ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu * @param tableName The name of this particular table. 404ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu */ 405ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu private static void createMessageChangeLogTableIndices(final SQLiteDatabase db, 406ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu final String tableName) { 407ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu db.execSQL(createIndex(tableName, MessageChangeLogTable.MESSAGE_KEY)); 408ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu db.execSQL(createIndex(tableName, MessageChangeLogTable.ACCOUNT_KEY)); 409ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu } 410ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu 411ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu /** 412ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu * Create triggers common to all {@link MessageChangeLogTable} tables. 413ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu * @param db The {@link SQLiteDatabase}. 414ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu * @param tableName The name of this particular table. 415ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu */ 416ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu private static void createMessageChangeLogTableTriggers(final SQLiteDatabase db, 417ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu final String tableName) { 418ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu // Trigger to delete from the change log when a message is deleted. 419ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu db.execSQL("create trigger " + tableName + "_delete_message before delete on " 420ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu + Message.TABLE_NAME + " for each row begin delete from " + tableName 421ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu + " where " + MessageChangeLogTable.MESSAGE_KEY + "=old." + MessageColumns.ID 422ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu + "; end"); 423ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu 424ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu // Trigger to delete from the change log when an account is deleted. 425ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu db.execSQL("create trigger " + tableName + "_delete_account before delete on " 426ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu + Account.TABLE_NAME + " for each row begin delete from " + tableName 427ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu + " where " + MessageChangeLogTable.ACCOUNT_KEY + "=old." + AccountColumns.ID 428ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu + "; end"); 429ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu } 430ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu 431ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu /** 432ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu * Create the MessageMove table. 433ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu * @param db The {@link SQLiteDatabase}. 434ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu */ 435ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu private static void createMessageMoveTable(final SQLiteDatabase db) { 436ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu db.execSQL("create table " + MessageMove.TABLE_NAME + " (" 437ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu + MESSAGE_CHANGE_LOG_COLUMNS 438ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu + MessageMove.SRC_FOLDER_KEY + " integer, " 439ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu + MessageMove.DST_FOLDER_KEY + " integer, " 440ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu + MessageMove.SRC_FOLDER_SERVER_ID + " text, " 441ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu + MessageMove.DST_FOLDER_SERVER_ID + " text);"); 442ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu 443ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu createMessageChangeLogTableIndices(db, MessageMove.TABLE_NAME); 444ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu createMessageChangeLogTableTriggers(db, MessageMove.TABLE_NAME); 445ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu } 446ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu 447ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu /** 448ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu * Create the MessageStateChange table. 449ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu * @param db The {@link SQLiteDatabase}. 450ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu */ 451ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu private static void createMessageStateChangeTable(final SQLiteDatabase db) { 452ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu db.execSQL("create table " + MessageStateChange.TABLE_NAME + " (" 453ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu + MESSAGE_CHANGE_LOG_COLUMNS 454ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu + MessageStateChange.OLD_FLAG_READ + " integer, " 455ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu + MessageStateChange.NEW_FLAG_READ + " integer, " 456ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu + MessageStateChange.OLD_FLAG_FAVORITE + " integer, " 457ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu + MessageStateChange.NEW_FLAG_FAVORITE + " integer);"); 458ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu 459ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu createMessageChangeLogTableIndices(db, MessageStateChange.TABLE_NAME); 460ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu createMessageChangeLogTableTriggers(db, MessageStateChange.TABLE_NAME); 461ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu } 462ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu 463c5afb16430a145f20d7c887e45f47b38687054daMarc Blank @SuppressWarnings("deprecation") 464c5afb16430a145f20d7c887e45f47b38687054daMarc Blank static void createAccountTable(SQLiteDatabase db) { 465c5afb16430a145f20d7c887e45f47b38687054daMarc Blank String s = " (" + EmailContent.RECORD_ID + " integer primary key autoincrement, " 466c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + AccountColumns.DISPLAY_NAME + " text, " 467c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + AccountColumns.EMAIL_ADDRESS + " text, " 468c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + AccountColumns.SYNC_KEY + " text, " 469c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + AccountColumns.SYNC_LOOKBACK + " integer, " 470c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + AccountColumns.SYNC_INTERVAL + " text, " 471c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + AccountColumns.HOST_AUTH_KEY_RECV + " integer, " 472c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + AccountColumns.HOST_AUTH_KEY_SEND + " integer, " 473c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + AccountColumns.FLAGS + " integer, " 474c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + AccountColumns.IS_DEFAULT + " integer, " 475c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + AccountColumns.COMPATIBILITY_UUID + " text, " 476c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + AccountColumns.SENDER_NAME + " text, " 477c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + AccountColumns.RINGTONE_URI + " text, " 478c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + AccountColumns.PROTOCOL_VERSION + " text, " 479c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + AccountColumns.NEW_MESSAGE_COUNT + " integer, " 480c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + AccountColumns.SECURITY_FLAGS + " integer, " 481c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + AccountColumns.SECURITY_SYNC_KEY + " text, " 482c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + AccountColumns.SIGNATURE + " text, " 48352135c6e8750f19084695cdda78ffe34719c4b6cMartin Hibdon + AccountColumns.POLICY_KEY + " integer, " 48452135c6e8750f19084695cdda78ffe34719c4b6cMartin Hibdon + AccountColumns.PING_DURATION + " integer" 485c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + ");"; 486c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("create table " + Account.TABLE_NAME + s); 487c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Deleting an account deletes associated Mailboxes and HostAuth's 488c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL(TRIGGER_ACCOUNT_DELETE); 489c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 490c5afb16430a145f20d7c887e45f47b38687054daMarc Blank 491c5afb16430a145f20d7c887e45f47b38687054daMarc Blank static void resetAccountTable(SQLiteDatabase db, int oldVersion, int newVersion) { 492c5afb16430a145f20d7c887e45f47b38687054daMarc Blank try { 493c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("drop table " + Account.TABLE_NAME); 494c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } catch (SQLException e) { 495c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 496c5afb16430a145f20d7c887e45f47b38687054daMarc Blank createAccountTable(db); 497c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 498c5afb16430a145f20d7c887e45f47b38687054daMarc Blank 499c5afb16430a145f20d7c887e45f47b38687054daMarc Blank static void createPolicyTable(SQLiteDatabase db) { 500c5afb16430a145f20d7c887e45f47b38687054daMarc Blank String s = " (" + EmailContent.RECORD_ID + " integer primary key autoincrement, " 501c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + PolicyColumns.PASSWORD_MODE + " integer, " 502c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + PolicyColumns.PASSWORD_MIN_LENGTH + " integer, " 503c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + PolicyColumns.PASSWORD_EXPIRATION_DAYS + " integer, " 504c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + PolicyColumns.PASSWORD_HISTORY + " integer, " 505c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + PolicyColumns.PASSWORD_COMPLEX_CHARS + " integer, " 506c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + PolicyColumns.PASSWORD_MAX_FAILS + " integer, " 507c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + PolicyColumns.MAX_SCREEN_LOCK_TIME + " integer, " 508c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + PolicyColumns.REQUIRE_REMOTE_WIPE + " integer, " 509c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + PolicyColumns.REQUIRE_ENCRYPTION + " integer, " 510c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + PolicyColumns.REQUIRE_ENCRYPTION_EXTERNAL + " integer, " 511c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + PolicyColumns.REQUIRE_MANUAL_SYNC_WHEN_ROAMING + " integer, " 512c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + PolicyColumns.DONT_ALLOW_CAMERA + " integer, " 513c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + PolicyColumns.DONT_ALLOW_ATTACHMENTS + " integer, " 514c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + PolicyColumns.DONT_ALLOW_HTML + " integer, " 515c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + PolicyColumns.MAX_ATTACHMENT_SIZE + " integer, " 516c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + PolicyColumns.MAX_TEXT_TRUNCATION_SIZE + " integer, " 517c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + PolicyColumns.MAX_HTML_TRUNCATION_SIZE + " integer, " 518c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + PolicyColumns.MAX_EMAIL_LOOKBACK + " integer, " 519c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + PolicyColumns.MAX_CALENDAR_LOOKBACK + " integer, " 520c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + PolicyColumns.PASSWORD_RECOVERY_ENABLED + " integer, " 521c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + PolicyColumns.PROTOCOL_POLICIES_ENFORCED + " text, " 522c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + PolicyColumns.PROTOCOL_POLICIES_UNSUPPORTED + " text" 523c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + ");"; 524c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("create table " + Policy.TABLE_NAME + s); 525c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 526c5afb16430a145f20d7c887e45f47b38687054daMarc Blank 527c5afb16430a145f20d7c887e45f47b38687054daMarc Blank static void createHostAuthTable(SQLiteDatabase db) { 528c5afb16430a145f20d7c887e45f47b38687054daMarc Blank String s = " (" + EmailContent.RECORD_ID + " integer primary key autoincrement, " 529c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + HostAuthColumns.PROTOCOL + " text, " 530c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + HostAuthColumns.ADDRESS + " text, " 531c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + HostAuthColumns.PORT + " integer, " 532c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + HostAuthColumns.FLAGS + " integer, " 533c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + HostAuthColumns.LOGIN + " text, " 534c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + HostAuthColumns.PASSWORD + " text, " 535c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + HostAuthColumns.DOMAIN + " text, " 536c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + HostAuthColumns.ACCOUNT_KEY + " integer," 5377d5e2a7c08966ffd4a9e8c78f504cc4fd5be4216Marc Blank + HostAuthColumns.CLIENT_CERT_ALIAS + " text," 538cee9881650e01da155b3d7117357a15f49a7a4a1Marc Blank + HostAuthColumns.SERVER_CERT + " blob" 539c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + ");"; 540c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("create table " + HostAuth.TABLE_NAME + s); 541c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 542c5afb16430a145f20d7c887e45f47b38687054daMarc Blank 543c5afb16430a145f20d7c887e45f47b38687054daMarc Blank static void resetHostAuthTable(SQLiteDatabase db, int oldVersion, int newVersion) { 544c5afb16430a145f20d7c887e45f47b38687054daMarc Blank try { 545c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("drop table " + HostAuth.TABLE_NAME); 546c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } catch (SQLException e) { 547c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 548c5afb16430a145f20d7c887e45f47b38687054daMarc Blank createHostAuthTable(db); 549c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 550c5afb16430a145f20d7c887e45f47b38687054daMarc Blank 551c5afb16430a145f20d7c887e45f47b38687054daMarc Blank static void createMailboxTable(SQLiteDatabase db) { 552c5afb16430a145f20d7c887e45f47b38687054daMarc Blank String s = " (" + EmailContent.RECORD_ID + " integer primary key autoincrement, " 553c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + MailboxColumns.DISPLAY_NAME + " text, " 554c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + MailboxColumns.SERVER_ID + " text, " 555c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + MailboxColumns.PARENT_SERVER_ID + " text, " 556c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + MailboxColumns.PARENT_KEY + " integer, " 557c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + MailboxColumns.ACCOUNT_KEY + " integer, " 558c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + MailboxColumns.TYPE + " integer, " 559c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + MailboxColumns.DELIMITER + " integer, " 560c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + MailboxColumns.SYNC_KEY + " text, " 561c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + MailboxColumns.SYNC_LOOKBACK + " integer, " 562c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + MailboxColumns.SYNC_INTERVAL + " integer, " 563c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + MailboxColumns.SYNC_TIME + " integer, " 564c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + MailboxColumns.UNREAD_COUNT + " integer, " 565c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + MailboxColumns.FLAG_VISIBLE + " integer, " 566c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + MailboxColumns.FLAGS + " integer, " 567c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + MailboxColumns.VISIBLE_LIMIT + " integer, " 568c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + MailboxColumns.SYNC_STATUS + " text, " 569c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + MailboxColumns.MESSAGE_COUNT + " integer not null default 0, " 570c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + MailboxColumns.LAST_TOUCHED_TIME + " integer default 0, " 571c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + MailboxColumns.UI_SYNC_STATUS + " integer default 0, " 572c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + MailboxColumns.UI_LAST_SYNC_RESULT + " integer default 0, " 573c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + MailboxColumns.LAST_NOTIFIED_MESSAGE_KEY + " integer not null default 0, " 574c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + MailboxColumns.LAST_NOTIFIED_MESSAGE_COUNT + " integer not null default 0, " 575c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + MailboxColumns.TOTAL_COUNT + " integer, " 576c75f5880ab70d9f4938727587696b864bb4ea02aMartin Hibdon + MailboxColumns.HIERARCHICAL_NAME + " text, " 577c75f5880ab70d9f4938727587696b864bb4ea02aMartin Hibdon + MailboxColumns.LAST_FULL_SYNC_TIME + " integer" 578c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + ");"; 579c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("create table " + Mailbox.TABLE_NAME + s); 580c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("create index mailbox_" + MailboxColumns.SERVER_ID 581c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + " on " + Mailbox.TABLE_NAME + " (" + MailboxColumns.SERVER_ID + ")"); 582c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("create index mailbox_" + MailboxColumns.ACCOUNT_KEY 583c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + " on " + Mailbox.TABLE_NAME + " (" + MailboxColumns.ACCOUNT_KEY + ")"); 584c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Deleting a Mailbox deletes associated Messages in all three tables 585c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL(TRIGGER_MAILBOX_DELETE); 586c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 587c5afb16430a145f20d7c887e45f47b38687054daMarc Blank 588c5afb16430a145f20d7c887e45f47b38687054daMarc Blank static void resetMailboxTable(SQLiteDatabase db, int oldVersion, int newVersion) { 589c5afb16430a145f20d7c887e45f47b38687054daMarc Blank try { 590c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("drop table " + Mailbox.TABLE_NAME); 591c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } catch (SQLException e) { 592c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 593c5afb16430a145f20d7c887e45f47b38687054daMarc Blank createMailboxTable(db); 594c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 595c5afb16430a145f20d7c887e45f47b38687054daMarc Blank 596c5afb16430a145f20d7c887e45f47b38687054daMarc Blank static void createAttachmentTable(SQLiteDatabase db) { 597c5afb16430a145f20d7c887e45f47b38687054daMarc Blank String s = " (" + EmailContent.RECORD_ID + " integer primary key autoincrement, " 598c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + AttachmentColumns.FILENAME + " text, " 599c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + AttachmentColumns.MIME_TYPE + " text, " 600c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + AttachmentColumns.SIZE + " integer, " 601c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + AttachmentColumns.CONTENT_ID + " text, " 602c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + AttachmentColumns.CONTENT_URI + " text, " 603c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + AttachmentColumns.MESSAGE_KEY + " integer, " 604c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + AttachmentColumns.LOCATION + " text, " 605c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + AttachmentColumns.ENCODING + " text, " 606c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + AttachmentColumns.CONTENT + " text, " 607c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + AttachmentColumns.FLAGS + " integer, " 608c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + AttachmentColumns.CONTENT_BYTES + " blob, " 609c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + AttachmentColumns.ACCOUNT_KEY + " integer, " 610c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + AttachmentColumns.UI_STATE + " integer, " 611c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + AttachmentColumns.UI_DESTINATION + " integer, " 6129a95253846ccc7a94dd7d4c618ec2d808e2a4000Paul Westbrook + AttachmentColumns.UI_DOWNLOADED_SIZE + " integer, " 6139a95253846ccc7a94dd7d4c618ec2d808e2a4000Paul Westbrook + AttachmentColumns.CACHED_FILE + " text" 614c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + ");"; 615c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("create table " + Attachment.TABLE_NAME + s); 616c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL(createIndex(Attachment.TABLE_NAME, AttachmentColumns.MESSAGE_KEY)); 617c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 618c5afb16430a145f20d7c887e45f47b38687054daMarc Blank 619c5afb16430a145f20d7c887e45f47b38687054daMarc Blank static void resetAttachmentTable(SQLiteDatabase db, int oldVersion, int newVersion) { 620c5afb16430a145f20d7c887e45f47b38687054daMarc Blank try { 621c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("drop table " + Attachment.TABLE_NAME); 622c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } catch (SQLException e) { 623c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 624c5afb16430a145f20d7c887e45f47b38687054daMarc Blank createAttachmentTable(db); 625c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 626c5afb16430a145f20d7c887e45f47b38687054daMarc Blank 627c5afb16430a145f20d7c887e45f47b38687054daMarc Blank static void createQuickResponseTable(SQLiteDatabase db) { 628c5afb16430a145f20d7c887e45f47b38687054daMarc Blank String s = " (" + EmailContent.RECORD_ID + " integer primary key autoincrement, " 629c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + QuickResponseColumns.TEXT + " text, " 630c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + QuickResponseColumns.ACCOUNT_KEY + " integer" 631c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + ");"; 632c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("create table " + QuickResponse.TABLE_NAME + s); 633c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 634c5afb16430a145f20d7c887e45f47b38687054daMarc Blank 635c5afb16430a145f20d7c887e45f47b38687054daMarc Blank static void createBodyTable(SQLiteDatabase db) { 636c5afb16430a145f20d7c887e45f47b38687054daMarc Blank String s = " (" + EmailContent.RECORD_ID + " integer primary key autoincrement, " 637c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + BodyColumns.MESSAGE_KEY + " integer, " 638c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + BodyColumns.HTML_CONTENT + " text, " 639c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + BodyColumns.TEXT_CONTENT + " text, " 640c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + BodyColumns.HTML_REPLY + " text, " 641c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + BodyColumns.TEXT_REPLY + " text, " 642c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + BodyColumns.SOURCE_MESSAGE_KEY + " text, " 643c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + BodyColumns.INTRO_TEXT + " text, " 644c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + BodyColumns.QUOTED_TEXT_START_POS + " integer" 645c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + ");"; 646c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("create table " + Body.TABLE_NAME + s); 647c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL(createIndex(Body.TABLE_NAME, BodyColumns.MESSAGE_KEY)); 648c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 649c5afb16430a145f20d7c887e45f47b38687054daMarc Blank 650c5afb16430a145f20d7c887e45f47b38687054daMarc Blank static void upgradeBodyTable(SQLiteDatabase db, int oldVersion, int newVersion) { 651c5afb16430a145f20d7c887e45f47b38687054daMarc Blank if (oldVersion < 5) { 652c5afb16430a145f20d7c887e45f47b38687054daMarc Blank try { 653c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("drop table " + Body.TABLE_NAME); 654c5afb16430a145f20d7c887e45f47b38687054daMarc Blank createBodyTable(db); 655c5afb16430a145f20d7c887e45f47b38687054daMarc Blank oldVersion = 5; 656c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } catch (SQLException e) { 657c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 658c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 659c5afb16430a145f20d7c887e45f47b38687054daMarc Blank if (oldVersion == 5) { 660c5afb16430a145f20d7c887e45f47b38687054daMarc Blank try { 661c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("alter table " + Body.TABLE_NAME 662c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + " add " + BodyColumns.INTRO_TEXT + " text"); 663c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } catch (SQLException e) { 664c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Shouldn't be needed unless we're debugging and interrupt the process 665560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy LogUtils.w(TAG, "Exception upgrading EmailProviderBody.db from v5 to v6", e); 666c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 667c5afb16430a145f20d7c887e45f47b38687054daMarc Blank oldVersion = 6; 668c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 669c5afb16430a145f20d7c887e45f47b38687054daMarc Blank if (oldVersion == 6 || oldVersion == 7) { 670c5afb16430a145f20d7c887e45f47b38687054daMarc Blank try { 671c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("alter table " + Body.TABLE_NAME 672c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + " add " + BodyColumns.QUOTED_TEXT_START_POS + " integer"); 673c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } catch (SQLException e) { 674c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Shouldn't be needed unless we're debugging and interrupt the process 675560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy LogUtils.w(TAG, "Exception upgrading EmailProviderBody.db from v6 to v8", e); 676c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 677c5afb16430a145f20d7c887e45f47b38687054daMarc Blank oldVersion = 8; 678c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 679c5afb16430a145f20d7c887e45f47b38687054daMarc Blank if (oldVersion == 8) { 680c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Move to Email2 version 681c5afb16430a145f20d7c887e45f47b38687054daMarc Blank oldVersion = 100; 682c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 683c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 684c5afb16430a145f20d7c887e45f47b38687054daMarc Blank 685c5afb16430a145f20d7c887e45f47b38687054daMarc Blank protected static class BodyDatabaseHelper extends SQLiteOpenHelper { 686c5afb16430a145f20d7c887e45f47b38687054daMarc Blank BodyDatabaseHelper(Context context, String name) { 687c5afb16430a145f20d7c887e45f47b38687054daMarc Blank super(context, name, null, BODY_DATABASE_VERSION); 688c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 689c5afb16430a145f20d7c887e45f47b38687054daMarc Blank 690c5afb16430a145f20d7c887e45f47b38687054daMarc Blank @Override 691c5afb16430a145f20d7c887e45f47b38687054daMarc Blank public void onCreate(SQLiteDatabase db) { 692560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy LogUtils.d(TAG, "Creating EmailProviderBody database"); 693c5afb16430a145f20d7c887e45f47b38687054daMarc Blank createBodyTable(db); 694c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 695c5afb16430a145f20d7c887e45f47b38687054daMarc Blank 696c5afb16430a145f20d7c887e45f47b38687054daMarc Blank @Override 697c5afb16430a145f20d7c887e45f47b38687054daMarc Blank public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 698c5afb16430a145f20d7c887e45f47b38687054daMarc Blank upgradeBodyTable(db, oldVersion, newVersion); 699c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 700c5afb16430a145f20d7c887e45f47b38687054daMarc Blank 701c5afb16430a145f20d7c887e45f47b38687054daMarc Blank @Override 702c5afb16430a145f20d7c887e45f47b38687054daMarc Blank public void onOpen(SQLiteDatabase db) { 703c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 704c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 705c5afb16430a145f20d7c887e45f47b38687054daMarc Blank 706c5afb16430a145f20d7c887e45f47b38687054daMarc Blank /** Counts the number of messages in each mailbox, and updates the message count column. */ 707c5afb16430a145f20d7c887e45f47b38687054daMarc Blank @VisibleForTesting 708c5afb16430a145f20d7c887e45f47b38687054daMarc Blank static void recalculateMessageCount(SQLiteDatabase db) { 709c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("update " + Mailbox.TABLE_NAME + " set " + MailboxColumns.MESSAGE_COUNT + 710c5afb16430a145f20d7c887e45f47b38687054daMarc Blank "= (select count(*) from " + Message.TABLE_NAME + 711c5afb16430a145f20d7c887e45f47b38687054daMarc Blank " where " + Message.MAILBOX_KEY + " = " + 712c5afb16430a145f20d7c887e45f47b38687054daMarc Blank Mailbox.TABLE_NAME + "." + EmailContent.RECORD_ID + ")"); 713c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 714c5afb16430a145f20d7c887e45f47b38687054daMarc Blank 715c5afb16430a145f20d7c887e45f47b38687054daMarc Blank protected static class DatabaseHelper extends SQLiteOpenHelper { 716c5afb16430a145f20d7c887e45f47b38687054daMarc Blank Context mContext; 717c5afb16430a145f20d7c887e45f47b38687054daMarc Blank 718c5afb16430a145f20d7c887e45f47b38687054daMarc Blank DatabaseHelper(Context context, String name) { 719c5afb16430a145f20d7c887e45f47b38687054daMarc Blank super(context, name, null, DATABASE_VERSION); 720c5afb16430a145f20d7c887e45f47b38687054daMarc Blank mContext = context; 721c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 722c5afb16430a145f20d7c887e45f47b38687054daMarc Blank 723c5afb16430a145f20d7c887e45f47b38687054daMarc Blank @Override 724c5afb16430a145f20d7c887e45f47b38687054daMarc Blank public void onCreate(SQLiteDatabase db) { 725560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy LogUtils.d(TAG, "Creating EmailProvider database"); 726c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Create all tables here; each class has its own method 72713ff5b86ac9314bbce09ae9e4ec381b6273a497bMartin Hibdon createMessageTable(mContext, db); 728c5afb16430a145f20d7c887e45f47b38687054daMarc Blank createAttachmentTable(db); 729c5afb16430a145f20d7c887e45f47b38687054daMarc Blank createMailboxTable(db); 730c5afb16430a145f20d7c887e45f47b38687054daMarc Blank createHostAuthTable(db); 731c5afb16430a145f20d7c887e45f47b38687054daMarc Blank createAccountTable(db); 732ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu createMessageMoveTable(db); 733ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu createMessageStateChangeTable(db); 734c5afb16430a145f20d7c887e45f47b38687054daMarc Blank createPolicyTable(db); 735c5afb16430a145f20d7c887e45f47b38687054daMarc Blank createQuickResponseTable(db); 736c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 737c5afb16430a145f20d7c887e45f47b38687054daMarc Blank 73854347010fbbdd3ae1dea5b0e282514c640e16a5fMarc Blank @Override 739c5afb16430a145f20d7c887e45f47b38687054daMarc Blank public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) { 740c5afb16430a145f20d7c887e45f47b38687054daMarc Blank if (oldVersion == 101 && newVersion == 100) { 741560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy LogUtils.d(TAG, "Downgrade from v101 to v100"); 742c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } else { 743c5afb16430a145f20d7c887e45f47b38687054daMarc Blank super.onDowngrade(db, oldVersion, newVersion); 744c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 745c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 746c5afb16430a145f20d7c887e45f47b38687054daMarc Blank 747c5afb16430a145f20d7c887e45f47b38687054daMarc Blank @Override 748c5afb16430a145f20d7c887e45f47b38687054daMarc Blank @SuppressWarnings("deprecation") 749c5afb16430a145f20d7c887e45f47b38687054daMarc Blank public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 750c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // For versions prior to 5, delete all data 751c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Versions >= 5 require that data be preserved! 752c5afb16430a145f20d7c887e45f47b38687054daMarc Blank if (oldVersion < 5) { 753c5afb16430a145f20d7c887e45f47b38687054daMarc Blank android.accounts.Account[] accounts = AccountManager.get(mContext) 75413ff5b86ac9314bbce09ae9e4ec381b6273a497bMartin Hibdon .getAccountsByType(LEGACY_SCHEME_EAS); 755c5afb16430a145f20d7c887e45f47b38687054daMarc Blank for (android.accounts.Account account: accounts) { 756c5afb16430a145f20d7c887e45f47b38687054daMarc Blank AccountManager.get(mContext).removeAccount(account, null, null); 757c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 75813ff5b86ac9314bbce09ae9e4ec381b6273a497bMartin Hibdon resetMessageTable(mContext, db, oldVersion, newVersion); 759c5afb16430a145f20d7c887e45f47b38687054daMarc Blank resetAttachmentTable(db, oldVersion, newVersion); 760c5afb16430a145f20d7c887e45f47b38687054daMarc Blank resetMailboxTable(db, oldVersion, newVersion); 761c5afb16430a145f20d7c887e45f47b38687054daMarc Blank resetHostAuthTable(db, oldVersion, newVersion); 762c5afb16430a145f20d7c887e45f47b38687054daMarc Blank resetAccountTable(db, oldVersion, newVersion); 763c5afb16430a145f20d7c887e45f47b38687054daMarc Blank return; 764c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 765c5afb16430a145f20d7c887e45f47b38687054daMarc Blank if (oldVersion == 5) { 766c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Message Tables: Add SyncColumns.SERVER_TIMESTAMP 767c5afb16430a145f20d7c887e45f47b38687054daMarc Blank try { 768c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("alter table " + Message.TABLE_NAME 769c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + " add column " + SyncColumns.SERVER_TIMESTAMP + " integer" + ";"); 770c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("alter table " + Message.UPDATED_TABLE_NAME 771c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + " add column " + SyncColumns.SERVER_TIMESTAMP + " integer" + ";"); 772c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("alter table " + Message.DELETED_TABLE_NAME 773c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + " add column " + SyncColumns.SERVER_TIMESTAMP + " integer" + ";"); 774c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } catch (SQLException e) { 775c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Shouldn't be needed unless we're debugging and interrupt the process 776560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy LogUtils.w(TAG, "Exception upgrading EmailProvider.db from v5 to v6", e); 777c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 778c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 779e54d6957dbbd14d35a1858cb02959fd8f9bb0d37Tony Mantler // TODO: Change all these to strict inequalities 7805ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu if (oldVersion <= 6) { 781c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Use the newer mailbox_delete trigger 782c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("drop trigger mailbox_delete;"); 783c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL(TRIGGER_MAILBOX_DELETE); 784c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 7855ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu if (oldVersion <= 7) { 786c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // add the security (provisioning) column 787c5afb16430a145f20d7c887e45f47b38687054daMarc Blank try { 788c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("alter table " + Account.TABLE_NAME 789c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + " add column " + AccountColumns.SECURITY_FLAGS + " integer" + ";"); 790c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } catch (SQLException e) { 791c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Shouldn't be needed unless we're debugging and interrupt the process 792560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy LogUtils.w(TAG, "Exception upgrading EmailProvider.db from 7 to 8 " + e); 793c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 794c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 7955ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu if (oldVersion <= 8) { 796c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // accounts: add security sync key & user signature columns 797c5afb16430a145f20d7c887e45f47b38687054daMarc Blank try { 798c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("alter table " + Account.TABLE_NAME 799c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + " add column " + AccountColumns.SECURITY_SYNC_KEY + " text" + ";"); 800c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("alter table " + Account.TABLE_NAME 801c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + " add column " + AccountColumns.SIGNATURE + " text" + ";"); 802c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } catch (SQLException e) { 803c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Shouldn't be needed unless we're debugging and interrupt the process 804560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy LogUtils.w(TAG, "Exception upgrading EmailProvider.db from 8 to 9 " + e); 805c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 806c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 8075ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu if (oldVersion <= 9) { 808c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Message: add meeting info column into Message tables 809c5afb16430a145f20d7c887e45f47b38687054daMarc Blank try { 810c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("alter table " + Message.TABLE_NAME 811c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + " add column " + MessageColumns.MEETING_INFO + " text" + ";"); 812c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("alter table " + Message.UPDATED_TABLE_NAME 813c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + " add column " + MessageColumns.MEETING_INFO + " text" + ";"); 814c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("alter table " + Message.DELETED_TABLE_NAME 815c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + " add column " + MessageColumns.MEETING_INFO + " text" + ";"); 816c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } catch (SQLException e) { 817c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Shouldn't be needed unless we're debugging and interrupt the process 818560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy LogUtils.w(TAG, "Exception upgrading EmailProvider.db from 9 to 10 " + e); 819c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 820c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 8215ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu if (oldVersion <= 10) { 822c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Attachment: add content and flags columns 823c5afb16430a145f20d7c887e45f47b38687054daMarc Blank try { 824c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("alter table " + Attachment.TABLE_NAME 825c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + " add column " + AttachmentColumns.CONTENT + " text" + ";"); 826c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("alter table " + Attachment.TABLE_NAME 827c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + " add column " + AttachmentColumns.FLAGS + " integer" + ";"); 828c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } catch (SQLException e) { 829c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Shouldn't be needed unless we're debugging and interrupt the process 830560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy LogUtils.w(TAG, "Exception upgrading EmailProvider.db from 10 to 11 " + e); 831c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 832c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 8335ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu if (oldVersion <= 11) { 834c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Attachment: add content_bytes 835c5afb16430a145f20d7c887e45f47b38687054daMarc Blank try { 836c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("alter table " + Attachment.TABLE_NAME 837c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + " add column " + AttachmentColumns.CONTENT_BYTES + " blob" + ";"); 838c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } catch (SQLException e) { 839c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Shouldn't be needed unless we're debugging and interrupt the process 840560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy LogUtils.w(TAG, "Exception upgrading EmailProvider.db from 11 to 12 " + e); 841c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 842c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 8435ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu if (oldVersion <= 12) { 844c5afb16430a145f20d7c887e45f47b38687054daMarc Blank try { 845c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("alter table " + Mailbox.TABLE_NAME 846c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + " add column " + Mailbox.MESSAGE_COUNT 847c5afb16430a145f20d7c887e45f47b38687054daMarc Blank +" integer not null default 0" + ";"); 848c5afb16430a145f20d7c887e45f47b38687054daMarc Blank recalculateMessageCount(db); 849c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } catch (SQLException e) { 850c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Shouldn't be needed unless we're debugging and interrupt the process 851560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy LogUtils.w(TAG, "Exception upgrading EmailProvider.db from 12 to 13 " + e); 852c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 853c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 8545ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu if (oldVersion <= 13) { 855c5afb16430a145f20d7c887e45f47b38687054daMarc Blank try { 856c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("alter table " + Message.TABLE_NAME 857c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + " add column " + Message.SNIPPET 858c5afb16430a145f20d7c887e45f47b38687054daMarc Blank +" text" + ";"); 859c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } catch (SQLException e) { 860c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Shouldn't be needed unless we're debugging and interrupt the process 861560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy LogUtils.w(TAG, "Exception upgrading EmailProvider.db from 13 to 14 " + e); 862c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 863c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 8645ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu if (oldVersion <= 14) { 865c5afb16430a145f20d7c887e45f47b38687054daMarc Blank try { 866c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("alter table " + Message.DELETED_TABLE_NAME 867c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + " add column " + Message.SNIPPET +" text" + ";"); 868c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("alter table " + Message.UPDATED_TABLE_NAME 869c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + " add column " + Message.SNIPPET +" text" + ";"); 870c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } catch (SQLException e) { 871c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Shouldn't be needed unless we're debugging and interrupt the process 872560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy LogUtils.w(TAG, "Exception upgrading EmailProvider.db from 14 to 15 " + e); 873c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 874c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 8755ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu if (oldVersion <= 15) { 876c5afb16430a145f20d7c887e45f47b38687054daMarc Blank try { 877c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("alter table " + Attachment.TABLE_NAME 878c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + " add column " + Attachment.ACCOUNT_KEY +" integer" + ";"); 879c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Update all existing attachments to add the accountKey data 880c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("update " + Attachment.TABLE_NAME + " set " + 881c5afb16430a145f20d7c887e45f47b38687054daMarc Blank Attachment.ACCOUNT_KEY + "= (SELECT " + Message.TABLE_NAME + "." + 882c5afb16430a145f20d7c887e45f47b38687054daMarc Blank Message.ACCOUNT_KEY + " from " + Message.TABLE_NAME + " where " + 883c5afb16430a145f20d7c887e45f47b38687054daMarc Blank Message.TABLE_NAME + "." + Message.RECORD_ID + " = " + 884c5afb16430a145f20d7c887e45f47b38687054daMarc Blank Attachment.TABLE_NAME + "." + Attachment.MESSAGE_KEY + ")"); 885c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } catch (SQLException e) { 886c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Shouldn't be needed unless we're debugging and interrupt the process 887560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy LogUtils.w(TAG, "Exception upgrading EmailProvider.db from 15 to 16 " + e); 888c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 889c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 8905ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu if (oldVersion <= 16) { 891c5afb16430a145f20d7c887e45f47b38687054daMarc Blank try { 892c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("alter table " + Mailbox.TABLE_NAME 893c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + " add column " + Mailbox.PARENT_KEY + " integer;"); 894c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } catch (SQLException e) { 895c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Shouldn't be needed unless we're debugging and interrupt the process 896560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy LogUtils.w(TAG, "Exception upgrading EmailProvider.db from 16 to 17 " + e); 897c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 898c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 8995ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu if (oldVersion <= 17) { 900c5afb16430a145f20d7c887e45f47b38687054daMarc Blank upgradeFromVersion17ToVersion18(db); 901c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 9025ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu if (oldVersion <= 18) { 903c5afb16430a145f20d7c887e45f47b38687054daMarc Blank try { 904c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("alter table " + Account.TABLE_NAME 905c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + " add column " + Account.POLICY_KEY + " integer;"); 906c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("drop trigger account_delete;"); 907c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL(TRIGGER_ACCOUNT_DELETE); 908c5afb16430a145f20d7c887e45f47b38687054daMarc Blank createPolicyTable(db); 909c5afb16430a145f20d7c887e45f47b38687054daMarc Blank convertPolicyFlagsToPolicyTable(db); 910c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } catch (SQLException e) { 911c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Shouldn't be needed unless we're debugging and interrupt the process 912560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy LogUtils.w(TAG, "Exception upgrading EmailProvider.db from 18 to 19 " + e); 913c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 914c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 9155ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu if (oldVersion <= 19) { 916c5afb16430a145f20d7c887e45f47b38687054daMarc Blank try { 917c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("alter table " + Policy.TABLE_NAME 918c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + " add column " + PolicyColumns.REQUIRE_MANUAL_SYNC_WHEN_ROAMING + 919c5afb16430a145f20d7c887e45f47b38687054daMarc Blank " integer;"); 920c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("alter table " + Policy.TABLE_NAME 921c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + " add column " + PolicyColumns.DONT_ALLOW_CAMERA + " integer;"); 922c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("alter table " + Policy.TABLE_NAME 923c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + " add column " + PolicyColumns.DONT_ALLOW_ATTACHMENTS + " integer;"); 924c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("alter table " + Policy.TABLE_NAME 925c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + " add column " + PolicyColumns.DONT_ALLOW_HTML + " integer;"); 926c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("alter table " + Policy.TABLE_NAME 927c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + " add column " + PolicyColumns.MAX_ATTACHMENT_SIZE + " integer;"); 928c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("alter table " + Policy.TABLE_NAME 929c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + " add column " + PolicyColumns.MAX_TEXT_TRUNCATION_SIZE + 930c5afb16430a145f20d7c887e45f47b38687054daMarc Blank " integer;"); 931c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("alter table " + Policy.TABLE_NAME 932c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + " add column " + PolicyColumns.MAX_HTML_TRUNCATION_SIZE + 933c5afb16430a145f20d7c887e45f47b38687054daMarc Blank " integer;"); 934c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("alter table " + Policy.TABLE_NAME 935c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + " add column " + PolicyColumns.MAX_EMAIL_LOOKBACK + " integer;"); 936c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("alter table " + Policy.TABLE_NAME 937c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + " add column " + PolicyColumns.MAX_CALENDAR_LOOKBACK + " integer;"); 938c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("alter table " + Policy.TABLE_NAME 939c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + " add column " + PolicyColumns.PASSWORD_RECOVERY_ENABLED + 940c5afb16430a145f20d7c887e45f47b38687054daMarc Blank " integer;"); 941c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } catch (SQLException e) { 942c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Shouldn't be needed unless we're debugging and interrupt the process 943560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy LogUtils.w(TAG, "Exception upgrading EmailProvider.db from 19 to 20 " + e); 944c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 945c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 9465ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu if (oldVersion <= 21) { 947c5afb16430a145f20d7c887e45f47b38687054daMarc Blank upgradeFromVersion21ToVersion22(db, mContext); 948c5afb16430a145f20d7c887e45f47b38687054daMarc Blank oldVersion = 22; 949c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 9505ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu if (oldVersion <= 22) { 951c5afb16430a145f20d7c887e45f47b38687054daMarc Blank upgradeFromVersion22ToVersion23(db); 952c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 9535ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu if (oldVersion <= 23) { 954c5afb16430a145f20d7c887e45f47b38687054daMarc Blank upgradeFromVersion23ToVersion24(db); 955c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 9565ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu if (oldVersion <= 24) { 957c5afb16430a145f20d7c887e45f47b38687054daMarc Blank upgradeFromVersion24ToVersion25(db); 958c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 9595ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu if (oldVersion <= 25) { 960c5afb16430a145f20d7c887e45f47b38687054daMarc Blank upgradeFromVersion25ToVersion26(db); 961c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 9625ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu if (oldVersion <= 26) { 963c5afb16430a145f20d7c887e45f47b38687054daMarc Blank try { 964c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("alter table " + Message.TABLE_NAME 965c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + " add column " + Message.PROTOCOL_SEARCH_INFO + " text;"); 966c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("alter table " + Message.DELETED_TABLE_NAME 967c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + " add column " + Message.PROTOCOL_SEARCH_INFO +" text" + ";"); 968c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("alter table " + Message.UPDATED_TABLE_NAME 969c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + " add column " + Message.PROTOCOL_SEARCH_INFO +" text" + ";"); 970c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } catch (SQLException e) { 971c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Shouldn't be needed unless we're debugging and interrupt the process 972560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy LogUtils.w(TAG, "Exception upgrading EmailProvider.db from 26 to 27 " + e); 973c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 974c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 9755ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu if (oldVersion <= 28) { 976c5afb16430a145f20d7c887e45f47b38687054daMarc Blank try { 977c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("alter table " + Policy.TABLE_NAME 978c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + " add column " + Policy.PROTOCOL_POLICIES_ENFORCED + " text;"); 979c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("alter table " + Policy.TABLE_NAME 980c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + " add column " + Policy.PROTOCOL_POLICIES_UNSUPPORTED + " text;"); 981c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } catch (SQLException e) { 982c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Shouldn't be needed unless we're debugging and interrupt the process 983560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy LogUtils.w(TAG, "Exception upgrading EmailProvider.db from 28 to 29 " + e); 984c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 985c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 9865ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu if (oldVersion <= 29) { 987c5afb16430a145f20d7c887e45f47b38687054daMarc Blank upgradeFromVersion29ToVersion30(db); 988c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 9895ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu if (oldVersion <= 30) { 990c5afb16430a145f20d7c887e45f47b38687054daMarc Blank try { 991c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("alter table " + Mailbox.TABLE_NAME 992c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + " add column " + Mailbox.UI_SYNC_STATUS + " integer;"); 993c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("alter table " + Mailbox.TABLE_NAME 994c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + " add column " + Mailbox.UI_LAST_SYNC_RESULT + " integer;"); 995c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } catch (SQLException e) { 996c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Shouldn't be needed unless we're debugging and interrupt the process 997560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy LogUtils.w(TAG, "Exception upgrading EmailProvider.db from 30 to 31 " + e); 998c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 999c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 10005ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu if (oldVersion <= 31) { 1001c5afb16430a145f20d7c887e45f47b38687054daMarc Blank try { 1002c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("alter table " + Mailbox.TABLE_NAME 1003c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + " add column " + Mailbox.LAST_NOTIFIED_MESSAGE_KEY + " integer;"); 1004c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("alter table " + Mailbox.TABLE_NAME 1005c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + " add column " + Mailbox.LAST_NOTIFIED_MESSAGE_COUNT + " integer;"); 1006c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("update Mailbox set " + Mailbox.LAST_NOTIFIED_MESSAGE_KEY + 1007c5afb16430a145f20d7c887e45f47b38687054daMarc Blank "=0 where " + Mailbox.LAST_NOTIFIED_MESSAGE_KEY + " IS NULL"); 1008c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("update Mailbox set " + Mailbox.LAST_NOTIFIED_MESSAGE_COUNT + 1009c5afb16430a145f20d7c887e45f47b38687054daMarc Blank "=0 where " + Mailbox.LAST_NOTIFIED_MESSAGE_COUNT + " IS NULL"); 1010c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } catch (SQLException e) { 1011c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Shouldn't be needed unless we're debugging and interrupt the process 1012560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy LogUtils.w(TAG, "Exception upgrading EmailProvider.db from 31 to 32 " + e); 1013c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 1014c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 10155ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu if (oldVersion <= 32) { 1016c5afb16430a145f20d7c887e45f47b38687054daMarc Blank try { 1017c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("alter table " + Attachment.TABLE_NAME 1018c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + " add column " + Attachment.UI_STATE + " integer;"); 1019c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("alter table " + Attachment.TABLE_NAME 1020c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + " add column " + Attachment.UI_DESTINATION + " integer;"); 1021c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("alter table " + Attachment.TABLE_NAME 1022c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + " add column " + Attachment.UI_DOWNLOADED_SIZE + " integer;"); 1023c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // If we have a contentUri then the attachment is saved 1024c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // uiDestination of 0 = "cache", so we don't have to set this 1025c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("update " + Attachment.TABLE_NAME + " set " + Attachment.UI_STATE + 1026c5afb16430a145f20d7c887e45f47b38687054daMarc Blank "=" + UIProvider.AttachmentState.SAVED + " where " + 1027c5afb16430a145f20d7c887e45f47b38687054daMarc Blank AttachmentColumns.CONTENT_URI + " is not null;"); 1028c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } catch (SQLException e) { 1029c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Shouldn't be needed unless we're debugging and interrupt the process 1030560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy LogUtils.w(TAG, "Exception upgrading EmailProvider.db from 32 to 33 " + e); 1031c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 1032c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 10335ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu if (oldVersion <= 33) { 1034c5afb16430a145f20d7c887e45f47b38687054daMarc Blank try { 1035c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("alter table " + Mailbox.TABLE_NAME 1036c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + " add column " + MailboxColumns.TOTAL_COUNT + " integer;"); 1037c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } catch (SQLException e) { 1038c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Shouldn't be needed unless we're debugging and interrupt the process 1039560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy LogUtils.w(TAG, "Exception upgrading EmailProvider.db from 33 to 34 " + e); 1040c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 1041c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 10425ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu if (oldVersion <= 34) { 1043c5afb16430a145f20d7c887e45f47b38687054daMarc Blank try { 1044c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("update " + Mailbox.TABLE_NAME + " set " + 1045c5afb16430a145f20d7c887e45f47b38687054daMarc Blank MailboxColumns.LAST_TOUCHED_TIME + " = " + 1046c5afb16430a145f20d7c887e45f47b38687054daMarc Blank Mailbox.DRAFTS_DEFAULT_TOUCH_TIME + " WHERE " + MailboxColumns.TYPE + 1047c5afb16430a145f20d7c887e45f47b38687054daMarc Blank " = " + Mailbox.TYPE_DRAFTS); 1048c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("update " + Mailbox.TABLE_NAME + " set " + 1049c5afb16430a145f20d7c887e45f47b38687054daMarc Blank MailboxColumns.LAST_TOUCHED_TIME + " = " + 1050c5afb16430a145f20d7c887e45f47b38687054daMarc Blank Mailbox.SENT_DEFAULT_TOUCH_TIME + " WHERE " + MailboxColumns.TYPE + 1051c5afb16430a145f20d7c887e45f47b38687054daMarc Blank " = " + Mailbox.TYPE_SENT); 1052c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } catch (SQLException e) { 1053c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Shouldn't be needed unless we're debugging and interrupt the process 1054560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy LogUtils.w(TAG, "Exception upgrading EmailProvider.db from 34 to 35 " + e); 1055c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 1056c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 10575ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu if (oldVersion <= 36) { 1058c5afb16430a145f20d7c887e45f47b38687054daMarc Blank try { 1059c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Set "supports settings" for EAS mailboxes 1060c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("update " + Mailbox.TABLE_NAME + " set " + 1061c5afb16430a145f20d7c887e45f47b38687054daMarc Blank MailboxColumns.FLAGS + "=" + MailboxColumns.FLAGS + "|" + 1062c5afb16430a145f20d7c887e45f47b38687054daMarc Blank Mailbox.FLAG_SUPPORTS_SETTINGS + " where (" + 1063c5afb16430a145f20d7c887e45f47b38687054daMarc Blank MailboxColumns.FLAGS + "&" + Mailbox.FLAG_HOLDS_MAIL + ")!=0 and " + 1064c5afb16430a145f20d7c887e45f47b38687054daMarc Blank MailboxColumns.ACCOUNT_KEY + " IN (SELECT " + Account.TABLE_NAME + 1065c5afb16430a145f20d7c887e45f47b38687054daMarc Blank "." + AccountColumns.ID + " from " + Account.TABLE_NAME + "," + 1066c5afb16430a145f20d7c887e45f47b38687054daMarc Blank HostAuth.TABLE_NAME + " where " + Account.TABLE_NAME + "." + 1067c5afb16430a145f20d7c887e45f47b38687054daMarc Blank AccountColumns.HOST_AUTH_KEY_RECV + "=" + HostAuth.TABLE_NAME + "." + 1068c5afb16430a145f20d7c887e45f47b38687054daMarc Blank HostAuthColumns.ID + " and " + HostAuthColumns.PROTOCOL + "='" + 106954347010fbbdd3ae1dea5b0e282514c640e16a5fMarc Blank LEGACY_SCHEME_EAS + "')"); 1070c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } catch (SQLException e) { 1071c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Shouldn't be needed unless we're debugging and interrupt the process 1072560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy LogUtils.w(TAG, "Exception upgrading EmailProvider.db from 35 to 36 " + e); 1073c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 1074c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 10755ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu if (oldVersion <= 37) { 1076c5afb16430a145f20d7c887e45f47b38687054daMarc Blank try { 1077c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("alter table " + Message.TABLE_NAME 1078c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + " add column " + MessageColumns.THREAD_TOPIC + " text;"); 1079c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } catch (SQLException e) { 1080c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Shouldn't be needed unless we're debugging and interrupt the process 1081560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy LogUtils.w(TAG, "Exception upgrading EmailProvider.db from 37 to 38 " + e); 1082c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 1083c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 10845ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu if (oldVersion <= 38) { 1085c5afb16430a145f20d7c887e45f47b38687054daMarc Blank try { 1086c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("alter table " + Message.DELETED_TABLE_NAME 1087c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + " add column " + MessageColumns.THREAD_TOPIC + " text;"); 1088c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("alter table " + Message.UPDATED_TABLE_NAME 1089c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + " add column " + MessageColumns.THREAD_TOPIC + " text;"); 1090c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } catch (SQLException e) { 1091c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Shouldn't be needed unless we're debugging and interrupt the process 1092560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy LogUtils.w(TAG, "Exception upgrading EmailProvider.db from 38 to 39 " + e); 1093c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 1094c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 10955ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu if (oldVersion <= 39) { 1096c5afb16430a145f20d7c887e45f47b38687054daMarc Blank upgradeToEmail2(db); 1097c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 10985ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu if (oldVersion <= 102) { 1099c5afb16430a145f20d7c887e45f47b38687054daMarc Blank try { 1100c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("alter table " + Mailbox.TABLE_NAME 1101c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + " add " + MailboxColumns.HIERARCHICAL_NAME + " text"); 1102c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } catch (SQLException e) { 1103c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Shouldn't be needed unless we're debugging and interrupt the process 1104560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy LogUtils.w(TAG, "Exception upgrading EmailProvider.db from v10x to v103", e); 1105c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 1106c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 11075ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu if (oldVersion <= 103) { 1108c6089bc01f2ae49fb11904a4b4f222811358254fMarc Blank try { 1109c6089bc01f2ae49fb11904a4b4f222811358254fMarc Blank db.execSQL("alter table " + Message.TABLE_NAME 1110c6089bc01f2ae49fb11904a4b4f222811358254fMarc Blank + " add " + MessageColumns.SYNC_DATA + " text"); 1111c6089bc01f2ae49fb11904a4b4f222811358254fMarc Blank } catch (SQLException e) { 1112c6089bc01f2ae49fb11904a4b4f222811358254fMarc Blank // Shouldn't be needed unless we're debugging and interrupt the process 1113560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy LogUtils.w(TAG, "Exception upgrading EmailProvider.db from v103 to v104", e); 1114c6089bc01f2ae49fb11904a4b4f222811358254fMarc Blank } 1115c6089bc01f2ae49fb11904a4b4f222811358254fMarc Blank } 11165ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu if (oldVersion <= 104) { 1117c6089bc01f2ae49fb11904a4b4f222811358254fMarc Blank try { 1118c6089bc01f2ae49fb11904a4b4f222811358254fMarc Blank db.execSQL("alter table " + Message.UPDATED_TABLE_NAME 1119c6089bc01f2ae49fb11904a4b4f222811358254fMarc Blank + " add " + MessageColumns.SYNC_DATA + " text"); 1120c6089bc01f2ae49fb11904a4b4f222811358254fMarc Blank db.execSQL("alter table " + Message.DELETED_TABLE_NAME 1121c6089bc01f2ae49fb11904a4b4f222811358254fMarc Blank + " add " + MessageColumns.SYNC_DATA + " text"); 1122c6089bc01f2ae49fb11904a4b4f222811358254fMarc Blank } catch (SQLException e) { 1123c6089bc01f2ae49fb11904a4b4f222811358254fMarc Blank // Shouldn't be needed unless we're debugging and interrupt the process 1124560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy LogUtils.w(TAG, "Exception upgrading EmailProvider.db from v104 to v105", e); 1125c6089bc01f2ae49fb11904a4b4f222811358254fMarc Blank } 1126c6089bc01f2ae49fb11904a4b4f222811358254fMarc Blank } 11275ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu if (oldVersion <= 105) { 11287d5e2a7c08966ffd4a9e8c78f504cc4fd5be4216Marc Blank try { 11297d5e2a7c08966ffd4a9e8c78f504cc4fd5be4216Marc Blank db.execSQL("alter table " + HostAuth.TABLE_NAME 11307d5e2a7c08966ffd4a9e8c78f504cc4fd5be4216Marc Blank + " add " + HostAuthColumns.SERVER_CERT + " blob"); 11317d5e2a7c08966ffd4a9e8c78f504cc4fd5be4216Marc Blank } catch (SQLException e) { 11327d5e2a7c08966ffd4a9e8c78f504cc4fd5be4216Marc Blank // Shouldn't be needed unless we're debugging and interrupt the process 1133560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy LogUtils.w(TAG, "Exception upgrading EmailProvider.db from v105 to v106", e); 11347d5e2a7c08966ffd4a9e8c78f504cc4fd5be4216Marc Blank } 11357d5e2a7c08966ffd4a9e8c78f504cc4fd5be4216Marc Blank } 11365ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu if (oldVersion <= 106) { 1137b34608228f0b55e401415b67b8150ca9e00cee7dScott Kennedy try { 1138b34608228f0b55e401415b67b8150ca9e00cee7dScott Kennedy db.execSQL("alter table " + Message.TABLE_NAME 1139b34608228f0b55e401415b67b8150ca9e00cee7dScott Kennedy + " add " + MessageColumns.FLAG_SEEN + " integer"); 1140b34608228f0b55e401415b67b8150ca9e00cee7dScott Kennedy db.execSQL("alter table " + Message.UPDATED_TABLE_NAME 1141b34608228f0b55e401415b67b8150ca9e00cee7dScott Kennedy + " add " + MessageColumns.FLAG_SEEN + " integer"); 1142b34608228f0b55e401415b67b8150ca9e00cee7dScott Kennedy db.execSQL("alter table " + Message.DELETED_TABLE_NAME 1143b34608228f0b55e401415b67b8150ca9e00cee7dScott Kennedy + " add " + MessageColumns.FLAG_SEEN + " integer"); 1144b34608228f0b55e401415b67b8150ca9e00cee7dScott Kennedy } catch (SQLException e) { 1145b34608228f0b55e401415b67b8150ca9e00cee7dScott Kennedy // Shouldn't be needed unless we're debugging and interrupt the process 1146560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy LogUtils.w(TAG, "Exception upgrading EmailProvider.db from v106 to v107", e); 1147b34608228f0b55e401415b67b8150ca9e00cee7dScott Kennedy } 1148b34608228f0b55e401415b67b8150ca9e00cee7dScott Kennedy } 11495ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu if (oldVersion <= 107) { 11509a95253846ccc7a94dd7d4c618ec2d808e2a4000Paul Westbrook try { 11519a95253846ccc7a94dd7d4c618ec2d808e2a4000Paul Westbrook db.execSQL("alter table " + Attachment.TABLE_NAME 11529a95253846ccc7a94dd7d4c618ec2d808e2a4000Paul Westbrook + " add column " + Attachment.CACHED_FILE +" text" + ";"); 11539a95253846ccc7a94dd7d4c618ec2d808e2a4000Paul Westbrook } catch (SQLException e) { 11549a95253846ccc7a94dd7d4c618ec2d808e2a4000Paul Westbrook // Shouldn't be needed unless we're debugging and interrupt the process 1155560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy LogUtils.w(TAG, "Exception upgrading EmailProvider.db from v107 to v108", e); 11569a95253846ccc7a94dd7d4c618ec2d808e2a4000Paul Westbrook } 11579a95253846ccc7a94dd7d4c618ec2d808e2a4000Paul Westbrook } 11585ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu if (oldVersion <= 108) { 115932881e8dd375f16e6059452166503f7136f14ae5Paul Westbrook // Migrate the accounts with the correct account type 116032881e8dd375f16e6059452166503f7136f14ae5Paul Westbrook migrateLegacyAccounts(db, mContext); 116132881e8dd375f16e6059452166503f7136f14ae5Paul Westbrook } 11625ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu if (oldVersion <= 109) { 116321b2522d7f6b2bce8fc3382e6e532d4b4df1b140Yu Ping Hu // Fix any mailboxes that have ping or push_hold states. 116421b2522d7f6b2bce8fc3382e6e532d4b4df1b140Yu Ping Hu db.execSQL("update " + Mailbox.TABLE_NAME + " set " + MailboxColumns.SYNC_INTERVAL 116521b2522d7f6b2bce8fc3382e6e532d4b4df1b140Yu Ping Hu + "=" + Mailbox.CHECK_INTERVAL_PUSH + " where " 116621b2522d7f6b2bce8fc3382e6e532d4b4df1b140Yu Ping Hu + MailboxColumns.SYNC_INTERVAL + "<" + Mailbox.CHECK_INTERVAL_PUSH); 116721b2522d7f6b2bce8fc3382e6e532d4b4df1b140Yu Ping Hu 116821b2522d7f6b2bce8fc3382e6e532d4b4df1b140Yu Ping Hu // Fix invalid syncLookback values. 116921b2522d7f6b2bce8fc3382e6e532d4b4df1b140Yu Ping Hu db.execSQL("update " + Account.TABLE_NAME + " set " + AccountColumns.SYNC_LOOKBACK 1170b3cb475fd29f827002b9743822b2a99ff85d1b38Yu Ping Hu + "=" + SyncWindow.SYNC_WINDOW_1_WEEK + " where " 1171b3cb475fd29f827002b9743822b2a99ff85d1b38Yu Ping Hu + AccountColumns.SYNC_LOOKBACK + " is null or " 1172b3cb475fd29f827002b9743822b2a99ff85d1b38Yu Ping Hu + AccountColumns.SYNC_LOOKBACK + "<" + SyncWindow.SYNC_WINDOW_1_DAY + " or " 1173b3cb475fd29f827002b9743822b2a99ff85d1b38Yu Ping Hu + AccountColumns.SYNC_LOOKBACK + ">" + SyncWindow.SYNC_WINDOW_ALL); 1174b3cb475fd29f827002b9743822b2a99ff85d1b38Yu Ping Hu 117521b2522d7f6b2bce8fc3382e6e532d4b4df1b140Yu Ping Hu db.execSQL("update " + Mailbox.TABLE_NAME + " set " + MailboxColumns.SYNC_LOOKBACK 1176b3cb475fd29f827002b9743822b2a99ff85d1b38Yu Ping Hu + "=" + SyncWindow.SYNC_WINDOW_ACCOUNT + " where " 1177b3cb475fd29f827002b9743822b2a99ff85d1b38Yu Ping Hu + MailboxColumns.SYNC_LOOKBACK + " is null or " 1178b3cb475fd29f827002b9743822b2a99ff85d1b38Yu Ping Hu + MailboxColumns.SYNC_LOOKBACK + "<" + SyncWindow.SYNC_WINDOW_1_DAY + " or " 1179b3cb475fd29f827002b9743822b2a99ff85d1b38Yu Ping Hu + MailboxColumns.SYNC_LOOKBACK + ">" + SyncWindow.SYNC_WINDOW_ALL); 1180aa0ca16a27e4a56a029e5cdebf96de5723bd84b6Yu Ping Hu } 11815ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu if (oldVersion <= 110) { 1182a54ee609cdb79ad3abdda2d7180a29617fa38610Yu Ping Hu // Delete account mailboxes. 1183aa0ca16a27e4a56a029e5cdebf96de5723bd84b6Yu Ping Hu db.execSQL("delete from " + Mailbox.TABLE_NAME + " where " + MailboxColumns.TYPE 1184aa0ca16a27e4a56a029e5cdebf96de5723bd84b6Yu Ping Hu + "=" +Mailbox.TYPE_EAS_ACCOUNT_MAILBOX); 1185a54ee609cdb79ad3abdda2d7180a29617fa38610Yu Ping Hu } 11865ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu if (oldVersion <= 111) { 1187a54ee609cdb79ad3abdda2d7180a29617fa38610Yu Ping Hu // Mailbox sync interval now indicates whether this mailbox syncs with the rest 1188a54ee609cdb79ad3abdda2d7180a29617fa38610Yu Ping Hu // of the account. Anyone who was syncing at all, plus outboxes, are set to 1, 1189a54ee609cdb79ad3abdda2d7180a29617fa38610Yu Ping Hu // everyone else is 0. 1190a54ee609cdb79ad3abdda2d7180a29617fa38610Yu Ping Hu db.execSQL("update " + Mailbox.TABLE_NAME + " set " + MailboxColumns.SYNC_INTERVAL 1191a54ee609cdb79ad3abdda2d7180a29617fa38610Yu Ping Hu + "=case when " + MailboxColumns.SYNC_INTERVAL + "=" 1192a54ee609cdb79ad3abdda2d7180a29617fa38610Yu Ping Hu + Mailbox.CHECK_INTERVAL_NEVER + " then 0 else 1 end"); 119321b2522d7f6b2bce8fc3382e6e532d4b4df1b140Yu Ping Hu } 11945ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu if (oldVersion >= 110 && oldVersion <= 112) { 11955ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu // v110 had dropped these triggers, but starting with v113 we restored them 11965ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu // (and altered the 109 -> 110 upgrade code to stop dropping them). 11975ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu // We therefore only add them back for the versions in between. We also need to 11985ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu // compute the correct value at this point as well. 11995ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu recalculateMessageCount(db); 12005ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu createMessageCountTriggers(db); 12015ff368b84573833497764c9d1661cc97717b7094Yu Ping Hu } 1202c75f5880ab70d9f4938727587696b864bb4ea02aMartin Hibdon 1203c75f5880ab70d9f4938727587696b864bb4ea02aMartin Hibdon if (oldVersion <= 113) { 1204c75f5880ab70d9f4938727587696b864bb4ea02aMartin Hibdon try { 1205c75f5880ab70d9f4938727587696b864bb4ea02aMartin Hibdon db.execSQL("alter table " + Mailbox.TABLE_NAME 1206c75f5880ab70d9f4938727587696b864bb4ea02aMartin Hibdon + " add column " + MailboxColumns.LAST_FULL_SYNC_TIME +" integer" + ";"); 120752135c6e8750f19084695cdda78ffe34719c4b6cMartin Hibdon final ContentValues cv = new ContentValues(1); 1208c75f5880ab70d9f4938727587696b864bb4ea02aMartin Hibdon cv.put(MailboxColumns.LAST_FULL_SYNC_TIME, 0); 1209c75f5880ab70d9f4938727587696b864bb4ea02aMartin Hibdon db.update(Mailbox.TABLE_NAME, cv, null, null); 121052135c6e8750f19084695cdda78ffe34719c4b6cMartin Hibdon } catch (final SQLException e) { 121152135c6e8750f19084695cdda78ffe34719c4b6cMartin Hibdon // Shouldn't be needed unless we're debugging and interrupt the process 121252135c6e8750f19084695cdda78ffe34719c4b6cMartin Hibdon LogUtils.w(TAG, "Exception upgrading EmailProvider.db from v113 to v114", e); 121352135c6e8750f19084695cdda78ffe34719c4b6cMartin Hibdon } 121452135c6e8750f19084695cdda78ffe34719c4b6cMartin Hibdon } 121552135c6e8750f19084695cdda78ffe34719c4b6cMartin Hibdon 121652135c6e8750f19084695cdda78ffe34719c4b6cMartin Hibdon if (oldVersion <= 114) { 121752135c6e8750f19084695cdda78ffe34719c4b6cMartin Hibdon try { 121852135c6e8750f19084695cdda78ffe34719c4b6cMartin Hibdon db.execSQL("alter table " + Account.TABLE_NAME 121952135c6e8750f19084695cdda78ffe34719c4b6cMartin Hibdon + " add column " + AccountColumns.PING_DURATION +" integer" + ";"); 122052135c6e8750f19084695cdda78ffe34719c4b6cMartin Hibdon final ContentValues cv = new ContentValues(1); 122152135c6e8750f19084695cdda78ffe34719c4b6cMartin Hibdon cv.put(AccountColumns.PING_DURATION, 0); 122252135c6e8750f19084695cdda78ffe34719c4b6cMartin Hibdon db.update(Account.TABLE_NAME, cv, null, null); 122352135c6e8750f19084695cdda78ffe34719c4b6cMartin Hibdon } catch (final SQLException e) { 1224c75f5880ab70d9f4938727587696b864bb4ea02aMartin Hibdon // Shouldn't be needed unless we're debugging and interrupt the process 1225c75f5880ab70d9f4938727587696b864bb4ea02aMartin Hibdon LogUtils.w(TAG, "Exception upgrading EmailProvider.db from v113 to v114", e); 1226c75f5880ab70d9f4938727587696b864bb4ea02aMartin Hibdon } 1227c75f5880ab70d9f4938727587696b864bb4ea02aMartin Hibdon } 1228ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu 1229ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu if (oldVersion <= 115) { 1230ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu createMessageMoveTable(db); 1231ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu createMessageStateChangeTable(db); 1232ca79aba675d5282b6ba365184f3727b7b24a568fYu Ping Hu } 1233e3a4a1b25dd20dfd69793ca953f3299bcf6f0501Yu Ping Hu 1234ac40b8648504ba5e4e2f8ad44ec2e5063a054cb3Martin Hibdon /** 1235ac40b8648504ba5e4e2f8ad44ec2e5063a054cb3Martin Hibdon * Originally, at 116, we added a trigger to delete duplicate messages. 1236ac40b8648504ba5e4e2f8ad44ec2e5063a054cb3Martin Hibdon * But we needed to change that trigger for version 120, so when we get 1237ac40b8648504ba5e4e2f8ad44ec2e5063a054cb3Martin Hibdon * there, we'll drop the trigger if it exists and create a new version. 1238ac40b8648504ba5e4e2f8ad44ec2e5063a054cb3Martin Hibdon */ 1239e54d6957dbbd14d35a1858cb02959fd8f9bb0d37Tony Mantler 1240e54d6957dbbd14d35a1858cb02959fd8f9bb0d37Tony Mantler /** 1241e54d6957dbbd14d35a1858cb02959fd8f9bb0d37Tony Mantler * This statement changes the syncInterval column to 0 for all IMAP mailboxes. 1242e54d6957dbbd14d35a1858cb02959fd8f9bb0d37Tony Mantler * It does this by matching mailboxes against all account IDs whose receive auth is 1243e54d6957dbbd14d35a1858cb02959fd8f9bb0d37Tony Mantler * either R.string.protocol_legacy_imap, R.string.protocol_imap or "imap" 1244e54d6957dbbd14d35a1858cb02959fd8f9bb0d37Tony Mantler */ 1245e54d6957dbbd14d35a1858cb02959fd8f9bb0d37Tony Mantler if (oldVersion <= 117) { 1246e54d6957dbbd14d35a1858cb02959fd8f9bb0d37Tony Mantler db.execSQL("update " + Mailbox.TABLE_NAME + " set " + MailboxColumns.SYNC_INTERVAL 1247e54d6957dbbd14d35a1858cb02959fd8f9bb0d37Tony Mantler + "=0 where " + MailboxColumns.ACCOUNT_KEY + " in (select " 1248e54d6957dbbd14d35a1858cb02959fd8f9bb0d37Tony Mantler + Account.TABLE_NAME + "." + AccountColumns.ID + " from " 1249e54d6957dbbd14d35a1858cb02959fd8f9bb0d37Tony Mantler + Account.TABLE_NAME + " join " + HostAuth.TABLE_NAME + " where " 1250e54d6957dbbd14d35a1858cb02959fd8f9bb0d37Tony Mantler + HostAuth.TABLE_NAME + "." + HostAuth.ID + "=" + Account.TABLE_NAME + "." 1251e54d6957dbbd14d35a1858cb02959fd8f9bb0d37Tony Mantler + Account.HOST_AUTH_KEY_RECV + " and (" + HostAuth.TABLE_NAME + "." 1252e54d6957dbbd14d35a1858cb02959fd8f9bb0d37Tony Mantler + HostAuthColumns.PROTOCOL + "='" 1253e54d6957dbbd14d35a1858cb02959fd8f9bb0d37Tony Mantler + mContext.getString(R.string.protocol_legacy_imap) + "' or " 1254e54d6957dbbd14d35a1858cb02959fd8f9bb0d37Tony Mantler + HostAuth.TABLE_NAME + "." + HostAuthColumns.PROTOCOL + "='" 1255e54d6957dbbd14d35a1858cb02959fd8f9bb0d37Tony Mantler + mContext.getString(R.string.protocol_imap) + "' or " 1256e54d6957dbbd14d35a1858cb02959fd8f9bb0d37Tony Mantler + HostAuth.TABLE_NAME + "." + HostAuthColumns.PROTOCOL + "='imap'));"); 1257e54d6957dbbd14d35a1858cb02959fd8f9bb0d37Tony Mantler } 1258cb30243fe1fa3a2f7540495cbeea470e77b539beMartin Hibdon 1259cb30243fe1fa3a2f7540495cbeea470e77b539beMartin Hibdon /** 1260cb30243fe1fa3a2f7540495cbeea470e77b539beMartin Hibdon * This statement changes the sync interval column to 0 for all DRAFTS type mailboxes, 1261cb30243fe1fa3a2f7540495cbeea470e77b539beMartin Hibdon * and deletes any messages that are: 1262cb30243fe1fa3a2f7540495cbeea470e77b539beMartin Hibdon * * synced from the server, and 1263cb30243fe1fa3a2f7540495cbeea470e77b539beMartin Hibdon * * in an exchange account draft folder 1264cb30243fe1fa3a2f7540495cbeea470e77b539beMartin Hibdon * 1265cb30243fe1fa3a2f7540495cbeea470e77b539beMartin Hibdon * This is primary for Exchange (b/11158759) but we don't sync draft folders for any 1266cb30243fe1fa3a2f7540495cbeea470e77b539beMartin Hibdon * other account type anyway. 1267cb30243fe1fa3a2f7540495cbeea470e77b539beMartin Hibdon * This will only affect people who used intermediate builds between email1 and email2, 1268cb30243fe1fa3a2f7540495cbeea470e77b539beMartin Hibdon * it should be a no-op for most users. 1269cb30243fe1fa3a2f7540495cbeea470e77b539beMartin Hibdon */ 1270cb30243fe1fa3a2f7540495cbeea470e77b539beMartin Hibdon if (oldVersion <= 118) { 1271cb30243fe1fa3a2f7540495cbeea470e77b539beMartin Hibdon db.execSQL("update " + Mailbox.TABLE_NAME + " set " + MailboxColumns.SYNC_INTERVAL 1272cb30243fe1fa3a2f7540495cbeea470e77b539beMartin Hibdon + "=0 where " + MailboxColumns.TYPE + "=" + Mailbox.TYPE_DRAFTS); 1273cb30243fe1fa3a2f7540495cbeea470e77b539beMartin Hibdon 1274cb30243fe1fa3a2f7540495cbeea470e77b539beMartin Hibdon db.execSQL("delete from " + Message.TABLE_NAME + " where " 1275cb30243fe1fa3a2f7540495cbeea470e77b539beMartin Hibdon + "(" + SyncColumns.SERVER_ID + " not null and " 1276cb30243fe1fa3a2f7540495cbeea470e77b539beMartin Hibdon + SyncColumns.SERVER_ID + "!='') and " 1277cb30243fe1fa3a2f7540495cbeea470e77b539beMartin Hibdon + MessageColumns.MAILBOX_KEY + " in (select " 1278cb30243fe1fa3a2f7540495cbeea470e77b539beMartin Hibdon + MailboxColumns.ID + " from " + Mailbox.TABLE_NAME + " where " 1279cb30243fe1fa3a2f7540495cbeea470e77b539beMartin Hibdon + MailboxColumns.TYPE + "=" + Mailbox.TYPE_DRAFTS + ")"); 1280cb30243fe1fa3a2f7540495cbeea470e77b539beMartin Hibdon } 1281ac40b8648504ba5e4e2f8ad44ec2e5063a054cb3Martin Hibdon 128213ff5b86ac9314bbce09ae9e4ec381b6273a497bMartin Hibdon // We originally dropped and recreated the deleteDuplicateMessagesTrigger here at 128313ff5b86ac9314bbce09ae9e4ec381b6273a497bMartin Hibdon // version 120. We needed to update it again at version 123, so there's no reason 128413ff5b86ac9314bbce09ae9e4ec381b6273a497bMartin Hibdon // to do it twice. 1285c86fbb5bcbff72102f87747d94948f0749402229Martin Hibdon 1286c86fbb5bcbff72102f87747d94948f0749402229Martin Hibdon // Add the mainMailboxKey column, and get rid of any messages in the search_results 1287c86fbb5bcbff72102f87747d94948f0749402229Martin Hibdon // folder. 1288c86fbb5bcbff72102f87747d94948f0749402229Martin Hibdon if (oldVersion <= 120) { 1289c86fbb5bcbff72102f87747d94948f0749402229Martin Hibdon db.execSQL("alter table " + Message.TABLE_NAME 1290c86fbb5bcbff72102f87747d94948f0749402229Martin Hibdon + " add " + MessageColumns.MAIN_MAILBOX_KEY + " integer"); 1291c86fbb5bcbff72102f87747d94948f0749402229Martin Hibdon 1292c86fbb5bcbff72102f87747d94948f0749402229Martin Hibdon // Delete all TYPE_SEARCH mailboxes. These will be for stale queries anyway, and 1293c86fbb5bcbff72102f87747d94948f0749402229Martin Hibdon // the messages in them will not have the mainMailboxKey column correctly populated. 1294c86fbb5bcbff72102f87747d94948f0749402229Martin Hibdon // We have a trigger (See TRIGGER_MAILBOX_DELETE) that will delete any messages 1295c86fbb5bcbff72102f87747d94948f0749402229Martin Hibdon // in the deleted mailboxes. 1296c86fbb5bcbff72102f87747d94948f0749402229Martin Hibdon db.execSQL("delete from " + Mailbox.TABLE_NAME + " where " 1297c86fbb5bcbff72102f87747d94948f0749402229Martin Hibdon + Mailbox.TYPE + "=" + Mailbox.TYPE_SEARCH); 1298c86fbb5bcbff72102f87747d94948f0749402229Martin Hibdon } 12997b7d7d5cb57c9f0e589b686511eabf3c73f96f00Yu Ping Hu 13007b7d7d5cb57c9f0e589b686511eabf3c73f96f00Yu Ping Hu if (oldVersion <= 121) { 13017b7d7d5cb57c9f0e589b686511eabf3c73f96f00Yu Ping Hu // The previous update omitted making these changes to the Message_Updates and 13027b7d7d5cb57c9f0e589b686511eabf3c73f96f00Yu Ping Hu // Message_Deletes tables. The app will actually crash in between these versions! 13037b7d7d5cb57c9f0e589b686511eabf3c73f96f00Yu Ping Hu db.execSQL("alter table " + Message.UPDATED_TABLE_NAME 13047b7d7d5cb57c9f0e589b686511eabf3c73f96f00Yu Ping Hu + " add " + MessageColumns.MAIN_MAILBOX_KEY + " integer"); 13057b7d7d5cb57c9f0e589b686511eabf3c73f96f00Yu Ping Hu db.execSQL("alter table " + Message.DELETED_TABLE_NAME 13067b7d7d5cb57c9f0e589b686511eabf3c73f96f00Yu Ping Hu + " add " + MessageColumns.MAIN_MAILBOX_KEY + " integer"); 13077b7d7d5cb57c9f0e589b686511eabf3c73f96f00Yu Ping Hu } 130813ff5b86ac9314bbce09ae9e4ec381b6273a497bMartin Hibdon 130913ff5b86ac9314bbce09ae9e4ec381b6273a497bMartin Hibdon if (oldVersion <= 122) { 131013ff5b86ac9314bbce09ae9e4ec381b6273a497bMartin Hibdon if (oldVersion >= 117) { 131113ff5b86ac9314bbce09ae9e4ec381b6273a497bMartin Hibdon /** 131213ff5b86ac9314bbce09ae9e4ec381b6273a497bMartin Hibdon * This trigger was originally created at version 117, but we needed to change 131313ff5b86ac9314bbce09ae9e4ec381b6273a497bMartin Hibdon * it for version 122. So if our oldVersion is 117 or more, we know we have that 131413ff5b86ac9314bbce09ae9e4ec381b6273a497bMartin Hibdon * trigger and must drop it before re creating it. 131513ff5b86ac9314bbce09ae9e4ec381b6273a497bMartin Hibdon */ 131613ff5b86ac9314bbce09ae9e4ec381b6273a497bMartin Hibdon dropDeleteDuplicateMessagesTrigger(db); 131713ff5b86ac9314bbce09ae9e4ec381b6273a497bMartin Hibdon } 131813ff5b86ac9314bbce09ae9e4ec381b6273a497bMartin Hibdon createDeleteDuplicateMessagesTrigger(mContext, db); 131913ff5b86ac9314bbce09ae9e4ec381b6273a497bMartin Hibdon } 1320c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 1321c5afb16430a145f20d7c887e45f47b38687054daMarc Blank 1322c5afb16430a145f20d7c887e45f47b38687054daMarc Blank @Override 1323c5afb16430a145f20d7c887e45f47b38687054daMarc Blank public void onOpen(SQLiteDatabase db) { 13240c06a7cf995c0d3e5dcccae97349891a46c3320fPaul Westbrook try { 13250c06a7cf995c0d3e5dcccae97349891a46c3320fPaul Westbrook // Cleanup some nasty records 13260c06a7cf995c0d3e5dcccae97349891a46c3320fPaul Westbrook db.execSQL("DELETE FROM " + Account.TABLE_NAME 13270c06a7cf995c0d3e5dcccae97349891a46c3320fPaul Westbrook + " WHERE " + AccountColumns.DISPLAY_NAME + " ISNULL;"); 13280c06a7cf995c0d3e5dcccae97349891a46c3320fPaul Westbrook db.execSQL("DELETE FROM " + HostAuth.TABLE_NAME 13290c06a7cf995c0d3e5dcccae97349891a46c3320fPaul Westbrook + " WHERE " + HostAuthColumns.PROTOCOL + " ISNULL;"); 13300c06a7cf995c0d3e5dcccae97349891a46c3320fPaul Westbrook } catch (SQLException e) { 13310c06a7cf995c0d3e5dcccae97349891a46c3320fPaul Westbrook // Shouldn't be needed unless we're debugging and interrupt the process 13320c06a7cf995c0d3e5dcccae97349891a46c3320fPaul Westbrook LogUtils.e(TAG, e, "Exception cleaning EmailProvider.db"); 13330c06a7cf995c0d3e5dcccae97349891a46c3320fPaul Westbrook } 1334c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 1335c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 1336c5afb16430a145f20d7c887e45f47b38687054daMarc Blank 1337c5afb16430a145f20d7c887e45f47b38687054daMarc Blank @VisibleForTesting 1338c5afb16430a145f20d7c887e45f47b38687054daMarc Blank @SuppressWarnings("deprecation") 1339c5afb16430a145f20d7c887e45f47b38687054daMarc Blank static void convertPolicyFlagsToPolicyTable(SQLiteDatabase db) { 1340c5afb16430a145f20d7c887e45f47b38687054daMarc Blank Cursor c = db.query(Account.TABLE_NAME, 1341c5afb16430a145f20d7c887e45f47b38687054daMarc Blank new String[] {EmailContent.RECORD_ID /*0*/, AccountColumns.SECURITY_FLAGS /*1*/}, 1342c5afb16430a145f20d7c887e45f47b38687054daMarc Blank AccountColumns.SECURITY_FLAGS + ">0", null, null, null, null); 134389c74e89e52e3d3223ec9c2f108a9b0735d99d33Yoohyun.choi try { 134489c74e89e52e3d3223ec9c2f108a9b0735d99d33Yoohyun.choi ContentValues cv = new ContentValues(); 134589c74e89e52e3d3223ec9c2f108a9b0735d99d33Yoohyun.choi String[] args = new String[1]; 134689c74e89e52e3d3223ec9c2f108a9b0735d99d33Yoohyun.choi while (c.moveToNext()) { 134789c74e89e52e3d3223ec9c2f108a9b0735d99d33Yoohyun.choi long securityFlags = c.getLong(1 /*SECURITY_FLAGS*/); 134889c74e89e52e3d3223ec9c2f108a9b0735d99d33Yoohyun.choi Policy policy = LegacyPolicySet.flagsToPolicy(securityFlags); 134989c74e89e52e3d3223ec9c2f108a9b0735d99d33Yoohyun.choi long policyId = db.insert(Policy.TABLE_NAME, null, policy.toContentValues()); 135089c74e89e52e3d3223ec9c2f108a9b0735d99d33Yoohyun.choi cv.put(AccountColumns.POLICY_KEY, policyId); 135189c74e89e52e3d3223ec9c2f108a9b0735d99d33Yoohyun.choi cv.putNull(AccountColumns.SECURITY_FLAGS); 135289c74e89e52e3d3223ec9c2f108a9b0735d99d33Yoohyun.choi args[0] = Long.toString(c.getLong(0 /*RECORD_ID*/)); 135389c74e89e52e3d3223ec9c2f108a9b0735d99d33Yoohyun.choi db.update(Account.TABLE_NAME, cv, EmailContent.RECORD_ID + "=?", args); 135489c74e89e52e3d3223ec9c2f108a9b0735d99d33Yoohyun.choi } 135589c74e89e52e3d3223ec9c2f108a9b0735d99d33Yoohyun.choi } finally { 135689c74e89e52e3d3223ec9c2f108a9b0735d99d33Yoohyun.choi c.close(); 1357c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 1358c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 1359c5afb16430a145f20d7c887e45f47b38687054daMarc Blank 1360c5afb16430a145f20d7c887e45f47b38687054daMarc Blank /** Upgrades the database from v17 to v18 */ 1361c5afb16430a145f20d7c887e45f47b38687054daMarc Blank @VisibleForTesting 1362c5afb16430a145f20d7c887e45f47b38687054daMarc Blank static void upgradeFromVersion17ToVersion18(SQLiteDatabase db) { 1363c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Copy the displayName column to the serverId column. In v18 of the database, 1364c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // we use the serverId for IMAP/POP3 mailboxes instead of overloading the 1365c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // display name. 1366c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // 1367c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // For posterity; this is the command we're executing: 1368c5afb16430a145f20d7c887e45f47b38687054daMarc Blank //sqlite> UPDATE mailbox SET serverid=displayname WHERE mailbox._id in ( 1369c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // ...> SELECT mailbox._id FROM mailbox,account,hostauth WHERE 1370c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // ...> (mailbox.parentkey isnull OR mailbox.parentkey=0) AND 1371c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // ...> mailbox.accountkey=account._id AND 1372c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // ...> account.hostauthkeyrecv=hostauth._id AND 1373c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // ...> (hostauth.protocol='imap' OR hostauth.protocol='pop3')); 1374c5afb16430a145f20d7c887e45f47b38687054daMarc Blank try { 1375c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL( 1376c5afb16430a145f20d7c887e45f47b38687054daMarc Blank "UPDATE " + Mailbox.TABLE_NAME + " SET " 1377c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + MailboxColumns.SERVER_ID + "=" + MailboxColumns.DISPLAY_NAME 1378c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + " WHERE " 1379c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + Mailbox.TABLE_NAME + "." + MailboxColumns.ID + " IN ( SELECT " 1380c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + Mailbox.TABLE_NAME + "." + MailboxColumns.ID + " FROM " 1381c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + Mailbox.TABLE_NAME + "," + Account.TABLE_NAME + "," 1382c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + HostAuth.TABLE_NAME + " WHERE " 1383c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + "(" 1384c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + Mailbox.TABLE_NAME + "." + MailboxColumns.PARENT_KEY + " isnull OR " 1385c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + Mailbox.TABLE_NAME + "." + MailboxColumns.PARENT_KEY + "=0 " 1386c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + ") AND " 1387c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + Mailbox.TABLE_NAME + "." + MailboxColumns.ACCOUNT_KEY + "=" 1388c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + Account.TABLE_NAME + "." + AccountColumns.ID + " AND " 1389c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + Account.TABLE_NAME + "." + AccountColumns.HOST_AUTH_KEY_RECV + "=" 1390c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + HostAuth.TABLE_NAME + "." + HostAuthColumns.ID + " AND ( " 1391c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + HostAuth.TABLE_NAME + "." + HostAuthColumns.PROTOCOL + "='imap' OR " 1392c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + HostAuth.TABLE_NAME + "." + HostAuthColumns.PROTOCOL + "='pop3' ) )"); 1393c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } catch (SQLException e) { 1394c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Shouldn't be needed unless we're debugging and interrupt the process 1395560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy LogUtils.w(TAG, "Exception upgrading EmailProvider.db from 17 to 18 " + e); 1396c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 1397c5afb16430a145f20d7c887e45f47b38687054daMarc Blank ContentCache.invalidateAllCaches(); 1398c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 1399c5afb16430a145f20d7c887e45f47b38687054daMarc Blank 1400c5afb16430a145f20d7c887e45f47b38687054daMarc Blank /** 1401c5afb16430a145f20d7c887e45f47b38687054daMarc Blank * Upgrade the database from v21 to v22 1402c5afb16430a145f20d7c887e45f47b38687054daMarc Blank * This entails creating AccountManager accounts for all pop3 and imap accounts 1403c5afb16430a145f20d7c887e45f47b38687054daMarc Blank */ 1404c5afb16430a145f20d7c887e45f47b38687054daMarc Blank 1405c5afb16430a145f20d7c887e45f47b38687054daMarc Blank private static final String[] V21_ACCOUNT_PROJECTION = 1406c5afb16430a145f20d7c887e45f47b38687054daMarc Blank new String[] {AccountColumns.HOST_AUTH_KEY_RECV, AccountColumns.EMAIL_ADDRESS}; 1407c5afb16430a145f20d7c887e45f47b38687054daMarc Blank private static final int V21_ACCOUNT_RECV = 0; 1408c5afb16430a145f20d7c887e45f47b38687054daMarc Blank private static final int V21_ACCOUNT_EMAIL = 1; 1409c5afb16430a145f20d7c887e45f47b38687054daMarc Blank 1410c5afb16430a145f20d7c887e45f47b38687054daMarc Blank private static final String[] V21_HOSTAUTH_PROJECTION = 1411c5afb16430a145f20d7c887e45f47b38687054daMarc Blank new String[] {HostAuthColumns.PROTOCOL, HostAuthColumns.PASSWORD}; 1412c5afb16430a145f20d7c887e45f47b38687054daMarc Blank private static final int V21_HOSTAUTH_PROTOCOL = 0; 1413c5afb16430a145f20d7c887e45f47b38687054daMarc Blank private static final int V21_HOSTAUTH_PASSWORD = 1; 1414c5afb16430a145f20d7c887e45f47b38687054daMarc Blank 141532881e8dd375f16e6059452166503f7136f14ae5Paul Westbrook private static void createAccountManagerAccount(Context context, String login, String type, 1416c5afb16430a145f20d7c887e45f47b38687054daMarc Blank String password) { 141732881e8dd375f16e6059452166503f7136f14ae5Paul Westbrook final AccountManager accountManager = AccountManager.get(context); 141832881e8dd375f16e6059452166503f7136f14ae5Paul Westbrook 141932881e8dd375f16e6059452166503f7136f14ae5Paul Westbrook if (isAccountPresent(accountManager, login, type)) { 142032881e8dd375f16e6059452166503f7136f14ae5Paul Westbrook // The account already exists,just return 142132881e8dd375f16e6059452166503f7136f14ae5Paul Westbrook return; 142232881e8dd375f16e6059452166503f7136f14ae5Paul Westbrook } 142332881e8dd375f16e6059452166503f7136f14ae5Paul Westbrook LogUtils.v("Email", "Creating account %s %s", login, type); 142432881e8dd375f16e6059452166503f7136f14ae5Paul Westbrook final android.accounts.Account amAccount = new android.accounts.Account(login, type); 1425c5afb16430a145f20d7c887e45f47b38687054daMarc Blank accountManager.addAccountExplicitly(amAccount, password, null); 1426c5afb16430a145f20d7c887e45f47b38687054daMarc Blank ContentResolver.setIsSyncable(amAccount, EmailContent.AUTHORITY, 1); 1427c5afb16430a145f20d7c887e45f47b38687054daMarc Blank ContentResolver.setSyncAutomatically(amAccount, EmailContent.AUTHORITY, true); 1428c5afb16430a145f20d7c887e45f47b38687054daMarc Blank ContentResolver.setIsSyncable(amAccount, ContactsContract.AUTHORITY, 0); 1429c5afb16430a145f20d7c887e45f47b38687054daMarc Blank ContentResolver.setIsSyncable(amAccount, CalendarContract.AUTHORITY, 0); 1430c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 1431c5afb16430a145f20d7c887e45f47b38687054daMarc Blank 143232881e8dd375f16e6059452166503f7136f14ae5Paul Westbrook private static boolean isAccountPresent(AccountManager accountManager, String name, 143332881e8dd375f16e6059452166503f7136f14ae5Paul Westbrook String type) { 143432881e8dd375f16e6059452166503f7136f14ae5Paul Westbrook final android.accounts.Account[] amAccounts = accountManager.getAccountsByType(type); 143532881e8dd375f16e6059452166503f7136f14ae5Paul Westbrook if (amAccounts != null) { 143632881e8dd375f16e6059452166503f7136f14ae5Paul Westbrook for (android.accounts.Account account : amAccounts) { 143732881e8dd375f16e6059452166503f7136f14ae5Paul Westbrook if (TextUtils.equals(account.name, name) && TextUtils.equals(account.type, type)) { 143832881e8dd375f16e6059452166503f7136f14ae5Paul Westbrook return true; 143932881e8dd375f16e6059452166503f7136f14ae5Paul Westbrook } 144032881e8dd375f16e6059452166503f7136f14ae5Paul Westbrook } 144132881e8dd375f16e6059452166503f7136f14ae5Paul Westbrook } 144232881e8dd375f16e6059452166503f7136f14ae5Paul Westbrook return false; 144332881e8dd375f16e6059452166503f7136f14ae5Paul Westbrook } 144432881e8dd375f16e6059452166503f7136f14ae5Paul Westbrook 1445c5afb16430a145f20d7c887e45f47b38687054daMarc Blank @VisibleForTesting 1446c5afb16430a145f20d7c887e45f47b38687054daMarc Blank static void upgradeFromVersion21ToVersion22(SQLiteDatabase db, Context accountManagerContext) { 144732881e8dd375f16e6059452166503f7136f14ae5Paul Westbrook migrateLegacyAccounts(db, accountManagerContext); 144832881e8dd375f16e6059452166503f7136f14ae5Paul Westbrook } 144932881e8dd375f16e6059452166503f7136f14ae5Paul Westbrook 145032881e8dd375f16e6059452166503f7136f14ae5Paul Westbrook private static void migrateLegacyAccounts(SQLiteDatabase db, Context accountManagerContext) { 145132881e8dd375f16e6059452166503f7136f14ae5Paul Westbrook final Map<String, String> legacyToNewTypeMap = new ImmutableMap.Builder<String, String>() 145232881e8dd375f16e6059452166503f7136f14ae5Paul Westbrook .put(LEGACY_SCHEME_POP3, 145332881e8dd375f16e6059452166503f7136f14ae5Paul Westbrook accountManagerContext.getString(R.string.account_manager_type_pop3)) 145432881e8dd375f16e6059452166503f7136f14ae5Paul Westbrook .put(LEGACY_SCHEME_IMAP, 145532881e8dd375f16e6059452166503f7136f14ae5Paul Westbrook accountManagerContext.getString(R.string.account_manager_type_legacy_imap)) 145632881e8dd375f16e6059452166503f7136f14ae5Paul Westbrook .put(LEGACY_SCHEME_EAS, 145732881e8dd375f16e6059452166503f7136f14ae5Paul Westbrook accountManagerContext.getString(R.string.account_manager_type_exchange)) 145832881e8dd375f16e6059452166503f7136f14ae5Paul Westbrook .build(); 1459c5afb16430a145f20d7c887e45f47b38687054daMarc Blank try { 1460c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Loop through accounts, looking for pop/imap accounts 146132881e8dd375f16e6059452166503f7136f14ae5Paul Westbrook final Cursor accountCursor = db.query(Account.TABLE_NAME, V21_ACCOUNT_PROJECTION, null, 1462c5afb16430a145f20d7c887e45f47b38687054daMarc Blank null, null, null, null); 1463c5afb16430a145f20d7c887e45f47b38687054daMarc Blank try { 146432881e8dd375f16e6059452166503f7136f14ae5Paul Westbrook final String[] hostAuthArgs = new String[1]; 1465c5afb16430a145f20d7c887e45f47b38687054daMarc Blank while (accountCursor.moveToNext()) { 1466c5afb16430a145f20d7c887e45f47b38687054daMarc Blank hostAuthArgs[0] = accountCursor.getString(V21_ACCOUNT_RECV); 1467c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Get the "receive" HostAuth for this account 146832881e8dd375f16e6059452166503f7136f14ae5Paul Westbrook final Cursor hostAuthCursor = db.query(HostAuth.TABLE_NAME, 1469c5afb16430a145f20d7c887e45f47b38687054daMarc Blank V21_HOSTAUTH_PROJECTION, HostAuth.RECORD_ID + "=?", hostAuthArgs, 1470c5afb16430a145f20d7c887e45f47b38687054daMarc Blank null, null, null); 1471c5afb16430a145f20d7c887e45f47b38687054daMarc Blank try { 1472c5afb16430a145f20d7c887e45f47b38687054daMarc Blank if (hostAuthCursor.moveToFirst()) { 147332881e8dd375f16e6059452166503f7136f14ae5Paul Westbrook final String protocol = hostAuthCursor.getString(V21_HOSTAUTH_PROTOCOL); 1474c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // If this is a pop3 or imap account, create the account manager account 147554347010fbbdd3ae1dea5b0e282514c640e16a5fMarc Blank if (LEGACY_SCHEME_IMAP.equals(protocol) || 147632881e8dd375f16e6059452166503f7136f14ae5Paul Westbrook LEGACY_SCHEME_POP3.equals(protocol)) { 147732881e8dd375f16e6059452166503f7136f14ae5Paul Westbrook // If this is a pop3 or imap account, create the account manager 147832881e8dd375f16e6059452166503f7136f14ae5Paul Westbrook // account 1479c5afb16430a145f20d7c887e45f47b38687054daMarc Blank if (MailActivityEmail.DEBUG) { 1480560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy LogUtils.d(TAG, "Create AccountManager account for " + protocol 1481560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy + "account: " 1482560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy + accountCursor.getString(V21_ACCOUNT_EMAIL)); 1483c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 1484c5afb16430a145f20d7c887e45f47b38687054daMarc Blank createAccountManagerAccount(accountManagerContext, 1485c5afb16430a145f20d7c887e45f47b38687054daMarc Blank accountCursor.getString(V21_ACCOUNT_EMAIL), 148632881e8dd375f16e6059452166503f7136f14ae5Paul Westbrook legacyToNewTypeMap.get(protocol), 1487c5afb16430a145f20d7c887e45f47b38687054daMarc Blank hostAuthCursor.getString(V21_HOSTAUTH_PASSWORD)); 148854347010fbbdd3ae1dea5b0e282514c640e16a5fMarc Blank } else if (LEGACY_SCHEME_EAS.equals(protocol)) { 148932881e8dd375f16e6059452166503f7136f14ae5Paul Westbrook // If an EAS account, make Email sync automatically (equivalent of 149032881e8dd375f16e6059452166503f7136f14ae5Paul Westbrook // checking the "Sync Email" box in settings 149132881e8dd375f16e6059452166503f7136f14ae5Paul Westbrook 149232881e8dd375f16e6059452166503f7136f14ae5Paul Westbrook android.accounts.Account amAccount = new android.accounts.Account( 149332881e8dd375f16e6059452166503f7136f14ae5Paul Westbrook accountCursor.getString(V21_ACCOUNT_EMAIL), 149432881e8dd375f16e6059452166503f7136f14ae5Paul Westbrook legacyToNewTypeMap.get(protocol)); 1495c5afb16430a145f20d7c887e45f47b38687054daMarc Blank ContentResolver.setIsSyncable(amAccount, EmailContent.AUTHORITY, 1); 1496c5afb16430a145f20d7c887e45f47b38687054daMarc Blank ContentResolver.setSyncAutomatically(amAccount, 1497c5afb16430a145f20d7c887e45f47b38687054daMarc Blank EmailContent.AUTHORITY, true); 1498c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 1499c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 1500c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } finally { 1501c5afb16430a145f20d7c887e45f47b38687054daMarc Blank hostAuthCursor.close(); 1502c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 1503c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 1504c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } finally { 1505c5afb16430a145f20d7c887e45f47b38687054daMarc Blank accountCursor.close(); 1506c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 1507c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } catch (SQLException e) { 1508c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Shouldn't be needed unless we're debugging and interrupt the process 1509560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy LogUtils.w(TAG, "Exception while migrating accounts " + e); 1510c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 1511c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 1512c5afb16430a145f20d7c887e45f47b38687054daMarc Blank 1513c5afb16430a145f20d7c887e45f47b38687054daMarc Blank /** Upgrades the database from v22 to v23 */ 1514c5afb16430a145f20d7c887e45f47b38687054daMarc Blank private static void upgradeFromVersion22ToVersion23(SQLiteDatabase db) { 1515c5afb16430a145f20d7c887e45f47b38687054daMarc Blank try { 1516c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("alter table " + Mailbox.TABLE_NAME 1517c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + " add column " + Mailbox.LAST_TOUCHED_TIME + " integer default 0;"); 1518c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } catch (SQLException e) { 1519c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Shouldn't be needed unless we're debugging and interrupt the process 1520560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy LogUtils.w(TAG, "Exception upgrading EmailProvider.db from 22 to 23 " + e); 1521c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 1522c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 1523c5afb16430a145f20d7c887e45f47b38687054daMarc Blank 1524c5afb16430a145f20d7c887e45f47b38687054daMarc Blank /** Adds in a column for information about a client certificate to use. */ 1525c5afb16430a145f20d7c887e45f47b38687054daMarc Blank private static void upgradeFromVersion23ToVersion24(SQLiteDatabase db) { 1526c5afb16430a145f20d7c887e45f47b38687054daMarc Blank try { 1527c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("alter table " + HostAuth.TABLE_NAME 1528c5afb16430a145f20d7c887e45f47b38687054daMarc Blank + " add column " + HostAuth.CLIENT_CERT_ALIAS + " text;"); 1529c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } catch (SQLException e) { 1530c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Shouldn't be needed unless we're debugging and interrupt the process 1531560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy LogUtils.w(TAG, "Exception upgrading EmailProvider.db from 23 to 24 " + e); 1532c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 1533c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 1534c5afb16430a145f20d7c887e45f47b38687054daMarc Blank 1535c5afb16430a145f20d7c887e45f47b38687054daMarc Blank /** Upgrades the database from v24 to v25 by creating table for quick responses */ 1536c5afb16430a145f20d7c887e45f47b38687054daMarc Blank private static void upgradeFromVersion24ToVersion25(SQLiteDatabase db) { 1537c5afb16430a145f20d7c887e45f47b38687054daMarc Blank try { 1538c5afb16430a145f20d7c887e45f47b38687054daMarc Blank createQuickResponseTable(db); 1539c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } catch (SQLException e) { 1540c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Shouldn't be needed unless we're debugging and interrupt the process 1541560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy LogUtils.w(TAG, "Exception upgrading EmailProvider.db from 24 to 25 " + e); 1542c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 1543c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 1544c5afb16430a145f20d7c887e45f47b38687054daMarc Blank 1545c5afb16430a145f20d7c887e45f47b38687054daMarc Blank private static final String[] V25_ACCOUNT_PROJECTION = 1546c5afb16430a145f20d7c887e45f47b38687054daMarc Blank new String[] {AccountColumns.ID, AccountColumns.FLAGS, AccountColumns.HOST_AUTH_KEY_RECV}; 1547c5afb16430a145f20d7c887e45f47b38687054daMarc Blank private static final int V25_ACCOUNT_ID = 0; 1548c5afb16430a145f20d7c887e45f47b38687054daMarc Blank private static final int V25_ACCOUNT_FLAGS = 1; 1549c5afb16430a145f20d7c887e45f47b38687054daMarc Blank private static final int V25_ACCOUNT_RECV = 2; 1550c5afb16430a145f20d7c887e45f47b38687054daMarc Blank 1551c5afb16430a145f20d7c887e45f47b38687054daMarc Blank private static final String[] V25_HOSTAUTH_PROJECTION = new String[] {HostAuthColumns.PROTOCOL}; 1552c5afb16430a145f20d7c887e45f47b38687054daMarc Blank private static final int V25_HOSTAUTH_PROTOCOL = 0; 1553c5afb16430a145f20d7c887e45f47b38687054daMarc Blank 1554c5afb16430a145f20d7c887e45f47b38687054daMarc Blank /** Upgrades the database from v25 to v26 by adding FLAG_SUPPORTS_SEARCH to IMAP accounts */ 1555c5afb16430a145f20d7c887e45f47b38687054daMarc Blank private static void upgradeFromVersion25ToVersion26(SQLiteDatabase db) { 1556c5afb16430a145f20d7c887e45f47b38687054daMarc Blank try { 1557c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Loop through accounts, looking for imap accounts 1558c5afb16430a145f20d7c887e45f47b38687054daMarc Blank Cursor accountCursor = db.query(Account.TABLE_NAME, V25_ACCOUNT_PROJECTION, null, 1559c5afb16430a145f20d7c887e45f47b38687054daMarc Blank null, null, null, null); 1560c5afb16430a145f20d7c887e45f47b38687054daMarc Blank ContentValues cv = new ContentValues(); 1561c5afb16430a145f20d7c887e45f47b38687054daMarc Blank try { 1562c5afb16430a145f20d7c887e45f47b38687054daMarc Blank String[] hostAuthArgs = new String[1]; 1563c5afb16430a145f20d7c887e45f47b38687054daMarc Blank while (accountCursor.moveToNext()) { 1564c5afb16430a145f20d7c887e45f47b38687054daMarc Blank hostAuthArgs[0] = accountCursor.getString(V25_ACCOUNT_RECV); 1565c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Get the "receive" HostAuth for this account 1566c5afb16430a145f20d7c887e45f47b38687054daMarc Blank Cursor hostAuthCursor = db.query(HostAuth.TABLE_NAME, 1567c5afb16430a145f20d7c887e45f47b38687054daMarc Blank V25_HOSTAUTH_PROJECTION, HostAuth.RECORD_ID + "=?", hostAuthArgs, 1568c5afb16430a145f20d7c887e45f47b38687054daMarc Blank null, null, null); 1569c5afb16430a145f20d7c887e45f47b38687054daMarc Blank try { 1570c5afb16430a145f20d7c887e45f47b38687054daMarc Blank if (hostAuthCursor.moveToFirst()) { 1571c5afb16430a145f20d7c887e45f47b38687054daMarc Blank String protocol = hostAuthCursor.getString(V25_HOSTAUTH_PROTOCOL); 1572c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // If this is an imap account, add the search flag 157354347010fbbdd3ae1dea5b0e282514c640e16a5fMarc Blank if (LEGACY_SCHEME_IMAP.equals(protocol)) { 1574c5afb16430a145f20d7c887e45f47b38687054daMarc Blank String id = accountCursor.getString(V25_ACCOUNT_ID); 1575c5afb16430a145f20d7c887e45f47b38687054daMarc Blank int flags = accountCursor.getInt(V25_ACCOUNT_FLAGS); 1576c5afb16430a145f20d7c887e45f47b38687054daMarc Blank cv.put(AccountColumns.FLAGS, flags | Account.FLAGS_SUPPORTS_SEARCH); 1577c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.update(Account.TABLE_NAME, cv, Account.RECORD_ID + "=?", 1578c5afb16430a145f20d7c887e45f47b38687054daMarc Blank new String[] {id}); 1579c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 1580c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 1581c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } finally { 1582c5afb16430a145f20d7c887e45f47b38687054daMarc Blank hostAuthCursor.close(); 1583c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 1584c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 1585c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } finally { 1586c5afb16430a145f20d7c887e45f47b38687054daMarc Blank accountCursor.close(); 1587c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 1588c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } catch (SQLException e) { 1589c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Shouldn't be needed unless we're debugging and interrupt the process 1590560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy LogUtils.w(TAG, "Exception upgrading EmailProvider.db from 25 to 26 " + e); 1591c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 1592c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 1593c5afb16430a145f20d7c887e45f47b38687054daMarc Blank 1594c5afb16430a145f20d7c887e45f47b38687054daMarc Blank /** Upgrades the database from v29 to v30 by updating all address fields in Message */ 1595c5afb16430a145f20d7c887e45f47b38687054daMarc Blank private static final int[] ADDRESS_COLUMN_INDICES = new int[] { 1596c5afb16430a145f20d7c887e45f47b38687054daMarc Blank Message.CONTENT_BCC_LIST_COLUMN, Message.CONTENT_CC_LIST_COLUMN, 1597c5afb16430a145f20d7c887e45f47b38687054daMarc Blank Message.CONTENT_FROM_LIST_COLUMN, Message.CONTENT_REPLY_TO_COLUMN, 1598c5afb16430a145f20d7c887e45f47b38687054daMarc Blank Message.CONTENT_TO_LIST_COLUMN 1599c5afb16430a145f20d7c887e45f47b38687054daMarc Blank }; 1600c5afb16430a145f20d7c887e45f47b38687054daMarc Blank private static final String[] ADDRESS_COLUMN_NAMES = new String[] { 1601c5afb16430a145f20d7c887e45f47b38687054daMarc Blank Message.BCC_LIST, Message.CC_LIST, Message.FROM_LIST, Message.REPLY_TO_LIST, Message.TO_LIST 1602c5afb16430a145f20d7c887e45f47b38687054daMarc Blank }; 1603c5afb16430a145f20d7c887e45f47b38687054daMarc Blank 1604c5afb16430a145f20d7c887e45f47b38687054daMarc Blank private static void upgradeFromVersion29ToVersion30(SQLiteDatabase db) { 1605c5afb16430a145f20d7c887e45f47b38687054daMarc Blank try { 1606c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Loop through all messages, updating address columns to new format (CSV, RFC822) 1607c5afb16430a145f20d7c887e45f47b38687054daMarc Blank Cursor messageCursor = db.query(Message.TABLE_NAME, Message.CONTENT_PROJECTION, null, 1608c5afb16430a145f20d7c887e45f47b38687054daMarc Blank null, null, null, null); 1609c5afb16430a145f20d7c887e45f47b38687054daMarc Blank ContentValues cv = new ContentValues(); 1610c5afb16430a145f20d7c887e45f47b38687054daMarc Blank String[] whereArgs = new String[1]; 1611c5afb16430a145f20d7c887e45f47b38687054daMarc Blank try { 1612c5afb16430a145f20d7c887e45f47b38687054daMarc Blank while (messageCursor.moveToNext()) { 1613c5afb16430a145f20d7c887e45f47b38687054daMarc Blank for (int i = 0; i < ADDRESS_COLUMN_INDICES.length; i++) { 1614c5afb16430a145f20d7c887e45f47b38687054daMarc Blank Address[] addrs = 1615c5afb16430a145f20d7c887e45f47b38687054daMarc Blank Address.unpack(messageCursor.getString(ADDRESS_COLUMN_INDICES[i])); 1616c5afb16430a145f20d7c887e45f47b38687054daMarc Blank cv.put(ADDRESS_COLUMN_NAMES[i], Address.pack(addrs)); 1617c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 1618c5afb16430a145f20d7c887e45f47b38687054daMarc Blank whereArgs[0] = messageCursor.getString(Message.CONTENT_ID_COLUMN); 1619c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.update(Message.TABLE_NAME, cv, WHERE_ID, whereArgs); 1620c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 1621c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } finally { 1622c5afb16430a145f20d7c887e45f47b38687054daMarc Blank messageCursor.close(); 1623c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 1624c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } catch (SQLException e) { 1625c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Shouldn't be needed unless we're debugging and interrupt the process 1626560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy LogUtils.w(TAG, "Exception upgrading EmailProvider.db from 29 to 30 " + e); 1627c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 1628c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 1629c5afb16430a145f20d7c887e45f47b38687054daMarc Blank 1630c5afb16430a145f20d7c887e45f47b38687054daMarc Blank private static void upgradeToEmail2(SQLiteDatabase db) { 1631c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // Perform cleanup operations from Email1 to Email2; Email1 will have added new 1632c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // data that won't conform to what's expected in Email2 1633c5afb16430a145f20d7c887e45f47b38687054daMarc Blank 1634c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // From 31->32 upgrade 1635c5afb16430a145f20d7c887e45f47b38687054daMarc Blank try { 1636c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("update Mailbox set " + Mailbox.LAST_NOTIFIED_MESSAGE_KEY + 1637c5afb16430a145f20d7c887e45f47b38687054daMarc Blank "=0 where " + Mailbox.LAST_NOTIFIED_MESSAGE_KEY + " IS NULL"); 1638c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("update Mailbox set " + Mailbox.LAST_NOTIFIED_MESSAGE_COUNT + 1639c5afb16430a145f20d7c887e45f47b38687054daMarc Blank "=0 where " + Mailbox.LAST_NOTIFIED_MESSAGE_COUNT + " IS NULL"); 1640c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } catch (SQLException e) { 1641560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy LogUtils.w(TAG, "Exception upgrading EmailProvider.db from 31 to 32/100 " + e); 1642c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 1643c5afb16430a145f20d7c887e45f47b38687054daMarc Blank 1644c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // From 32->33 upgrade 1645c5afb16430a145f20d7c887e45f47b38687054daMarc Blank try { 1646c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("update " + Attachment.TABLE_NAME + " set " + Attachment.UI_STATE + 1647c5afb16430a145f20d7c887e45f47b38687054daMarc Blank "=" + UIProvider.AttachmentState.SAVED + " where " + 1648c5afb16430a145f20d7c887e45f47b38687054daMarc Blank AttachmentColumns.CONTENT_URI + " is not null;"); 1649c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } catch (SQLException e) { 1650560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy LogUtils.w(TAG, "Exception upgrading EmailProvider.db from 32 to 33/100 " + e); 1651c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 1652c5afb16430a145f20d7c887e45f47b38687054daMarc Blank 1653c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // From 34->35 upgrade 1654c5afb16430a145f20d7c887e45f47b38687054daMarc Blank try { 1655c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("update " + Mailbox.TABLE_NAME + " set " + 1656c5afb16430a145f20d7c887e45f47b38687054daMarc Blank MailboxColumns.LAST_TOUCHED_TIME + " = " + 1657c5afb16430a145f20d7c887e45f47b38687054daMarc Blank Mailbox.DRAFTS_DEFAULT_TOUCH_TIME + " WHERE " + MailboxColumns.TYPE + 1658c5afb16430a145f20d7c887e45f47b38687054daMarc Blank " = " + Mailbox.TYPE_DRAFTS); 1659c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("update " + Mailbox.TABLE_NAME + " set " + 1660c5afb16430a145f20d7c887e45f47b38687054daMarc Blank MailboxColumns.LAST_TOUCHED_TIME + " = " + 1661c5afb16430a145f20d7c887e45f47b38687054daMarc Blank Mailbox.SENT_DEFAULT_TOUCH_TIME + " WHERE " + MailboxColumns.TYPE + 1662c5afb16430a145f20d7c887e45f47b38687054daMarc Blank " = " + Mailbox.TYPE_SENT); 1663c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } catch (SQLException e) { 1664560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy LogUtils.w(TAG, "Exception upgrading EmailProvider.db from 34 to 35/100 " + e); 1665c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 1666c5afb16430a145f20d7c887e45f47b38687054daMarc Blank 1667c5afb16430a145f20d7c887e45f47b38687054daMarc Blank // From 35/36->37 1668c5afb16430a145f20d7c887e45f47b38687054daMarc Blank try { 1669c5afb16430a145f20d7c887e45f47b38687054daMarc Blank db.execSQL("update " + Mailbox.TABLE_NAME + " set " + 1670c5afb16430a145f20d7c887e45f47b38687054daMarc Blank MailboxColumns.FLAGS + "=" + MailboxColumns.FLAGS + "|" + 1671c5afb16430a145f20d7c887e45f47b38687054daMarc Blank Mailbox.FLAG_SUPPORTS_SETTINGS + " where (" + 1672c5afb16430a145f20d7c887e45f47b38687054daMarc Blank MailboxColumns.FLAGS + "&" + Mailbox.FLAG_HOLDS_MAIL + ")!=0 and " + 1673c5afb16430a145f20d7c887e45f47b38687054daMarc Blank MailboxColumns.ACCOUNT_KEY + " IN (SELECT " + Account.TABLE_NAME + 1674c5afb16430a145f20d7c887e45f47b38687054daMarc Blank "." + AccountColumns.ID + " from " + Account.TABLE_NAME + "," + 1675c5afb16430a145f20d7c887e45f47b38687054daMarc Blank HostAuth.TABLE_NAME + " where " + Account.TABLE_NAME + "." + 1676c5afb16430a145f20d7c887e45f47b38687054daMarc Blank AccountColumns.HOST_AUTH_KEY_RECV + "=" + HostAuth.TABLE_NAME + "." + 1677c5afb16430a145f20d7c887e45f47b38687054daMarc Blank HostAuthColumns.ID + " and " + HostAuthColumns.PROTOCOL + "='" + 167854347010fbbdd3ae1dea5b0e282514c640e16a5fMarc Blank LEGACY_SCHEME_EAS + "')"); 1679c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } catch (SQLException e) { 1680560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy LogUtils.w(TAG, "Exception upgrading EmailProvider.db from 35/36 to 37/100 " + e); 1681c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 1682c5afb16430a145f20d7c887e45f47b38687054daMarc Blank } 1683c5afb16430a145f20d7c887e45f47b38687054daMarc Blank} 1684