16f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio/*
26f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio * Copyright (C) 2014 The Android Open Source Project
36f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio *
46f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio * Licensed under the Apache License, Version 2.0 (the "License");
56f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio * you may not use this file except in compliance with the License.
66f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio * You may obtain a copy of the License at
76f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio *
86f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio *      http://www.apache.org/licenses/LICENSE-2.0
96f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio *
106f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio * Unless required by applicable law or agreed to in writing, software
116f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio * distributed under the License is distributed on an "AS IS" BASIS,
126f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio * See the License for the specific language governing permissions and
146f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio * limitations under the License.
156f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio */
166f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio
17fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Megliopackage com.android.settings.search;
186f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio
196f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglioimport android.content.Context;
206f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglioimport android.database.Cursor;
216f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglioimport android.database.sqlite.SQLiteDatabase;
226f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglioimport android.database.sqlite.SQLiteOpenHelper;
236f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglioimport android.os.Build;
246f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglioimport android.util.Log;
256f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio
266f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Megliopublic class IndexDatabaseHelper extends SQLiteOpenHelper {
276f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio
286f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio    private static final String TAG = "IndexDatabaseHelper";
296f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio
306f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio    private static final String DATABASE_NAME = "search_index.db";
31d17a15bbc473a7262755ff136b15a3587f4c7ddbFabrice Di Meglio    private static final int DATABASE_VERSION = 115;
326f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio
336f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio    public interface Tables {
346f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio        public static final String TABLE_PREFS_INDEX = "prefs_index";
356f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio        public static final String TABLE_META_INDEX = "meta_index";
36ab791fccf94b91c2e70e788743dc03d9123c176bFabrice Di Meglio        public static final String TABLE_SAVED_QUERIES = "saved_queries";
376f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio    }
386f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio
396f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio    public interface IndexColumns {
4051bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        public static final String DOCID = "docid";
416f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio        public static final String LOCALE = "locale";
426f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio        public static final String DATA_RANK = "data_rank";
436f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio        public static final String DATA_TITLE = "data_title";
44489362c83c11f7d531c8c0c08c285499cd2b3869Fabrice Di Meglio        public static final String DATA_TITLE_NORMALIZED = "data_title_normalized";
459593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio        public static final String DATA_SUMMARY_ON = "data_summary_on";
469593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio        public static final String DATA_SUMMARY_ON_NORMALIZED = "data_summary_on_normalized";
479593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio        public static final String DATA_SUMMARY_OFF = "data_summary_off";
489593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio        public static final String DATA_SUMMARY_OFF_NORMALIZED = "data_summary_off_normalized";
49a41707200b6628376e8fb575e782d8228c0d32a2Fabrice Di Meglio        public static final String DATA_ENTRIES = "data_entries";
506f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio        public static final String DATA_KEYWORDS = "data_keywords";
51fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio        public static final String CLASS_NAME = "class_name";
52fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio        public static final String SCREEN_TITLE = "screen_title";
53fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio        public static final String INTENT_ACTION = "intent_action";
54fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio        public static final String INTENT_TARGET_PACKAGE = "intent_target_package";
55fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio        public static final String INTENT_TARGET_CLASS = "intent_target_class";
566f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio        public static final String ICON = "icon";
5751bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio        public static final String ENABLED = "enabled";
58c1457323d271309d5d1955743cd806417c84b9d6Fabrice Di Meglio        public static final String DATA_KEY_REF = "data_key_reference";
59d17a15bbc473a7262755ff136b15a3587f4c7ddbFabrice Di Meglio        public static final String USER_ID = "user_id";
606f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio    }
616f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio
626f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio    public interface MetaColumns {
636f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio        public static final String BUILD = "build";
646f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio    }
656f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio
66ab791fccf94b91c2e70e788743dc03d9123c176bFabrice Di Meglio    public interface SavedQueriesColums  {
67ab791fccf94b91c2e70e788743dc03d9123c176bFabrice Di Meglio        public static final String QUERY = "query";
68ab791fccf94b91c2e70e788743dc03d9123c176bFabrice Di Meglio        public static final String TIME_STAMP = "timestamp";
69ab791fccf94b91c2e70e788743dc03d9123c176bFabrice Di Meglio    }
70ab791fccf94b91c2e70e788743dc03d9123c176bFabrice Di Meglio
716f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio    private static final String CREATE_INDEX_TABLE =
726f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio            "CREATE VIRTUAL TABLE " + Tables.TABLE_PREFS_INDEX + " USING fts4" +
736f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio                    "(" +
746f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio                    IndexColumns.LOCALE +
756f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio                    ", " +
766f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio                    IndexColumns.DATA_RANK +
776f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio                    ", " +
786f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio                    IndexColumns.DATA_TITLE +
796f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio                    ", " +
80489362c83c11f7d531c8c0c08c285499cd2b3869Fabrice Di Meglio                    IndexColumns.DATA_TITLE_NORMALIZED +
81489362c83c11f7d531c8c0c08c285499cd2b3869Fabrice Di Meglio                    ", " +
829593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio                    IndexColumns.DATA_SUMMARY_ON +
836f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio                    ", " +
849593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio                    IndexColumns.DATA_SUMMARY_ON_NORMALIZED +
859593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio                    ", " +
869593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio                    IndexColumns.DATA_SUMMARY_OFF +
879593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio                    ", " +
889593782d154f378a0c911cd015d410c18fe74a92Fabrice Di Meglio                    IndexColumns.DATA_SUMMARY_OFF_NORMALIZED +
89489362c83c11f7d531c8c0c08c285499cd2b3869Fabrice Di Meglio                    ", " +
90a41707200b6628376e8fb575e782d8228c0d32a2Fabrice Di Meglio                    IndexColumns.DATA_ENTRIES +
91a41707200b6628376e8fb575e782d8228c0d32a2Fabrice Di Meglio                    ", " +
926f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio                    IndexColumns.DATA_KEYWORDS +
936f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio                    ", " +
94fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio                    IndexColumns.SCREEN_TITLE +
956f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio                    ", " +
96fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio                    IndexColumns.CLASS_NAME +
976f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio                    ", " +
986f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio                    IndexColumns.ICON +
99fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio                    ", " +
100fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio                    IndexColumns.INTENT_ACTION +
101fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio                    ", " +
102fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio                    IndexColumns.INTENT_TARGET_PACKAGE +
103fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio                    ", " +
104fa7dc240e978b1b77bb5c80a78cd1f8c77648301Fabrice Di Meglio                    IndexColumns.INTENT_TARGET_CLASS +
10551bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                    ", " +
10651bfee595c3ce587e2e26565fd9e8f4ae02c3482Fabrice Di Meglio                    IndexColumns.ENABLED +
107c1457323d271309d5d1955743cd806417c84b9d6Fabrice Di Meglio                    ", " +
108c1457323d271309d5d1955743cd806417c84b9d6Fabrice Di Meglio                    IndexColumns.DATA_KEY_REF +
109d17a15bbc473a7262755ff136b15a3587f4c7ddbFabrice Di Meglio                    ", " +
110d17a15bbc473a7262755ff136b15a3587f4c7ddbFabrice Di Meglio                    IndexColumns.USER_ID +
1116f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio                    ");";
1126f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio
1136f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio    private static final String CREATE_META_TABLE =
1146f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio            "CREATE TABLE " + Tables.TABLE_META_INDEX +
1156f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio                    "(" +
1166f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio                    MetaColumns.BUILD + " VARCHAR(32) NOT NULL" +
1176f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio                    ")";
1186f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio
119ab791fccf94b91c2e70e788743dc03d9123c176bFabrice Di Meglio    private static final String CREATE_SAVED_QUERIES_TABLE =
120ab791fccf94b91c2e70e788743dc03d9123c176bFabrice Di Meglio            "CREATE TABLE " + Tables.TABLE_SAVED_QUERIES +
121ab791fccf94b91c2e70e788743dc03d9123c176bFabrice Di Meglio                    "(" +
122ab791fccf94b91c2e70e788743dc03d9123c176bFabrice Di Meglio                    SavedQueriesColums.QUERY + " VARCHAR(64) NOT NULL" +
123ab791fccf94b91c2e70e788743dc03d9123c176bFabrice Di Meglio                    ", " +
124ab791fccf94b91c2e70e788743dc03d9123c176bFabrice Di Meglio                    SavedQueriesColums.TIME_STAMP + " INTEGER" +
125ab791fccf94b91c2e70e788743dc03d9123c176bFabrice Di Meglio                    ")";
126ab791fccf94b91c2e70e788743dc03d9123c176bFabrice Di Meglio
1276f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio    private static final String INSERT_BUILD_VERSION =
1286f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio            "INSERT INTO " + Tables.TABLE_META_INDEX +
1296f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio                    " VALUES ('" + Build.VERSION.INCREMENTAL + "');";
1306f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio
1316f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio    private static final String SELECT_BUILD_VERSION =
1326f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio            "SELECT " + MetaColumns.BUILD + " FROM " + Tables.TABLE_META_INDEX + " LIMIT 1;";
1336f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio
1346f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio    private static IndexDatabaseHelper sSingleton;
1356f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio
1366f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio    public static synchronized IndexDatabaseHelper getInstance(Context context) {
1376f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio        if (sSingleton == null) {
1386f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio            sSingleton = new IndexDatabaseHelper(context);
1396f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio        }
1406f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio        return sSingleton;
1416f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio    }
1426f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio
1436f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio    public IndexDatabaseHelper(Context context) {
1446f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio        super(context, DATABASE_NAME, null, DATABASE_VERSION);
1456f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio    }
1466f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio
1476f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio    @Override
1486f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio    public void onCreate(SQLiteDatabase db) {
1496f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio        bootstrapDB(db);
1506f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio    }
1516f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio
1526f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio    private void bootstrapDB(SQLiteDatabase db) {
1536f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio        db.execSQL(CREATE_INDEX_TABLE);
1546f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio        db.execSQL(CREATE_META_TABLE);
155ab791fccf94b91c2e70e788743dc03d9123c176bFabrice Di Meglio        db.execSQL(CREATE_SAVED_QUERIES_TABLE);
1566f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio        db.execSQL(INSERT_BUILD_VERSION);
1576f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio        Log.i(TAG, "Bootstrapped database");
1586f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio    }
1596f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio
1606f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio    @Override
161fb5e639b30e866ba5a379487ab5b7a77fe175a7bFabrice Di Meglio    public void onOpen(SQLiteDatabase db) {
162fb5e639b30e866ba5a379487ab5b7a77fe175a7bFabrice Di Meglio        super.onOpen(db);
163fb5e639b30e866ba5a379487ab5b7a77fe175a7bFabrice Di Meglio
164fb5e639b30e866ba5a379487ab5b7a77fe175a7bFabrice Di Meglio        Log.i(TAG, "Using schema version: " + db.getVersion());
165fb5e639b30e866ba5a379487ab5b7a77fe175a7bFabrice Di Meglio
166fb5e639b30e866ba5a379487ab5b7a77fe175a7bFabrice Di Meglio        if (!Build.VERSION.INCREMENTAL.equals(getBuildVersion(db))) {
167fb5e639b30e866ba5a379487ab5b7a77fe175a7bFabrice Di Meglio            Log.w(TAG, "Index needs to be rebuilt as build-version is not the same");
168fb5e639b30e866ba5a379487ab5b7a77fe175a7bFabrice Di Meglio            // We need to drop the tables and recreate them
169fb5e639b30e866ba5a379487ab5b7a77fe175a7bFabrice Di Meglio            reconstruct(db);
170fb5e639b30e866ba5a379487ab5b7a77fe175a7bFabrice Di Meglio        } else {
171fb5e639b30e866ba5a379487ab5b7a77fe175a7bFabrice Di Meglio            Log.i(TAG, "Index is fine");
172fb5e639b30e866ba5a379487ab5b7a77fe175a7bFabrice Di Meglio        }
173fb5e639b30e866ba5a379487ab5b7a77fe175a7bFabrice Di Meglio    }
174fb5e639b30e866ba5a379487ab5b7a77fe175a7bFabrice Di Meglio
175fb5e639b30e866ba5a379487ab5b7a77fe175a7bFabrice Di Meglio    @Override
1766f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
177dd41dfc483e830bdb33df858dec99e2c4c806bfcFabrice Di Meglio        if (oldVersion < DATABASE_VERSION) {
178fb5e639b30e866ba5a379487ab5b7a77fe175a7bFabrice Di Meglio            Log.w(TAG, "Detected schema version '" +  oldVersion + "'. " +
179fb5e639b30e866ba5a379487ab5b7a77fe175a7bFabrice Di Meglio                    "Index needs to be rebuilt for schema version '" + newVersion + "'.");
180489362c83c11f7d531c8c0c08c285499cd2b3869Fabrice Di Meglio            // We need to drop the tables and recreate them
181fb5e639b30e866ba5a379487ab5b7a77fe175a7bFabrice Di Meglio            reconstruct(db);
182489362c83c11f7d531c8c0c08c285499cd2b3869Fabrice Di Meglio        }
1836f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio    }
1846f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio
185fb5e639b30e866ba5a379487ab5b7a77fe175a7bFabrice Di Meglio    @Override
186fb5e639b30e866ba5a379487ab5b7a77fe175a7bFabrice Di Meglio    public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
187fb5e639b30e866ba5a379487ab5b7a77fe175a7bFabrice Di Meglio        Log.w(TAG, "Detected schema version '" +  oldVersion + "'. " +
188fb5e639b30e866ba5a379487ab5b7a77fe175a7bFabrice Di Meglio                "Index needs to be rebuilt for schema version '" + newVersion + "'.");
189fb5e639b30e866ba5a379487ab5b7a77fe175a7bFabrice Di Meglio        // We need to drop the tables and recreate them
190fb5e639b30e866ba5a379487ab5b7a77fe175a7bFabrice Di Meglio        reconstruct(db);
191fb5e639b30e866ba5a379487ab5b7a77fe175a7bFabrice Di Meglio    }
192fb5e639b30e866ba5a379487ab5b7a77fe175a7bFabrice Di Meglio
193fb5e639b30e866ba5a379487ab5b7a77fe175a7bFabrice Di Meglio    private void reconstruct(SQLiteDatabase db) {
194fb5e639b30e866ba5a379487ab5b7a77fe175a7bFabrice Di Meglio        dropTables(db);
195fb5e639b30e866ba5a379487ab5b7a77fe175a7bFabrice Di Meglio        bootstrapDB(db);
196fb5e639b30e866ba5a379487ab5b7a77fe175a7bFabrice Di Meglio    }
197fb5e639b30e866ba5a379487ab5b7a77fe175a7bFabrice Di Meglio
1986f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio    private String getBuildVersion(SQLiteDatabase db) {
1996f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio        String version = null;
2006f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio        Cursor cursor = null;
2016f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio        try {
2026f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio            cursor = db.rawQuery(SELECT_BUILD_VERSION, null);
2036f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio            if (cursor.moveToFirst()) {
2046f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio                version = cursor.getString(0);
2056f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio            }
2066f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio        }
2076f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio        catch (Exception e) {
2086f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio            Log.e(TAG, "Cannot get build version from Index metadata");
2096f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio        }
2106f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio        finally {
2116f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio            if (cursor != null) {
2126f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio                cursor.close();
2136f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio            }
2146f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio        }
2156f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio        return version;
2166f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio    }
2176f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio
2186f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio    private void dropTables(SQLiteDatabase db) {
2196f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio        db.execSQL("DROP TABLE IF EXISTS " + Tables.TABLE_META_INDEX);
2206f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio        db.execSQL("DROP TABLE IF EXISTS " + Tables.TABLE_PREFS_INDEX);
221ab791fccf94b91c2e70e788743dc03d9123c176bFabrice Di Meglio        db.execSQL("DROP TABLE IF EXISTS " + Tables.TABLE_SAVED_QUERIES);
2226f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio    }
2236f0739a3d9a9eca1591ae6bada1dd4d1d92c0defFabrice Di Meglio}
224