Skip to content
Extraits de code Groupes Projets
Vérifiée Valider dc5b8e43 rédigé par Kubat's avatar Kubat
Parcourir les fichiers

search add and insert with good perforamces

parent daa46f15
Branches
Étiquettes
1 requête de fusion!71Resolve "Performance of search commands"
......@@ -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 */
......
......@@ -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 */
......
......@@ -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;
}
......
......@@ -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
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Veuillez vous inscrire ou vous pour commenter