1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License.
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License.
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage com.google.coretests;
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport junit.framework.Test;
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.File;
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.sql.Connection;
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.sql.DriverManager;
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.sql.PreparedStatement;
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.sql.ResultSet;
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.sql.SQLException;
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.sql.Statement;
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class StatsStore {
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static final String sysVersion = "1.0";
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static Connection conn;
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static Statement stmt;
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static PreparedStatement insertStmt, selectByNameStmt, updateStmt;
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static PreparedStatement insertDetStmt, insertEventStmt;
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static PreparedStatement selectAllStmt;
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static long now;
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static int compareDuration(long dur, long refDur) {
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        long diff = dur - refDur;
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (diff <= 0) {
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if ((double)-diff / refDur > 0.5) return 1; // remarkably faster
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            else return 0; // equivalent duration (maybe a bit faster)
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        else if (diff < 20) return 0; // not measurably slower: equivalent duration
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        else if ((double)diff / refDur < 0.2) return 0; // just little slower: equivalent duration
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        else return -1; // relevantly SLOWer
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static void initStats(PerfStatCollector.Item a) {
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        a.statMinDuration = a.duration;
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        a.statMaxDuration = a.duration;
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        a.statAvgDuration = a.duration;
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        a.statCount = 1;
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static void adjustStats(PerfStatCollector.Item a) {
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (a.duration < a.statMinDuration) a.statMinDuration = a.duration;
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        else
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (a.duration > a.statMaxDuration) a.statMaxDuration = a.duration;
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        a.statAvgDuration = ((a.statAvgDuration * a.statCount + a.duration) / (a.statCount + 1));
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        a.statCount++;
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static void adjustStatsOptimistic(PerfStatCollector.Item a) {
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        adjustStats(a);
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // Could consider reducing a.statMaxDuration.
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static void use1(PerfStatCollector.Item a) {
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Test test;
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int pos;
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        PreparedStatement selectStmt = selectByNameStmt;
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                insertStmt.setString(1, a.test.toString());
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                insertStmt.execute();
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (SQLException e) {}
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            selectStmt.setString(1, a.test.toString());
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            ResultSet row = selectStmt.executeQuery();
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            row.first();
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            pos = 1;
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            a.id = row.getInt(pos); pos++;
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            a.bestRes = row.getInt(pos); pos++;
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            a.lastBestAt = row.getLong(pos); pos++;
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            a.lastRes = row.getInt(pos); pos++;
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            a.lastDuration = row.getLong(pos); pos++;
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            a.statCount = row.getInt(pos); pos++;
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            a.statAvgDuration = row.getDouble(pos); pos++;
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            a.statMinDuration = row.getLong(pos); pos++;
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            a.statMaxDuration = row.getLong(pos); pos++;
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (a.res == 0) {
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (a.bestRes == 100) {
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    a.bestRes = 0; a.lastBestAt = now;
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    a.histRelevance = 0; // Good from scratch.
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    a.isTransition = false;
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    initStats(a);
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                } else if (a.bestRes != 0) {
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    a.bestRes = 0; a.lastBestAt = now;
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    a.histRelevance = 4; // "Good" for the first time:
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    a.isTransition = true; // was bad before.
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    initStats(a);
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                } else if (a.lastRes != 0) {
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    a.bestRes = 0; a.lastBestAt = now;
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    a.histRelevance = 3; // "good" again:
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    a.isTransition = true; // was bad in between.
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    adjustStats(a);
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                } else {
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    // res == lastRes == bestRes == 0:
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    int cmp = compareDuration(a.duration, a.statMinDuration);
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    if (cmp >= 0) {
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        a.bestRes = 0; a.lastBestAt = now;
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        if (cmp > 0) {
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            a.histRelevance = 2; // "Fast"er than ever before.
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            a.isTransition = true;
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            adjustStatsOptimistic(a);
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        } else if (compareDuration(a.duration, a.lastDuration) > 0) {
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            // As fast as best but faster than last run:
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            a.histRelevance = 1; // "fast" again.
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            a.isTransition = true;
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            adjustStatsOptimistic(a);
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        } else {
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            a.histRelevance = 0; // Equivalent Duration:
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            a.isTransition = false; // usual good case.
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            adjustStats(a);
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        }
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    } else {
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        if (compareDuration(a.duration, a.lastDuration) < 0) {
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            a.histRelevance = -2; // "SLOW"!!!
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            a.isTransition = true;
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            adjustStats(a);
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        } else {
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            a.histRelevance = -2; // Still "SLOW"!!!
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            a.isTransition = false; // (But NO transition!)
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            adjustStats(a);
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        }
141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    }
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } else if (a.bestRes == 0) {
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (a.lastRes == 0) {
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    a.histRelevance = -4; // "VBAD"!!!
146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    a.isTransition = true;
147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                } else {
148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    a.histRelevance = -4; // Still "VBAD"!!!
149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    a.isTransition = false; // (But NO transition!)
150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                // DON'T adjust statistics: they should reflect good runs, only.
152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } else if (a.bestRes == 100) {
153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                a.bestRes = -3; // Just mark as NOT good.
154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                a.histRelevance = -3; // Bad (initial run).
155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                a.isTransition = true;
156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                initStats(a);
157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } else {
158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                a.histRelevance = 0; // Still Failure or Error:
159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                a.isTransition = false; // usual bad case.
160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                adjustStats(a);
161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            pos = 1;
163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            updateStmt.setInt(pos, a.bestRes); pos++;
164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            updateStmt.setLong(pos, a.lastBestAt); pos++;
165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            updateStmt.setInt(pos, a.res); pos++;
166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            updateStmt.setLong(pos, a.duration); pos++;
167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            updateStmt.setInt(pos, a.statCount); pos++;
168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            updateStmt.setDouble(pos, a.statAvgDuration); pos++;
169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            updateStmt.setLong(pos, a.statMinDuration); pos++;
170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            updateStmt.setLong(pos, a.statMaxDuration); pos++;
171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            updateStmt.setInt(pos, a.id); pos++;
172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            updateStmt.execute();
173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            pos = 1;
174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            insertDetStmt.setInt(pos, a.id); pos++;
175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            insertDetStmt.setLong(pos, now); pos++;
176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            insertDetStmt.setInt(pos, a.statCount); pos++;
177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            insertDetStmt.setInt(pos, a.res); pos++;
178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            insertDetStmt.setLong(pos, a.duration); pos++;
179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            insertDetStmt.execute();
180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (a.isTransition) {
181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                pos = 1;
182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                insertEventStmt.setInt(pos, a.id); pos++;
183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                insertEventStmt.setLong(pos, now); pos++;
184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                insertEventStmt.setInt(pos, a.histRelevance); pos++;
185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                insertEventStmt.setInt(pos, a.res); pos++;
186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                insertEventStmt.setLong(pos, a.duration); pos++;
187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                insertEventStmt.execute();
188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        catch (SQLException e) {
191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            int x = 0;
192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project//    static void use2(PerfStatCollector.Item a) {
196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project//    }
197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static void execOrIgnore(String sql) {
199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try { stmt.execute(sql); }
200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        catch (SQLException e) {}
201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static void open(String jdbcDriver, String connectionURL)
204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    throws Exception {
205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project//        try {
206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Class.forName(jdbcDriver).newInstance();
207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            conn = DriverManager.getConnection(connectionURL);
208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            stmt = conn.createStatement();
209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            String dbVersion;
210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                ResultSet res = stmt.executeQuery("SELECT id FROM Version");
212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                res.first();
213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                dbVersion = res.getString(1);
214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            catch (SQLException e) {
216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                dbVersion = "";
217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (!dbVersion.equals(sysVersion)) {
219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                execOrIgnore("DROP TABLE Test_Cases;");
220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                stmt.execute("CREATE TABLE Test_Cases (" +
221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        "  id INTEGER PRIMARY KEY AUTOINCREMENT, " +
222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        "  name VARCHAR(255) UNIQUE, " +
223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        // (best_Res != 0) ==> (last_Best_At == 0) never ran good!
224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        "  best_Res INTEGER, last_Best_At INTEGER, " +
225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        "  last_Res INTEGER, last_Duration INTEGER, " +
226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        "  stat_Cnt INTEGER, stat_Avg NUMBER(20, 2), " +
227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        "  stat_Min INTEGER, stat_Max INTEGER);");
228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                execOrIgnore("DROP TABLE Test_Case_Runs;");
229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                stmt.execute("CREATE TABLE Test_Case_Runs (" +
230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        "  test_Id INTEGER, run_At INTEGER, " +
231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        "  iteration INTEGER, res INTEGER, duration INTEGER, " +
232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        "  PRIMARY KEY (test_Id, run_At));");
233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                execOrIgnore("DROP TABLE Test_Case_Events;");
234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                stmt.execute("CREATE TABLE Test_Case_Events (" +
235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        "  test_Id INTEGER, run_At INTEGER, " +
236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        "  relevance INTEGER, " +
237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        "  res INTEGER, duration INTEGER, " +
238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        "  PRIMARY KEY (test_Id, run_At));");
239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project//                stmt.execute("CREATE PROCEDURE useSample (IN pName TEXT, " +
240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project//                        "pRes INTEGER, pDuration INTEGER, pTime INTEGER) " +
241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project//                        "BEGIN " +
242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project//                        "  INSERT OR IGNORE INTO TestCases (name)" +
243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project//                        "  VALUES (pName);" +
244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project//                        "END;");
245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                execOrIgnore("DROP TABLE Version;");
246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                stmt.execute("CREATE TABLE Version(id VARCHAR(31));");
247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                stmt.execute("INSERT INTO Version (id) VALUES ('" + sysVersion + "');");
248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project//            updateStmt = conn.prepareStatement("useSample(:name, :res, :duration, :time)");
250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    //        firstConnection.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    //        firstStmt = firstConnection.createStatement();
252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    //        firstStmt.execute("create table tbl1(one varchar(10), two smallint)");
253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            insertStmt = conn.prepareStatement("INSERT " +
254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    "INTO Test_Cases (name, stat_Cnt) VALUES (?, 0);");
255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            selectByNameStmt = conn.prepareStatement("SELECT id, " +
256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    "  IFNULL(best_Res, 100), IFNULL(last_Best_At, 0), " +
257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    "  IFNULL(last_Res, 100), IFNULL(last_Duration, 0), " +
258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    "  IFNULL(stat_Cnt, 0), IFNULL(stat_Avg, 0), " +
259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    "  IFNULL(stat_Min, 0), IFNULL(stat_Max, 0) " +
260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    "FROM Test_Cases WHERE name = ?;");
261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            updateStmt = conn.prepareStatement("UPDATE Test_Cases SET " +
262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    "  best_Res = ?, last_Best_At = ?, " +
263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    "  last_Res = ?, last_Duration = ?, " +
264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    "  stat_Cnt = ?, stat_Avg = ?, " +
265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    "  stat_Min = ?, stat_Max = ? " +
266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    "WHERE id = ?;");
267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            insertDetStmt = conn.prepareStatement("INSERT " +
268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    "INTO Test_Case_Runs (test_Id, run_At, iteration, res, duration) " +
269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    "VALUES (?, ?, ?, ?, ?);");
270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            insertEventStmt = conn.prepareStatement("INSERT " +
271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    "INTO Test_Case_Events (test_Id, run_At, relevance, res, duration) " +
272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    "VALUES (?, ?, ?, ?, ?);");
273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            selectAllStmt = conn.prepareStatement("SELECT id, name, " +
274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    "last_Res, stat_Cnt, " +
275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    "last_Duration, stat_Avg, stat_Min, stat_Max " +
276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    "FROM Test_Cases;");
277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project//                ResultSet res = stmt.executeQuery("PRAGMA CACHE_SIZE;");
280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project//                res.first();
281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project//                System.out.print("CACHE_SIZE = ");
282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project//                System.out.println(res.getString(1));
283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project//                stmt.execute("PRAGMA CACHE_SIZE = 5000;");
284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                stmt.execute("PRAGMA SYNCHRONOUS = OFF;");
285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                stmt.execute("PRAGMA temp_store = MEMORY;");
286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            catch (SQLException e) {
288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                dbVersion = "";
289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            stmt.close();
291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            conn.commit();
292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project//        }
293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project//        catch (Exception e) {
294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project//            conn = null;
295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project//        }
296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project//        return conn != null;
297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static void close() {
300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            conn.commit();
302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            conn.close();
303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            conn = null;
304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        catch (Exception e) {
306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            conn = null;
307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
310