Merge pull request #5289 from annando/item-central-content
Item content is now stored outside the item table
This commit is contained in:
commit
29fd15a4c6
2
boot.php
2
boot.php
|
@ -41,7 +41,7 @@ define('FRIENDICA_PLATFORM', 'Friendica');
|
||||||
define('FRIENDICA_CODENAME', 'The Tazmans Flax-lily');
|
define('FRIENDICA_CODENAME', 'The Tazmans Flax-lily');
|
||||||
define('FRIENDICA_VERSION', '2018.08-dev');
|
define('FRIENDICA_VERSION', '2018.08-dev');
|
||||||
define('DFRN_PROTOCOL_VERSION', '2.23');
|
define('DFRN_PROTOCOL_VERSION', '2.23');
|
||||||
define('DB_UPDATE_VERSION', 1270);
|
define('DB_UPDATE_VERSION', 1271);
|
||||||
define('NEW_UPDATE_ROUTINE_VERSION', 1170);
|
define('NEW_UPDATE_ROUTINE_VERSION', 1170);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
33
database.sql
33
database.sql
|
@ -1,6 +1,6 @@
|
||||||
-- ------------------------------------------
|
-- ------------------------------------------
|
||||||
-- Friendica 2018.08-dev (The Tazmans Flax-lily)
|
-- 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-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-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',
|
`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',
|
`title` varchar(255) NOT NULL DEFAULT '' COMMENT 'item title',
|
||||||
`content-warning` varchar(255) NOT NULL DEFAULT '' COMMENT '',
|
`content-warning` varchar(255) NOT NULL DEFAULT '' COMMENT '',
|
||||||
`body` mediumtext COMMENT 'item body content',
|
`body` mediumtext COMMENT 'item body content',
|
||||||
|
@ -541,9 +542,33 @@ CREATE TABLE IF NOT EXISTS `item` (
|
||||||
INDEX `deleted_changed` (`deleted`,`changed`),
|
INDEX `deleted_changed` (`deleted`,`changed`),
|
||||||
INDEX `uid_wall_changed` (`uid`,`wall`,`changed`),
|
INDEX `uid_wall_changed` (`uid`,`wall`,`changed`),
|
||||||
INDEX `uid_eventid` (`uid`,`event-id`),
|
INDEX `uid_eventid` (`uid`,`event-id`),
|
||||||
INDEX `uid_authorlink` (`uid`,`author-link`(190)),
|
INDEX `icid` (`icid`)
|
||||||
INDEX `uid_ownerlink` (`uid`,`owner-link`(190))
|
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='Structure for all posts';
|
||||||
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='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
|
-- TABLE locks
|
||||||
|
|
|
@ -189,9 +189,10 @@ function community_content(App $a, $update = 0)
|
||||||
function community_getitems($start, $itemspage, $content)
|
function community_getitems($start, $itemspage, $content)
|
||||||
{
|
{
|
||||||
if ($content == 'local') {
|
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 `user` ON `user`.`uid` = `thread`.`uid` AND NOT `user`.`hidewall`
|
||||||
INNER JOIN `item` ON `item`.`id` = `thread`.`iid`
|
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`
|
WHERE `thread`.`visible` AND NOT `thread`.`deleted` AND NOT `thread`.`moderated`
|
||||||
AND NOT `thread`.`private` AND `thread`.`wall` AND `thread`.`origin`
|
AND NOT `thread`.`private` AND `thread`.`wall` AND `thread`.`origin`
|
||||||
ORDER BY `thread`.`commented` DESC LIMIT " . intval($start) . ", " . intval($itemspage)
|
ORDER BY `thread`.`commented` DESC LIMIT " . intval($start) . ", " . intval($itemspage)
|
||||||
|
@ -200,7 +201,7 @@ function community_getitems($start, $itemspage, $content)
|
||||||
} elseif ($content == 'global') {
|
} elseif ($content == 'global') {
|
||||||
$r = dba::p("SELECT `uri` FROM `thread`
|
$r = dba::p("SELECT `uri` FROM `thread`
|
||||||
INNER JOIN `item` ON `item`.`id` = `thread`.`iid`
|
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`
|
WHERE `thread`.`uid` = 0 AND NOT `author`.`hidden` AND NOT `author`.`blocked`
|
||||||
ORDER BY `thread`.`commented` DESC LIMIT " . intval($start) . ", " . intval($itemspage));
|
ORDER BY `thread`.`commented` DESC LIMIT " . intval($start) . ", " . intval($itemspage));
|
||||||
return dba::inArray($r);
|
return dba::inArray($r);
|
||||||
|
|
|
@ -93,9 +93,9 @@ function item_post(App $a) {
|
||||||
|
|
||||||
if ($thr_parent || $thr_parent_uri) {
|
if ($thr_parent || $thr_parent_uri) {
|
||||||
if ($thr_parent) {
|
if ($thr_parent) {
|
||||||
$parent_item = dba::selectFirst('item', [], ['id' => $thr_parent]);
|
$parent_item = Item::selectFirst([], ['id' => $thr_parent]);
|
||||||
} elseif ($thr_parent_uri) {
|
} 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
|
// if this isn't the real parent of the conversation, find it
|
||||||
|
|
|
@ -1154,7 +1154,7 @@ class DBStructure
|
||||||
]
|
]
|
||||||
];
|
];
|
||||||
$database["item"] = [
|
$database["item"] = [
|
||||||
"comment" => "All posts",
|
"comment" => "Structure for all posts",
|
||||||
"fields" => [
|
"fields" => [
|
||||||
"id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "relation" => ["thread" => "iid"]],
|
"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"],
|
"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-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-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"],
|
"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"],
|
"title" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => "item title"],
|
||||||
"content-warning" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
|
"content-warning" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
|
||||||
"body" => ["type" => "mediumtext", "comment" => "item body content"],
|
"body" => ["type" => "mediumtext", "comment" => "item body content"],
|
||||||
|
@ -1247,8 +1248,33 @@ class DBStructure
|
||||||
"deleted_changed" => ["deleted","changed"],
|
"deleted_changed" => ["deleted","changed"],
|
||||||
"uid_wall_changed" => ["uid","wall","changed"],
|
"uid_wall_changed" => ["uid","wall","changed"],
|
||||||
"uid_eventid" => ["uid","event-id"],
|
"uid_eventid" => ["uid","event-id"],
|
||||||
"uid_authorlink" => ["uid","author-link(190)"],
|
"icid" => ["icid"],
|
||||||
"uid_ownerlink" => ["uid","owner-link(190)"],
|
]
|
||||||
|
];
|
||||||
|
$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"] = [
|
$database["locks"] = [
|
||||||
|
|
|
@ -56,6 +56,24 @@ class Item extends BaseObject
|
||||||
'author-id', 'author-link', 'owner-link', 'contact-uid',
|
'author-id', 'author-link', 'owner-link', 'contact-uid',
|
||||||
'signed_text', 'signature', 'signer'];
|
'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
|
* @brief Fetch a single item row
|
||||||
*
|
*
|
||||||
|
@ -66,6 +84,14 @@ class Item extends BaseObject
|
||||||
{
|
{
|
||||||
$row = dba::fetch($stmt);
|
$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
|
// We prefer the data from the user's contact over the public one
|
||||||
if (!empty($row['author-link']) && !empty($row['contact-link']) &&
|
if (!empty($row['author-link']) && !empty($row['contact-link']) &&
|
||||||
($row['author-link'] == $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',
|
$fields['item'] = ['id', 'uid', 'parent', 'uri', 'parent-uri', 'thr-parent', 'guid',
|
||||||
'contact-id', 'owner-id', 'author-id', 'type', 'wall', 'gravity', 'extid',
|
'contact-id', 'owner-id', 'author-id', 'type', 'wall', 'gravity', 'extid',
|
||||||
'created', 'edited', 'commented', 'received', 'changed',
|
'created', 'edited', 'commented', 'received', 'changed', 'verb',
|
||||||
'title', 'body', 'app', 'verb', 'object-type', 'object', 'target-type', 'target',
|
|
||||||
'postopts', 'plink', 'resource-id', 'event-id', 'tag', 'attach', 'inform',
|
'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',
|
'private', 'pubmail', 'moderated', 'visible', 'starred', 'bookmark',
|
||||||
'unseen', 'deleted', 'origin', 'forum_mode', 'mention',
|
'unseen', 'deleted', 'origin', 'forum_mode', 'mention', 'global',
|
||||||
'rendered-hash', 'rendered-html', 'global', 'content-warning',
|
|
||||||
'id' => 'item_id', 'network'];
|
'id' => 'item_id', 'network'];
|
||||||
|
|
||||||
|
$fields['item-content'] = self::CONTENT_FIELDLIST;
|
||||||
|
|
||||||
$fields['author'] = ['url' => 'author-link', 'name' => 'author-name',
|
$fields['author'] = ['url' => 'author-link', 'name' => 'author-name',
|
||||||
'thumb' => 'author-avatar', 'nick' => 'author-nick'];
|
'thumb' => 'author-avatar', 'nick' => 'author-nick'];
|
||||||
|
|
||||||
|
@ -449,6 +475,10 @@ class Item extends BaseObject
|
||||||
$joins .= " LEFT JOIN `sign` ON `sign`.`iid` = `item`.`id`";
|
$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)) {
|
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`";
|
$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 ($fields as $table => $table_fields) {
|
||||||
foreach ($table_fields as $field => $select) {
|
foreach ($table_fields as $field => $select) {
|
||||||
if (empty($selected) || in_array($select, $selected)) {
|
if (empty($selected) || in_array($select, $selected)) {
|
||||||
|
if (in_array($select, self::CONTENT_FIELDLIST)) {
|
||||||
|
$selection[] = "`item`.`".$select."` AS `item-" . $select . "`";
|
||||||
|
}
|
||||||
if (is_int($field)) {
|
if (is_int($field)) {
|
||||||
$selection[] = "`" . $table . "`.`".$select."`";
|
$selection[] = "`" . $table . "`.`" . $select . "`";
|
||||||
} else {
|
} 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
|
// 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.
|
// 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.
|
// 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 (!$success) {
|
if (isset($fields[$field])) {
|
||||||
dba::close($items);
|
$content_fields[$field] = $fields[$field];
|
||||||
dba::rollback();
|
unset($fields[$field]);
|
||||||
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();
|
$rows = dba::affected_rows();
|
||||||
|
|
||||||
while ($item = dba::fetch($items)) {
|
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::insertFromTagFieldByItemId($item['id']);
|
||||||
Term::insertFromFileFieldByItemId($item['id']);
|
Term::insertFromFileFieldByItemId($item['id']);
|
||||||
self::updateThread($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
|
// When there is no content then we don't post it
|
||||||
if ($item['body'].$item['title'] == '') {
|
if ($item['body'].$item['title'] == '') {
|
||||||
|
logger('No body, no title.');
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1044,11 +1093,12 @@ class Item extends BaseObject
|
||||||
return 0;
|
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-name']);
|
||||||
unset($item['author-avatar']);
|
unset($item['author-avatar']);
|
||||||
|
|
||||||
//unset($item['owner-link']);
|
unset($item['owner-link']);
|
||||||
unset($item['owner-name']);
|
unset($item['owner-name']);
|
||||||
unset($item['owner-avatar']);
|
unset($item['owner-avatar']);
|
||||||
|
|
||||||
|
@ -1260,6 +1310,7 @@ class Item extends BaseObject
|
||||||
logger('' . print_r($item,true), LOGGER_DATA);
|
logger('' . print_r($item,true), LOGGER_DATA);
|
||||||
|
|
||||||
dba::transaction();
|
dba::transaction();
|
||||||
|
self::insertContent($item);
|
||||||
$ret = dba::insert('item', $item);
|
$ret = dba::insert('item', $item);
|
||||||
|
|
||||||
// When the item was successfully stored we fetch the ID of the 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;
|
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
|
* @brief Distributes public items to the receivers
|
||||||
*
|
*
|
||||||
|
@ -1425,7 +1537,7 @@ class Item extends BaseObject
|
||||||
$condition = ['id' => $itemid, 'uid' => 0,
|
$condition = ['id' => $itemid, 'uid' => 0,
|
||||||
'network' => [NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_OSTATUS, ""],
|
'network' => [NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_OSTATUS, ""],
|
||||||
'visible' => true, 'deleted' => false, 'moderated' => false, 'private' => false];
|
'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)) {
|
if (!DBM::is_result($item)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1436,8 +1548,6 @@ class Item extends BaseObject
|
||||||
unset($item['wall']);
|
unset($item['wall']);
|
||||||
unset($item['origin']);
|
unset($item['origin']);
|
||||||
unset($item['starred']);
|
unset($item['starred']);
|
||||||
unset($item['rendered-hash']);
|
|
||||||
unset($item['rendered-html']);
|
|
||||||
|
|
||||||
$users = [];
|
$users = [];
|
||||||
|
|
||||||
|
@ -1553,7 +1663,7 @@ class Item extends BaseObject
|
||||||
return;
|
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"] == '') &&
|
if (DBM::is_result($item) && ($item["allow_cid"] == '') && ($item["allow_gid"] == '') &&
|
||||||
($item["deny_cid"] == '') && ($item["deny_gid"] == '')) {
|
($item["deny_cid"] == '') && ($item["deny_gid"] == '')) {
|
||||||
|
@ -1567,12 +1677,10 @@ class Item extends BaseObject
|
||||||
unset($item['mention']);
|
unset($item['mention']);
|
||||||
unset($item['origin']);
|
unset($item['origin']);
|
||||||
unset($item['starred']);
|
unset($item['starred']);
|
||||||
unset($item['rendered-hash']);
|
|
||||||
unset($item['rendered-html']);
|
|
||||||
if ($item['uri'] == $item['parent-uri']) {
|
if ($item['uri'] == $item['parent-uri']) {
|
||||||
$item['contact-id'] = Contact::getIdForURL($item['owner-link']);
|
$item['contact-id'] = $item['owner-id'];
|
||||||
} else {
|
} else {
|
||||||
$item['contact-id'] = Contact::getIdForURL($item['author-link']);
|
$item['contact-id'] = $item['author-id'];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (in_array($item['type'], ["net-comment", "wall-comment"])) {
|
if (in_array($item['type'], ["net-comment", "wall-comment"])) {
|
||||||
|
@ -1597,7 +1705,7 @@ class Item extends BaseObject
|
||||||
*/
|
*/
|
||||||
public static function addShadowPost($itemid)
|
public static function addShadowPost($itemid)
|
||||||
{
|
{
|
||||||
$item = dba::selectFirst('item', [], ['id' => $itemid]);
|
$item = self::selectFirst(self::ITEM_FIELDLIST, ['id' => $itemid]);
|
||||||
if (!DBM::is_result($item)) {
|
if (!DBM::is_result($item)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1635,8 +1743,6 @@ class Item extends BaseObject
|
||||||
unset($item['mention']);
|
unset($item['mention']);
|
||||||
unset($item['origin']);
|
unset($item['origin']);
|
||||||
unset($item['starred']);
|
unset($item['starred']);
|
||||||
unset($item['rendered-hash']);
|
|
||||||
unset($item['rendered-html']);
|
|
||||||
$item['contact-id'] = Contact::getIdForURL($item['author-link']);
|
$item['contact-id'] = Contact::getIdForURL($item['author-link']);
|
||||||
|
|
||||||
if (in_array($item['type'], ["net-comment", "wall-comment"])) {
|
if (in_array($item['type'], ["net-comment", "wall-comment"])) {
|
||||||
|
@ -2604,9 +2710,9 @@ EOT;
|
||||||
|
|
||||||
private static function updateThread($itemid, $setmention = false)
|
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',
|
'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];
|
$condition = ["`id` = ? AND (`parent` = ? OR `parent` = 0)", $itemid, $itemid];
|
||||||
|
|
||||||
$item = dba::selectFirst('item', $fields, $condition);
|
$item = dba::selectFirst('item', $fields, $condition);
|
||||||
|
@ -2623,7 +2729,7 @@ EOT;
|
||||||
$fields = [];
|
$fields = [];
|
||||||
|
|
||||||
foreach ($item as $field => $data) {
|
foreach ($item as $field => $data) {
|
||||||
if (!in_array($field, ["guid", "title", "body", "rendered-html", "rendered-hash"])) {
|
if (!in_array($field, ["guid"])) {
|
||||||
$fields[$field] = $data;
|
$fields[$field] = $data;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2631,19 +2737,6 @@ EOT;
|
||||||
$result = dba::update('thread', $fields, ['iid' => $itemid]);
|
$result = dba::update('thread', $fields, ['iid' => $itemid]);
|
||||||
|
|
||||||
logger("Update thread for item ".$itemid." - guid ".$item["guid"]." - ".(int)$result, LOGGER_DEBUG);
|
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 = "")
|
private static function deleteThread($itemid, $itemuri = "")
|
||||||
|
|
|
@ -26,9 +26,12 @@ class Expire {
|
||||||
if ($param == 'delete') {
|
if ($param == 'delete') {
|
||||||
logger('Delete expired items', LOGGER_DEBUG);
|
logger('Delete expired items', LOGGER_DEBUG);
|
||||||
// physically remove anything that has been deleted for more than two months
|
// 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)) {
|
while ($row = dba::fetch($r)) {
|
||||||
dba::delete('item', ['id' => $row['id']]);
|
dba::delete('item', ['id' => $row['id']]);
|
||||||
|
if (!dba::exists('item', ['icid' => $row['icid']])) {
|
||||||
|
dba::delete('item-content', ['id' => $row['icid']]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
dba::close($r);
|
dba::close($r);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue