1394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski/*
2394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski * Copyright (C) 2010 The Android Open Source Project
3394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski *
4394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski * Licensed under the Apache License, Version 2.0 (the "License");
5394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski * you may not use this file except in compliance with the License.
6394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski * You may obtain a copy of the License at
7394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski *
8394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski *      http://www.apache.org/licenses/LICENSE-2.0
9394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski *
10394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski * Unless required by applicable law or agreed to in writing, software
11394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski * distributed under the License is distributed on an "AS IS" BASIS,
12394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski * See the License for the specific language governing permissions and
14394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski * limitations under the License.
15394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski */
16394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski
17394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowskipackage com.android.dumprendertree2;
18394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski
19394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowskiimport android.content.ContentValues;
20394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowskiimport android.content.Context;
21394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowskiimport android.database.Cursor;
22394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowskiimport android.database.SQLException;
23394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowskiimport android.database.sqlite.SQLiteDatabase;
24394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowskiimport android.database.sqlite.SQLiteOpenHelper;
25394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski
26394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowskiimport java.util.HashSet;
27394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowskiimport java.util.Set;
28394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski
29394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski/**
30394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski * A basic class that wraps database accesses inside itself and provides functionality to
31394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski * store and retrieve AbstractResults.
32394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski */
33394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowskipublic class SummarizerDBHelper {
34394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski    private static final String KEY_ID = "id";
35394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski    private static final String KEY_PATH = "path";
36394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski    private static final String KEY_BYTES = "bytes";
37394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski
38394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski    private static final String DATABASE_NAME = "SummarizerDB";
39394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski    private static final int DATABASE_VERSION = 1;
40394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski
41394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski    static final String EXPECTED_FAILURES_TABLE = "expectedFailures";
42394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski    static final String UNEXPECTED_FAILURES_TABLE = "unexpectedFailures";
43394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski    static final String EXPECTED_PASSES_TABLE = "expextedPasses";
44394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski    static final String UNEXPECTED_PASSES_TABLE = "unexpextedPasses";
45394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski    private static final Set<String> TABLES_NAMES = new HashSet<String>();
46394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski    {
47394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski        TABLES_NAMES.add(EXPECTED_FAILURES_TABLE);
48394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski        TABLES_NAMES.add(EXPECTED_PASSES_TABLE);
49394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski        TABLES_NAMES.add(UNEXPECTED_FAILURES_TABLE);
50394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski        TABLES_NAMES.add(UNEXPECTED_PASSES_TABLE);
51394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski    }
52394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski
53394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski    private static final void createTables(SQLiteDatabase db) {
54394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski        String cmd;
55394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski        for (String tableName : TABLES_NAMES) {
56394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski            cmd = "create table " + tableName + " ("
57394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski                    + KEY_ID + " integer primary key autoincrement, "
58394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski                    + KEY_PATH + " text not null, "
59394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski                    + KEY_BYTES + " blob not null);";
60394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski            db.execSQL(cmd);
61394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski        }
62394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski    }
63394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski
64394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski    private static final void dropTables(SQLiteDatabase db) {
65394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski        for (String tableName : TABLES_NAMES) {
66394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski            db.execSQL("DROP TABLE IF EXISTS " + tableName);
67394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski        }
68394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski    }
69394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski
70394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski    private static class DatabaseHelper extends SQLiteOpenHelper {
71394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski        DatabaseHelper(Context context) {
72394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski            super(context, DATABASE_NAME, null, DATABASE_VERSION);
73394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski        }
74394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski
75394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski        @Override
76394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski        public void onCreate(SQLiteDatabase db) {
77394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski            dropTables(db);
78394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski            createTables(db);
79394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski        }
80394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski
81394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski        @Override
82394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
83394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski            /** NOOP for now, because we will never upgrade the db */
84394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski        }
85394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski
86394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski        public void reset(SQLiteDatabase db) {
87394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski            dropTables(db);
88394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski            createTables(db);
89394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski        }
90394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski    }
91394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski
92394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski    private DatabaseHelper mDbHelper;
93394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski    private SQLiteDatabase mDb;
94394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski
95394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski    private final Context mContext;
96394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski
97394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski    public SummarizerDBHelper(Context ctx) {
98394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski        mContext = ctx;
99394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski        mDbHelper = new DatabaseHelper(mContext);
100394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski    }
101394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski
102394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski    public void reset() {
103394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski        mDbHelper.reset(this.mDb);
104394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski    }
105394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski
106394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski    public void open() throws SQLException {
107394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski        mDb = mDbHelper.getWritableDatabase();
108394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski    }
109394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski
110394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski    public void close() {
111394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski        mDbHelper.close();
112394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski    }
113394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski
114394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski    public void insertAbstractResult(AbstractResult result, String table) {
115394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski        ContentValues cv = new ContentValues();
116394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski        cv.put(KEY_PATH, result.getRelativePath());
117394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski        cv.put(KEY_BYTES, result.getBytes());
118394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski        mDb.insert(table, null, cv);
119394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski    }
120394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski
121394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski    public Cursor getAbstractResults(String table) throws SQLException {
122394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski        return mDb.query(false, table, new String[] {KEY_BYTES}, null, null, null, null,
123394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski                KEY_PATH + " ASC", null);
124394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski    }
125394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski
126394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski    public static AbstractResult getAbstractResult(Cursor cursor) {
127394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski        return AbstractResult.create(cursor.getBlob(cursor.getColumnIndex(KEY_BYTES)));
128394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski    }
129394e0fb84996f5f5ee9e33c9e2f0e11066e6f943Maksymilian Osowski}