소스 검색

Add sorting for multi-line DELETE queries

Visman 1 년 전
부모
커밋
e45170cd0e

+ 4 - 0
app/Models/BanList/Delete.php

@@ -22,6 +22,10 @@ class Delete extends Method
     public function delete(int ...$ids): BanList
     {
         if (! empty($ids)) {
+            if (\count($ids) > 1) {
+                \sort($ids, \SORT_NUMERIC);
+            }
+
             $vars = [
                 ':ids' => $ids,
             ];

+ 7 - 1
app/Models/Censorship/Save.php

@@ -29,6 +29,7 @@ class Save extends Method
             if (! isset($list[$id]['search_for'], $list[$id]['replace_with'])) {
                 continue;
             }
+
             if ('' === \trim($list[$id]['search_for'])) {
                 if ($id > 0) {
                     $forDel[] = $id;
@@ -60,9 +61,14 @@ class Save extends Method
                 $this->c->DB->exec($query, $vars);
             }
         }
+
         if ($forDel) {
+            if (\count($forDel) > 1) {
+                \sort($forDel, \SORT_NUMERIC);
+            }
+
             $vars = [
-                ':del' => $forDel
+                ':del' => $forDel,
             ];
             $query = 'DELETE
                 FROM ::censoring

+ 4 - 0
app/Models/Forum/Delete.php

@@ -87,6 +87,10 @@ class Delete extends Action
         }
 
         if ($forums) {
+            if (\count($forums) > 1) {
+                \ksort($forums, \SORT_NUMERIC);
+            }
+
             $this->c->subscriptions->unsubscribe(...$forums);
 
             foreach ($forums as $forum) {

+ 6 - 0
app/Models/Forum/Refresh.php

@@ -89,6 +89,7 @@ class Refresh extends Action
             $sub[] = $id;
             $all   = \array_merge($this->createList($list, $id), $all);
         }
+
         if (0 === $parent) {
             if (empty($sub)) {
                 return [];
@@ -99,6 +100,11 @@ class Refresh extends Action
         }
 
         $all = \array_merge($sub, $all);
+
+        if (\count($all) > 1) {
+            \sort($all, \SORT_NUMERIC);
+        }
+
         $list[$parent]['subforums']   = $sub ?: null;
         $list[$parent]['descendants'] = $all ?: null;
 

+ 6 - 2
app/Models/Online/Online.php

@@ -157,7 +157,9 @@ class Online extends Model
 
         // удаление просроченных посетителей
         if ($upUsers) {
-            \ksort($upUsers, \SORT_NUMERIC);
+            if (\count($upUsers) > 1) {
+                \ksort($upUsers, \SORT_NUMERIC);
+            }
 
             foreach ($upUsers as $id => $logged) {
                 $this->c->users->updateLastVisit(
@@ -180,7 +182,9 @@ class Online extends Model
 
         // удаление просроченных гостей
         if ($delGuests) {
-            \sort($delGuests, \SORT_STRING);
+            if (\count($delGuests) > 1) {
+                \sort($delGuests, \SORT_STRING);
+            }
 
             $vars = [
                 ':idents' => $delGuests,

+ 21 - 1
app/Models/PM/Delete.php

@@ -62,7 +62,7 @@ class Delete extends Method
                 }
 
                 $users[$arg->id] = $arg;
-                $isUser         = 1;
+                $isUser          = 1;
             } elseif ($arg instanceof PPost) {
                 if (! $arg->parent instanceof PTopic) {
                     throw new RuntimeException('Bad ppost');
@@ -87,6 +87,10 @@ class Delete extends Method
         }
 
         if ($topics) {
+            if (\count($topics) > 1) {
+                \ksort($topics, \SORT_NUMERIC);
+            }
+
             $ids = [];
 
             foreach ($topics as $topic) {
@@ -103,6 +107,10 @@ class Delete extends Method
         }
 
         if ($posts) {
+            if (\count($posts) > 1) {
+                \ksort($posts, \SORT_NUMERIC);
+            }
+
             $calcTopics = [];
 
             foreach ($posts as $post) {
@@ -123,6 +131,10 @@ class Delete extends Method
 
             $this->c->DB->exec($query, $vars);
 
+            if (\count($calcTopics) > 1) {
+                \ksort($calcTopics, \SORT_NUMERIC);
+            }
+
             foreach ($calcTopics as $topic) {
                 $this->model->update(Cnst::PTOPIC, $topic->calcStat());
             }
@@ -184,6 +196,10 @@ class Delete extends Method
                 $uids[$row['target_id']] = $row['target_id'];
             }
 
+            if (\count($ids) > 1) {
+                \sort($ids, \SORT_NUMERIC);
+            }
+
             $this->deletePTopics($ids);
 
             foreach ($this->c->users->loadByIds($uids) as $user) {
@@ -193,6 +209,10 @@ class Delete extends Method
             }
         }
 
+        if (\count($calcUsers) > 1) {
+            \ksort($calcUsers, \SORT_NUMERIC);
+        }
+
         foreach ($calcUsers as $user) {
             $this->model->recalculate($user);
         }

+ 2 - 1
app/Models/Pages/Search.php

@@ -334,7 +334,6 @@ class Search extends Page
                 if (! $search->prepare($query)) {
                     $v->addError([$search->queryError, $search->queryText]);
                 } else {
-
                     if ($this->c->search->execute($v, $this->listOfIndexes, $flood)) {
                         $flood = false;
 
@@ -384,7 +383,9 @@ class Search extends Page
             if (! empty(\array_diff($forums, $this->listOfIndexes))) {
                 $v->addError('The :alias contains an invalid value');
             }
+
             \sort($forums, SORT_NUMERIC);
+
             $forums = \implode('.', $forums);
         }
 

+ 4 - 0
app/Models/Poll/Delete.php

@@ -55,6 +55,10 @@ class Delete extends Action
             throw new InvalidArgumentException('Expected only Poll(s) or Topic(s)');
         }
 
+        if (\count($tids) > 1) {
+            \sort($tids, \SORT_NUMERIC);
+        }
+
         $vars = [
             ':tids' => $tids,
         ];

+ 2 - 2
app/Models/Poll/Save.php

@@ -43,9 +43,9 @@ class Save extends Action
             SET qna_text=?s:qna
             WHERE tid=?i:tid AND question_id=?i:qid AND field_id=?i:fid';
         $queryD1 = 'DELETE FROM ::poll
-            WHERE tid=?i:tid AND question_id IN(?ai:qids)';
+            WHERE tid=?i:tid AND question_id IN (?ai:qids)';
         $queryD2 = 'DELETE FROM ::poll
-            WHERE tid=?i:tid AND question_id=?i:qid AND field_id IN(?ai:fid)';
+            WHERE tid=?i:tid AND question_id=?i:qid AND field_id IN (?ai:fid)';
 
         $modified    = false;
         $oldQuestion = $old->question;

+ 13 - 0
app/Models/Post/Delete.php

@@ -202,6 +202,10 @@ class Delete extends Action
         }
 
         if ($pids) {
+            if (\count($pids) > 1) {
+                \sort($pids, \SORT_NUMERIC);
+            }
+
             $vars = [
                 ':posts' => $pids,
             ];
@@ -213,15 +217,24 @@ class Delete extends Action
         }
 
         if ($parents) {
+            if (\count($parents) > 1) {
+                \ksort($parents, \SORT_NUMERIC);
+            }
+
             $topics  = $parents;
             $parents = [];
 
             foreach ($topics as $topic) {
                 $parents[$topic->parent->id] = $topic->parent;
+
                 $this->c->topics->update($topic->calcStat());
             }
 
             if (! $forums) {
+                if (\count($parents) > 1) {
+                    \ksort($parents, \SORT_NUMERIC);
+                }
+
                 foreach ($parents as $forum) {
                     $this->c->forums->update($forum->calcStat());
                 }

+ 2 - 2
app/Models/Search/Index.php

@@ -113,7 +113,7 @@ class Index extends Method
             ];
             $query = 'DELETE
                 FROM ::search_matches
-                WHERE word_id IN(?ai:ids) AND post_id=?i:pid AND subject_match=?i:subj';
+                WHERE word_id IN (?ai:ids) AND post_id=?i:pid AND subject_match=?i:subj';
 
             $this->c->DB->exec($query, $vars);
         }
@@ -132,7 +132,7 @@ class Index extends Method
             $query = 'INSERT INTO ::search_matches (post_id, word_id, subject_match)
                 SELECT ?i:pid, id, ?i:subj
                 FROM ::search_words
-                WHERE word IN(?as:words)';
+                WHERE word IN (?as:words)';
 
             $this->c->DB->exec($query, $vars);
         }

+ 11 - 5
app/Models/Subscription/Subscription.php

@@ -141,20 +141,23 @@ class Subscription extends Model
                 $where[':uid'] = 'user_id=?i:uid';
                 $vars[':uid']  = \reset($this->users);
             } else {
-                $where[':uid'] = 'user_id IN(?ai:uid)';
+                $where[':uid'] = 'user_id IN (?ai:uid)';
                 $vars[':uid']  = $this->users;
             }
         }
 
         $all = empty($this->forums) && empty($this->topics);
 
-        if ($all || ! empty($this->forums)) {
+        if (
+            $all
+            || ! empty($this->forums)
+        ) {
             if (! empty($this->forums)) {
                 if (1 === \count($this->forums)) {
                     $where[':id'] = 'forum_id=?i:id';
                     $vars[':id']  = \reset($this->forums);
                 } else {
-                    $where[':id'] = 'forum_id IN(?ai:id)';
+                    $where[':id'] = 'forum_id IN (?ai:id)';
                     $vars[':id']  = $this->forums;
                 }
             }
@@ -168,13 +171,16 @@ class Subscription extends Model
 
         unset($where[':id'], $vars[':id']);
 
-        if ($all || ! empty($this->topics)) {
+        if (
+            $all
+            || ! empty($this->topics)
+        ) {
             if (! empty($this->topics)) {
                 if (1 === \count($this->topics)) {
                     $where[':id'] = 'topic_id=?i:id';
                     $vars[':id']  = \reset($this->topics);
                 } else {
-                    $where[':id'] = 'topic_id IN(?ai:id)';
+                    $where[':id'] = 'topic_id IN (?ai:id)';
                     $vars[':id']  = $this->topics;
                 }
             }

+ 8 - 0
app/Models/Topic/Delete.php

@@ -149,6 +149,10 @@ class Delete extends Action
                 throw new RuntimeException('Bad topic');
             }
 
+            if (\count($topics) > 1) {
+                \ksort($topics, \SORT_NUMERIC);
+            }
+
             $this->c->subscriptions->unsubscribe(...$topics);
             $this->c->polls->delete(...$topics);
 
@@ -175,6 +179,10 @@ class Delete extends Action
         }
 
         if ($parents) {
+            if (\count($parents) > 1) {
+                \ksort($parents, \SORT_NUMERIC);
+            }
+
             foreach ($parents as $forum) {
                 $this->c->forums->update($forum->calcStat());
             }

+ 12 - 6
app/Models/User/Delete.php

@@ -21,29 +21,35 @@ class Delete extends Action
     /**
      * Удаляет пользователя(ей)
      */
-    public function delete(User ...$users): void
+    public function delete(User ...$args): void
     {
-        if (empty($users)) {
+        if (empty($args)) {
             throw new InvalidArgumentException('No arguments, expected User(s)');
         }
 
-        $ids        = [];
+        $users      = [];
         $moderators = [];
         $resetAdmin = false;
         $resetBan   = false;
 
-        foreach ($users as $user) {
+        foreach ($args as $user) {
             if ($user->isGuest) {
                 throw new RuntimeException('Guest can not be deleted');
             }
+
             if ($user->isAdmMod) {
                 $moderators[$user->id] = $user;
             }
+
             if ($user->isAdmin) {
                 $resetAdmin = true;
             }
 
-            $ids[] = $user->id;
+            $users[$user->id] = $user;
+        }
+
+        if (\count($users) > 1) {
+            \ksort($users, \SORT_NUMERIC);
         }
 
         if ($moderators) {
@@ -85,7 +91,7 @@ class Delete extends Action
         }
 
         $vars = [
-            ':users' => $ids,
+            ':users' => \array_keys($users),
         ];
         $query = 'DELETE
             FROM ::users

+ 4 - 0
app/Models/User/UpdateCountPosts.php

@@ -46,6 +46,10 @@ class UpdateCountPosts extends Action
             $where = '';
             $vars  = [];
         } else {
+            if (\count($ids) > 1) {
+                \ksort($ids, \SORT_NUMERIC);
+            }
+
             $where = ' WHERE ::users.id IN (?ai:ids)';
             $vars  = [
                 ':ids' => \array_keys($ids),

+ 4 - 0
app/Models/User/UpdateCountTopics.php

@@ -43,6 +43,10 @@ class UpdateCountTopics extends Action
             $where = '';
             $vars  = [];
         } else {
+            if (\count($ids) > 1) {
+                \ksort($ids, \SORT_NUMERIC);
+            }
+
             $where = ' WHERE ::users.id IN (?ai:ids)';
             $vars  = [
                 ':ids' => \array_keys($ids),