From 5fe6a2dfcd2ad2ceb09bb51047e3ebd70c6c6026 Mon Sep 17 00:00:00 2001 From: Michael Date: Sat, 9 May 2020 15:38:40 +0000 Subject: [PATCH] We now store verbs in a new side table --- src/Database/PostUpdate.php | 57 ++++++++++++++++++++++++++++++++++- src/Model/Item.php | 4 +++ src/Model/Verb.php | 51 +++++++++++++++++++++++++++++++ static/dbstructure.config.php | 13 +++++++- update.php | 9 ++++++ 5 files changed, 132 insertions(+), 2 deletions(-) create mode 100644 src/Model/Verb.php diff --git a/src/Database/PostUpdate.php b/src/Database/PostUpdate.php index 82cc07c6d6..b2c8170bbd 100644 --- a/src/Database/PostUpdate.php +++ b/src/Database/PostUpdate.php @@ -32,6 +32,7 @@ use Friendica\Model\Post\Category; use Friendica\Model\Tag; use Friendica\Model\Term; use Friendica\Model\UserItem; +use Friendica\Model\Verb; use Friendica\Util\Strings; /** @@ -80,6 +81,9 @@ class PostUpdate if (!self::update1346()) { return false; } + if (!self::update1347()) { + return false; + } return true; } @@ -787,5 +791,56 @@ class PostUpdate } return false; - } + } + + /** + * update the "vid" (verb) field in the item table + * + * @return bool "true" when the job is done + * @throws \Friendica\Network\HTTPException\InternalServerErrorException + * @throws \ImagickException + */ + private static function update1347() + { + // Was the script completed? + if (DI::config()->get("system", "post_update_version") >= 1347) { + return true; + } + + $id = DI::config()->get("system", "post_update_version_1347_id", 0); + + Logger::info('Start', ['item' => $id]); + + $start_id = $id; + $rows = 0; + $condition = ["`id` > ? AND `vid` IS NULL", $id]; + $params = ['order' => ['id'], 'limit' => 10000]; + $items = Item::select(['id', 'verb'], $condition, $params); + + if (DBA::errorNo() != 0) { + Logger::error('Database error', ['no' => DBA::errorNo(), 'message' => DBA::errorMessage()]); + return false; + } + + while ($item = Item::fetch($items)) { + $id = $item['id']; + + DBA::update('item', ['vid' => Verb::getID($item['verb'])], ['id' => $item['id']]); + + ++$rows; + } + DBA::close($items); + + DI::config()->set("system", "post_update_version_1347_id", $id); + + Logger::info('Processed', ['rows' => $rows, 'last' => $id]); + + if ($start_id == $id) { + DI::config()->set("system", "post_update_version", 1347); + Logger::info('Done'); + return true; + } + + return false; + } } diff --git a/src/Model/Item.php b/src/Model/Item.php index 38ea35c8f6..2fc8a31fcc 100644 --- a/src/Model/Item.php +++ b/src/Model/Item.php @@ -1505,6 +1505,10 @@ class Item return 0; } + if (empty($item['vid']) && !empty($item['verb'])) { + $item['vid'] = Verb::getID($item['verb']); + } + self::addLanguageToItemArray($item); // Items cannot be stored before they happen ... diff --git a/src/Model/Verb.php b/src/Model/Verb.php new file mode 100644 index 0000000000..46b306c1d3 --- /dev/null +++ b/src/Model/Verb.php @@ -0,0 +1,51 @@ +. + * + */ + +namespace Friendica\Model; + +use Friendica\Database\DBA; + +class Verb +{ + /** + * Insert a verb record and return its id + * + * @param string $verb + * + * @return integer verb id + * @throws \Exception + */ + public static function getID($verb) + { + if (empty($verb)) { + return 0; + } + + $verb_record = DBA::selectFirst('verb', ['id'], ['name' => $verb]); + if (DBA::isResult($verb_record)) { + return $verb_record['id']; + } + + DBA::insert('verb', ['name' => $verb], true); + + return DBA::lastInsertId(); + } +} diff --git a/static/dbstructure.config.php b/static/dbstructure.config.php index c214883898..603327cd05 100755 --- a/static/dbstructure.config.php +++ b/static/dbstructure.config.php @@ -51,7 +51,7 @@ use Friendica\Database\DBA; if (!defined('DB_UPDATE_VERSION')) { - define('DB_UPDATE_VERSION', 1346); + define('DB_UPDATE_VERSION', 1347); } return [ @@ -670,6 +670,7 @@ return [ "author-id" => ["type" => "int unsigned", "not null" => "1", "default" => "0", "relation" => ["contact" => "id"], "comment" => "Link to the contact table with uid=0 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"], "iaid" => ["type" => "int unsigned", "relation" => ["item-activity" => "id"], "comment" => "Id of the item-activity table entry that contains the activity data"], + "vid" => ["type" => "smallint unsigned", "relation" => ["verb" => "id"], "comment" => "Id of the verb table entry that contains the activity verbs"], "extid" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""], "post-type" => ["type" => "tinyint unsigned", "not null" => "1", "default" => "0", "comment" => "Post type (personal note, bookmark, ...)"], "global" => ["type" => "boolean", "not null" => "1", "default" => "0", "comment" => ""], @@ -1489,6 +1490,16 @@ return [ "iid_uid" => ["iid", "uid"] ] ], + "verb" => [ + "comment" => "Activity Verbs", + "fields" => [ + "id" => ["type" => "int unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1"], + "name" => ["type" => "varchar(100)", "not null" => "1", "default" => "", "comment" => ""] + ], + "indexes" => [ + "PRIMARY" => ["id"] + ] + ], "worker-ipc" => [ "comment" => "Inter process communication between the frontend and the worker", "fields" => [ diff --git a/update.php b/update.php index 82b184c9f4..b7575e6c39 100644 --- a/update.php +++ b/update.php @@ -422,3 +422,12 @@ function update_1332() return Update::SUCCESS; } + +function update_1347() +{ + foreach (Item::ACTIVITIES as $index => $activity) { + DBA::insert('verb', ['id' => $index + 1, 'name' => $activity], true); + } + + return Update::SUCCESS; +}