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