From 38160a48b0226a3ece01d5a28d59d2c02e8bb8e5 Mon Sep 17 00:00:00 2001
From: Michael <heluecht@pirati.ca>
Date: Sun, 1 Jul 2018 19:02:29 +0000
Subject: [PATCH] Post update script to move old content from the item table

---
 src/Database/PostUpdate.php | 44 +++++++++++++++++++++++++++++++++++++
 src/Model/Item.php          | 16 +++++++++++++-
 src/Protocol/DFRN.php       |  7 ------
 src/Protocol/Diaspora.php   |  7 ------
 4 files changed, 59 insertions(+), 15 deletions(-)

diff --git a/src/Database/PostUpdate.php b/src/Database/PostUpdate.php
index 13da437796..4f186ecbe3 100644
--- a/src/Database/PostUpdate.php
+++ b/src/Database/PostUpdate.php
@@ -7,6 +7,7 @@ namespace Friendica\Database;
 use Friendica\Core\Config;
 use Friendica\Database\DBM;
 use Friendica\Model\Contact;
+use Friendica\Model\Item;
 use dba;
 
 require_once 'include/dba.php';
@@ -30,6 +31,9 @@ class PostUpdate
 		if (!self::update1206()) {
 			return;
 		}
+		if (!self::update1274()) {
+			return;
+		}
 	}
 
 	/**
@@ -217,4 +221,44 @@ class PostUpdate
 		logger("Done", LOGGER_DEBUG);
 		return true;
 	}
+
+	/**
+	 * @brief update the "item-content" table
+	 *
+	 * @return bool "true" when the job is done
+	 */
+	private static function update1274()
+	{
+		// Was the script completed?
+		if (Config::get("system", "post_update_version") >= 1274) {
+			return true;
+		}
+
+		logger("Start", LOGGER_DEBUG);
+
+		$fields = ['id', 'title', 'content-warning', 'body', 'location', 'tag', 'file',
+			'coord', 'app', 'rendered-hash', 'rendered-html', 'verb',
+			'object-type', 'object', 'target-type', 'target', 'plink'];
+
+		$condition = ["`icid` IS NULL"];
+		$params = ['limit' => 10000];
+		$items = Item::select($fields, $condition, $params);
+
+		if (!DBM::is_result($items)) {
+			Config::set("system", "post_update_version", 1274);
+			logger("Done", LOGGER_DEBUG);
+			return true;
+		}
+
+		$rows = 0;
+
+		while ($item = Item::fetch($items)) {
+			Item::update($item, ['id' => $item['id']]);
+			++$rows;
+		}
+		dba::close($items);
+
+		logger("Processed rows: " . $rows, LOGGER_DEBUG);
+		return true;
+	}
 }
diff --git a/src/Model/Item.php b/src/Model/Item.php
index 71faa3f267..57090da4cb 100644
--- a/src/Model/Item.php
+++ b/src/Model/Item.php
@@ -614,7 +614,7 @@ 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', 'uri', 'plink'], $condition);
+		$items = dba::select('item', ['id', 'origin', 'uri', 'plink', 'icid'], $condition);
 
 		$content_fields = [];
 		foreach (array_merge(self::CONTENT_FIELDLIST, self::MIXED_CONTENT_FIELDLIST) as $field) {
@@ -657,6 +657,20 @@ class Item extends BaseObject
 			}
 			self::updateContent($content_fields, ['uri' => $item['uri']]);
 
+			if (empty($item['icid'])) {
+				$item_content = dba::selectFirst('item-content', [], ['uri' => $item['uri']]);
+				if (DBM::is_result($item_content)) {
+					$item_fields = ['icid' => $item_content['id']];
+					// Clear all fields in the item table that have a content in the item-content table
+					foreach ($item_content as $field => $content) {
+						if (in_array($field, self::MIXED_CONTENT_FIELDLIST) && !empty($item_content[$field])) {
+							$item_fields[$field] = '';
+						}
+					}
+					dba::update('item', $item_fields, ['id' => $item['id']]);
+				}
+			}
+
 			if (!empty($tags)) {
 				Term::insertFromTagFieldByItemId($item['id'], $tags);
 			}
diff --git a/src/Protocol/DFRN.php b/src/Protocol/DFRN.php
index c1e116f2f7..f979d6b003 100644
--- a/src/Protocol/DFRN.php
+++ b/src/Protocol/DFRN.php
@@ -2087,13 +2087,6 @@ class DFRN
 
 		logger('Contacts are updated.');
 
-		// update items
-		// This is an extreme performance killer
-		Item::update(['owner-link' => $relocate["url"]], ['owner-link' => $old["url"], 'uid' => $importer["importer_uid"]]);
-		Item::update(['author-link' => $relocate["url"]], ['author-link' => $old["url"], 'uid' => $importer["importer_uid"]]);
-
-		logger('Items are updated.');
-
 		/// @TODO
 		/// merge with current record, current contents have priority
 		/// update record, set url-updated
diff --git a/src/Protocol/Diaspora.php b/src/Protocol/Diaspora.php
index 6ef529b7fe..47101d5ad7 100644
--- a/src/Protocol/Diaspora.php
+++ b/src/Protocol/Diaspora.php
@@ -1543,13 +1543,6 @@ class Diaspora
 
 		logger('Contacts are updated.');
 
-		// update items
-		// This is an extreme performance killer
-		Item::update(['owner-link' => $data["url"]], ['owner-link' => $contact["url"], 'uid' => $importer["uid"]]);
-		Item::update(['author-link' => $data["url"]], ['author-link' => $contact["url"], 'uid' => $importer["uid"]]);
-
-		logger('Items are updated.');
-
 		return true;
 	}
 
-- 
2.39.5