diff options
Diffstat (limited to 'classes/RSSUtils.php')
| -rw-r--r-- | classes/RSSUtils.php | 154 |
1 files changed, 83 insertions, 71 deletions
diff --git a/classes/RSSUtils.php b/classes/RSSUtils.php index 7339a066d..5354ae7ba 100644 --- a/classes/RSSUtils.php +++ b/classes/RSSUtils.php @@ -702,8 +702,6 @@ class RSSUtils { $tstart = time(); foreach ($items as $item) { - $pdo->beginTransaction(); - Debug::log(Debug::SEPARATOR, Debug::LOG_VERBOSE); if (Debug::get_loglevel() >= 3) { @@ -712,7 +710,6 @@ class RSSUtils { if (ini_get("max_execution_time") > 0 && time() - $tstart >= ((float)ini_get("max_execution_time") * 0.7)) { Debug::log("looks like there's too many articles to process at once, breaking out.", Debug::LOG_VERBOSE); - $pdo->commit(); break; } @@ -721,7 +718,6 @@ class RSSUtils { if (!$entry_guid) $entry_guid = self::make_guid_from_title($item->get_title()); if (!$entry_guid) { - $pdo->commit(); continue; } @@ -848,8 +844,6 @@ class RSSUtils { // dupes when the entry gets purged and reinserted again e.g. // in the case of SLOW SLOW OMG SLOW updating feeds - $pdo->commit(); - ORM::for_table('ttrss_entries') ->find_one($base_entry_id) ->set('date_updated', Db::NOW()) @@ -996,15 +990,18 @@ class RSSUtils { WHERE guid IN (?, ?, ?)"); $csth->execute([$entry_guid, $entry_guid_hashed, $entry_guid_hashed_compat]); - if (!$csth->fetch()) { + if ($row = $csth->fetch()) { + Debug::log("select returned RID: " . $row['id'], Debug::LOG_VERBOSE); + $base_record_created = false; + } else { Debug::log("base guid [$entry_guid or $entry_guid_hashed] not found, creating...", Debug::LOG_VERBOSE); // base post entry does not exist, create it - - $usth = $pdo->prepare( + $isth = $pdo->prepare( "INSERT INTO ttrss_entries (title, + tsvector_combined, guid, link, updated, @@ -1019,41 +1016,55 @@ class RSSUtils { lang, author) VALUES - (?, ?, ?, ?, ?, ?, + (:title, + to_tsvector(:ts_lang, :ts_content), + :guid, + :link, + :updated, + :content, + :content_hash, false, NOW(), - ?, ?, ?, ?, ?, ?)"); - - $usth->execute([$entry_title, - $entry_guid_hashed, - $entry_link, - $entry_timestamp_fmt, - "$entry_content", - $entry_current_hash, - $date_feed_processed, - $entry_comments, - (int)$num_comments, - $entry_plugin_data, - "$entry_language", - "$entry_author"]); - - } - - $csth->execute([$entry_guid, $entry_guid_hashed, $entry_guid_hashed_compat]); + :date_entered, + :comments, + :num_comments, + :plugin_data, + :lang, + :author) RETURNING id"); + + $isth->execute([":title" => $entry_title, + ":ts_lang" => $feed_language, + ":ts_content" => mb_substr(strip_tags($entry_title) . " " . \Soundasleep\Html2Text::convert($entry_content), 0, 900000), + ":guid" => $entry_guid_hashed, + ":link" => $entry_link, + ":updated" => $entry_timestamp_fmt, + ":content" => $entry_content, + ":content_hash" => $entry_current_hash, + ":date_entered" => $date_feed_processed, + ":comments" => $entry_comments, + ":num_comments" => (int)$num_comments, + ":plugin_data" => $entry_plugin_data, + ":lang" => $entry_language, + ":author" => $entry_author]); + + $row = $isth->fetch(); + + Debug::log("insert returned RID: " . $row['id'], Debug::LOG_VERBOSE); + $base_record_created = true; + } $entry_ref_id = 0; $entry_int_id = 0; - if ($row = $csth->fetch()) { + if ($row['id']) { - Debug::log("base guid found, checking for user record", Debug::LOG_VERBOSE); + Debug::log("base record with RID: " . $row['id'] . " found, checking for user record", Debug::LOG_VERBOSE); $ref_id = $row['id']; $entry_ref_id = $ref_id; if (self::find_article_filter($article_filters, "filter")) { Debug::log("article is filtered out, nothing to do.", Debug::LOG_VERBOSE); - $pdo->commit(); continue; } @@ -1061,8 +1072,10 @@ class RSSUtils { Debug::log("initial score: $score [including plugin modifier: $entry_score_modifier]", Debug::LOG_VERBOSE); - // check for user post link to main table + Debug::log("begin pdo transaction...", Debug::LOG_VERBOSE); + $pdo->beginTransaction(); + // check for user post link to main table $sth = $pdo->prepare("SELECT ref_id, int_id FROM ttrss_user_entries WHERE ref_id = ? AND owner_uid = ?"); $sth->execute([$ref_id, $feed_obj->owner_uid]); @@ -1105,56 +1118,54 @@ class RSSUtils { (ref_id, owner_uid, feed_id, unread, last_read, marked, published, score, tag_cache, label_cache, uuid, last_marked, last_published) - VALUES (?, ?, ?, ?, ?, ?, ?, ?, '', '', '', ".$last_marked.", ".$last_published.")"); + VALUES (?, ?, ?, ?, ?, ?, ?, ?, '', '', '', ".$last_marked.", ".$last_published.") + RETURNING int_id"); $sth->execute([$ref_id, $feed_obj->owner_uid, $feed, $unread, $last_read_qpart, $marked, $published, $score]); + if ($row = $sth->fetch()) + $entry_int_id = $row['int_id']; + if ($marked) PluginHost::getInstance()->run_hooks(PluginHost::HOOK_ARTICLES_MARK_TOGGLED, [$ref_id]); if ($published) PluginHost::getInstance()->run_hooks(PluginHost::HOOK_ARTICLES_PUBLISH_TOGGLED, [$ref_id]); - - $sth = $pdo->prepare("SELECT int_id FROM ttrss_user_entries WHERE - ref_id = ? AND owner_uid = ? AND - feed_id = ? LIMIT 1"); - - $sth->execute([$ref_id, $feed_obj->owner_uid, $feed]); - - if ($row = $sth->fetch()) - $entry_int_id = $row['int_id']; } Debug::log("resulting RID: $entry_ref_id, IID: $entry_int_id", Debug::LOG_VERBOSE); - $sth = $pdo->prepare("UPDATE ttrss_entries - SET title = :title, - tsvector_combined = to_tsvector(:ts_lang, :ts_content), - content = :content, - content_hash = :content_hash, - updated = :updated, - date_updated = NOW(), - num_comments = :num_comments, - plugin_data = :plugin_data, - author = :author, - lang = :lang - WHERE id = :id"); - - $params = [":title" => $entry_title, - ":content" => "$entry_content", - ":content_hash" => $entry_current_hash, - ":updated" => $entry_timestamp_fmt, - ":num_comments" => (int)$num_comments, - ":plugin_data" => $entry_plugin_data, - ":author" => "$entry_author", - ":lang" => $entry_language, - ":id" => $ref_id, - ":ts_lang" => $feed_language, - ":ts_content" => mb_substr(strip_tags($entry_title) . " " . \Soundasleep\Html2Text::convert($entry_content), 0, 900000) - ]; - - $sth->execute($params); + // it's pointless to update base record we've just created + if (!$base_record_created) { + $sth = $pdo->prepare("UPDATE ttrss_entries + SET title = :title, + tsvector_combined = to_tsvector(:ts_lang, :ts_content), + content = :content, + content_hash = :content_hash, + updated = :updated, + date_updated = NOW(), + num_comments = :num_comments, + plugin_data = :plugin_data, + author = :author, + lang = :lang + WHERE id = :id"); + + $params = [":title" => $entry_title, + ":content" => "$entry_content", + ":content_hash" => $entry_current_hash, + ":updated" => $entry_timestamp_fmt, + ":num_comments" => (int)$num_comments, + ":plugin_data" => $entry_plugin_data, + ":author" => "$entry_author", + ":lang" => $entry_language, + ":id" => $ref_id, + ":ts_lang" => $feed_language, + ":ts_content" => mb_substr(strip_tags($entry_title) . " " . \Soundasleep\Html2Text::convert($entry_content), 0, 900000) + ]; + + $sth->execute($params); + } // update aux data $sth = $pdo->prepare("UPDATE ttrss_user_entries @@ -1264,9 +1275,10 @@ class RSSUtils { ]); } - Debug::log("article processed.", Debug::LOG_VERBOSE); - + Debug::log("commit pdo transaction...", Debug::LOG_VERBOSE); $pdo->commit(); + + Debug::log("article processed.", Debug::LOG_VERBOSE); } Debug::log(Debug::SEPARATOR, Debug::LOG_VERBOSE); |