68
68
public ZeitgeistDatabase () throws EngineError
70
int rc = Sqlite.Database.open_v2 (
71
Utils.get_database_file_path (),
73
assert_query_success (rc, "Can't open database");
75
DatabaseSchema.ensure_schema (database);
77
72
prepare_queries ();
81
76
database.update_hook (update_callback);
79
private void open_database (bool retry)
82
int rc = Sqlite.Database.open_v2 (
83
Utils.get_database_file_path (),
90
// Error (like a malformed database) may not be exposed
91
// until we try to operate on the database.
92
DatabaseSchema.ensure_schema (database);
94
catch (EngineError err)
96
if (err is EngineError.DATABASE_CORRUPT && retry)
98
else if (err is EngineError.DATABASE_CANTOPEN)
100
else if (err is EngineError.DATABASE_BUSY)
109
if (rc == Sqlite.CORRUPT && retry)
111
// The database disk image is malformed
112
warning ("It looks like your database is corrupt. " +
113
"It will be renamed and a new one will be created.");
116
Utils.retire_database ();
121
"Could not rename database: %s".printf (
123
throw new EngineError.DATABASE_RETIRE_FAILED (message);
125
open_database (false);
127
else if (rc == Sqlite.PERM || rc == Sqlite.CANTOPEN)
129
// Access permission denied / Unable to open database file
130
throw new EngineError.DATABASE_CANTOPEN (
133
else if (rc == Sqlite.BUSY)
135
// The database file is locked
136
throw new EngineError.DATABASE_BUSY (database.errmsg ());
140
string message = "Can't open database: %d, %s".printf(rc,
142
throw new EngineError.DATABASE_ERROR (message);
84
147
public uint32 get_last_id () throws EngineError
256
public void explain_query (Sqlite.Statement prepared_stmt)
260
Sqlite.Statement stmt;
262
var explain_sql = "EXPLAIN QUERY PLAN %s".printf (prepared_stmt.sql ());
264
rc = prepared_stmt.db_handle ().prepare_v2 (explain_sql, -1, out stmt);
265
assert_query_success(rc, "SQL error");
267
while ((rc = stmt.step()) == Sqlite.ROW)
269
int select_id = stmt.column_int (0);
270
int order = stmt.column_int (1);
271
int from = stmt.column_int (2);
272
unowned string detail = stmt.column_text (3);
274
print ("%d %d %d %s\n", select_id, order, from, detail);
193
280
* Ensure `rc' is SQLITE_OK. If it isn't, print an error message
194
281
* and throw an error.
200
287
public void assert_query_success (int rc, string msg,
201
288
int success_code=Sqlite.OK) throws EngineError
203
if (rc != success_code)
290
if (unlikely (rc != success_code))
205
292
string error_message = "%s: %d, %s".printf(
206
293
msg, rc, database.errmsg ());