diff --git a/inc/lektor/commands.h b/inc/lektor/commands.h index ba3cb7af0435577c45810c65413a68aaa5db95e2..83bb70c999b210d044808683ecfbaeb49b9c7951 100644 --- a/inc/lektor/commands.h +++ b/inc/lektor/commands.h @@ -60,7 +60,7 @@ bool command_noidle(struct lkt_state *srv, size_t c); /* Find and send karas in the db that match the search expression */ bool command_find(struct lkt_state *srv, size_t c, char *cmd_args[LKT_MESSAGE_ARGS_MAX], long continuation, - bool (*init)(volatile sqlite3 *, char *, char *, struct lkt_search *)); + bool (*init)(volatile sqlite3 *, struct lkt_search *)); /* Set options for the lektor such as `random`, `single`, `repeat`, etc */ enum lkt_playback_option { diff --git a/inc/lektor/database.h b/inc/lektor/database.h index c6a399b88a301266cef52c3587bb381ee590dc1b..d50fa1d2b4e8bacf49a538201bf5872b8739fc9d 100644 --- a/inc/lektor/database.h +++ b/inc/lektor/database.h @@ -96,6 +96,9 @@ struct lkt_search { const char *name; /* Stickers and playlists */ int st_value; /* The value of a sticker */ int st_uri; /* URI of a sticker */ + + char *ka_col_name; /* Column name for karas */ + char *ka_rgx; /* Regex for the content of the selected column */ }; typedef bool (*lkt_search_init_add_func)(volatile sqlite3 *, struct lkt_uri *, int); @@ -103,8 +106,8 @@ typedef bool (*lkt_search_database_func)(struct lkt_state *srv, size_t c, int id typedef bool (*lkt_search_queue_func) (struct lkt_state *srv, size_t c, int id, int id_len, const char *row); typedef bool (*lkt_search_sticker_func) (struct lkt_state *srv, size_t c, const char *sticker, const char *type, int uri, int value); -bool database_search_database_init(volatile sqlite3 *db, char *col_name, char *rgx, struct lkt_search *ret); -bool database_search_queue_init (volatile sqlite3 *db, char *col_name, char *rgx, struct lkt_search *ret); +bool database_search_database_init(volatile sqlite3 *db, struct lkt_search *ret); +bool database_search_queue_init (volatile sqlite3 *db, struct lkt_search *ret); bool database_search_sticker_init (volatile sqlite3 *db, char *type, char *name, int uri, char op, int value, struct lkt_search *ret); bool database_search_iter(struct lkt_search *item); diff --git a/src/commands.c b/src/commands.c index b92c2a106bd1a464bf46ed14e96fd2b91893ee0a..4db7b1d58eacf67704d2c5d0a472f821229ce1b4 100644 --- a/src/commands.c +++ b/src/commands.c @@ -396,9 +396,9 @@ lkt_callback_send_row_v2(struct lkt_state *srv, size_t c, int id, int id_len, co bool command_find(struct lkt_state *srv, size_t c, char *cmd_args[LKT_MESSAGE_ARGS_MAX], long continuation, - bool(*init)(volatile sqlite3 *, char *, char *, struct lkt_search *)) + bool(*init)(volatile sqlite3 *, struct lkt_search *)) { - char rgx[PATH_MAX], *col_name, *mpd_tag; + char rgx[PATH_MAX], *mpd_tag; int count; struct lkt_search search = { .srv = srv, @@ -406,6 +406,7 @@ command_find(struct lkt_state *srv, size_t c, char *cmd_args[LKT_MESSAGE_ARGS_MA .continuation = continuation, .msg_count = lkt_remaining_msg(srv, c) - 3, /* Reserve slots for OK/ACK and continue: */ .call = (void(*)(void)) lkt_callback_send_row_v2, + .ka_rgx = rgx, }; /* Check args */ @@ -415,17 +416,17 @@ command_find(struct lkt_state *srv, size_t c, char *cmd_args[LKT_MESSAGE_ARGS_MA mpd_tag = cmd_args[0]; if (!strcasecmp("any", mpd_tag) || !strcasecmp("all", mpd_tag) || !strcasecmp("query", mpd_tag) || !strcasecmp("source", mpd_tag) || !strcasecmp("title", mpd_tag)) { - col_name = LKT_DATABASE_KARA_COLUMNT_ANY; + search.ka_col_name = LKT_DATABASE_KARA_COLUMNT_ANY; } else if (!strcasecmp("author", mpd_tag)) { - col_name = LKT_DATABASE_NAME_KAUTHOR; + search.ka_col_name = LKT_DATABASE_NAME_KAUTHOR; } else if (!strcasecmp("category", mpd_tag) || !strcasecmp("cat", mpd_tag)) { - col_name = LKT_DATABASE_NAME_KCAT; + search.ka_col_name = LKT_DATABASE_NAME_KCAT; } else if (!strcasecmp("type", mpd_tag)) { - col_name = LKT_DATABASE_NAME_KTYPE; + search.ka_col_name = LKT_DATABASE_NAME_KTYPE; } else if (!strcasecmp("language", mpd_tag) || !strcasecmp("lang", mpd_tag)) { - col_name = LKT_DATABASE_NAME_KLANG; + search.ka_col_name = LKT_DATABASE_NAME_KLANG; } else if (!strcasecmp("id", mpd_tag)) { - col_name = LKT_DATABASE_NAME_KID; + search.ka_col_name = LKT_DATABASE_NAME_KID; } else return false; @@ -440,7 +441,7 @@ command_find(struct lkt_state *srv, size_t c, char *cmd_args[LKT_MESSAGE_ARGS_MA } /* Make the search langand do the right action */ - RETURN_UNLESS(init(srv->db, col_name, rgx, &search), "Failed to init search", false); + RETURN_UNLESS(init(srv->db, &search), "Failed to init search", false); for (count = 0; database_search_iter(&search); ++count) continue; diff --git a/src/database/find.c b/src/database/find.c index 2d378348c93fddb45143ad77d8ac88d63a7a6cef..73e566369984c7dc9d02fafc71fe9abe62f57a5c 100644 --- a/src/database/find.c +++ b/src/database/find.c @@ -9,7 +9,7 @@ #include <string.h> bool -database_search_database_init(volatile sqlite3 *db, char *col_name, char *rgx, struct lkt_search *ret) +database_search_database_init(volatile sqlite3 *db, struct lkt_search *ret) { RETURN_UNLESS(ret, "Exit because return pointer is NULL", false); static const char *SQL_STMT_TEMPLATE = @@ -22,11 +22,11 @@ database_search_database_init(volatile sqlite3 *db, char *col_name, char *rgx, s ret->type = lkt_search_database; /* Search part */ - snprintf(SQL_STMT, LKT_MAX_SQLITE_STATEMENT - 1, SQL_STMT_TEMPLATE, col_name, + snprintf(SQL_STMT, LKT_MAX_SQLITE_STATEMENT - 1, SQL_STMT_TEMPLATE, ret->ka_col_name, ret->msg_count, ret->continuation); SQL_STMT[LKT_MAX_SQLITE_STATEMENT - 1] = 0; SQLITE_PREPARE(db, ret->stmt, SQL_STMT, error); - SQLITE_BIND_TEXT(db, ret->stmt, 1, rgx, error); + SQLITE_BIND_TEXT(db, ret->stmt, 1, ret->ka_rgx, error); ret->db = db; return true; error: @@ -72,7 +72,7 @@ error: } bool -database_search_queue_init(volatile sqlite3 *db, char *col_name, char *rgx, struct lkt_search *ret) +database_search_queue_init(volatile sqlite3 *db, struct lkt_search *ret) { RETURN_UNLESS(ret, "Exit because return pointer is NULL", false); static const char *SQL_STMT_TEMPLATE = @@ -87,11 +87,11 @@ database_search_queue_init(volatile sqlite3 *db, char *col_name, char *rgx, stru ret->type = lkt_search_queue; /* Search part */ - snprintf(SQL_STMT, LKT_MAX_SQLITE_STATEMENT - 1, SQL_STMT_TEMPLATE, col_name, + snprintf(SQL_STMT, LKT_MAX_SQLITE_STATEMENT - 1, SQL_STMT_TEMPLATE, ret->ka_col_name, ret->msg_count, ret->continuation); SQL_STMT[LKT_MAX_SQLITE_STATEMENT - 1] = 0; SQLITE_PREPARE(db, ret->stmt, SQL_STMT, error); - SQLITE_BIND_TEXT(db, ret->stmt, 1, rgx, error); + SQLITE_BIND_TEXT(db, ret->stmt, 1, ret->ka_rgx, error); ret->db = db; return true; error: