]> git.mxchange.org Git - friendica.git/commitdiff
Merge pull request #5289 from annando/item-central-content
authorHypolite Petovan <mrpetovan@gmail.com>
Tue, 26 Jun 2018 12:03:56 +0000 (08:03 -0400)
committerGitHub <noreply@github.com>
Tue, 26 Jun 2018 12:03:56 +0000 (08:03 -0400)
Item content is now stored outside the item table

boot.php
database.sql
mod/community.php
mod/item.php
src/Database/DBStructure.php
src/Model/Item.php
src/Worker/Expire.php

index 9bc02584c25ab0c277eaa903f27f5af3f3c5228f..ac21d108a3cd0c25a929ed77dd8ccde88fcd340b 100644 (file)
--- a/boot.php
+++ b/boot.php
@@ -41,7 +41,7 @@ define('FRIENDICA_PLATFORM',     'Friendica');
 define('FRIENDICA_CODENAME',     'The Tazmans Flax-lily');
 define('FRIENDICA_VERSION',      '2018.08-dev');
 define('DFRN_PROTOCOL_VERSION',  '2.23');
-define('DB_UPDATE_VERSION',      1270);
+define('DB_UPDATE_VERSION',      1271);
 define('NEW_UPDATE_ROUTINE_VERSION', 1170);
 
 /**
index 9dc0bcb187ec3a3050ddc6c2d6fff037edbda3bb..9711ace803eed6a73dee7c4bbf3d1e64a7029d9c 100644 (file)
@@ -1,6 +1,6 @@
 -- ------------------------------------------
 -- Friendica 2018.08-dev (The Tazmans Flax-lily)
--- DB_UPDATE_VERSION 1270
+-- DB_UPDATE_VERSION 1271
 -- ------------------------------------------
 
 
@@ -477,6 +477,7 @@ CREATE TABLE IF NOT EXISTS `item` (
        `author-name` varchar(255) NOT NULL DEFAULT '' COMMENT 'Name of the author of this item',
        `author-link` varchar(255) NOT NULL DEFAULT '' COMMENT 'Link to the profile page of the author of this item',
        `author-avatar` varchar(255) NOT NULL DEFAULT '' COMMENT 'Link to the avatar picture of the author of this item',
+       `icid` int unsigned COMMENT 'Id of the item-content table entry that contains the whole item content',
        `title` varchar(255) NOT NULL DEFAULT '' COMMENT 'item title',
        `content-warning` varchar(255) NOT NULL DEFAULT '' COMMENT '',
        `body` mediumtext COMMENT 'item body content',
@@ -541,9 +542,33 @@ CREATE TABLE IF NOT EXISTS `item` (
         INDEX `deleted_changed` (`deleted`,`changed`),
         INDEX `uid_wall_changed` (`uid`,`wall`,`changed`),
         INDEX `uid_eventid` (`uid`,`event-id`),
-        INDEX `uid_authorlink` (`uid`,`author-link`(190)),
-        INDEX `uid_ownerlink` (`uid`,`owner-link`(190))
-) DEFAULT COLLATE utf8mb4_general_ci COMMENT='All posts';
+        INDEX `icid` (`icid`)
+) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Structure for all posts';
+
+--
+-- TABLE item-content
+--
+CREATE TABLE IF NOT EXISTS `item-content` (
+       `id` int unsigned NOT NULL auto_increment,
+       `uri` varchar(255) NOT NULL DEFAULT '' COMMENT '',
+       `uri-plink-hash` char(80) NOT NULL DEFAULT '' COMMENT 'SHA-1 hash from uri and plink',
+       `title` varchar(255) NOT NULL DEFAULT '' COMMENT 'item title',
+       `content-warning` varchar(255) NOT NULL DEFAULT '' COMMENT '',
+       `body` mediumtext COMMENT 'item body content',
+       `location` varchar(255) NOT NULL DEFAULT '' COMMENT 'text location where this item originated',
+       `coord` varchar(255) NOT NULL DEFAULT '' COMMENT 'longitude/latitude pair representing location where this item originated',
+       `app` varchar(255) NOT NULL DEFAULT '' COMMENT 'application which generated this item',
+       `rendered-hash` varchar(32) NOT NULL DEFAULT '' COMMENT '',
+       `rendered-html` mediumtext COMMENT 'item.body converted to html',
+       `object-type` varchar(100) NOT NULL DEFAULT '' COMMENT 'ActivityStreams object type',
+       `object` text COMMENT 'JSON encoded object structure unless it is an implied object (normal post)',
+       `target-type` varchar(100) NOT NULL DEFAULT '' COMMENT 'ActivityStreams target type if applicable (URI)',
+       `target` text COMMENT 'JSON encoded target structure if used',
+       `plink` varchar(255) NOT NULL DEFAULT '' COMMENT 'permalink or URL to a displayable copy of the message at its source',
+        PRIMARY KEY(`id`),
+        UNIQUE INDEX `uri-plink-hash` (`uri-plink-hash`),
+        INDEX `uri` (`uri`(191))
+) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Content for all posts';
 
 --
 -- TABLE locks
index 59be7487bdca55a8318410b80e4eeab16f2dc199..1e6162fb8e57b2b5b890c4226f9f89efa8c28780 100644 (file)
@@ -189,9 +189,10 @@ function community_content(App $a, $update = 0)
 function community_getitems($start, $itemspage, $content)
 {
        if ($content == 'local') {
-               $r = dba::p("SELECT `item`.`uri`, `item`.`author-link` FROM `thread`
+               $r = dba::p("SELECT `item`.`uri`, `author`.`url` AS `author-link` FROM `thread`
                        INNER JOIN `user` ON `user`.`uid` = `thread`.`uid` AND NOT `user`.`hidewall`
                        INNER JOIN `item` ON `item`.`id` = `thread`.`iid`
+                       INNER JOIN `contact` AS `author` ON `author`.`id`=`item`.`author-id`
                        WHERE `thread`.`visible` AND NOT `thread`.`deleted` AND NOT `thread`.`moderated`
                        AND NOT `thread`.`private` AND `thread`.`wall` AND `thread`.`origin`
                        ORDER BY `thread`.`commented` DESC LIMIT " . intval($start) . ", " . intval($itemspage)
@@ -200,7 +201,7 @@ function community_getitems($start, $itemspage, $content)
        } elseif ($content == 'global') {
                $r = dba::p("SELECT `uri` FROM `thread`
                                INNER JOIN `item` ON `item`.`id` = `thread`.`iid`
-                               INNER JOIN `contact` AS `author` ON `author`.`id`=`item`.`author-id`
+                               INNER JOIN `contact` AS `author` ON `author`.`id`=`item`.`author-id`
                                WHERE `thread`.`uid` = 0 AND NOT `author`.`hidden` AND NOT `author`.`blocked`
                                ORDER BY `thread`.`commented` DESC LIMIT " . intval($start) . ", " . intval($itemspage));
                return dba::inArray($r);
index 4c78af6ca1d05796a40f8368e0e03c9379f81ca5..2830cae2c920ec3bfdc20fbe630ca4df7ef40b8e 100644 (file)
@@ -93,9 +93,9 @@ function item_post(App $a) {
 
        if ($thr_parent || $thr_parent_uri) {
                if ($thr_parent) {
-                       $parent_item = dba::selectFirst('item', [], ['id' => $thr_parent]);
+                       $parent_item = Item::selectFirst([], ['id' => $thr_parent]);
                } elseif ($thr_parent_uri) {
-                       $parent_item = dba::selectFirst('item', [], ['uri' => $thr_parent_uri, 'uid' => $profile_uid]);
+                       $parent_item = Item::selectFirst([], ['uri' => $thr_parent_uri, 'uid' => $profile_uid]);
                }
 
                // if this isn't the real parent of the conversation, find it
index a089ab8942e36e8dd9f91b9cb0c729b37c62d4a8..eaf54cee233aeac8d1d61c8a9cb39dd5ac0c9332 100644 (file)
@@ -1154,7 +1154,7 @@ class DBStructure
                                                ]
                                ];
                $database["item"] = [
-                               "comment" => "All posts",
+                               "comment" => "Structure for all posts",
                                "fields" => [
                                                "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "relation" => ["thread" => "iid"]],
                                                "guid" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "A unique identifier for this item"],
@@ -1181,6 +1181,7 @@ class DBStructure
                                                "author-name" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "Name of the author of this item"],
                                                "author-link" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "Link to the profile page of the author of this item"],
                                                "author-avatar" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "Link to the avatar picture of the author of this item"],
+                                               "icid" => ["type" => "int unsigned", "relation" => ["item-content" => "id"], "comment" => "Id of the item-content table entry that contains the whole item content"],
                                                "title" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "item title"],
                                                "content-warning" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
                                                "body" => ["type" => "mediumtext", "comment" => "item body content"],
@@ -1247,8 +1248,33 @@ class DBStructure
                                                "deleted_changed" => ["deleted","changed"],
                                                "uid_wall_changed" => ["uid","wall","changed"],
                                                "uid_eventid" => ["uid","event-id"],
-                                               "uid_authorlink" => ["uid","author-link(190)"],
-                                               "uid_ownerlink" => ["uid","owner-link(190)"],
+                                               "icid" => ["icid"],
+                                               ]
+                               ];
+               $database["item-content"] = [
+                               "comment" => "Content for all posts",
+                               "fields" => [
+                                               "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "relation" => ["thread" => "iid"]],
+                                               "uri" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                                               "uri-plink-hash" => ["type" => "char(80)", "not null" => "1", "default" => "", "comment" => "SHA-1 hash from uri and plink"],
+                                               "title" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "item title"],
+                                               "content-warning" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                                               "body" => ["type" => "mediumtext", "comment" => "item body content"],
+                                               "location" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "text location where this item originated"],
+                                               "coord" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "longitude/latitude pair representing location where this item originated"],
+                                               "app" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "application which generated this item"],
+                                               "rendered-hash" => ["type" => "varchar(32)", "not null" => "1", "default" => "", "comment" => ""],
+                                               "rendered-html" => ["type" => "mediumtext", "comment" => "item.body converted to html"],
+                                               "object-type" => ["type" => "varchar(100)", "not null" => "1", "default" => "", "comment" => "ActivityStreams object type"],
+                                               "object" => ["type" => "text", "comment" => "JSON encoded object structure unless it is an implied object (normal post)"],
+                                               "target-type" => ["type" => "varchar(100)", "not null" => "1", "default" => "", "comment" => "ActivityStreams target type if applicable (URI)"],
+                                               "target" => ["type" => "text", "comment" => "JSON encoded target structure if used"],
+                                               "plink" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "permalink or URL to a displayable copy of the message at its source"],
+                                               ],
+                               "indexes" => [
+                                               "PRIMARY" => ["id"],
+                                               "uri-plink-hash" => ["UNIQUE", "uri-plink-hash"],
+                                               "uri" => ["uri(191)"],
                                                ]
                                ];
                $database["locks"] = [
index d6bfef39fba978fbfe2180ffddc3231cf9660d22..6fe4a575dd9fa6ffdb55a1039bb3fe48ab95a4c7 100644 (file)
@@ -56,6 +56,24 @@ class Item extends BaseObject
                        'author-id', 'author-link', 'owner-link', 'contact-uid',
                        'signed_text', 'signature', 'signer'];
 
+       // Field list for "item-content" table that is mixed with the item table
+       const CONTENT_FIELDLIST = ['title', 'content-warning', 'body', 'location',
+                       'coord', 'app', 'rendered-hash', 'rendered-html',
+                       'object-type', 'object', 'target-type', 'target'];
+
+       // All fields in the item table
+       const ITEM_FIELDLIST = ['id', 'uid', 'parent', 'uri', 'parent-uri', 'thr-parent', 'guid',
+                       'contact-id', 'type', 'wall', 'gravity', 'extid', 'icid',
+                       'created', 'edited', 'commented', 'received', 'changed', 'verb',
+                       'postopts', 'plink', 'resource-id', 'event-id', 'tag', 'attach', 'inform',
+                       'file', 'allow_cid', 'allow_gid', 'deny_cid', 'deny_gid',
+                       'private', 'pubmail', 'moderated', 'visible', 'starred', 'bookmark',
+                       'unseen', 'deleted', 'origin', 'forum_mode', 'mention', 'global', 'network',
+                       'title', 'content-warning', 'body', 'location', 'coord', 'app',
+                       'rendered-hash', 'rendered-html', 'object-type', 'object', 'target-type', 'target',
+                       'author-id', 'author-link', 'author-name', 'author-avatar',
+                       'owner-id', 'owner-link', 'owner-name', 'owner-avatar'];
+
        /**
         * @brief Fetch a single item row
         *
@@ -66,6 +84,14 @@ class Item extends BaseObject
        {
                $row = dba::fetch($stmt);
 
+               // Fetch data from the item-content table whenever there is content there
+               foreach (self::CONTENT_FIELDLIST as $field) {
+                       if (is_null($row[$field]) && !is_null($row['item-' . $field])) {
+                               $row[$field] = $row['item-' . $field];
+                       }
+                       unset($row['item-' . $field]);
+               }
+
                // We prefer the data from the user's contact over the public one
                if (!empty($row['author-link']) && !empty($row['contact-link']) &&
                        ($row['author-link'] == $row['contact-link'])) {
@@ -351,15 +377,15 @@ class Item extends BaseObject
 
                $fields['item'] = ['id', 'uid', 'parent', 'uri', 'parent-uri', 'thr-parent', 'guid',
                        'contact-id', 'owner-id', 'author-id', 'type', 'wall', 'gravity', 'extid',
-                       'created', 'edited', 'commented', 'received', 'changed',
-                       'title', 'body', 'app', 'verb', 'object-type', 'object', 'target-type', 'target',
+                       'created', 'edited', 'commented', 'received', 'changed', 'verb',
                        'postopts', 'plink', 'resource-id', 'event-id', 'tag', 'attach', 'inform',
-                       'file', 'location', 'coord', 'allow_cid', 'allow_gid', 'deny_cid', 'deny_gid',
+                       'file', 'allow_cid', 'allow_gid', 'deny_cid', 'deny_gid',
                        'private', 'pubmail', 'moderated', 'visible', 'starred', 'bookmark',
-                       'unseen', 'deleted', 'origin', 'forum_mode', 'mention',
-                       'rendered-hash', 'rendered-html', 'global', 'content-warning',
+                       'unseen', 'deleted', 'origin', 'forum_mode', 'mention', 'global',
                        'id' => 'item_id', 'network'];
 
+               $fields['item-content'] = self::CONTENT_FIELDLIST;
+
                $fields['author'] = ['url' => 'author-link', 'name' => 'author-name',
                        'thumb' => 'author-avatar', 'nick' => 'author-nick'];
 
@@ -449,6 +475,10 @@ class Item extends BaseObject
                        $joins .= " LEFT JOIN `sign` ON `sign`.`iid` = `item`.`id`";
                }
 
+               if (strpos($sql_commands, "`item-content`.") !== false) {
+                       $joins .= " LEFT JOIN `item-content` ON `item-content`.`id` = `item`.`icid`";
+               }
+
                if ((strpos($sql_commands, "`parent-item`.") !== false) || (strpos($sql_commands, "`parent-author`.") !== false)) {
                        $joins .= " STRAIGHT_JOIN `item` AS `parent-item` ON `parent-item`.`id` = `item`.`parent`";
                }
@@ -474,10 +504,13 @@ class Item extends BaseObject
                foreach ($fields as $table => $table_fields) {
                        foreach ($table_fields as $field => $select) {
                                if (empty($selected) || in_array($select, $selected)) {
+                                       if (in_array($select, self::CONTENT_FIELDLIST)) {
+                                               $selection[] = "`item`.`".$select."` AS `item-" . $select . "`";
+                                       }
                                        if (is_int($field)) {
-                                               $selection[] = "`" . $table . "`.`".$select."`";
+                                               $selection[] = "`" . $table . "`.`" . $select . "`";
                                        } else {
-                                               $selection[] = "`" . $table . "`.`" . $field . "` AS `".$select ."`";
+                                               $selection[] = "`" . $table . "`.`" . $field . "` AS `" . $select . "`";
                                        }
                                }
                        }
@@ -536,19 +569,34 @@ class Item extends BaseObject
                // We cannot simply expand the condition to check for origin entries
                // The condition needn't to be a simple array but could be a complex condition.
                // And we have to execute this query before the update to ensure to fetch the same data.
-               $items = dba::select('item', ['id', 'origin'], $condition);
+               $items = dba::select('item', ['id', 'origin', 'uri', 'plink'], $condition);
 
-               $success = dba::update('item', $fields, $condition);
+               $content_fields = [];
+               foreach (self::CONTENT_FIELDLIST as $field) {
+                       if (isset($fields[$field])) {
+                               $content_fields[$field] = $fields[$field];
+                               unset($fields[$field]);
+                       }
+               }
 
-               if (!$success) {
-                       dba::close($items);
-                       dba::rollback();
-                       return false;
+               if (!empty($fields)) {
+                       $success = dba::update('item', $fields, $condition);
+
+                       if (!$success) {
+                               dba::close($items);
+                               dba::rollback();
+                               return false;
+                       }
                }
 
+               // When there is no content for the "old" item table, this will count the fetched items
                $rows = dba::affected_rows();
 
                while ($item = dba::fetch($items)) {
+                       if (!empty($item['plink'])) {
+                               $content_fields['plink'] =  $item['plink'];
+                       }
+                       self::updateContent($content_fields, ['uri' => $item['uri']]);
                        Term::insertFromTagFieldByItemId($item['id']);
                        Term::insertFromFileFieldByItemId($item['id']);
                        self::updateThread($item['id']);
@@ -1002,6 +1050,7 @@ class Item extends BaseObject
 
                // When there is no content then we don't post it
                if ($item['body'].$item['title'] == '') {
+                       logger('No body, no title.');
                        return 0;
                }
 
@@ -1044,11 +1093,12 @@ class Item extends BaseObject
                        return 0;
                }
 
-               //unset($item['author-link']);
+               // These fields aren't stored anymore in the item table, they are fetched upon request
+               unset($item['author-link']);
                unset($item['author-name']);
                unset($item['author-avatar']);
 
-               //unset($item['owner-link']);
+               unset($item['owner-link']);
                unset($item['owner-name']);
                unset($item['owner-avatar']);
 
@@ -1260,6 +1310,7 @@ class Item extends BaseObject
                logger('' . print_r($item,true), LOGGER_DATA);
 
                dba::transaction();
+               self::insertContent($item);
                $ret = dba::insert('item', $item);
 
                // When the item was successfully stored we fetch the ID of the item.
@@ -1407,6 +1458,67 @@ class Item extends BaseObject
                return $current_post;
        }
 
+       /**
+        * @brief Insert a new item content entry
+        *
+        * @param array $item The item fields that are to be inserted
+        */
+       private static function insertContent(&$item)
+       {
+               $fields = ['uri' => $item['uri'], 'plink' => $item['plink'],
+                       'uri-plink-hash' => hash('sha1', $item['plink']).hash('sha1', $item['uri'])];
+
+               unset($item['plink']);
+
+               foreach (self::CONTENT_FIELDLIST as $field) {
+                       if (isset($item[$field])) {
+                               $fields[$field] = $item[$field];
+                               unset($item[$field]);
+                       }
+               }
+
+               // Do we already have this content?
+               if (!dba::exists('item-content', ['uri' => $item['uri']])) {
+                       dba::insert('item-content', $fields, true);
+               }
+
+               $item_content = dba::selectFirst('item-content', ['id'], ['uri' => $item['uri']]);
+               if (DBM::is_result($item_content)) {
+                       $item['icid'] = $item_content['id'];
+                       logger('Insert content for URI ' . $item['uri'] . ' (' . $item['icid'] . ')');
+               }
+       }
+
+       /**
+        * @brief Update existing item content entries
+        *
+        * @param array $item The item fields that are to be changed
+        * @param array $condition The condition for finding the item content entries
+        */
+       private static function updateContent($item, $condition)
+       {
+               // We have to select only the fields from the "item-content" table
+               $fields = [];
+               foreach (self::CONTENT_FIELDLIST as $field) {
+                       if (isset($item[$field])) {
+                               $fields[$field] = $item[$field];
+                       }
+               }
+
+               if (empty($fields)) {
+                       return;
+               }
+
+               if (!empty($item['plink'])) {
+                       $fields['plink'] = $item['plink'];
+                       $fields['uri-plink-hash'] = hash('sha1', $item['plink']) . hash('sha1', $condition['uri']);
+               }
+
+               logger('Update content for URI ' . $condition['uri']);
+
+               dba::update('item-content', $fields, $condition, true);
+       }
+
        /**
         * @brief Distributes public items to the receivers
         *
@@ -1425,7 +1537,7 @@ class Item extends BaseObject
                $condition = ['id' => $itemid, 'uid' => 0,
                        'network' => [NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_OSTATUS, ""],
                        'visible' => true, 'deleted' => false, 'moderated' => false, 'private' => false];
-               $item = dba::selectFirst('item', [], ['id' => $itemid]);
+               $item = self::selectFirst(self::ITEM_FIELDLIST, ['id' => $itemid]);
                if (!DBM::is_result($item)) {
                        return;
                }
@@ -1436,8 +1548,6 @@ class Item extends BaseObject
                unset($item['wall']);
                unset($item['origin']);
                unset($item['starred']);
-               unset($item['rendered-hash']);
-               unset($item['rendered-html']);
 
                $users = [];
 
@@ -1553,7 +1663,7 @@ class Item extends BaseObject
                        return;
                }
 
-               $item = dba::selectFirst('item', [], ['id' => $itemid]);
+               $item = self::selectFirst(self::ITEM_FIELDLIST, ['id' => $itemid]);
 
                if (DBM::is_result($item) && ($item["allow_cid"] == '') && ($item["allow_gid"] == '') &&
                        ($item["deny_cid"] == '') && ($item["deny_gid"] == '')) {
@@ -1567,12 +1677,10 @@ class Item extends BaseObject
                                unset($item['mention']);
                                unset($item['origin']);
                                unset($item['starred']);
-                               unset($item['rendered-hash']);
-                               unset($item['rendered-html']);
                                if ($item['uri'] == $item['parent-uri']) {
-                                       $item['contact-id'] = Contact::getIdForURL($item['owner-link']);
+                                       $item['contact-id'] = $item['owner-id'];
                                } else {
-                                       $item['contact-id'] = Contact::getIdForURL($item['author-link']);
+                                       $item['contact-id'] = $item['author-id'];
                                }
 
                                if (in_array($item['type'], ["net-comment", "wall-comment"])) {
@@ -1597,7 +1705,7 @@ class Item extends BaseObject
         */
        public static function addShadowPost($itemid)
        {
-               $item = dba::selectFirst('item', [], ['id' => $itemid]);
+               $item = self::selectFirst(self::ITEM_FIELDLIST, ['id' => $itemid]);
                if (!DBM::is_result($item)) {
                        return;
                }
@@ -1635,8 +1743,6 @@ class Item extends BaseObject
                unset($item['mention']);
                unset($item['origin']);
                unset($item['starred']);
-               unset($item['rendered-hash']);
-               unset($item['rendered-html']);
                $item['contact-id'] = Contact::getIdForURL($item['author-link']);
 
                if (in_array($item['type'], ["net-comment", "wall-comment"])) {
@@ -2604,9 +2710,9 @@ EOT;
 
        private static function updateThread($itemid, $setmention = false)
        {
-               $fields = ['uid', 'guid', 'title', 'body', 'created', 'edited', 'commented', 'received', 'changed',
+               $fields = ['uid', 'guid', 'created', 'edited', 'commented', 'received', 'changed',
                        'wall', 'private', 'pubmail', 'moderated', 'visible', 'starred', 'bookmark', 'contact-id',
-                       'deleted', 'origin', 'forum_mode', 'network', 'author-id', 'owner-id', 'rendered-html', 'rendered-hash'];
+                       'deleted', 'origin', 'forum_mode', 'network', 'author-id', 'owner-id'];
                $condition = ["`id` = ? AND (`parent` = ? OR `parent` = 0)", $itemid, $itemid];
 
                $item = dba::selectFirst('item', $fields, $condition);
@@ -2623,7 +2729,7 @@ EOT;
                $fields = [];
 
                foreach ($item as $field => $data) {
-                       if (!in_array($field, ["guid", "title", "body", "rendered-html", "rendered-hash"])) {
+                       if (!in_array($field, ["guid"])) {
                                $fields[$field] = $data;
                        }
                }
@@ -2631,19 +2737,6 @@ EOT;
                $result = dba::update('thread', $fields, ['iid' => $itemid]);
 
                logger("Update thread for item ".$itemid." - guid ".$item["guid"]." - ".(int)$result, LOGGER_DEBUG);
-
-               // Updating a shadow item entry
-               $items = dba::selectFirst('item', ['id'], ['guid' => $item['guid'], 'uid' => 0]);
-
-               if (!DBM::is_result($items)) {
-                       return;
-               }
-
-               $fields = ['title' => $item['title'], 'body' => $item['body'],
-                       'rendered-html' => $item['rendered-html'], 'rendered-hash' => $item['rendered-hash']];
-               $result = dba::update('item', $fields, ['id' => $items['id']]);
-
-               logger("Updating public shadow for post ".$items["id"]." - guid ".$item["guid"]." Result: ".print_r($result, true), LOGGER_DEBUG);
        }
 
        private static function deleteThread($itemid, $itemuri = "")
index cf6e78cb7203d05618a246d6b25b4b61b550905e..713bfa25e0ad67f6a6f9caab456ba5de7375dffd 100644 (file)
@@ -26,9 +26,12 @@ class Expire {
                if ($param == 'delete') {
                        logger('Delete expired items', LOGGER_DEBUG);
                        // physically remove anything that has been deleted for more than two months
-                       $r = dba::p("SELECT `id` FROM `item` WHERE `deleted` AND `changed` < UTC_TIMESTAMP() - INTERVAL 60 DAY");
+                       $r = dba::p("SELECT `id`, `icid` FROM `item` WHERE `deleted` AND `changed` < UTC_TIMESTAMP() - INTERVAL 60 DAY");
                        while ($row = dba::fetch($r)) {
                                dba::delete('item', ['id' => $row['id']]);
+                               if (!dba::exists('item', ['icid' => $row['icid']])) {
+                                       dba::delete('item-content', ['id' => $row['icid']]);
+                               }
                        }
                        dba::close($r);