diff --git a/src/Database/DisposableFullTextSearch.php b/src/Database/DisposableFullTextSearch.php index fb8ce900d5..5ef8adebd2 100644 --- a/src/Database/DisposableFullTextSearch.php +++ b/src/Database/DisposableFullTextSearch.php @@ -37,12 +37,17 @@ class DisposableFullTextSearch { $this->db = $database; + // Unique identifier generation. Two DisposableFullTextSearch object should never have the same as the first object destruction + // would delete both check-full-text-search rows before the second object destruction is called, leading to unexpected behavior. do { - // Unique identifier generation. Two DisposableFullTextSearch object should never have the same as the first object destruction - // would delete both check-full-text-search rows before the second object destruction is called, leading to unexpected behavior. // Maximum value is indicated by the INT UNSIGNED type of the check-full-text-search.pid field $this->identifier = random_int(0, pow(2, 32) - 1); - } while($this->db->insert('check-full-text-search', ['pid' => $this->identifier, 'searchtext' => $haystack])); + } while($this->db->exists('check-full-text-search', ['pid' => $this->identifier, 'searchtext' => $haystack])); + + // If the `exists()` call fails and return false because the database is unavailable, the `insert()` call will likely fail as well, which means + // all subsequent calls to `match()` will return false because the haystack won't have been inserted. + // However, at this point there may be bigger problems to worry about. + $this->db->insert('check-full-text-search', ['pid' => $this->identifier, 'searchtext' => $haystack]); } public function __destruct()