From dc5b8e438a2a47dd2224dab961c76d8085d73fec Mon Sep 17 00:00:00 2001 From: Kubat <mael.martin31@gmail.com> Date: Mon, 4 May 2020 14:40:33 +0200 Subject: [PATCH] search add and insert with good perforamces --- inc/lektor/database.h | 2 -- src/commands.c | 33 ++++++++++++++++++--------------- src/database/find.c | 25 +++++++------------------ src/net/listen.c | 8 +++----- 4 files changed, 28 insertions(+), 40 deletions(-) diff --git a/inc/lektor/database.h b/inc/lektor/database.h index c749eaf4..559becbb 100644 --- a/inc/lektor/database.h +++ b/inc/lektor/database.h @@ -84,8 +84,6 @@ struct lkt_search { lkt_search_playlist, lkt_search_queue, lkt_search_sticker, - - lkt_add_queue, } type; void (*init)(void); /* Called at the end of the init phase */ diff --git a/src/commands.c b/src/commands.c index 17503ee4..387b7ece 100644 --- a/src/commands.c +++ b/src/commands.c @@ -398,11 +398,14 @@ __find(struct lkt_state *srv, size_t c, char *cmd_args[LKT_MESSAGE_ARGS_MAX], lo { char rgx[PATH_MAX], *col_name, *mpd_tag; int count; + struct lkt_uri uri; struct lkt_search search = { .srv = srv, .c = c, + .qu_uri = &uri, .continuation = continuation, .msg_count = lkt_remaining_msg(srv, c) - 3, /* Reserve slots for OK/ACK and continue: */ + .init = NULL, }; /* Check args */ @@ -421,7 +424,6 @@ __find(struct lkt_state *srv, size_t c, char *cmd_args[LKT_MESSAGE_ARGS_MAX], lo case LKT_FND_ACT_ENQUEUE: search.call = (void(*)(void)) lkt_callback_send_row_v2; search.init = (void(*)(void)) database_queue_add_uri; - search.type = lkt_add_queue; search.qu_priority = 5; srv->mpd_idle_events |= MPD_IDLE_PLAYLIST; break; @@ -429,7 +431,6 @@ __find(struct lkt_state *srv, size_t c, char *cmd_args[LKT_MESSAGE_ARGS_MAX], lo search.call = (void(*)(void)) lkt_callback_send_row_v2; search.init = (void(*)(void)) database_queue_add_uri; search.qu_priority = 1; - search.type = lkt_add_queue; srv->mpd_idle_events |= MPD_IDLE_PLAYLIST; break; default: @@ -439,25 +440,26 @@ __find(struct lkt_state *srv, size_t c, char *cmd_args[LKT_MESSAGE_ARGS_MAX], lo /* Select the right column */ mpd_tag = cmd_args[0]; - if (!strcasecmp("any", mpd_tag) || !strcasecmp("all", mpd_tag) || !strcasecmp("query", mpd_tag)) + if (!strcasecmp("any", mpd_tag) || !strcasecmp("all", mpd_tag) || !strcasecmp("query", mpd_tag) || + !strcasecmp("source", mpd_tag) || !strcasecmp("title", mpd_tag)) { + uri.type = uri_query; col_name = LKT_DATABASE_KARA_COLUMNT_ANY; - else if (!strcasecmp("author", mpd_tag)) + } else if (!strcasecmp("author", mpd_tag)) { + uri.type = uri_author; col_name = LKT_DATABASE_NAME_KAUTHOR; - else if (!strcasecmp("source", mpd_tag)) - col_name = LKT_DATABASE_NAME_KNAME; - else if (!strcasecmp("title", mpd_tag)) - col_name = LKT_DATABASE_NAME_KTITLE; - else if (!strcasecmp("category", mpd_tag) || !strcasecmp("cat", mpd_tag)) + } else if (!strcasecmp("category", mpd_tag) || !strcasecmp("cat", mpd_tag)) { + uri.type = uri_category; col_name = LKT_DATABASE_NAME_KCAT; - else if (!strcasecmp("type", mpd_tag)) + } else if (!strcasecmp("type", mpd_tag)) { + uri.type = uri_type; col_name = LKT_DATABASE_NAME_KTYPE; - else if (!strcasecmp("language", mpd_tag) || !strcasecmp("lang", mpd_tag)) + } else if (!strcasecmp("language", mpd_tag) || !strcasecmp("lang", mpd_tag)) { + uri.type = uri_language; col_name = LKT_DATABASE_NAME_KLANG; - else if (!strcasecmp("date", mpd_tag)) - col_name = LKT_DATABASE_NAME_KAUTHOR_YEAR; - else if (!strcasecmp("id", mpd_tag)) + } else if (!strcasecmp("id", mpd_tag)) { + uri.type = uri_id; col_name = LKT_DATABASE_NAME_KID; - else + } else return false; /* Get the regex */ @@ -470,6 +472,7 @@ __find(struct lkt_state *srv, size_t c, char *cmd_args[LKT_MESSAGE_ARGS_MAX], lo if (cmd_args[i + 1]) strncat(rgx, " ", PATH_MAX - 1); } + uri.value = rgx; /* Make the search langand do the right action */ diff --git a/src/database/find.c b/src/database/find.c index cc20524e..63753ac6 100644 --- a/src/database/find.c +++ b/src/database/find.c @@ -8,21 +8,6 @@ #include <stdio.h> #include <string.h> -static inline bool -__init_search(volatile sqlite3 *db, struct lkt_search *ret) -{ - bool sta = false; - switch (ret->type) { - case lkt_add_queue: - sta = ((lkt_search_init_add_func) ret->init)(db, ret->qu_uri, ret->qu_priority); - ret->type = lkt_search_queue; - default: - LOG_WARN_SCT("DB", "Init for type %d is not implemented", ret->type); - return false; - } - return sta; -} - bool database_search_database_init(volatile sqlite3 *db, char *col_name, char *rgx, struct lkt_search *ret) { @@ -34,10 +19,12 @@ database_search_database_init(volatile sqlite3 *db, char *col_name, char *rgx, s "SELECT id, any_col, (SELECT MAX(len) FROM content)" "FROM content LIMIT %d OFFSET %d;"; char SQL_STMT[LKT_MAX_SQLITE_STATEMENT]; + ret->type = lkt_search_database; /* Init */ - if (! ret->continuation && ret->init && ! __init_search(db, ret)) { - LOG_ERROR_SCT("DB", "%s", "Failed to init search query, called to init func failed"); + if (! ret->continuation && ret->init && + ! ((lkt_search_init_add_func) ret->init)(db, ret->qu_uri, ret->qu_priority)) { + LOG_ERROR_SCT("DB", "%s", "Failed to init search query, init func failed"); return false; } @@ -101,9 +88,11 @@ database_search_queue_init(volatile sqlite3 *db, char *col_name, char *rgx, stru "SELECT id, any_col, (SELECT MAX(len) FROM content)" "FROM content LIMIT %d OFFSET %d;"; char SQL_STMT[LKT_MAX_SQLITE_STATEMENT]; + ret->type = lkt_search_queue; /* Init */ - if (! ret->continuation && ret->init && ! __init_search(db, ret)) { + if (! ret->continuation && ret->init && + ! ((lkt_search_init_add_func) ret->init)(db, ret->qu_uri, ret->qu_priority)) { LOG_ERROR_SCT("DB", "%s", "Failed to init search query, called to init func failed"); return false; } diff --git a/src/net/listen.c b/src/net/listen.c index 23d4fddf..1d842149 100644 --- a/src/net/listen.c +++ b/src/net/listen.c @@ -253,12 +253,10 @@ handle_simple_command(struct lkt_state *srv, size_t c, struct lkt_command cmd) else if (!strcmp(cmd.name, "idle")) { err = !command_idle(srv, c, &cmd); goto end_no_send_status; - } else if (!strcmp(cmd.name, "searchadd") || - !strcmp(cmd.name, "findadd")) - err = ! command_find(srv, c, cmd.args, cmd.cont, LKT_FND_ACT_ADD); - else if (!strcmp(cmd.name, "search") || - !strcmp(cmd.name, "find")) + } else if (!strcmp(cmd.name, "search") || !strcmp(cmd.name, "find")) err = ! command_find(srv, c, cmd.args, cmd.cont, LKT_FND_ACT_RESPOND); + else if (!strcmp(cmd.name, "searchadd") || !strcmp(cmd.name, "findadd")) + err = ! command_find(srv, c, cmd.args, cmd.cont, LKT_FND_ACT_ADD); else if (!strcmp(cmd.name, "__insert")) err = ! command_find(srv, c, cmd.args, cmd.cont, LKT_FND_ACT_ENQUEUE); else -- GitLab