From daf95349d2aeb067ed16cb7e5a9700f1d8abd3bc Mon Sep 17 00:00:00 2001 From: janis steiner Date: Wed, 6 May 2026 12:59:55 +0200 Subject: [PATCH] . --- public/index.html | 2 +- src/Storage/Repository.php | 38 +++++++++++++++++++++++++------------- 2 files changed, 26 insertions(+), 14 deletions(-) diff --git a/public/index.html b/public/index.html index b164e66..446a675 100644 --- a/public/index.html +++ b/public/index.html @@ -197,7 +197,7 @@ pre.raw-line { background: var(--bs-tertiary-bg); padding: .75rem; border-radius - Search terms: error 500, "disk full", auth*. Boolean operators like NOT not supported. + Use * as wildcard. bla matches "blabla". * shows all logs. Separate terms match all (AND).
diff --git a/src/Storage/Repository.php b/src/Storage/Repository.php index 4689926..68a613c 100644 --- a/src/Storage/Repository.php +++ b/src/Storage/Repository.php @@ -176,24 +176,15 @@ class Repository return []; } - try { + if ($query === '*') { $stmt = $this->db->pdo()->prepare( - "SELECT e.* FROM log_entries e - JOIN log_entries_fts fts ON e.id = fts.rowid - WHERE log_entries_fts MATCH ? - ORDER BY rank - LIMIT ? OFFSET ?" + "SELECT * FROM log_entries ORDER BY created_at DESC LIMIT ? OFFSET ?" ); - $stmt->execute([$query, $limit, $offset]); + $stmt->execute([$limit, $offset]); return $stmt->fetchAll(); - } catch (\PDOException $e) { - return $this->searchLogEntriesLike($query, $limit, $offset); } - } - private function searchLogEntriesLike(string $query, int $limit = 200, int $offset = 0): array - { - $like = '%' . str_replace(['%', '_'], ['\\%', '\\_'], $query) . '%'; + $like = $this->toLikePattern($query); $stmt = $this->db->pdo()->prepare( "SELECT e.* FROM log_entries e WHERE e.line LIKE ? @@ -204,6 +195,27 @@ class Repository return $stmt->fetchAll(); } + private function toLikePattern(string $query): string + { + $parts = preg_split('/\s+/', $query); + $likeParts = []; + foreach ($parts as $part) { + $escaped = ''; + for ($i = 0; $i < strlen($part); $i++) { + $ch = $part[$i]; + if ($ch === '*') { + $escaped .= '%'; + } elseif ($ch === '%' || $ch === '_') { + $escaped .= '\\' . $ch; + } else { + $escaped .= $ch; + } + } + $likeParts[] = '%' . $escaped . '%'; + } + return implode('%', $likeParts); + } + // --- Config --- public function getAllowedUserTokens(): array