On Fri, 2008-08-15 at 23:29 +0100, Adeodato Simó wrote: > * rodrigo@debian.org [Thu, 14 Aug 2008 17:10:06 -0700]: > > > I'm seeking aproval for uploading liferea 1.4.18 to unstable > > The diff from 1.4.16b, present currently in the archive is large because > > upstream stopped shipping generated intltool files. > > Please send us a cleaned up diff (i.e., only code changes) for review. rodrigo@nabiki:$ git diff --stat -p -b release/1.4.16b-0.1 -- src xslt liferea/src/common.c | 6 +- liferea/src/common.h | 6 +- liferea/src/db.c | 114 ++++++++++++++++++++++++------------------ liferea/src/feedlist.c | 6 ++ liferea/src/scripting/lua.c | 13 +++-- liferea/src/ui/ui_popup.c | 2 +- liferea/xslt/item.xml | 2 +- liferea/xslt/item.xml.in | 2 +- 8 files changed, 89 insertions(+), 62 deletions(-) diff --git a/liferea/src/common.c b/liferea/src/common.c index 3201a34..0f45b31 100644 --- a/liferea/src/common.c +++ b/liferea/src/common.c @@ -1,7 +1,7 @@ /** * @file common.c common routines for Liferea * - * Copyright (C) 2003-2007 Lars Lindner <lars.lindner@gmail.com> + * Copyright (C) 2003-2008 Lars Lindner <lars.lindner@gmail.com> * Copyright (C) 2004-2006 Nathan J. Conrad <t98502@users.sourceforge.net> * Copyright (C) 2004 Karl Soderstrom <ks@xanadunet.net> * @@ -179,10 +179,10 @@ gchar * common_format_nice_date(time_t date) { if (!done) { if (then.tm_year == now.tm_year) { /* translation hint: date format for dates older than a week but from this year, reorder format codes as necessary */ - e_strftime_fix_am_pm (buf, TIMESTRLEN, _("%b %d %l:%M %p"), &then); + e_utf8_strftime_fix_am_pm (buf, TIMESTRLEN, _("%b %d %l:%M %p"), &then); } else { /* translation hint: date format for dates from the last years, reorder format codes as necessary */ - e_strftime_fix_am_pm (buf, TIMESTRLEN, _("%b %d %Y"), &then); + e_utf8_strftime_fix_am_pm (buf, TIMESTRLEN, _("%b %d %Y"), &then); } } diff --git a/liferea/src/common.h b/liferea/src/common.h index ec2c52a..0a91ffa 100644 --- a/liferea/src/common.h +++ b/liferea/src/common.h @@ -75,9 +75,9 @@ long common_parse_long(gchar *str, long def); * Returns a formatted date string for the given timestamp. * * @param t the timestamp - * @param date_format a strptime format string (encoded in user locale!) + * @param date_format a strptime format string (encoded in UTF-8) * - * @returns a new formatted date string (encoded in user locale!) + * @returns a new formatted date string (encoded in UTF-8) */ gchar * common_format_date(time_t date, const gchar *date_format); @@ -88,7 +88,7 @@ gchar * common_format_date(time_t date, const gchar *date_format); * * @param t the timestamp * - * @returns a new formatted date string (encoded in user locale!) + * @returns a new formatted date string (encoded in UTF-8) */ gchar * common_format_nice_date(time_t date); diff --git a/liferea/src/db.c b/liferea/src/db.c index 193d420..9ea43a8 100644 --- a/liferea/src/db.c +++ b/liferea/src/db.c @@ -31,6 +31,7 @@ static sqlite3 *db = NULL; static guint stmtCounter = 0; +static gboolean transaction = FALSE; /**< single transaction lock, prevents DB re-opening during transaction */ /** * To avoid loosing statements on crashes, close+reopen the DB from time to time, @@ -92,7 +93,7 @@ redo: if (statement->write) stmtCounter++; - if (stmtCounter > MAX_STATEMENTS_BEFORE_RECONNECT) { + if (!transaction && (stmtCounter > MAX_STATEMENTS_BEFORE_RECONNECT)) { stmtCounter = 0; debug1 (DEBUG_DB, "DB reconnect after %d DB write actions...\n", MAX_STATEMENTS_BEFORE_RECONNECT); db_deinit (); @@ -418,29 +419,6 @@ open: db_exec ("CREATE INDEX metadata_idx ON metadata (item_id);"); - /* Set up item removal trigger (does not remove comments!) */ - db_exec ("DROP TRIGGER item_removal;"); - db_exec ("CREATE TRIGGER item_removal DELETE ON itemsets " - "BEGIN " - " DELETE FROM items WHERE ROWID = old.item_id; " - " DELETE FROM metadata WHERE item_id = old.item_id; " - "END;"); - - /* Set up item read state update triggers */ - db_exec ("DROP TRIGGER item_insert;"); - db_exec ("CREATE TRIGGER item_insert INSERT ON items " - "BEGIN " - " UPDATE itemsets SET read = new.read " - " WHERE item_id = new.ROWID; " - "END;"); - - db_exec ("DROP TRIGGER item_update;"); - db_exec ("CREATE TRIGGER item_update UPDATE ON items " - "BEGIN " - " UPDATE itemsets SET read = new.read " - " WHERE item_id = new.ROWID; " - "END;"); - db_exec ("CREATE TABLE subscription (" " node_id STRING," " source STRING," @@ -472,15 +450,6 @@ open: db_exec ("CREATE INDEX subscription_metadata_idx ON subscription_metadata (node_id);"); - /* Set up subscription removal trigger */ - db_exec ("DROP TRIGGER subscription_removal;"); - db_exec ("CREATE TRIGGER subscription_removal DELETE ON subscription " - "BEGIN " - " DELETE FROM node WHERE node_id = old.node_id; " - " DELETE FROM update_state WHERE node_id = old.node_id; " - " DELETE FROM subscription_metadata WHERE node_id = old.node_id; " - "END;"); - db_exec ("CREATE TABLE node (" " node_id STRING," " parent_id STRING," @@ -500,29 +469,71 @@ open: " PRIMARY KEY (node_id)" ");"); - /* view counting triggers are set up in the view preparation code (see db_view_create()) */ - db_end_transaction (); debug_end_measurement (DEBUG_DB, "table setup"); - /* Cleanup of DB */ + /* 2. Removing old triggers */ + db_exec ("DROP TRIGGER item_insert;"); + db_exec ("DROP TRIGGER item_update;"); + db_exec ("DROP TRIGGER item_removal;"); + db_exec ("DROP TRIGGER subscription_removal;"); - /* - debug_start_measurement (DEBUG_DB); - db_exec ("DELETE FROM items WHERE ROWID NOT IN " - "(SELECT item_id FROM itemsets);"); - debug_end_measurement (DEBUG_DB, "cleanup lost items"); + /* 3. Cleanup of DB */ - debug_start_measurement (DEBUG_DB); - db_exec ("DELETE FROM itemsets WHERE item_id NOT IN " - "(SELECT ROWID FROM items);"); - debug_end_measurement (DEBUG_DB, "cleanup lost itemset entries"); + if (initial) { + debug0 (DEBUG_DB, "Checking for items not referenced in table 'itemsets'...\n"); + db_exec ("BEGIN; " + " CREATE TEMP TABLE tmp_id ( id );" + " INSERT INTO tmp_id SELECT ROWID FROM items WHERE ROWID NOT IN (SELECT item_id FROM itemsets);" + " DELETE FROM items WHERE ROWID IN (SELECT id FROM tmp_id LIMIT 1000);" + " DROP TABLE tmp_id;" + "END;"); - debug_start_measurement (DEBUG_DB); + debug0 (DEBUG_DB, "Checking for invalid item ids in table 'itemsets'...\n"); + db_exec ("BEGIN; " + " CREATE TEMP TABLE tmp_id ( id );" + " INSERT INTO tmp_id SELECT item_id FROM itemsets WHERE item_id NOT IN (SELECT ROWID FROM items);" + /* limit to 1000 items as it is very slow */ + " DELETE FROM itemsets WHERE item_id IN (SELECT id FROM tmp_id LIMIT 1000);" + " DROP TABLE tmp_id;" + "END;"); + + debug0 (DEBUG_DB, "Checking for items without a subscription...\n"); db_exec ("DELETE FROM itemsets WHERE comment = 0 AND node_id NOT IN " "(SELECT node_id FROM subscription);"); - debug_end_measurement (DEBUG_DB, "cleanup lost node entries"); - */ + + debug0 (DEBUG_DB, "DB cleanup finished. Continuing startup.\n"); + } + + /* 4. Creating triggers (after cleanup so it is not slowed down by triggers) */ + + db_exec ("CREATE TRIGGER item_insert INSERT ON items " + "BEGIN " + " UPDATE itemsets SET read = new.read " + " WHERE item_id = new.ROWID; " + "END;"); + + db_exec ("CREATE TRIGGER item_update UPDATE ON items " + "BEGIN " + " UPDATE itemsets SET read = new.read " + " WHERE item_id = new.ROWID; " + "END;"); + + /* This trigger does explicitely not remove comments! */ + db_exec ("CREATE TRIGGER item_removal DELETE ON itemsets " + "BEGIN " + " DELETE FROM items WHERE ROWID = old.item_id; " + " DELETE FROM metadata WHERE item_id = old.item_id; " + "END;"); + + db_exec ("CREATE TRIGGER subscription_removal DELETE ON subscription " + "BEGIN " + " DELETE FROM node WHERE node_id = old.node_id; " + " DELETE FROM update_state WHERE node_id = old.node_id; " + " DELETE FROM subscription_metadata WHERE node_id = old.node_id; " + "END;"); + + /* Note: view counting triggers are set up in the view preparation code (see db_view_create()) */ } /* prepare statements */ @@ -549,7 +560,7 @@ open: "WHERE node_id = ?"); db_new_statement ("itemsetRemoveStmt", - "DELETE FROM itemsets WHERE parent_item_id = ?"); + "DELETE FROM itemsets WHERE item_id = ? OR parent_item_id = ?"); db_new_statement ("itemsetRemoveAllStmt", "DELETE FROM itemsets WHERE parent_node_id = ?"); @@ -964,6 +975,7 @@ db_item_remove (gulong id) stmt = db_get_statement ("itemsetRemoveStmt"); sqlite3_bind_int (stmt, 1, id); + sqlite3_bind_int (stmt, 2, id); res = sqlite3_step (stmt); if (SQLITE_DONE != res) @@ -1174,6 +1186,8 @@ db_begin_transaction (void) res = sqlite3_exec (db, sql, NULL, NULL, &err); if (SQLITE_OK != res) g_warning ("Transaction begin failed (%s) SQL: %s", err, sql); + else + transaction = TRUE; sqlite3_free (sql); sqlite3_free (err); } @@ -1188,6 +1202,8 @@ db_end_transaction (void) res = sqlite3_exec (db, sql, NULL, NULL, &err); if (SQLITE_OK != res) g_warning ("Transaction end failed (%s) SQL: %s", err, sql); + else + transaction = FALSE; sqlite3_free (sql); sqlite3_free (err); } diff --git a/liferea/src/feedlist.c b/liferea/src/feedlist.c index 2c95a91..0e4445b 100644 --- a/liferea/src/feedlist.c +++ b/liferea/src/feedlist.c @@ -381,6 +381,8 @@ on_menu_allfeedsread (GtkWidget *widget, gpointer user_data) problems. Use feedlist_schedule_save() instead! */ static gboolean feedlist_schedule_save_cb(gpointer user_data) { + g_return_if_fail(NULL != rootNode); + /* step 1: request each node to save its state */ feedlist_foreach(node_save); @@ -511,7 +513,11 @@ feedlist_free_node (nodePtr node) void feedlist_free (void) { + if (autoUpdateTimer) g_source_remove (autoUpdateTimer); + if (feedlist_save_timer) + g_source_remove (feedlist_save_timer); + feedlist_foreach (feedlist_free_node); node_free (rootNode); rootNode = NULL; diff --git a/liferea/src/scripting/lua.c b/liferea/src/scripting/lua.c index 8b4f263..c1b12ee 100644 --- a/liferea/src/scripting/lua.c +++ b/liferea/src/scripting/lua.c @@ -1,7 +1,7 @@ /** * @file script.c LUA scripting plugin implementation * - * Copyright (C) 2006 Lars Lindner <lars.lindner@gmx.net> + * Copyright (C) 2006-2008 Lars Lindner <lars.lindner@gmail.com> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -33,18 +33,23 @@ static void lua_init(void) { luaVM = lua_open(); + #if defined(LUA_VERSION_NUM) && LUA_VERSION_NUM >= 501 + luaL_openlibs(luaVM); /* LUA 5.1 allows loading all default modules... */ + #endif + luaL_reg lualibs[] = { + #if defined(LUA_VERSION_NUM) && LUA_VERSION_NUM >= 501 + #else + /* LUA 5.0 forces us to load all modules ourselves... */ {"base", luaopen_base}, {"table", luaopen_table}, {"io", luaopen_io}, {"string", luaopen_string}, {"math", luaopen_math}, {"debug", luaopen_debug}, - #if defined(LUA_VERSION_NUM) && LUA_VERSION_NUM >= 501 - {"package", luaopen_package}, - #else {"package", luaopen_loadlib}, #endif + /* This loads swig generated Liferea module... */ {SWIG_name, SWIG_init}, {NULL, NULL} }; diff --git a/liferea/src/ui/ui_popup.c b/liferea/src/ui/ui_popup.c index 7757bda..0b86150 100644 --- a/liferea/src/ui/ui_popup.c +++ b/liferea/src/ui/ui_popup.c @@ -141,7 +141,7 @@ void ui_popup_update_menues(void) { addPopupOption(&item_menu_items, &item_menu_len, _("/Copy Item _URL to Clipboard"), NULL, on_popup_copy_URL_clipboard, 0, NULL, 0); addPopupOption(&item_menu_items, &item_menu_len, "/", NULL, NULL, 0, "<Separator>", 0); - addPopupOption(&item_menu_items, &item_menu_len, _("/Toggle _Read Status"), NULL, on_popup_toggle_read, 0, NULL, 0); + addPopupOption(&item_menu_items, &item_menu_len, _("/Toggle _Read Status"), NULL, on_popup_toggle_read, 0, "<Separator>", GTK_STOCK_APPLY); addPopupOption(&item_menu_items, &item_menu_len, _("/Toggle Item _Flag"), NULL, on_popup_toggle_flag, 0, NULL, 0); addPopupOption(&item_menu_items, &item_menu_len, _("/R_emove Item"), NULL, on_popup_remove_selected, 0, "<StockItem>", GTK_STOCK_DELETE); diff --git a/liferea/xslt/item.xml b/liferea/xslt/item.xml index e445e02..aff2256 100644 --- a/liferea/xslt/item.xml +++ b/liferea/xslt/item.xml @@ -109,7 +109,7 @@ </td> <td width="99%"> <xsl:choose> - <xsl:when test="contains(.,'mp3') or contains(.,'ogg')"> + <xsl:when test="contains(.,'mp3')"> <span class="xspf_player"> <xsl:variable name="song"> <xsl:call-template name="substring-after-last"> diff --git a/liferea/xslt/item.xml.in b/liferea/xslt/item.xml.in index 2f0dfa9..4e9fada 100644 --- a/liferea/xslt/item.xml.in +++ b/liferea/xslt/item.xml.in @@ -134,7 +134,7 @@ </td> <td width="99%"> <xsl:choose> - <xsl:when test="contains(.,'mp3') or contains(.,'ogg')"> + <xsl:when test="contains(.,'mp3')"> <span class="xspf_player"> <xsl:variable name="song"> <xsl:call-template name="substring-after-last">
Attachment:
signature.asc
Description: This is a digitally signed message part