24 using namespace mageec;
35 loaded = sqlite3_open (dbname.c_str(), &db);
37 loaded = sqlite3_open_v2 (dbname.c_str(), &db, SQLITE_OPEN_READONLY, NULL);
40 assert(loaded == 0 &&
"Unable to load machine learning database.");
45 sqlite3_exec(db,
"PRAGMA foreign_keys = ON", NULL, NULL, NULL);
69 char qinit[] =
"CREATE TABLE IF NOT EXISTS passes (passname TEXT PRIMARY KEY)";
70 retval = sqlite3_exec(db, qinit, NULL, NULL, NULL);
73 char qinit2[] =
"CREATE TABLE IF NOT EXISTS passorder (seq INTEGER NOT NULL, "
74 "pos INTEGER NOT NULL, pass TEXT NOT NULL, "
75 "PRIMARY KEY (seq, pos))";
76 retval |= sqlite3_exec(db, qinit2, NULL, NULL, NULL);
78 char qinit3[] =
"CREATE TABLE IF NOT EXISTS features (prog TEXT NOT NULL, "
79 "feature INTEGER NOT NULL, value INTEGER NOT NULL, "
80 "PRIMARY KEY (prog, feature))";
81 retval |= sqlite3_exec(db, qinit3, NULL, NULL, NULL);
84 char qinit4[] =
"CREATE TABLE IF NOT EXISTS results (prog TEXT NOT NULL, "
85 "seq INTEGER NOT NULL, time INTEGER, energy INTEGER, "
86 "PRIMARY KEY (prog, seq))";
87 retval |= sqlite3_exec(db, qinit4, NULL, NULL, NULL);
90 char qinit5[] =
"CREATE TABLE IF NOT EXISTS passblob (pass TEXT, blob TEXT, "
91 "PRIMARY KEY (pass))";
92 retval |= sqlite3_exec(db, qinit5, NULL, NULL, NULL);
103 std::vector<mageec_pass*> passes;
108 char query[] =
"SELECT * FROM passes";
109 int retval = sqlite3_prepare_v2 (db, query, -1, &stmt, 0);
117 retval = sqlite3_step(stmt);
118 if(retval == SQLITE_ROW)
120 const char *val =
reinterpret_cast<const char *
>(sqlite3_column_text(stmt,0));
123 else if (retval == SQLITE_DONE)
139 std::string hashdata;
140 for (
unsigned long i=0, size=res.
passlist.size(); i < size; i++)
141 hashdata += res.
passlist[i]->name();
142 uint64_t hash =
hash_data (hashdata.c_str(), hashdata.size());
146 int64_t shash =
static_cast<int64_t
>(hash) ^
147 static_cast<int64_t>(0x8000000000000000);
150 buffer = sqlite3_mprintf (
"SELECT seq FROM passorder WHERE seq = %lli "
151 "GROUP BY seq", shash);
154 int retval = sqlite3_prepare_v2 (db, buffer, -1, &stmt, 0);
155 sqlite3_free (buffer);
160 retval = sqlite3_step(stmt);
161 if (retval != SQLITE_DONE)
164 for (
unsigned long i=0, size=res.
passlist.size(); i < size; i++)
166 buffer = sqlite3_mprintf (
"INSERT INTO passorder VALUES (%lli, %i, %Q)",
171 sqlite3_exec (db, buffer, NULL, NULL, NULL);
172 sqlite3_free (buffer);
177 buffer = sqlite3_mprintf (
"INSERT INTO results VALUES (%Q, %lli, 0, %i)",
182 sqlite3_exec (db, buffer, NULL, NULL, NULL);
183 sqlite3_free (buffer);
188 std::vector<result> results;
190 int retval, passretval;
191 sqlite3_stmt *stmt, *passstmt;
194 buffer = sqlite3_mprintf(
"SELECT `PROG`, `SEQ`, MIN(`energy`) FROM (SELECT "
195 "`rowid`,* FROM `results` ORDER BY `rowid` ASC "
196 "LIMIT 0, 50000) GROUP BY `PROG`");
197 retval = sqlite3_prepare_v2 (db, buffer, -1, &stmt, 0);
198 sqlite3_free (buffer);
204 retval = sqlite3_step(stmt);
205 if (retval == SQLITE_ROW)
207 const char *progkey =
reinterpret_cast<const char *
>(sqlite3_column_text(stmt, 0));
208 const char *passkey =
reinterpret_cast<const char *
>(sqlite3_column_text(stmt, 1));
211 std::vector<mageec_pass *> passes;
212 buffer = sqlite3_mprintf (
"SELECT * FROM passorder WHERE seq = %s ORDER "
214 passretval = sqlite3_prepare_v2 (db, buffer, -1, &passstmt, 0);
215 sqlite3_free (buffer);
220 passretval = sqlite3_step(passstmt);
221 if (passretval == SQLITE_ROW)
223 const char *passname =
reinterpret_cast<const char *
>(sqlite3_column_text(passstmt, 2));
226 else if (passretval == SQLITE_DONE)
231 std::vector<mageec_feature *> features;
232 buffer = sqlite3_mprintf (
"SELECT * FROM features WHERE prog = %Q ORDER "
233 "BY feature", progkey);
234 passretval = sqlite3_prepare_v2 (db, buffer, -1, &passstmt, 0);
235 sqlite3_free (buffer);
240 passretval = sqlite3_step(passstmt);
241 if (passretval == SQLITE_ROW)
243 const char *featname =
reinterpret_cast<const char *
>(sqlite3_column_text(passstmt, 1));
244 int featdata = sqlite3_column_int(passstmt, 2);
247 else if (passretval == SQLITE_DONE)
252 int energy = sqlite3_column_int(stmt, 3);
258 results.push_back (res);
260 else if (retval == SQLITE_DONE)
270 buffer = sqlite3_mprintf (
"DELETE FROM passblob WHERE pass = %Q",
272 sqlite3_exec (db, buffer, NULL, NULL, NULL);
273 sqlite3_free (buffer);
275 buffer = sqlite3_mprintf (
"INSERT INTO passblob VALUES (%Q, %Q)",
278 sqlite3_exec (db, buffer, NULL, NULL, NULL);
279 sqlite3_free (buffer);
287 buffer = sqlite3_mprintf(
"SELECT blob FROM passblob WHERE pass = %Q",
289 retval = sqlite3_prepare_v2(db, buffer, -1, &stmt, 0);
290 sqlite3_free(buffer);
296 retval = sqlite3_step(stmt);
297 if (retval == SQLITE_ROW)
299 const char *data =
reinterpret_cast<const char *
>(sqlite3_column_text(stmt, 0));