diff --git a/inc/lektor/commands.h b/inc/lektor/commands.h index 3329c8a48a5e26e2799d045e74eae4251f1797ed..48f2086816c66c4040f7d37433cc7fd80118fb85 100644 --- a/inc/lektor/commands.h +++ b/inc/lektor/commands.h @@ -32,7 +32,6 @@ bool command_add(sqlite3 *db, struct lkt_win *win, char *args[LKT_MESSAGE_ARGS_M enum mpd_idle_flag *watch_mask_ptr); bool command_addid(sqlite3 *db, struct lkt_win *win, char *args[LKT_MESSAGE_ARGS_MAX], enum mpd_idle_flag *watch_mask_ptr); -bool command_del(sqlite3 *db, struct lkt_win *win, char *pos_range, enum mpd_idle_flag *watch_mask_ptr); bool command_delid(sqlite3 *db, struct lkt_win *win, char *id, enum mpd_idle_flag *watch_mask_ptr); bool command_clear(sqlite3 *db, enum mpd_idle_flag *watch_mask_ptr); bool command_crop(sqlite3 *db, enum mpd_idle_flag *watch_mask_ptr); @@ -63,10 +62,9 @@ bool command_noidle(struct lkt_state *srv, size_t c); /* Find commands */ enum lkt_find_action { - LKT_FND_ACT_NONE = 0, - LKT_FND_ACT_RESPOND = 1, - LKT_FND_ACT_PRINT = 2, - LKT_FND_ACT_ENQUEUE = 3, + LKT_FND_ACT_RESPOND, + LKT_FND_ACT_ADD, + LKT_FND_ACT_INSERT, }; /* Find and send karas in the db that match the search expression */ diff --git a/inc/lektor/database.h b/inc/lektor/database.h index 475206c5e695c6419e26f7077487e4d6236edb19..9adae381872650f76fda5fe585fae3a52e336e97 100644 --- a/inc/lektor/database.h +++ b/inc/lektor/database.h @@ -73,19 +73,15 @@ bool database_queue_toggle_pause(sqlite3 *db); bool database_queue_play(sqlite3 *db, int pos); bool database_queue_stop(sqlite3 *db); -/* A search callback to be called after each matched row */ -typedef bool (*database_search_callback_t)(void *args, int id, int id_len, const char *sql_row); - /* List the content of the queue */ -bool database_queue_list_from(sqlite3 *db, unsigned int count, void *args, - database_search_callback_t callback); -bool database_queue_list_abs(sqlite3 *db, unsigned int from, unsigned int to, void *args, - database_search_callback_t callback); +bool database_queue_list_from(sqlite3 *db, unsigned int count, void *args, struct database_callback callback); +bool database_queue_list_abs(sqlite3 *db, unsigned int from, unsigned int to, void *args, struct database_callback callback); /* Search the database */ -bool database_search_init(sqlite3 *db, char *col_name, char *rgx, sqlite3_stmt **ret); -bool database_search_iter(sqlite3 *db, sqlite3_stmt *item, void *args, - database_search_callback_t callback, bool *need_free); +bool database_search_database_init(sqlite3 *db, const char *col_name, const char *rgx, sqlite3_stmt **ret); +bool database_search_plt_init(sqlite3 *db, const char *plt_name, char *col_name, char *rgx, + sqlite3_stmt **ret); +bool database_search_iter(sqlite3 *db, sqlite3_stmt *item, struct lkt_callback callback, bool *need_free); /* Next and prev operation on the queue. */ bool database_queue_next(sqlite3 *db, char filepath[PATH_MAX]); diff --git a/inc/lektor/defines.h b/inc/lektor/defines.h index c6eac5cdabfa5a5119f7f8be73bd1c53f2e2603c..33f3293c2bf7c4bb5a546c3f2805e968bd9fbc55 100644 --- a/inc/lektor/defines.h +++ b/inc/lektor/defines.h @@ -46,3 +46,16 @@ enum mpd_idle_flag { MPD_IDLE_OUTPUT | MPD_IDLE_OPTIONS | MPD_IDLE_PARTITION | MPD_IDLE_STICKER | MPD_IDLE_SUBSCRIPTION | MPD_IDLE_MESSAGE, }; + +enum lkt_callback_type { + callback_database, + callback_queue, + callback_playlist, +}; + +struct lkt_callback { + void **args; + enum lkt_callback_type type; + int (*call)(void **args, int id, int id_len, const char *sql_row); +}; + diff --git a/src/commands.c b/src/commands.c index 743d2f25d1d65674ad6f8609288404f83872512a..de185efeb6a4bde288d5033a551c6d2a0a43f29b 100644 --- a/src/commands.c +++ b/src/commands.c @@ -522,42 +522,28 @@ command_noidle(struct lkt_state *srv, size_t c) /* Functions for the searchadd and the search mpd commands */ static bool -lkt_callback_print_row_v1(void *args, int id, int id_len, const char *sql_row) +lkt_callback_send_row(struct _client_trace_t *args, int id, int id_len, const char *sql_row) { - printf(" . from client %ld:\t%*d:%s\n", ((struct _client_trace_t *) args)->c, - id_len, id, sql_row); + struct lkt_message *out = lkt_message_new(); + out->data_len = snprintf(out->data, LKT_MESSAGE_MAX, "%*d %s\n", id_len, id, sql_row); + lkt_state_send(args->srv, args->c, out); return true; } static bool -lkt_callback_none(void *args, int id, int id_len, const char *sql_row) +lkt_callback_insert(struct _client_trace_t *args, int id, int id_len, const char *sql_row) { - (void) args; - (void) id; - (void) id_len; (void) sql_row; - return true; -} - -static bool -lkt_callback_send_row_v1(void *_args, int id, int id_len, const char *sql_row) -{ - struct _client_trace_t *args = (struct _client_trace_t *) _args; - struct lkt_message *out; - - out = lkt_message_new(); - out->data_len = snprintf(out->data, LKT_MESSAGE_MAX, "%*d %s\n", id_len, id, sql_row); - lkt_state_send(args->srv, args->c, out); - return true; + (void) id_len; + return database_queue_add_id(args->srv->db, id, 5); } static bool -lkt_callback_insert_v1(void *_args, int id, int id_len, const char *sql_row) +lkt_callback_add(struct _client_trace_t *args, int id, int id_len, const char *sql_row) { (void) sql_row; (void) id_len; - struct _client_trace_t *args = (struct _client_trace_t *) _args; - return database_queue_add_id(args->srv->db, id, 5); + return database_queue_add_id(args->srv->db, id, 1); } bool @@ -569,9 +555,13 @@ command_find(struct lkt_state *srv, sqlite3_stmt *stmt; char rgx[PATH_MAX], *col_name, *mpd_tag; bool once, free_stmt; - struct _client_trace_t args; + struct _client_trace_t args = { + .srv = srv, + .c = c, + }; struct lkt_message *not_found_msg; - database_search_callback_t callback; + struct database_callback callback = { .type = database_callback_db }; + // Check args // if (cmd_args == NULL || cmd_args[0] == NULL) { @@ -582,23 +572,19 @@ command_find(struct lkt_state *srv, // Select callback // switch (action) { case LKT_FND_ACT_RESPOND: - callback = lkt_callback_send_row_v1; - args.srv = srv; - args.c = c; + callback.call = lkt_callback_send_row; break; - case LKT_FND_ACT_PRINT: - callback = lkt_callback_print_row_v1; + case LKT_FND_ACT_INSERT: + callback.call = lkt_callback_add; + srv->mpd_idle_events |= MPD_IDLE_PLAYLIST; break; - case LKT_FND_ACT_ENQUEUE: - callback = lkt_callback_insert_v1; + case LKT_FND_ACT_INSERT: + callback.call = lkt_callback_insert; srv->mpd_idle_events |= MPD_IDLE_PLAYLIST; - args.srv = srv; - args.c = c; break; - case LKT_FND_ACT_NONE: default: - callback = lkt_callback_none; - break; + fprintf(stderr, " ! command_find: Find action not implemented\n"); + return false; } // Select the right column // @@ -637,7 +623,7 @@ command_find(struct lkt_state *srv, } // Make the search langand do the right action // - if (!database_search_init(srv->db, col_name, rgx, &stmt)) { + if (!database_search_database_init(srv->db, col_name, rgx, &stmt)) { fprintf(stderr, " ! command_find: Failed to init the search\n"); return false; } @@ -932,9 +918,11 @@ command_queue_list(struct lkt_state *srv, size_t c, unsigned int from, to, tmp_switch; long val; char *endptr, *str; - struct _client_trace_t callback_args = { - .srv = srv, - .c = c, + void ** call_args = { &srv, c }; + struct lkt_callback callback = { + .args = call_args, + .type = callback_queue, + .call = lkt_callback_send_row, }; if (!args || !args[0] || strlen(args[0]) == 0) { @@ -999,13 +987,11 @@ command_queue_list(struct lkt_state *srv, size_t c, /* The command is used in its relative forme, display elements from the current one. */ is_relative: - return database_queue_list_from(srv->db, count, &callback_args, - lkt_callback_send_row_v1); + return database_queue_list_from(srv->db, count, &callback_args, lkt_callback_send_row); /* The command is used with a range specifier. */ is_absolute: - return database_queue_list_abs(srv->db, from, to, &callback_args, - lkt_callback_send_row_v1); + return database_queue_list_abs(srv->db, from, to, &callback_args, lkt_callback_send_row); } bool diff --git a/src/database/find.c b/src/database/find.c index f9c8a62d20e01b826b0a36f23dc5b21e2c8fa043..1b6dbbe96cb52ff39d11e323876aaa7fb10d2702 100644 --- a/src/database/find.c +++ b/src/database/find.c @@ -8,7 +8,7 @@ #include <string.h> bool -database_search_init(sqlite3 *db, char *col_name, char *rgx, sqlite3_stmt **ret) +database_search_database_init(sqlite3 *db, const char *col_name, const char *rgx, sqlite3_stmt **ret) { if (ret == NULL) { fprintf(stderr, " ! database_search_init: Exit because return pointer is NULL\n"); @@ -34,12 +34,13 @@ error: return false; } +//bool +//database_search_plt_init(sqlite3 *db, const char *plt_name, char *col_name, char *rgx, sqlite3_stmt **ret) +//{ +//} + bool -database_search_iter(sqlite3 *db, - sqlite3_stmt *item, - void *args, - database_search_callback_t callback, - bool *need_free) +database_search_iter(sqlite3 *db, sqlite3_stmt *item, struct lkt_callback callback, bool *need_free) { const char *sql_row; int id, code, id_len; @@ -53,17 +54,25 @@ database_search_iter(sqlite3 *db, } if (code == SQLITE_DONE) - goto error_or_done; + goto done; + + if (code != SQLITE_ROW) + goto error; - if (code == SQLITE_ROW) { + switch (callback.type) { + case callback_database: id = sqlite3_column_int(item, 0); sql_row = (const char *) sqlite3_column_text(item, 1); id_len = sqlite3_column_int(item, 2); - return callback(args, id, id_len, sql_row); + return callback.call(callback.args, id, id_len, sql_row); + + default: + break; } +error: fprintf(stderr, " ! database_search_iter: sqlite3_step failed: %s\n", sqlite3_errmsg(db)); -error_or_done: +done: sqlite3_finalize(item); *need_free = false; return false; diff --git a/src/database/queue.c b/src/database/queue.c index 1ec0e4292ae8c8821db2cfc6cddfdbd6335fbf54..7ac22dd3a7ad0ec995a09a006ae8a3ae120e1635 100644 --- a/src/database/queue.c +++ b/src/database/queue.c @@ -320,7 +320,7 @@ database_queue_del_id(sqlite3 *db, int id) " WHEN current IS NULL THEN NULL" " ELSE (SELECT pos FROM before) " "END WHERE current > (SELECT position FROM queue_ WHERE kara_id = %d);" - "DELETE FROM queue WHERE kara_id = %d;" + "DELETE FROM queue WHERE kara_id = %d LIMIT 1;" "COMMIT TRANSACTION;"; char SQL[LKT_MAX_SQLITE_STATEMENT]; snprintf(SQL, LKT_MAX_SQLITE_STATEMENT - 1, SQL_TEMPLATE, id, id, id); @@ -674,7 +674,7 @@ error: bool database_queue_list_abs(sqlite3 *db, unsigned int from, unsigned int to, void *args, - database_search_callback_t callback) + struct database_callback callback) { const char *SQL_STMT = "WITH content AS (" @@ -702,7 +702,7 @@ database_queue_list_abs(sqlite3 *db, unsigned int from, unsigned int to, void *a id = sqlite3_column_int(stmt, 0); row = (const char *) sqlite3_column_text(stmt, 1); id_len = sqlite3_column_int(stmt, 2); - if (callback(args, id, id_len, row)) + if (callback.call(args, id, id_len, row)) continue; else break; @@ -724,7 +724,7 @@ error: bool database_queue_list_from(sqlite3 *db, unsigned int count, void *args, - database_search_callback_t callback) + struct database_callback callback) { const char *SQL_TEMPLATE = "WITH content AS (" @@ -755,7 +755,7 @@ database_queue_list_from(sqlite3 *db, unsigned int count, void *args, id = sqlite3_column_int(stmt, 0); row = (const char *) sqlite3_column_text(stmt, 1); id_len = sqlite3_column_int(stmt, 2); - if (callback(args, id, id_len, row)) + if (callback.call(args, id, id_len, row)) continue; else break; diff --git a/src/net/listen.c b/src/net/listen.c index 58b2743261ccb31c37f0f414f2e9868858abd834..d2730be6cd85ef6dfd39ad3e7fdcf1250dfba296 100644 --- a/src/net/listen.c +++ b/src/net/listen.c @@ -246,7 +246,7 @@ handle_simple_command(struct lkt_state *srv, size_t c, struct lkt_command cmd) goto end_no_send_status; } else if (!strcmp(cmd.name, "searchadd") || !strcmp(cmd.name, "findadd")) - err = !command_find(srv, c, cmd.args, LKT_FND_ACT_ENQUEUE); + err = !command_find(srv, c, cmd.args, LKT_FND_ACT_RESPOND); else if (!strcmp(cmd.name, "search") || !strcmp(cmd.name, "find")) err = !command_find(srv, c, cmd.args, LKT_FND_ACT_RESPOND);