diff --git a/inc/lektor/database.h b/inc/lektor/database.h index a1405c47860fcc7623cf19a2055c2219ee75c300..748916227b2fe9597a9e86c5fd5be187302ca837 100644 --- a/inc/lektor/database.h +++ b/inc/lektor/database.h @@ -100,7 +100,8 @@ struct lkt_search { int msg_count; /* How much messages we can send. */ }; -typedef bool (*lkt_search_database_func)(struct lkt_state *srv, size_t c, int id, int id_len, const char *row); +typedef bool (*lkt_search_database_func)(struct lkt_state *srv, size_t c, int id, int id_len, + const char *row); bool database_search_queue_init(sqlite3 *db, char *col_name, char *rgx, struct lkt_search *ret); bool database_search_iter(struct lkt_search *item); diff --git a/src/commands.c b/src/commands.c index 7fd47c74cfcffe575cb6c4a9800b91f4d601dd9a..9f29e29adf6a6a26fcdccaad8d24905dfa3c25e2 100644 --- a/src/commands.c +++ b/src/commands.c @@ -545,13 +545,12 @@ command_find(struct lkt_state *srv, size_t c, char *cmd_args[LKT_MESSAGE_ARGS_MA enum lkt_find_action action) { char rgx[PATH_MAX], *col_name, *mpd_tag; - bool once; - struct lkt_message *not_found_msg; + int count; struct lkt_search search = { .srv = srv, .c = c, .continuation = continuation, - .msg_count = lkt_remaining_msg(srv, c), + .msg_count = lkt_remaining_msg(srv, c) - 3, /* Reserve slots for OK/ACK and continue: */ }; // Check args // @@ -617,19 +616,14 @@ command_find(struct lkt_state *srv, size_t c, char *cmd_args[LKT_MESSAGE_ARGS_MA return false; } - for (once = false; database_search_iter(&search); once |= true) + for (count = 0; database_search_iter(&search); ++count) continue; - if (!once) { -no_rgx: - not_found_msg = lkt_message_new(); - not_found_msg->data_len = snprintf(not_found_msg->data, - LKT_MESSAGE_MAX, - "No kara found with regex\n"); - lkt_state_send(srv, c, not_found_msg); - } - + if (count) + lkt_set_continuation(srv, c, continuation + count); return true; +no_rgx: + return false; } bool @@ -966,7 +960,7 @@ command_queue_list(struct lkt_state *srv, size_t c, char *args[LKT_MESSAGE_ARGS_ /* The command is used in its relative forme, display elements from the current one. */ only_one: - return database_queue_list(srv->db, from, from, &callback); + return database_queue_list(srv->db, from, from, &callback); /* The command is used with a range specifier. */ is_a_range: diff --git a/src/database/find.c b/src/database/find.c index 7230c9d2901748a44a89ab40288c261933ccf1ad..a0366d65482adc127bb0aa9af4d627205cb6be22 100644 --- a/src/database/find.c +++ b/src/database/find.c @@ -20,10 +20,11 @@ database_search_queue_init(sqlite3 *db, char *col_name, char *rgx, struct lkt_se " 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;"; + "FROM content LIMIT %d OFFSET %d;"; char SQL_STMT[LKT_MAX_SQLITE_STATEMENT]; - snprintf(SQL_STMT, LKT_MAX_SQLITE_STATEMENT - 1, SQL_STMT_TEMPLATE, col_name); + snprintf(SQL_STMT, LKT_MAX_SQLITE_STATEMENT - 1, SQL_STMT_TEMPLATE, 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); diff --git a/src/main/lkt.c b/src/main/lkt.c index 7d89e64e8da00e7b7d9534caa17dbd027013a4c2..ca1875c915f442f750855d5ac1e85c22cb613598 100644 --- a/src/main/lkt.c +++ b/src/main/lkt.c @@ -745,11 +745,7 @@ search_with_cmd__(struct lkt_cmd_args *args, const char *cmd) redo: sock = lkt_connect(); - if (continuation > 0) - write_socket_format(sock, "%d ", continuation); - - write_socket(sock, cmd, strlen(cmd)); - + write_socket_format(sock, "%d %s", continuation, cmd); for (i = 0; i < args->argc; ++i) write_socket_format(sock, " %s", args->argv[i]); write_socket(sock, "\n", sizeof("\n") / sizeof(char)); diff --git a/src/net/command.c b/src/net/command.c index 130adca4b1ce11387b85614f651ad4c896637c34..33df59b7ea8856018480657dc5c2f7e42ab93932 100644 --- a/src/net/command.c +++ b/src/net/command.c @@ -12,9 +12,9 @@ lkt_command_parse(char *raw) { errno = 0; char *endptr; - struct lkt_command res = { .name = raw, .args = {0}, .cont = strtol(raw, &endptr, 0) }; + struct lkt_command res = { .name = raw, .args = {0}, .cont = strtol(raw, &endptr, 10) }; - if ((errno == ERANGE && (res.cont == LONG_MAX || res.cont == LONG_MIN)) || (errno != 0 && res.cont == 0)) { + if ((errno == ERANGE && (res.cont == LONG_MAX || res.cont == LONG_MIN)) || (errno != 0)) { res.cont = 0; goto skip_cont; } @@ -30,7 +30,7 @@ lkt_command_parse(char *raw) } /* Get the real command name. */ - raw = endptr + strcspn(raw, " "); + raw += strspn(raw, " 1234567890"); if (!*raw) return res; res.name = raw;