mirror of
https://github.com/aljazceru/lightning.git
synced 2025-12-20 07:34:24 +01:00
committed by
Christian Decker
parent
0f2c9cf5d5
commit
381b0f456c
@@ -657,6 +657,13 @@ static struct migration dbmigrations[] = {
|
|||||||
" cause INTEGER,"
|
" cause INTEGER,"
|
||||||
" message TEXT"
|
" message TEXT"
|
||||||
");"), NULL},
|
");"), NULL},
|
||||||
|
{SQL("CREATE TABLE offers ("
|
||||||
|
" offer_id BLOB"
|
||||||
|
", bolt12 TEXT"
|
||||||
|
", label TEXT"
|
||||||
|
", status INTEGER"
|
||||||
|
", PRIMARY KEY (offer_id)"
|
||||||
|
");"), NULL},
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Leak tracking. */
|
/* Leak tracking. */
|
||||||
|
|||||||
52
wallet/db_postgres_sqlgen.c
generated
52
wallet/db_postgres_sqlgen.c
generated
@@ -848,6 +848,12 @@ struct db_query db_postgres_queries[] = {
|
|||||||
.placeholders = 0,
|
.placeholders = 0,
|
||||||
.readonly = false,
|
.readonly = false,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.name = "CREATE TABLE offers ( offer_id BLOB, bolt12 TEXT, label TEXT, status INTEGER, PRIMARY KEY (offer_id));",
|
||||||
|
.query = "CREATE TABLE offers ( offer_id BYTEA, bolt12 TEXT, label TEXT, status INTEGER, PRIMARY KEY (offer_id));",
|
||||||
|
.placeholders = 0,
|
||||||
|
.readonly = false,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
.name = "UPDATE vars SET intval = intval + 1 WHERE name = 'data_version' AND intval = ?",
|
.name = "UPDATE vars SET intval = intval + 1 WHERE name = 'data_version' AND intval = ?",
|
||||||
.query = "UPDATE vars SET intval = intval + 1 WHERE name = 'data_version' AND intval = $1",
|
.query = "UPDATE vars SET intval = intval + 1 WHERE name = 'data_version' AND intval = $1",
|
||||||
@@ -1664,6 +1670,48 @@ struct db_query db_postgres_queries[] = {
|
|||||||
.placeholders = 2,
|
.placeholders = 2,
|
||||||
.readonly = false,
|
.readonly = false,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.name = "SELECT 1 FROM offers WHERE offer_id = ?;",
|
||||||
|
.query = "SELECT 1 FROM offers WHERE offer_id = $1;",
|
||||||
|
.placeholders = 1,
|
||||||
|
.readonly = true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.name = "INSERT INTO offers ( offer_id, bolt12, label, status) VALUES (?, ?, ?, ?);",
|
||||||
|
.query = "INSERT INTO offers ( offer_id, bolt12, label, status) VALUES ($1, $2, $3, $4);",
|
||||||
|
.placeholders = 4,
|
||||||
|
.readonly = false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.name = "SELECT bolt12, label, status FROM offers WHERE offer_id = ?;",
|
||||||
|
.query = "SELECT bolt12, label, status FROM offers WHERE offer_id = $1;",
|
||||||
|
.placeholders = 1,
|
||||||
|
.readonly = true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.name = "SELECT offer_id FROM offers;",
|
||||||
|
.query = "SELECT offer_id FROM offers;",
|
||||||
|
.placeholders = 0,
|
||||||
|
.readonly = true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.name = "UPDATE offers SET status=? WHERE offer_id = ?;",
|
||||||
|
.query = "UPDATE offers SET status=$1 WHERE offer_id = $2;",
|
||||||
|
.placeholders = 2,
|
||||||
|
.readonly = false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.name = "UPDATE invoices SET state=? WHERE state=? AND offer_id = ?;",
|
||||||
|
.query = "UPDATE invoices SET state=$1 WHERE state=$2 AND offer_id = $3;",
|
||||||
|
.placeholders = 3,
|
||||||
|
.readonly = false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.name = "SELECT status FROM offers WHERE offer_id = ?;",
|
||||||
|
.query = "SELECT status FROM offers WHERE offer_id = $1;",
|
||||||
|
.placeholders = 1,
|
||||||
|
.readonly = true,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
.name = "SELECT name FROM sqlite_master WHERE type='table';",
|
.name = "SELECT name FROM sqlite_master WHERE type='table';",
|
||||||
.query = "SELECT name FROM sqlite_master WHERE type='table';",
|
.query = "SELECT name FROM sqlite_master WHERE type='table';",
|
||||||
@@ -1684,10 +1732,10 @@ struct db_query db_postgres_queries[] = {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
#define DB_POSTGRES_QUERY_COUNT 279
|
#define DB_POSTGRES_QUERY_COUNT 287
|
||||||
|
|
||||||
#endif /* HAVE_POSTGRES */
|
#endif /* HAVE_POSTGRES */
|
||||||
|
|
||||||
#endif /* LIGHTNINGD_WALLET_GEN_DB_POSTGRES */
|
#endif /* LIGHTNINGD_WALLET_GEN_DB_POSTGRES */
|
||||||
|
|
||||||
// SHA256STAMP:a51ae4928fd56f2b22d0dd8f498f1288e2c3df7be872ddf1240f4b8fded6fd22
|
// SHA256STAMP:94af743741cd2a2d8725371af12e130a692334a118b52386fb901fadfe25d4cd
|
||||||
|
|||||||
52
wallet/db_sqlite3_sqlgen.c
generated
52
wallet/db_sqlite3_sqlgen.c
generated
@@ -848,6 +848,12 @@ struct db_query db_sqlite3_queries[] = {
|
|||||||
.placeholders = 0,
|
.placeholders = 0,
|
||||||
.readonly = false,
|
.readonly = false,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.name = "CREATE TABLE offers ( offer_id BLOB, bolt12 TEXT, label TEXT, status INTEGER, PRIMARY KEY (offer_id));",
|
||||||
|
.query = "CREATE TABLE offers ( offer_id BLOB, bolt12 TEXT, label TEXT, status INTEGER, PRIMARY KEY (offer_id));",
|
||||||
|
.placeholders = 0,
|
||||||
|
.readonly = false,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
.name = "UPDATE vars SET intval = intval + 1 WHERE name = 'data_version' AND intval = ?",
|
.name = "UPDATE vars SET intval = intval + 1 WHERE name = 'data_version' AND intval = ?",
|
||||||
.query = "UPDATE vars SET intval = intval + 1 WHERE name = 'data_version' AND intval = ?",
|
.query = "UPDATE vars SET intval = intval + 1 WHERE name = 'data_version' AND intval = ?",
|
||||||
@@ -1664,6 +1670,48 @@ struct db_query db_sqlite3_queries[] = {
|
|||||||
.placeholders = 2,
|
.placeholders = 2,
|
||||||
.readonly = false,
|
.readonly = false,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.name = "SELECT 1 FROM offers WHERE offer_id = ?;",
|
||||||
|
.query = "SELECT 1 FROM offers WHERE offer_id = ?;",
|
||||||
|
.placeholders = 1,
|
||||||
|
.readonly = true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.name = "INSERT INTO offers ( offer_id, bolt12, label, status) VALUES (?, ?, ?, ?);",
|
||||||
|
.query = "INSERT INTO offers ( offer_id, bolt12, label, status) VALUES (?, ?, ?, ?);",
|
||||||
|
.placeholders = 4,
|
||||||
|
.readonly = false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.name = "SELECT bolt12, label, status FROM offers WHERE offer_id = ?;",
|
||||||
|
.query = "SELECT bolt12, label, status FROM offers WHERE offer_id = ?;",
|
||||||
|
.placeholders = 1,
|
||||||
|
.readonly = true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.name = "SELECT offer_id FROM offers;",
|
||||||
|
.query = "SELECT offer_id FROM offers;",
|
||||||
|
.placeholders = 0,
|
||||||
|
.readonly = true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.name = "UPDATE offers SET status=? WHERE offer_id = ?;",
|
||||||
|
.query = "UPDATE offers SET status=? WHERE offer_id = ?;",
|
||||||
|
.placeholders = 2,
|
||||||
|
.readonly = false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.name = "UPDATE invoices SET state=? WHERE state=? AND offer_id = ?;",
|
||||||
|
.query = "UPDATE invoices SET state=? WHERE state=? AND offer_id = ?;",
|
||||||
|
.placeholders = 3,
|
||||||
|
.readonly = false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.name = "SELECT status FROM offers WHERE offer_id = ?;",
|
||||||
|
.query = "SELECT status FROM offers WHERE offer_id = ?;",
|
||||||
|
.placeholders = 1,
|
||||||
|
.readonly = true,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
.name = "SELECT name FROM sqlite_master WHERE type='table';",
|
.name = "SELECT name FROM sqlite_master WHERE type='table';",
|
||||||
.query = "SELECT name FROM sqlite_master WHERE type='table';",
|
.query = "SELECT name FROM sqlite_master WHERE type='table';",
|
||||||
@@ -1684,10 +1732,10 @@ struct db_query db_sqlite3_queries[] = {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
#define DB_SQLITE3_QUERY_COUNT 279
|
#define DB_SQLITE3_QUERY_COUNT 287
|
||||||
|
|
||||||
#endif /* HAVE_SQLITE3 */
|
#endif /* HAVE_SQLITE3 */
|
||||||
|
|
||||||
#endif /* LIGHTNINGD_WALLET_GEN_DB_SQLITE3 */
|
#endif /* LIGHTNINGD_WALLET_GEN_DB_SQLITE3 */
|
||||||
|
|
||||||
// SHA256STAMP:a51ae4928fd56f2b22d0dd8f498f1288e2c3df7be872ddf1240f4b8fded6fd22
|
// SHA256STAMP:94af743741cd2a2d8725371af12e130a692334a118b52386fb901fadfe25d4cd
|
||||||
|
|||||||
66
wallet/statements_gettextgen.po
generated
66
wallet/statements_gettextgen.po
generated
@@ -558,67 +558,71 @@ msgstr ""
|
|||||||
msgid "CREATE TABLE channel_state_changes ( channel_id BIGINT REFERENCES channels(id) ON DELETE CASCADE, timestamp BIGINT, old_state INTEGER, new_state INTEGER, cause INTEGER, message TEXT);"
|
msgid "CREATE TABLE channel_state_changes ( channel_id BIGINT REFERENCES channels(id) ON DELETE CASCADE, timestamp BIGINT, old_state INTEGER, new_state INTEGER, cause INTEGER, message TEXT);"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: wallet/db.c:886
|
#: wallet/db.c:660
|
||||||
|
msgid "CREATE TABLE offers ( offer_id BLOB, bolt12 TEXT, label TEXT, status INTEGER, PRIMARY KEY (offer_id));"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: wallet/db.c:893
|
||||||
msgid "UPDATE vars SET intval = intval + 1 WHERE name = 'data_version' AND intval = ?"
|
msgid "UPDATE vars SET intval = intval + 1 WHERE name = 'data_version' AND intval = ?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: wallet/db.c:986
|
#: wallet/db.c:993
|
||||||
msgid "SELECT version FROM version LIMIT 1"
|
msgid "SELECT version FROM version LIMIT 1"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: wallet/db.c:1044
|
#: wallet/db.c:1051
|
||||||
msgid "UPDATE version SET version=?;"
|
msgid "UPDATE version SET version=?;"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: wallet/db.c:1052
|
#: wallet/db.c:1059
|
||||||
msgid "INSERT INTO db_upgrades VALUES (?, ?);"
|
msgid "INSERT INTO db_upgrades VALUES (?, ?);"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: wallet/db.c:1064
|
#: wallet/db.c:1071
|
||||||
msgid "SELECT intval FROM vars WHERE name = 'data_version'"
|
msgid "SELECT intval FROM vars WHERE name = 'data_version'"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: wallet/db.c:1091
|
#: wallet/db.c:1098
|
||||||
msgid "SELECT intval FROM vars WHERE name= ? LIMIT 1"
|
msgid "SELECT intval FROM vars WHERE name= ? LIMIT 1"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: wallet/db.c:1107
|
#: wallet/db.c:1114
|
||||||
msgid "UPDATE vars SET intval=? WHERE name=?;"
|
msgid "UPDATE vars SET intval=? WHERE name=?;"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: wallet/db.c:1116
|
#: wallet/db.c:1123
|
||||||
msgid "INSERT INTO vars (name, intval) VALUES (?, ?);"
|
msgid "INSERT INTO vars (name, intval) VALUES (?, ?);"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: wallet/db.c:1130
|
#: wallet/db.c:1137
|
||||||
msgid "UPDATE channels SET feerate_base = ?, feerate_ppm = ?;"
|
msgid "UPDATE channels SET feerate_base = ?, feerate_ppm = ?;"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: wallet/db.c:1151
|
#: wallet/db.c:1158
|
||||||
msgid "UPDATE channels SET our_funding_satoshi = funding_satoshi WHERE funder = 0;"
|
msgid "UPDATE channels SET our_funding_satoshi = funding_satoshi WHERE funder = 0;"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: wallet/db.c:1167
|
#: wallet/db.c:1174
|
||||||
msgid "SELECT type, keyindex, prev_out_tx, prev_out_index, channel_id, peer_id, commitment_point FROM outputs WHERE scriptpubkey IS NULL;"
|
msgid "SELECT type, keyindex, prev_out_tx, prev_out_index, channel_id, peer_id, commitment_point FROM outputs WHERE scriptpubkey IS NULL;"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: wallet/db.c:1229
|
#: wallet/db.c:1236
|
||||||
msgid "UPDATE outputs SET scriptpubkey = ? WHERE prev_out_tx = ? AND prev_out_index = ?"
|
msgid "UPDATE outputs SET scriptpubkey = ? WHERE prev_out_tx = ? AND prev_out_index = ?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: wallet/db.c:1254
|
#: wallet/db.c:1261
|
||||||
msgid "SELECT id, funding_tx_id, funding_tx_outnum FROM channels;"
|
msgid "SELECT id, funding_tx_id, funding_tx_outnum FROM channels;"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: wallet/db.c:1273
|
#: wallet/db.c:1280
|
||||||
msgid "UPDATE channels SET full_channel_id = ? WHERE id = ?;"
|
msgid "UPDATE channels SET full_channel_id = ? WHERE id = ?;"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: wallet/db.c:1296
|
#: wallet/db.c:1303
|
||||||
msgid "SELECT c.id, p.node_id, c.last_tx, c.funding_satoshi, c.fundingkey_remote, c.last_sig FROM channels c LEFT OUTER JOIN peers p ON p.id = c.peer_id;"
|
msgid "SELECT c.id, p.node_id, c.last_tx, c.funding_satoshi, c.fundingkey_remote, c.last_sig FROM channels c LEFT OUTER JOIN peers p ON p.id = c.peer_id;"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: wallet/db.c:1363
|
#: wallet/db.c:1370
|
||||||
msgid "UPDATE channels SET last_tx = ? WHERE id = ?;"
|
msgid "UPDATE channels SET last_tx = ? WHERE id = ?;"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -1102,6 +1106,34 @@ msgstr ""
|
|||||||
msgid "DELETE FROM penalty_bases WHERE channel_id = ? AND commitnum = ?"
|
msgid "DELETE FROM penalty_bases WHERE channel_id = ? AND commitnum = ?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: wallet/wallet.c:3976
|
||||||
|
msgid "SELECT 1 FROM offers WHERE offer_id = ?;"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: wallet/wallet.c:3989
|
||||||
|
msgid "INSERT INTO offers ( offer_id, bolt12, label, status) VALUES (?, ?, ?, ?);"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: wallet/wallet.c:4017
|
||||||
|
msgid "SELECT bolt12, label, status FROM offers WHERE offer_id = ?;"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: wallet/wallet.c:4045
|
||||||
|
msgid "SELECT offer_id FROM offers;"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: wallet/wallet.c:4071
|
||||||
|
msgid "UPDATE offers SET status=? WHERE offer_id = ?;"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: wallet/wallet.c:4082
|
||||||
|
msgid "UPDATE invoices SET state=? WHERE state=? AND offer_id = ?;"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: wallet/wallet.c:4110
|
||||||
|
msgid "SELECT status FROM offers WHERE offer_id = ?;"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: wallet/test/run-db.c:120
|
#: wallet/test/run-db.c:120
|
||||||
msgid "SELECT name FROM sqlite_master WHERE type='table';"
|
msgid "SELECT name FROM sqlite_master WHERE type='table';"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -1113,4 +1145,4 @@ msgstr ""
|
|||||||
#: wallet/test/run-wallet.c:1377
|
#: wallet/test/run-wallet.c:1377
|
||||||
msgid "INSERT INTO channels (id) VALUES (1);"
|
msgid "INSERT INTO channels (id) VALUES (1);"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
# SHA256STAMP:ebfc7675e32b832d172d040d0120cd339a1e1e924969373f8d7d6b75a7836c5b
|
# SHA256STAMP:3c2b67d1ede6a371d5dfbc97c6406cb3152c0a36ff60d714967552de6d02f7d7
|
||||||
|
|||||||
166
wallet/wallet.c
166
wallet/wallet.c
@@ -3961,3 +3961,169 @@ void wallet_penalty_base_delete(struct wallet *w, u64 chan_id, u64 commitnum)
|
|||||||
db_bind_u64(stmt, 1, commitnum);
|
db_bind_u64(stmt, 1, commitnum);
|
||||||
db_exec_prepared_v2(take(stmt));
|
db_exec_prepared_v2(take(stmt));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool wallet_offer_create(struct wallet *w,
|
||||||
|
const struct sha256 *offer_id,
|
||||||
|
const char *bolt12,
|
||||||
|
const struct json_escape *label,
|
||||||
|
enum offer_status status)
|
||||||
|
{
|
||||||
|
struct db_stmt *stmt;
|
||||||
|
|
||||||
|
assert(offer_status_active(status));
|
||||||
|
|
||||||
|
/* Test if already exists. */
|
||||||
|
stmt = db_prepare_v2(w->db, SQL("SELECT 1"
|
||||||
|
" FROM offers"
|
||||||
|
" WHERE offer_id = ?;"));
|
||||||
|
db_bind_sha256(stmt, 0, offer_id);
|
||||||
|
db_query_prepared(stmt);
|
||||||
|
|
||||||
|
if (db_step(stmt)) {
|
||||||
|
tal_free(stmt);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
tal_free(stmt);
|
||||||
|
|
||||||
|
stmt = db_prepare_v2(w->db,
|
||||||
|
SQL("INSERT INTO offers ("
|
||||||
|
" offer_id"
|
||||||
|
", bolt12"
|
||||||
|
", label"
|
||||||
|
", status"
|
||||||
|
") VALUES (?, ?, ?, ?);"));
|
||||||
|
|
||||||
|
db_bind_sha256(stmt, 0, offer_id);
|
||||||
|
db_bind_text(stmt, 1, bolt12);
|
||||||
|
if (label)
|
||||||
|
db_bind_json_escape(stmt, 2, label);
|
||||||
|
else
|
||||||
|
db_bind_null(stmt, 2);
|
||||||
|
db_bind_int(stmt, 3, offer_status_in_db(status));
|
||||||
|
db_exec_prepared_v2(take(stmt));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *wallet_offer_find(const tal_t *ctx,
|
||||||
|
struct wallet *w,
|
||||||
|
const struct sha256 *offer_id,
|
||||||
|
const struct json_escape **label,
|
||||||
|
enum offer_status *status)
|
||||||
|
{
|
||||||
|
struct db_stmt *stmt;
|
||||||
|
char *bolt12;
|
||||||
|
|
||||||
|
/* Test if already exists. */
|
||||||
|
stmt = db_prepare_v2(w->db, SQL("SELECT bolt12, label, status"
|
||||||
|
" FROM offers"
|
||||||
|
" WHERE offer_id = ?;"));
|
||||||
|
db_bind_sha256(stmt, 0, offer_id);
|
||||||
|
db_query_prepared(stmt);
|
||||||
|
|
||||||
|
if (!db_step(stmt)) {
|
||||||
|
tal_free(stmt);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
bolt12 = tal_strdup(ctx, cast_signed(const char *, db_column_text(stmt, 0)));
|
||||||
|
if (label) {
|
||||||
|
if (db_column_is_null(stmt, 1))
|
||||||
|
*label = NULL;
|
||||||
|
else
|
||||||
|
*label = db_column_json_escape(ctx, stmt, 1);
|
||||||
|
}
|
||||||
|
if (status)
|
||||||
|
*status = offer_status_in_db(db_column_int(stmt, 2));
|
||||||
|
tal_free(stmt);
|
||||||
|
return bolt12;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct db_stmt *wallet_offer_first(struct wallet *w, struct sha256 *offer_id)
|
||||||
|
{
|
||||||
|
struct db_stmt *stmt;
|
||||||
|
|
||||||
|
stmt = db_prepare_v2(w->db, SQL("SELECT offer_id FROM offers;"));
|
||||||
|
db_query_prepared(stmt);
|
||||||
|
|
||||||
|
return wallet_offer_next(w, stmt, offer_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct db_stmt *wallet_offer_next(struct wallet *w,
|
||||||
|
struct db_stmt *stmt,
|
||||||
|
struct sha256 *offer_id)
|
||||||
|
{
|
||||||
|
if (!db_step(stmt))
|
||||||
|
return tal_free(stmt);
|
||||||
|
|
||||||
|
db_column_sha256(stmt, 0, offer_id);
|
||||||
|
return stmt;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If we make an offer inactive, this also expires all invoices
|
||||||
|
* which we issued for it. */
|
||||||
|
static void offer_status_update(struct db *db,
|
||||||
|
const struct sha256 *offer_id,
|
||||||
|
enum offer_status oldstatus,
|
||||||
|
enum offer_status newstatus)
|
||||||
|
{
|
||||||
|
struct db_stmt *stmt;
|
||||||
|
|
||||||
|
stmt = db_prepare_v2(db, SQL("UPDATE offers"
|
||||||
|
" SET status=?"
|
||||||
|
" WHERE offer_id = ?;"));
|
||||||
|
db_bind_int(stmt, 0, offer_status_in_db(newstatus));
|
||||||
|
db_bind_sha256(stmt, 1, offer_id);
|
||||||
|
db_exec_prepared_v2(take(stmt));
|
||||||
|
|
||||||
|
if (!offer_status_active(oldstatus)
|
||||||
|
|| offer_status_active(newstatus))
|
||||||
|
return;
|
||||||
|
|
||||||
|
stmt = db_prepare_v2(db, SQL("UPDATE invoices"
|
||||||
|
" SET state=?"
|
||||||
|
" WHERE state=? AND offer_id = ?;"));
|
||||||
|
db_bind_int(stmt, 0, invoice_status_in_db(UNPAID));
|
||||||
|
db_bind_int(stmt, 1, invoice_status_in_db(EXPIRED));
|
||||||
|
db_bind_sha256(stmt, 2, offer_id);
|
||||||
|
db_exec_prepared_v2(take(stmt));
|
||||||
|
}
|
||||||
|
|
||||||
|
enum offer_status wallet_offer_disable(struct wallet *w,
|
||||||
|
const struct sha256 *offer_id,
|
||||||
|
enum offer_status s)
|
||||||
|
{
|
||||||
|
enum offer_status newstatus;
|
||||||
|
|
||||||
|
assert(offer_status_active(s));
|
||||||
|
|
||||||
|
newstatus = offer_status_in_db(s &= ~OFFER_STATUS_ACTIVE_F);
|
||||||
|
offer_status_update(w->db, offer_id, s, newstatus);
|
||||||
|
|
||||||
|
return newstatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wallet_offer_mark_used(struct db *db, const struct sha256 *offer_id)
|
||||||
|
{
|
||||||
|
struct db_stmt *stmt;
|
||||||
|
enum offer_status status;
|
||||||
|
|
||||||
|
stmt = db_prepare_v2(db, SQL("SELECT status"
|
||||||
|
" FROM offers"
|
||||||
|
" WHERE offer_id = ?;"));
|
||||||
|
db_bind_sha256(stmt, 0, offer_id);
|
||||||
|
db_query_prepared(stmt);
|
||||||
|
if (!db_step(stmt))
|
||||||
|
fatal("Unknown stats offer_id %s",
|
||||||
|
type_to_string(tmpctx, struct sha256, offer_id));
|
||||||
|
|
||||||
|
status = offer_status_in_db(db_column_int(stmt, 0));
|
||||||
|
tal_free(stmt);
|
||||||
|
|
||||||
|
if (!offer_status_active(status))
|
||||||
|
fatal("offer_id %s status %i",
|
||||||
|
type_to_string(tmpctx, struct sha256, offer_id),
|
||||||
|
status);
|
||||||
|
|
||||||
|
if (status == OFFER_SINGLE_USE)
|
||||||
|
offer_status_update(db, offer_id, status, OFFER_USED);
|
||||||
|
}
|
||||||
|
|||||||
123
wallet/wallet.h
123
wallet/wallet.h
@@ -1331,4 +1331,127 @@ struct penalty_base *wallet_penalty_base_load_for_channel(const tal_t *ctx,
|
|||||||
*/
|
*/
|
||||||
void wallet_penalty_base_delete(struct wallet *w, u64 chan_id, u64 commitnum);
|
void wallet_penalty_base_delete(struct wallet *w, u64 chan_id, u64 commitnum);
|
||||||
|
|
||||||
|
/* /!\ This is a DB ENUM, please do not change the numbering of any
|
||||||
|
* already defined elements (adding is ok) /!\ */
|
||||||
|
#define OFFER_STATUS_ACTIVE_F 0x1
|
||||||
|
#define OFFER_STATUS_SINGLE_F 0x2
|
||||||
|
#define OFFER_STATUS_USED_F 0x4
|
||||||
|
enum offer_status {
|
||||||
|
OFFER_MULTIPLE_USE = OFFER_STATUS_ACTIVE_F,
|
||||||
|
OFFER_SINGLE_USE = OFFER_STATUS_ACTIVE_F|OFFER_STATUS_SINGLE_F,
|
||||||
|
OFFER_USED = OFFER_STATUS_SINGLE_F|OFFER_STATUS_USED_F,
|
||||||
|
OFFER_SINGLE_DISABLED = OFFER_STATUS_SINGLE_F,
|
||||||
|
OFFER_MULTIPLE_DISABLED = 0,
|
||||||
|
};
|
||||||
|
|
||||||
|
static inline enum offer_status offer_status_in_db(enum offer_status s)
|
||||||
|
{
|
||||||
|
switch (s) {
|
||||||
|
case OFFER_MULTIPLE_USE:
|
||||||
|
BUILD_ASSERT(OFFER_MULTIPLE_USE == 1);
|
||||||
|
return s;
|
||||||
|
case OFFER_SINGLE_USE:
|
||||||
|
BUILD_ASSERT(OFFER_SINGLE_USE == 3);
|
||||||
|
return s;
|
||||||
|
case OFFER_USED:
|
||||||
|
BUILD_ASSERT(OFFER_USED == 6);
|
||||||
|
return s;
|
||||||
|
case OFFER_SINGLE_DISABLED:
|
||||||
|
BUILD_ASSERT(OFFER_SINGLE_DISABLED == 2);
|
||||||
|
return s;
|
||||||
|
case OFFER_MULTIPLE_DISABLED:
|
||||||
|
BUILD_ASSERT(OFFER_MULTIPLE_DISABLED == 0);
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
fatal("%s: %u is invalid", __func__, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline bool offer_status_active(enum offer_status s)
|
||||||
|
{
|
||||||
|
return s & OFFER_STATUS_ACTIVE_F;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline bool offer_status_single(enum offer_status s)
|
||||||
|
{
|
||||||
|
return s & OFFER_STATUS_SINGLE_F;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Store an offer in the database.
|
||||||
|
* @w: the wallet
|
||||||
|
* @offer_id: the merkle root, as used for signing (must be unique)
|
||||||
|
* @bolt12: offer as text.
|
||||||
|
* @label: optional label for this offer.
|
||||||
|
* @status: OFFER_SINGLE_USE or OFFER_MULTIPLE_USE
|
||||||
|
*/
|
||||||
|
bool wallet_offer_create(struct wallet *w,
|
||||||
|
const struct sha256 *offer_id,
|
||||||
|
const char *bolt12,
|
||||||
|
const struct json_escape *label,
|
||||||
|
enum offer_status status)
|
||||||
|
NON_NULL_ARGS(1,2,3);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve an offer from the database.
|
||||||
|
* @ctx: the tal context to allocate return from.
|
||||||
|
* @w: the wallet
|
||||||
|
* @offer_id: the merkle root, as used for signing (must be unique)
|
||||||
|
* @label: the label of the offer, set to NULL if none (or NULL)
|
||||||
|
* @status: set if succeeds (or NULL)
|
||||||
|
*
|
||||||
|
* If @offer_id is found, returns the bolt12 text, sets @label and
|
||||||
|
* @state. Otherwise returns NULL.
|
||||||
|
*/
|
||||||
|
char *wallet_offer_find(const tal_t *ctx,
|
||||||
|
struct wallet *w,
|
||||||
|
const struct sha256 *offer_id,
|
||||||
|
const struct json_escape **label,
|
||||||
|
enum offer_status *status)
|
||||||
|
NON_NULL_ARGS(1,2,3);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Iterate through all the offers.
|
||||||
|
* @w: the wallet
|
||||||
|
* @offer_id: the first offer id (if returns non-NULL)
|
||||||
|
*
|
||||||
|
* Returns pointer to hand as @stmt to wallet_offer_next(), or NULL.
|
||||||
|
* If you choose not to call wallet_offer_next() you must free it!
|
||||||
|
*/
|
||||||
|
struct db_stmt *wallet_offer_first(struct wallet *w,
|
||||||
|
struct sha256 *offer_id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Iterate through all the offers.
|
||||||
|
* @w: the wallet
|
||||||
|
* @stmt: return from wallet_offer_first() or previous wallet_offer_next()
|
||||||
|
* @offer_id: the next offer id (if returns non-NULL)
|
||||||
|
*
|
||||||
|
* Returns NULL once we're out of offers. If you choose not to call
|
||||||
|
* wallet_offer_next() again you must free return.
|
||||||
|
*/
|
||||||
|
struct db_stmt *wallet_offer_next(struct wallet *w,
|
||||||
|
struct db_stmt *stmt,
|
||||||
|
struct sha256 *offer_id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Disable an offer in the database.
|
||||||
|
* @w: the wallet
|
||||||
|
* @offer_id: the merkle root, as used for signing (must be unique)
|
||||||
|
* @s: the current status (must be active).
|
||||||
|
*
|
||||||
|
* Must exist. Returns new status. */
|
||||||
|
enum offer_status wallet_offer_disable(struct wallet *w,
|
||||||
|
const struct sha256 *offer_id,
|
||||||
|
enum offer_status s)
|
||||||
|
NO_NULL_ARGS;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mark an offer in the database used.
|
||||||
|
* @w: the wallet
|
||||||
|
* @offer_id: the merkle root, as used for signing (must be unique)
|
||||||
|
*
|
||||||
|
* Must exist and be active.
|
||||||
|
*/
|
||||||
|
void wallet_offer_mark_used(struct db *db, const struct sha256 *offer_id)
|
||||||
|
NO_NULL_ARGS;
|
||||||
#endif /* LIGHTNING_WALLET_WALLET_H */
|
#endif /* LIGHTNING_WALLET_WALLET_H */
|
||||||
|
|||||||
Reference in New Issue
Block a user