diff --git a/inc/lektor/uri.h b/inc/lektor/uri.h index 7a48fe7df505d467e5244dcf8254a317ddacac60..e231bbaf5f761e47cea700d86c5b5c16e266cba8 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 fbe544a6132530dff31a709218353b6c1eb43149..cc2239cf26921e004175c71eafd8e5582d4a1089 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 9f3f56d1da87e6866f6b1a756ff80bf3adaf3c34..25202e8c7a67166e0d74385f62c3616c136feb9f 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 1aac3ddf18f4bc8f8aad07397ec2a09085ed2bd8..228b7f5b6d97f0e16bd8420a54b415f19f0d8414 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 9c77af5f18a1f4dfdb3e4d882745f12db951cc0f..dbccc4826806036dd0e2f4ddedbcc0be86dc66fb 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 bebc028637232c9533077105d65a6adecc2128da..eb4da47159ae07d881eab9c294118238b9165a94 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!() }