Change db_ helpers in main.c into direct sqlite3_ calls

This means 1 function call instead of 2 or 3 calls for each
query and should reduce some overhead.
This commit is contained in:
Christian Dywan 2010-01-15 06:47:16 +01:00
parent de141078b2
commit 86d060f250

View file

@ -54,15 +54,6 @@
#define BOOKMARK_FILE "bookmarks.xbel" #define BOOKMARK_FILE "bookmarks.xbel"
#endif #endif
#define MIDORI_HISTORY_ERROR g_quark_from_string("MIDORI_HISTORY_ERROR")
typedef enum
{
MIDORI_HISTORY_ERROR_DB_OPEN, /* Error opening the database file */
MIDORI_HISTORY_ERROR_EXEC_SQL, /* Error executing SQL statement */
} MidoriHistoryError;
static gchar* static gchar*
build_config_filename (const gchar* filename) build_config_filename (const gchar* filename)
{ {
@ -361,69 +352,6 @@ search_engines_save_to_file (KatzeArray* search_engines,
} }
#if HAVE_SQLITE #if HAVE_SQLITE
/* Open database 'dbname' */
static sqlite3*
db_open (const char* dbname,
GError** error)
{
sqlite3* db;
if (sqlite3_open (dbname, &db))
{
if (error)
{
*error = g_error_new (MIDORI_HISTORY_ERROR,
MIDORI_HISTORY_ERROR_DB_OPEN,
_("Failed to open database: %s\n"),
sqlite3_errmsg (db));
}
sqlite3_close (db);
return NULL;
}
return (db);
}
/* Close database 'db' */
static void
db_close (sqlite3* db)
{
sqlite3_close (db);
}
/* Execute an SQL statement and run 'callback' on the result data */
static gboolean
db_exec_callback (sqlite3* db,
const char* sqlcmd,
int (*callback)(void*, int, char**, char**),
void* cbarg,
GError** error)
{
char* errmsg;
if (sqlite3_exec (db, sqlcmd, callback, cbarg, &errmsg) != SQLITE_OK)
{
if (error)
{
*error = g_error_new (MIDORI_HISTORY_ERROR,
MIDORI_HISTORY_ERROR_EXEC_SQL,
_("Failed to execute database statement: %s\n"),
errmsg);
}
sqlite3_free (errmsg);
return FALSE;
}
return TRUE;
}
/* Execute a SQL statement */
static gboolean
db_exec (sqlite3* db,
const char* sqlcmd,
GError** error)
{
return (db_exec_callback (db, sqlcmd, NULL, NULL, error));
}
/* sqlite method for retrieving the date/ time */ /* sqlite method for retrieving the date/ time */
static int static int
gettimestr (void* data, gettimestr (void* data,
@ -446,8 +374,7 @@ midori_history_remove_item_cb (KatzeArray* history,
sqlite3* db) sqlite3* db)
{ {
gchar* sqlcmd; gchar* sqlcmd;
gboolean success = TRUE; char* errmsg = NULL;
GError* error = NULL;
g_return_if_fail (KATZE_IS_ITEM (item)); g_return_if_fail (KATZE_IS_ITEM (item));
@ -457,12 +384,10 @@ midori_history_remove_item_cb (KatzeArray* history,
katze_item_get_uri (item), katze_item_get_uri (item),
katze_item_get_name (item), katze_item_get_name (item),
katze_item_get_added (item)); katze_item_get_added (item));
success = db_exec (db, sqlcmd, &error); if (sqlite3_exec (db, sqlcmd, NULL, NULL, &errmsg) != SQLITE_OK)
if (!success)
{ {
g_printerr (_("Failed to remove history item: %s\n"), error->message); g_printerr (_("Failed to remove history item: %s\n"), errmsg);
g_error_free (error); sqlite3_free (errmsg);
return ;
} }
sqlite3_free (sqlcmd); sqlite3_free (sqlcmd);
} }
@ -478,14 +403,14 @@ static void
midori_history_clear_cb (KatzeArray* history, midori_history_clear_cb (KatzeArray* history,
sqlite3* db) sqlite3* db)
{ {
GError* error = NULL; char* errmsg = NULL;
g_return_if_fail (KATZE_IS_ARRAY (history)); g_return_if_fail (KATZE_IS_ARRAY (history));
if (!db_exec (db, "DELETE FROM history", &error)) if (sqlite3_exec (db, "DELETE FROM history", NULL, NULL, &errmsg) != SQLITE_OK)
{ {
g_printerr (_("Failed to clear history: %s\n"), error->message); g_printerr (_("Failed to clear history: %s\n"), errmsg);
g_error_free (error); sqlite3_free (errmsg);
} }
} }
@ -495,22 +420,19 @@ midori_history_notify_item_cb (KatzeItem* item,
sqlite3* db) sqlite3* db)
{ {
gchar* sqlcmd; gchar* sqlcmd;
gboolean success = TRUE; char* errmsg = NULL;
GError* error = NULL;
sqlcmd = sqlite3_mprintf ("UPDATE history SET title='%q' WHERE " sqlcmd = sqlite3_mprintf ("UPDATE history SET title='%q' WHERE "
"uri='%q' AND date=%llu", "uri='%q' AND date=%llu",
katze_item_get_name (item), katze_item_get_name (item),
katze_item_get_uri (item), katze_item_get_uri (item),
katze_item_get_added (item)); katze_item_get_added (item));
success = db_exec (db, sqlcmd, &error); if (sqlite3_exec (db, sqlcmd, NULL, NULL, &errmsg) != SQLITE_OK)
sqlite3_free (sqlcmd);
if (!success)
{ {
g_printerr (_("Failed to update history item: %s\n"), error->message); g_printerr (_("Failed to update history item: %s\n"), errmsg);
g_error_free (error); sqlite3_free (errmsg);
return ;
} }
sqlite3_free (sqlcmd);
} }
static void static void
@ -519,8 +441,8 @@ midori_history_add_item_cb (KatzeArray* array,
sqlite3* db) sqlite3* db)
{ {
gchar* sqlcmd; gchar* sqlcmd;
gboolean success = TRUE; int success;
GError* error = NULL; char* errmsg = NULL;
g_return_if_fail (KATZE_IS_ITEM (item)); g_return_if_fail (KATZE_IS_ITEM (item));
@ -538,11 +460,11 @@ midori_history_add_item_cb (KatzeArray* array,
/* New item, set added to the current date/ time */ /* New item, set added to the current date/ time */
if (!katze_item_get_added (item)) if (!katze_item_get_added (item))
{ {
if (!db_exec_callback (db, "SELECT date('now')", if (sqlite3_exec (db, "SELECT date('now')",
gettimestr, item, &error)) gettimestr, item, &errmsg) != SQLITE_OK)
{ {
g_printerr (_("Failed to get current time: %s\n"), error->message); g_printerr (_("Failed to get current time: %s\n"), errmsg);
g_error_free (error); sqlite3_free (errmsg);
return; return;
} }
} }
@ -553,12 +475,12 @@ midori_history_add_item_cb (KatzeArray* array,
katze_item_get_name (item), katze_item_get_name (item),
katze_item_get_added (item), katze_item_get_added (item),
katze_item_get_added (KATZE_ITEM (array))); katze_item_get_added (KATZE_ITEM (array)));
success = db_exec (db, sqlcmd, &error); success = sqlite3_exec (db, sqlcmd, NULL, NULL, &errmsg);
sqlite3_free (sqlcmd); sqlite3_free (sqlcmd);
if (!success) if (success != SQLITE_OK)
{ {
g_printerr (_("Failed to add history item: %s\n"), error->message); g_printerr (_("Failed to add history item: %s\n"), errmsg);
g_error_free (error); sqlite3_free (errmsg);
return ; return ;
} }
@ -624,7 +546,7 @@ midori_history_add_items (void* data,
static sqlite3* static sqlite3*
midori_history_initialize (KatzeArray* array, midori_history_initialize (KatzeArray* array,
const gchar* filename, const gchar* filename,
GError** error) char** errmsg)
{ {
sqlite3* db; sqlite3* db;
KatzeItem* item; KatzeItem* item;
@ -633,19 +555,26 @@ midori_history_initialize (KatzeArray* array,
has_day = FALSE; has_day = FALSE;
if ((db = db_open (filename, error)) == NULL) if (sqlite3_open (filename, &db) != SQLITE_OK)
return db; {
if (errmsg)
*errmsg = g_strdup_printf (_("Failed to open database: %s\n"),
sqlite3_errmsg (db));
sqlite3_close (db);
return NULL;
}
if (!db_exec (db, if (sqlite3_exec (db,
"CREATE TABLE IF NOT EXISTS " "CREATE TABLE IF NOT EXISTS "
"history(uri text, title text, date integer, day integer)", "history(uri text, title text, date integer, day integer)",
error)) NULL, NULL, errmsg) != SQLITE_OK)
return NULL; return NULL;
if (!db_exec (db, "SELECT day FROM history LIMIT 1", error)) if (sqlite3_exec (db, "SELECT day FROM history LIMIT 1", NULL, NULL,
errmsg) != SQLITE_OK)
return NULL; return NULL;
if (!has_day && !db_exec (db, if (!has_day && sqlite3_exec (db,
"BEGIN TRANSACTION;" "BEGIN TRANSACTION;"
"CREATE TEMPORARY TABLE backup (uri text, title text, date integer);" "CREATE TEMPORARY TABLE backup (uri text, title text, date integer);"
"INSERT INTO backup SELECT uri,title,date FROM history;" "INSERT INTO backup SELECT uri,title,date FROM history;"
@ -657,15 +586,15 @@ midori_history_initialize (KatzeArray* array,
"FROM backup;" "FROM backup;"
"DROP TABLE backup;" "DROP TABLE backup;"
"COMMIT;", "COMMIT;",
error)) NULL, NULL, errmsg) != SQLITE_OK)
return NULL; return NULL;
if (!db_exec_callback (db, if (sqlite3_exec (db,
"SELECT uri, title, date, day FROM history " "SELECT uri, title, date, day FROM history "
"ORDER BY date ASC", "ORDER BY date ASC",
midori_history_add_items, midori_history_add_items,
array, array,
error)) errmsg) != SQLITE_OK)
return NULL; return NULL;
i = 0; i = 0;
@ -686,23 +615,20 @@ midori_history_terminate (sqlite3* db,
gint max_history_age) gint max_history_age)
{ {
gchar* sqlcmd; gchar* sqlcmd;
gboolean success = TRUE; char* errmsg = NULL;
GError* error = NULL;
sqlcmd = g_strdup_printf ( sqlcmd = g_strdup_printf (
"DELETE FROM history WHERE " "DELETE FROM history WHERE "
"(julianday(date('now')) - julianday(date(date,'unixepoch')))" "(julianday(date('now')) - julianday(date(date,'unixepoch')))"
" >= %d", max_history_age); " >= %d", max_history_age);
db_exec (db, sqlcmd, &error); if (sqlite3_exec (db, sqlcmd, NULL, NULL, &errmsg) != SQLITE_OK)
if (!success)
{ {
/* i18n: Couldn't remove items that are older than n days */ /* i18n: Couldn't remove items that are older than n days */
g_printerr (_("Failed to remove old history items: %s\n"), error->message); g_printerr (_("Failed to remove old history items: %s\n"), errmsg);
g_error_free (error); sqlite3_free (errmsg);
return ;
} }
g_free (sqlcmd); g_free (sqlcmd);
db_close (db); sqlite3_close (db);
} }
#endif #endif
@ -1686,6 +1612,7 @@ main (int argc,
KatzeItem* item; KatzeItem* item;
gchar* uri_ready; gchar* uri_ready;
#if HAVE_SQLITE #if HAVE_SQLITE
gchar* errmsg;
sqlite3* db; sqlite3* db;
gint max_history_age; gint max_history_age;
#endif #endif
@ -1995,12 +1922,12 @@ main (int argc,
#if HAVE_SQLITE #if HAVE_SQLITE
katze_assign (config_file, build_config_filename ("history.db")); katze_assign (config_file, build_config_filename ("history.db"));
error = NULL; errmsg = NULL;
if ((db = midori_history_initialize (history, config_file, &error)) == NULL) if ((db = midori_history_initialize (history, config_file, &errmsg)) == NULL)
{ {
g_string_append_printf (error_messages, g_string_append_printf (error_messages,
_("The history couldn't be loaded: %s\n"), error->message); _("The history couldn't be loaded: %s\n"), errmsg);
g_error_free (error); g_free (errmsg);
} }
#endif #endif