Skip to content

Commit 41aae43

Browse files
committed
feat: implement a paginate in reverse flag
1 parent e3312f2 commit 41aae43

File tree

3 files changed

+40
-9
lines changed

3 files changed

+40
-9
lines changed

common/json_param.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1107,8 +1107,9 @@ struct command_result *param_paginator(struct command *cmd, const char *name,
11071107
const char *buffer, const jsmntok_t *tok,
11081108
struct jsonrpc_paginator **paginator)
11091109
{
1110-
const jsmntok_t *batch_tok, *offset_tok, *limit_tok;
1110+
const jsmntok_t *batch_tok, *offset_tok, *limit_tok, *reverse_tok;
11111111
u64 *limit, *offset;
1112+
bool *reverse;
11121113
const char **batch;
11131114

11141115
batch = NULL;
@@ -1126,8 +1127,13 @@ struct command_result *param_paginator(struct command *cmd, const char *name,
11261127
if (limit_tok)
11271128
json_to_u64(buffer, limit_tok, limit);
11281129

1130+
reverse = tal(cmd, bool);
1131+
reverse_tok = json_get_member(buffer, tok, "reverse");
1132+
if (reverse_tok)
1133+
json_to_bool(buffer, reverse_tok, reverse);
1134+
11291135
if (batch || (limit && offset)) {
1130-
*paginator = new_paginator(cmd, batch, limit, offset);
1136+
*paginator = new_paginator(cmd, batch, limit, offset, reverse);
11311137
assert(paginator);
11321138
return NULL;
11331139
}

common/jsonrpc_paginator.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
* @offset: a position (u64) that determines the number of element (in SQL row)
4343
* returned by request.
4444
* @limit: a position (u64) that give the number of element in [0,..,offset - 1] to skip skip.
45+
* @reverse: a boolean that reverse the order of the result.
4546
*/
4647
struct jsonrpc_paginator {
4748
/** reall usefult for access to gossip map */
@@ -50,6 +51,7 @@ struct jsonrpc_paginator {
5051
* query please use the sql plugins */
5152
const u64 *offset;
5253
const u64 *limit;
54+
const bool *reverse;
5355
/* FIXME: more smarter one? like sort_by = "json key"
5456
* but this required to have a mapping between json_keys and sql keys
5557
* maybe we had already somethings in the sql plugin? */
@@ -62,15 +64,17 @@ struct jsonrpc_paginator {
6264
*
6365
* BTW: I love C Macros, really!
6466
*/
65-
static inline struct jsonrpc_paginator *new_paginator(const tal_t *ctx, const char **batch,
66-
const u64 *limit, const u64 *offset)
67+
static inline struct jsonrpc_paginator *
68+
new_paginator(const tal_t *ctx, const char **batch, const u64 *limit,
69+
const u64 *offset, const bool *reverse)
6770
{
6871
struct jsonrpc_paginator *paginator = NULL;
6972
if (batch || (limit && offset)) {
7073
paginator = tal(ctx, struct jsonrpc_paginator);
7174
paginator->batch = batch;
7275
paginator->limit = limit;
7376
paginator->offset = offset;
77+
paginator->reverse = reverse;
7478
return paginator;
7579
}
7680
return NULL;

wallet/wallet.c

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#include "config.h"
2+
#include <stdio.h>
23
#include <bitcoin/script.h>
34
#include <ccan/array_size/array_size.h>
45
#include <ccan/cast/cast.h>
@@ -4538,8 +4539,8 @@ const struct forwarding *wallet_forwarded_payments_get(struct wallet *w,
45384539
// placeholder for any parameter, the value doesn't matter because it's discarded by sql
45394540
const int any = -1;
45404541

4541-
if (paginator) {
4542-
stmt = db_prepare_v2(
4542+
if (paginator && *paginator->reverse == true) {
4543+
stmt = db_prepare_v2(
45434544
w->db,
45444545
SQL("SELECT"
45454546
" state"
@@ -4554,11 +4555,31 @@ const struct forwarding *wallet_forwarded_payments_get(struct wallet *w,
45544555
", failcode "
45554556
", forward_style "
45564557
"FROM forwards "
4558+
"ORDER BY ROWID DESC "
45574559
"WHERE (1 = ? OR state = ?) AND "
45584560
"(1 = ? OR in_channel_scid = ?) AND "
4559-
"(1 = ? OR out_channel_scid = ?)"
4560-
"LIMIT ? OFFSET ?"));
4561-
} else {
4561+
"(1 = ? OR out_channel_scid = ?)"));
4562+
} else if (paginator && *paginator->reverse == false) {
4563+
stmt = db_prepare_v2(
4564+
w->db,
4565+
SQL("SELECT"
4566+
" state"
4567+
", in_msatoshi"
4568+
", out_msatoshi"
4569+
", in_channel_scid"
4570+
", out_channel_scid"
4571+
", in_htlc_id"
4572+
", out_htlc_id"
4573+
", received_time"
4574+
", resolved_time"
4575+
", failcode "
4576+
", forward_style "
4577+
"FROM forwards "
4578+
"WHERE (1 = ? OR state = ?) AND "
4579+
"(1 = ? OR in_channel_scid = ?) AND "
4580+
"(1 = ? OR out_channel_scid = ?)"));
4581+
}
4582+
else {
45624583
stmt = db_prepare_v2(
45634584
w->db,
45644585
SQL("SELECT"

0 commit comments

Comments
 (0)