diff --git a/inc/lektor/database.h b/inc/lektor/database.h index 3f71c30166205875a7203290c5a28941169f8caa..26cda41e959334bbe603534fb9fc30ab745e58b3 100644 --- a/inc/lektor/database.h +++ b/inc/lektor/database.h @@ -74,7 +74,7 @@ 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, const char *sql_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, diff --git a/src/commands.c b/src/commands.c index 0e1bcb8795503a8d1885ff4df14db0bbc6f2199c..9ba427ff8d5edcc1e0db3bcedcf5d85c2c15c5b7 100644 --- a/src/commands.c +++ b/src/commands.c @@ -554,38 +554,40 @@ struct _client_trace_t { }; static bool -lkt_callback_print_row_v1(void *args, int id, const char *sql_row) +lkt_callback_print_row_v1(void *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, sql_row); + printf(" . from client %ld:\t%*d:%s\n", ((struct _client_trace_t *) args)->c, + id_len, id, sql_row); return true; } static bool -lkt_callback_none(void *args, int id, const char *sql_row) +lkt_callback_none(void *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, const char *sql_row) +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\t%s\n", id, sql_row); + 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_insert_v1(void *_args, int id, const char *sql_row) +lkt_callback_insert_v1(void *_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); } @@ -634,7 +636,9 @@ command_find(struct lkt_state *srv, // Select the right column // mpd_tag = cmd_args[0]; - if (!strcasecmp("any", mpd_tag) || !strcasecmp("all", mpd_tag)) + if (!strcasecmp("any", mpd_tag) || + !strcasecmp("all", mpd_tag) || + !strcasecmp("a", mpd_tag)) col_name = LKT_DATABASE_KARA_COLUMNT_ANY; else if (!strcasecmp("author", mpd_tag)) col_name = LKT_DATABASE_NAME_KAUTHOR; diff --git a/src/database/find.c b/src/database/find.c index 074229701f3f8f1c5a7ed6d62c3f444548c32023..f9c8a62d20e01b826b0a36f23dc5b21e2c8fa043 100644 --- a/src/database/find.c +++ b/src/database/find.c @@ -16,10 +16,11 @@ database_search_init(sqlite3 *db, char *col_name, char *rgx, sqlite3_stmt **ret) } static const char *SQL_STMT_TEMPLATE = - "SELECT " - " kara.id AS id, " - " string AS any_col" - "FROM kara WHERE %s LIKE ?;"; + "WITH content AS (" + " SELECT kara.id AS id, string AS any_col, LENGTH(CAST(kara.id AS TEXT)) AS len" + " FROM kara WHERE %s LIKE ?)" + "SELECT id, any_col, (SELECT MAX(len) FROM content)" + "FROM content;"; char SQL_STMT[LKT_MAX_SQLITE_STATEMENT]; snprintf(SQL_STMT, LKT_MAX_SQLITE_STATEMENT - 1, SQL_STMT_TEMPLATE, col_name); @@ -41,7 +42,7 @@ database_search_iter(sqlite3 *db, bool *need_free) { const char *sql_row; - int id, code; + int id, code, id_len; *need_free = true; code = sqlite3_step(item); @@ -57,7 +58,8 @@ database_search_iter(sqlite3 *db, if (code == SQLITE_ROW) { id = sqlite3_column_int(item, 0); sql_row = (const char *) sqlite3_column_text(item, 1); - return callback(args, id, sql_row); + id_len = sqlite3_column_int(item, 2); + return callback(args, id, id_len, sql_row); } fprintf(stderr, " ! database_search_iter: sqlite3_step failed: %s\n", sqlite3_errmsg(db)); diff --git a/src/database/queue.c b/src/database/queue.c index cf046b87260327bf240f98f29eff36f9e1c18f8c..6a486ae466cdb51658d2e1ad9c190460962507f8 100644 --- a/src/database/queue.c +++ b/src/database/queue.c @@ -685,12 +685,15 @@ database_queue_list_abs(sqlite3 *db, unsigned int from, unsigned int to, void *a database_search_callback_t callback) { const char *SQL_STMT = - "SELECT kara.id, string" + "WITH content AS (" + " SELECT kara.id AS id, string, LENGTH(CAST(kara.id AS TEXT)) AS len" " FROM queue_" " JOIN kara ON kara_id = kara.id" " WHERE position >= ? AND position <= ?" - " ORDER BY position;"; - int code, id; + " GROUP BY position ORDER BY position)" + "SELECT id, string, (SELECT MAX(len) FROM content)" + " FROM content;"; + int code, id, id_len; const char *row; bool ret = false; sqlite3_stmt *stmt; @@ -706,7 +709,8 @@ database_queue_list_abs(sqlite3 *db, unsigned int from, unsigned int to, void *a if (code == SQLITE_ROW) { id = sqlite3_column_int(stmt, 0); row = (const char *) sqlite3_column_text(stmt, 1); - if (callback(args, id, row)) + id_len = sqlite3_column_int(stmt, 2); + if (callback(args, id, id_len, row)) continue; else break; @@ -731,17 +735,19 @@ database_queue_list_from(sqlite3 *db, unsigned int count, void *args, database_search_callback_t callback) { const char *SQL_TEMPLATE = - "SELECT kara.id, string" + "WITH content AS (" + " SELECT kara.id AS id, string, LENGTH(CAST(kara.id AS TEXT)) AS len" " FROM queue_" " JOIN queue_state ON queue_.position >= CASE" " WHEN queue_state.current IS NULL THEN 1" " ELSE queue_state.current END" " JOIN kara ON kara_id = kara.id" - " ORDER BY position" - " LIMIT %d;"; + " GROUP BY position ORDER BY position LIMIT %d)" + "SELECT id, string, (SELECT MAX(len) FROM content)" + " FROM content;"; static const int stmt_len = 512; char SQL_STMT[stmt_len]; - int code, id; + int code, id, id_len; const char *row; bool ret = false; sqlite3_stmt *stmt; @@ -756,7 +762,8 @@ database_queue_list_from(sqlite3 *db, unsigned int count, void *args, if (code == SQLITE_ROW) { id = sqlite3_column_int(stmt, 0); row = (const char *) sqlite3_column_text(stmt, 1); - if (callback(args, id, row)) + id_len = sqlite3_column_int(stmt, 2); + if (callback(args, id, id_len, row)) continue; else break;