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