wallet: don't expose wallet_payment constructor, use wallet_add_payment.

Have it construct and return.  No need to expose details about dbid...

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
Rusty Russell 2023-10-28 13:38:17 +10:30
parent 52b1ba2992
commit 2689a4ed76
4 changed files with 132 additions and 64 deletions

View file

@ -1100,8 +1100,8 @@ send_payment_core(struct lightningd *ld,
partid); partid);
} }
payment = wallet_payment_new(cmd, payment = wallet_add_payment(cmd,
0, /* ID is not in db yet */ ld->wallet,
time_now().ts.tv_sec, time_now().ts.tv_sec,
NULL, NULL,
rhash, rhash,
@ -1122,9 +1122,6 @@ send_payment_core(struct lightningd *ld,
NULL, NULL,
local_invreq_id); local_invreq_id);
/* Save into db */
wallet_add_payment(ld->wallet, payment);
return json_sendpay_in_progress(cmd, payment); return json_sendpay_in_progress(cmd, payment);
} }
@ -1412,8 +1409,8 @@ static struct command_result *self_payment(struct lightningd *ld,
u64 inv_dbid; u64 inv_dbid;
const char *err; const char *err;
payment = wallet_payment_new(tmpctx, payment = wallet_add_payment(tmpctx,
0, /* ID is not in db yet */ ld->wallet,
time_now().ts.tv_sec, time_now().ts.tv_sec,
NULL, NULL,
rhash, rhash,
@ -1434,9 +1431,6 @@ static struct command_result *self_payment(struct lightningd *ld,
NULL, NULL,
local_invreq_id); local_invreq_id);
/* We write this into db immediately. */
wallet_add_payment(ld->wallet, payment);
/* Now, resolve the invoice */ /* Now, resolve the invoice */
inv = invoice_check_payment(tmpctx, ld, rhash, msat, payment_secret, &err); inv = invoice_check_payment(tmpctx, ld, rhash, msat, payment_secret, &err);
if (!inv) { if (!inv) {

View file

@ -2088,27 +2088,37 @@ static bool test_htlc_crud(struct lightningd *ld, const tal_t *ctx)
static bool test_payment_crud(struct lightningd *ld, const tal_t *ctx) static bool test_payment_crud(struct lightningd *ld, const tal_t *ctx)
{ {
struct wallet_payment *t = tal(ctx, struct wallet_payment), *t2; struct wallet_payment *t, *t2;
struct wallet *w = create_test_wallet(ld, ctx); struct wallet *w = create_test_wallet(ld, ctx);
struct sha256 payment_hash;
struct node_id destination;
mempat(t, sizeof(*t)); memset(&payment_hash, 1, sizeof(payment_hash));
t->destination = tal(t, struct node_id); memset(&destination, 2, sizeof(struct node_id));
memset(t->destination, 2, sizeof(struct node_id));
t->id = 0;
t->msatoshi = AMOUNT_MSAT(100);
t->msatoshi_sent = AMOUNT_MSAT(101);
t->total_msat = t->msatoshi;
t->status = PAYMENT_PENDING;
t->payment_preimage = NULL;
memset(&t->payment_hash, 1, sizeof(t->payment_hash));
t->partid = 0;
t->groupid = 12345;
db_begin_transaction(w->db); db_begin_transaction(w->db);
load_indexes(w->db, ld->indexes); load_indexes(w->db, ld->indexes);
t2 = tal_dup(NULL, struct wallet_payment, t); t = wallet_add_payment(ctx,
wallet_add_payment(w, take(t2)); w,
1,
NULL,
&payment_hash,
0, 12345,
PAYMENT_PENDING,
&destination,
AMOUNT_MSAT(100),
AMOUNT_MSAT(101),
AMOUNT_MSAT(100),
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL);
t2 = wallet_payment_by_hash(ctx, w, &t->payment_hash, 0, t->groupid); t2 = wallet_payment_by_hash(ctx, w, &t->payment_hash, 0, t->groupid);
CHECK(t2 != NULL); CHECK(t2 != NULL);
CHECK(t2->status == t->status); CHECK(t2->status == t->status);

View file

@ -3174,14 +3174,84 @@ void wallet_local_htlc_out_delete(struct wallet *wallet,
db_exec_prepared_v2(take(stmt)); db_exec_prepared_v2(take(stmt));
} }
void wallet_add_payment(struct wallet *wallet, /* FIXME: reorder! */
struct wallet_payment *payment) static
struct wallet_payment *wallet_payment_new(const tal_t *ctx,
u64 dbid,
u32 timestamp,
const u32 *completed_at,
const struct sha256 *payment_hash,
u64 partid,
u64 groupid,
enum payment_status status,
/* The destination may not be known if we used `sendonion` */
const struct node_id *destination,
struct amount_msat msatoshi,
struct amount_msat msatoshi_sent,
struct amount_msat total_msat,
/* If and only if PAYMENT_COMPLETE */
const struct preimage *payment_preimage,
const struct secret *path_secrets,
const struct node_id *route_nodes,
const struct short_channel_id *route_channels,
const char *invstring,
const char *label,
const char *description,
const u8 *failonion,
const struct sha256 *local_invreq_id);
struct wallet_payment *wallet_add_payment(const tal_t *ctx,
struct wallet *wallet,
u32 timestamp,
const u32 *completed_at,
const struct sha256 *payment_hash,
u64 partid,
u64 groupid,
enum payment_status status,
/* The destination may not be known if we used `sendonion` */
const struct node_id *destination TAKES,
struct amount_msat msatoshi,
struct amount_msat msatoshi_sent,
struct amount_msat total_msat,
/* If and only if PAYMENT_COMPLETE */
const struct preimage *payment_preimage TAKES,
const struct secret *path_secrets TAKES,
const struct node_id *route_nodes TAKES,
const struct short_channel_id *route_channels TAKES,
const char *invstring TAKES,
const char *label TAKES,
const char *description TAKES,
const u8 *failonion TAKES,
const struct sha256 *local_invreq_id)
{ {
struct db_stmt *stmt; struct db_stmt *stmt;
struct wallet_payment *payment;
u64 id;
/* Don't attempt to add the same payment twice */ id = sendpay_index_created(wallet->ld,
assert(!payment->id); payment_hash,
partid, groupid, status);
payment = wallet_payment_new(ctx, id,
timestamp,
completed_at,
payment_hash,
partid,
groupid,
status,
destination,
msatoshi,
msatoshi_sent,
total_msat,
payment_preimage,
path_secrets,
route_nodes,
route_channels,
invstring,
label,
description,
failonion,
local_invreq_id);
stmt = db_prepare_v2( stmt = db_prepare_v2(
wallet->db, wallet->db,
SQL("INSERT INTO payments (" SQL("INSERT INTO payments ("
@ -3204,11 +3274,6 @@ void wallet_add_payment(struct wallet *wallet,
" paydescription" " paydescription"
") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);")); ") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);"));
payment->id = sendpay_index_created(wallet->ld,
&payment->payment_hash,
payment->partid,
payment->groupid,
payment->status);
assert(payment->id > 0); assert(payment->id > 0);
db_bind_u64(stmt, payment->id); db_bind_u64(stmt, payment->id);
@ -3267,8 +3332,7 @@ void wallet_add_payment(struct wallet *wallet,
db_exec_prepared_v2(stmt); db_exec_prepared_v2(stmt);
tal_free(stmt); tal_free(stmt);
if (taken(payment)) return payment;
tal_free(payment);
} }
u64 wallet_payment_get_groupid(struct wallet *wallet, u64 wallet_payment_get_groupid(struct wallet *wallet,
@ -3323,6 +3387,7 @@ void wallet_payment_delete(struct wallet *wallet,
db_exec_prepared_v2(take(stmt)); db_exec_prepared_v2(take(stmt));
} }
static
struct wallet_payment *wallet_payment_new(const tal_t *ctx, struct wallet_payment *wallet_payment_new(const tal_t *ctx,
u64 dbid, u64 dbid,
u32 timestamp, u32 timestamp,

View file

@ -418,30 +418,6 @@ struct wallet_payment {
struct sha256 *local_invreq_id; struct sha256 *local_invreq_id;
}; };
struct wallet_payment *wallet_payment_new(const tal_t *ctx,
u64 dbid,
u32 timestamp,
const u32 *completed_at,
const struct sha256 *payment_hash,
u64 partid,
u64 groupid,
enum payment_status status,
/* The destination may not be known if we used `sendonion` */
const struct node_id *destination TAKES,
struct amount_msat msatoshi,
struct amount_msat msatoshi_sent,
struct amount_msat total_msat,
/* If and only if PAYMENT_COMPLETE */
const struct preimage *payment_preimage TAKES,
const struct secret *path_secrets TAKES,
const struct node_id *route_nodes TAKES,
const struct short_channel_id *route_channels TAKES,
const char *invstring TAKES,
const char *label TAKES,
const char *description TAKES,
const u8 *failonion TAKES,
const struct sha256 *local_invreq_id);
struct outpoint { struct outpoint {
struct bitcoin_outpoint outpoint; struct bitcoin_outpoint outpoint;
u32 blockheight; u32 blockheight;
@ -921,11 +897,34 @@ struct htlc_stub *wallet_htlc_stubs(const tal_t *ctx, struct wallet *wallet,
struct channel *chan, u64 commit_num); struct channel *chan, u64 commit_num);
/** /**
* wallet_add_payment - Store this payment in the db; sets payment->id * wallet_add_payment - Store this payment in the db
* @ctx: context to allocate returned `struct wallet_payment` off.
* @wallet: wallet we're going to store it in. * @wallet: wallet we're going to store it in.
* @payment: the payment for later committing. * @...: the details
*/ */
void wallet_add_payment(struct wallet *wallet, struct wallet_payment *payment TAKES); struct wallet_payment *wallet_add_payment(const tal_t *ctx,
struct wallet *wallet,
u32 timestamp,
const u32 *completed_at,
const struct sha256 *payment_hash,
u64 partid,
u64 groupid,
enum payment_status status,
/* The destination may not be known if we used `sendonion` */
const struct node_id *destination TAKES,
struct amount_msat msatoshi,
struct amount_msat msatoshi_sent,
struct amount_msat total_msat,
/* If and only if PAYMENT_COMPLETE */
const struct preimage *payment_preimage TAKES,
const struct secret *path_secrets TAKES,
const struct node_id *route_nodes TAKES,
const struct short_channel_id *route_channels TAKES,
const char *invstring TAKES,
const char *label TAKES,
const char *description TAKES,
const u8 *failonion TAKES,
const struct sha256 *local_invreq_id);
/** /**
* wallet_payment_delete - Remove a payment * wallet_payment_delete - Remove a payment