X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FModel%2FPost.php;h=aae847664db2093efee10ebc45575a2fa44a39ad;hb=a24febb8b656217a7cd88db205007420cb64485e;hp=ec348c60ad3b7d7f1565448ab2721ca517a0e7c1;hpb=1193b73125fc911ae508276cde69718cc4c7f3c3;p=friendica.git diff --git a/src/Model/Post.php b/src/Model/Post.php index ec348c60ad..aae847664d 100644 --- a/src/Model/Post.php +++ b/src/Model/Post.php @@ -1,6 +1,6 @@ $uid, 'pinned' => true]); - if (!DBA::isResult($useritems)) { - return $useritems; + $postthreaduser = DBA::select('post-thread-user', ['uri-id'], ['uid' => $uid, 'pinned' => true]); + if (!DBA::isResult($postthreaduser)) { + return $postthreaduser; } $pinned = []; - while ($useritem = DBA::fetch($useritems)) { - $pinned[] = $useritem['iid']; + while ($useritem = DBA::fetch($postthreaduser)) { + $pinned[] = $useritem['uri-id']; } - DBA::close($useritems); + DBA::close($postthreaduser); if (empty($pinned)) { return []; } - $condition = DBA::mergeConditions(['iid' => $pinned], $condition); + $condition = DBA::mergeConditions(['uri-id' => $pinned, 'uid' => $uid, 'gravity' => GRAVITY_PARENT], $condition); + + return self::selectForUser($uid, $selected, $condition, $params); + } - return self::selectThreadForUser($uid, $selected, $condition, $params); + /** + * Update existing post entries + * + * @param array $fields The fields that are to be changed + * @param array $condition The condition for finding the item entries + * + * A return value of "0" doesn't mean an error - but that 0 rows had been changed. + * + * @return integer|boolean number of affected rows - or "false" if there was an error + * @throws \Friendica\Network\HTTPException\InternalServerErrorException + */ + public static function update(array $fields, array $condition) + { + $affected = 0; + + Logger::info('Start Update', ['fields' => $fields, 'condition' => $condition, 'uid' => local_user(),'callstack' => System::callstack(10)]); + + // Don't allow changes to fields that are responsible for the relation between the records + unset($fields['id']); + unset($fields['parent']); + unset($fields['uid']); + unset($fields['uri']); + unset($fields['uri-id']); + unset($fields['thr-parent']); + unset($fields['thr-parent-id']); + unset($fields['parent-uri']); + unset($fields['parent-uri-id']); + + $thread_condition = DBA::mergeConditions($condition, ['gravity' => GRAVITY_PARENT]); + + // To ensure the data integrity we do it in an transaction + DBA::transaction(); + + $update_fields = DBStructure::getFieldsForTable('post-user', $fields); + if (!empty($update_fields)) { + $affected_count = 0; + $posts = DBA::select('post-user-view', ['post-user-id'], $condition); + while ($rows = DBA::toArray($posts, false, 100)) { + $puids = array_column($rows, 'post-user-id'); + if (!DBA::update('post-user', $update_fields, ['id' => $puids])) { + DBA::rollback(); + Logger::notice('Updating post-user failed', ['fields' => $update_fields, 'condition' => $condition]); + return false; + } + $affected_count += DBA::affectedRows(); + } + DBA::close($posts); + $affected = $affected_count; + } + + $update_fields = DBStructure::getFieldsForTable('post-content', $fields); + if (!empty($update_fields)) { + $affected_count = 0; + $posts = DBA::select('post-user-view', ['uri-id'], $condition, ['group_by' => ['uri-id']]); + while ($rows = DBA::toArray($posts, false, 100)) { + $uriids = array_column($rows, 'uri-id'); + if (!DBA::update('post-content', $update_fields, ['uri-id' => $uriids])) { + DBA::rollback(); + Logger::notice('Updating post-content failed', ['fields' => $update_fields, 'condition' => $condition]); + return false; + } + $affected_count += DBA::affectedRows(); + } + DBA::close($posts); + $affected = max($affected, $affected_count); + } + + $update_fields = DBStructure::getFieldsForTable('post', $fields); + if (!empty($update_fields)) { + $affected_count = 0; + $posts = DBA::select('post-user-view', ['uri-id'], $condition, ['group_by' => ['uri-id']]); + while ($rows = DBA::toArray($posts, false, 100)) { + $uriids = array_column($rows, 'uri-id'); + if (!DBA::update('post', $update_fields, ['uri-id' => $uriids])) { + DBA::rollback(); + Logger::notice('Updating post failed', ['fields' => $update_fields, 'condition' => $condition]); + return false; + } + $affected_count += DBA::affectedRows(); + } + DBA::close($posts); + $affected = max($affected, $affected_count); + } + + $update_fields = Post\DeliveryData::extractFields($fields); + if (!empty($update_fields)) { + $affected_count = 0; + $posts = DBA::select('post-user-view', ['uri-id'], $condition, ['group_by' => ['uri-id']]); + while ($rows = DBA::toArray($posts, false, 100)) { + $uriids = array_column($rows, 'uri-id'); + if (!DBA::update('post-delivery-data', $update_fields, ['uri-id' => $uriids])) { + DBA::rollback(); + Logger::notice('Updating post-delivery-data failed', ['fields' => $update_fields, 'condition' => $condition]); + return false; + } + $affected_count += DBA::affectedRows(); + } + DBA::close($posts); + $affected = max($affected, $affected_count); + } + + $update_fields = DBStructure::getFieldsForTable('post-thread', $fields); + if (!empty($update_fields)) { + $affected_count = 0; + $posts = DBA::select('post-user-view', ['uri-id'], $thread_condition, ['group_by' => ['uri-id']]); + while ($rows = DBA::toArray($posts, false, 100)) { + $uriids = array_column($rows, 'uri-id'); + if (!DBA::update('post-thread', $update_fields, ['uri-id' => $uriids])) { + DBA::rollback(); + Logger::notice('Updating post-thread failed', ['fields' => $update_fields, 'condition' => $condition]); + return false; + } + $affected_count += DBA::affectedRows(); + } + DBA::close($posts); + $affected = max($affected, $affected_count); + } + + $update_fields = DBStructure::getFieldsForTable('post-thread-user', $fields); + if (!empty($update_fields)) { + $affected_count = 0; + $posts = DBA::select('post-user-view', ['post-user-id'], $thread_condition); + while ($rows = DBA::toArray($posts, false, 100)) { + $thread_puids = array_column($rows, 'post-user-id'); + if (!DBA::update('post-thread-user', $update_fields, ['post-user-id' => $thread_puids])) { + DBA::rollback(); + Logger::notice('Updating post-thread-user failed', ['fields' => $update_fields, 'condition' => $condition]); + return false; + } + $affected_count += DBA::affectedRows(); + } + DBA::close($posts); + $affected = max($affected, $affected_count); + } + + DBA::commit(); + + Logger::info('Updated posts', ['rows' => $affected]); + return $affected; + } + + /** + * Delete a row from the post table + * + * @param array $conditions Field condition(s) + * @param array $options + * - cascade: If true we delete records in other tables that depend on the one we're deleting through + * relations (default: true) + * + * @return boolean was the delete successful? + * @throws \Exception + */ + public static function delete(array $conditions, array $options = []) + { + return DBA::delete('post', $conditions, $options); } }