From d6d4e35949ee24a29e4eac40e1e9a5eb0e67afdd Mon Sep 17 00:00:00 2001
From: Kubat <mael.martin31@gmail.com>
Date: Tue, 24 Jan 2023 20:19:34 +0100
Subject: [PATCH] URI: Add the query+link uri

---
 inc/lektor/uri.h                              | 21 ++++++++++---------
 src/base/uri.c                                | 10 ++++++++-
 src/database/queue.c                          |  1 +
 .../lektor_c_compat/src/c_types.rs            |  1 +
 .../lektor_c_compat/src/rs_types/uri.rs       | 12 +++++++----
 .../liblektor-rs/lektor_db/src/connexion.rs   |  2 +-
 6 files changed, 31 insertions(+), 16 deletions(-)

diff --git a/inc/lektor/uri.h b/inc/lektor/uri.h
index 7a48fe7d..e231bbaf 100644
--- a/inc/lektor/uri.h
+++ b/inc/lektor/uri.h
@@ -9,19 +9,20 @@ extern "C" {
 #include <stddef.h>
 
 typedef enum {
-    URI_NULL     = 0,
-    URI_ID       = 1,
-    URI_PLAYLIST = 2,
-    URI_TYPE     = 3,
-    URI_AUTHOR   = 4,
-    URI_CATEGORY = 5,
-    URI_LANGUAGE = 6,
-    URI_QUERY    = 7,
+    URI_NULL            = 0,
+    URI_ID              = 1,
+    URI_PLAYLIST        = 2,
+    URI_TYPE            = 3,
+    URI_AUTHOR          = 4,
+    URI_CATEGORY        = 5,
+    URI_LANGUAGE        = 6,
+    URI_QUERY           = 7,
+    URI_QUERY_PLUS_LINK = 8,
 } LKT_URI_TYPE;
 
 typedef enum {
-    URI_VALUE_TYPE_NULL = 0,
-    URI_VALUE_TYPE_STRING = 1,
+    URI_VALUE_TYPE_NULL    = 0,
+    URI_VALUE_TYPE_STRING  = 1,
     URI_VALUE_TYPE_INTEGER = 2,
 } LKT_URI_VALUE_TYPE;
 
diff --git a/src/base/uri.c b/src/base/uri.c
index fbe544a6..cc2239cf 100644
--- a/src/base/uri.c
+++ b/src/base/uri.c
@@ -134,6 +134,10 @@ __prefix(char *str, struct lkt_uri *ret)
         ret->column_name = LKT_DB_LANG;
         ret->type        = URI_LANGUAGE;
         val              = str + 4;
+    } else if (STR_NMATCH(str, "query+link", 11)) {
+        ret->column_name = LKT_DB_ALL;
+        ret->type        = URI_QUERY_PLUS_LINK;
+        val              = str + 11;
     } else if (STR_NMATCH(str, "query", 5)) {
         ret->column_name = LKT_DB_ALL;
         ret->type        = URI_QUERY;
@@ -296,6 +300,8 @@ __lkt_to_str(const struct lkt_uri *uri, char *ret, size_t len)
     case URI_TYPE: safe_snprintf(ret, len, "type=%s", (char *)uri->value); break;
     case URI_AUTHOR: safe_snprintf(ret, len, "author=%s", (char *)uri->value); break;
     case URI_CATEGORY: safe_snprintf(ret, len, "cat=%s", (char *)uri->value); break;
+
+    case URI_QUERY_PLUS_LINK:
     case URI_QUERY: safe_snprintf(ret, len, "search=%s", (char *)uri->value); break;
 
     case URI_PLAYLIST: ___plt_uri_to_str(uri, ret, len); return false;
@@ -356,11 +362,13 @@ lkt_uri_match_kara_metadata(const struct lkt_uri *uri, const struct kara_metadat
     }
 
     case URI_TYPE: return STR_MATCH((const char *)uri->value, kara_mdt->song_type);
-    case URI_QUERY: return database_is_kara_like(db, kara_id, uri->value);
     case URI_AUTHOR: return STR_MATCH((const char *)uri->value, kara_mdt->author_name);
     case URI_CATEGORY: return STR_MATCH((const char *)uri->value, kara_mdt->category);
     case URI_PLAYLIST: return database_plt_contais_kara(db, uri->value, kara_id);
     case URI_LANGUAGE: return STR_MATCH((const char *)uri->value, kara_mdt->language);
+
+    case URI_QUERY_PLUS_LINK:
+    case URI_QUERY: return database_is_kara_like(db, kara_id, uri->value);
     }
     LOG_ERROR("URI", "Found an unusual uri type: %d", uri->type);
     LOG_UNREACHABLE;
diff --git a/src/database/queue.c b/src/database/queue.c
index 9f3f56d1..25202e8c 100644
--- a/src/database/queue.c
+++ b/src/database/queue.c
@@ -326,6 +326,7 @@ database_queue_add_uri(lkt_db *db, struct lkt_uri *uri, int prio)
     const LKT_URI_TYPE type = lkt_uri_get_type(uri);
 
     switch (type) {
+    case URI_QUERY_PLUS_LINK:
     case URI_QUERY:
         return queue_add_with_col_like_str(db, LKT_DB_ALL, lkt_uri_get_value_as_str(uri), prio);
 
diff --git a/src/rust/liblektor-rs/lektor_c_compat/src/c_types.rs b/src/rust/liblektor-rs/lektor_c_compat/src/c_types.rs
index 1aac3ddf..228b7f5b 100644
--- a/src/rust/liblektor-rs/lektor_c_compat/src/c_types.rs
+++ b/src/rust/liblektor-rs/lektor_c_compat/src/c_types.rs
@@ -23,6 +23,7 @@ pub enum LktUriType {
     Category = 5,
     Lanquage = 6,
     Query = 7,
+    QueryPlusLink = 8,
 }
 
 #[repr(C)]
diff --git a/src/rust/liblektor-rs/lektor_c_compat/src/rs_types/uri.rs b/src/rust/liblektor-rs/lektor_c_compat/src/rs_types/uri.rs
index 9c77af5f..dbccc482 100644
--- a/src/rust/liblektor-rs/lektor_c_compat/src/rs_types/uri.rs
+++ b/src/rust/liblektor-rs/lektor_c_compat/src/rs_types/uri.rs
@@ -22,10 +22,13 @@ pub enum LktUriField {
     /// The language of the kara must match the value in the URI.
     Language,
 
-    /// Do a fuzzy search with the value if the URI. This is the default action
-    /// for an URI.
+    /// Do a fuzzy search with the value if the URI. We also look up the links
+    /// of the kara.
     FuzzySearch,
 
+    /// Do a search with the value if the URI. This is the default action for an URI.
+    Search,
+
     /// Do a search by the name of the playlist.
     Playlist,
 }
@@ -39,7 +42,7 @@ pub enum LktUriValue<'a> {
 
 impl Default for LktUriField {
     fn default() -> Self {
-        LktUriField::FuzzySearch
+        LktUriField::Search
     }
 }
 
@@ -60,7 +63,8 @@ impl LktCUri {
             LktUriType::Author => Some(KaraMaker),
             LktUriType::Category => Some(Origin),
             LktUriType::Lanquage => Some(Language),
-            LktUriType::Query => Some(FuzzySearch),
+            LktUriType::Query => Some(Search),
+            LktUriType::QueryPlusLink => Some(FuzzySearch),
         }
     }
 
diff --git a/src/rust/liblektor-rs/lektor_db/src/connexion.rs b/src/rust/liblektor-rs/lektor_db/src/connexion.rs
index bebc0286..eb4da471 100644
--- a/src/rust/liblektor-rs/lektor_db/src/connexion.rs
+++ b/src/rust/liblektor-rs/lektor_db/src/connexion.rs
@@ -319,7 +319,7 @@ impl LktDatabaseConnection {
                 .map_err(|err| format!("{err}"))?
             )),
 
-            LktUriField::FuzzySearch => {
+            LktUriField::Search | LktUriField::FuzzySearch => {
                 let _ = uri_str!("query" :/ uri);
                 todo!()
             }
-- 
GitLab