mirror of
https://github.com/ElementsProject/lightning.git
synced 2024-11-19 18:11:28 +01:00
e853cdc3ff
Because it used internal routines, it didn't pass operations through the db hook! So make it use the generic routines, with the twist that they are not translated. And when we use this in a migration hook, we're actually in a transaction. This, in turn, introduces an issue: we need to be outside a transaction to "PRAGMA foreign_keys = OFF", but completing the transaction when there is a db hook actually enters the io loop, freeing the tmpctx! Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
109 lines
3.7 KiB
C
109 lines
3.7 KiB
C
#ifndef LIGHTNING_DB_UTILS_H
|
|
#define LIGHTNING_DB_UTILS_H
|
|
#include "config.h"
|
|
#include <ccan/take/take.h>
|
|
#include <ccan/tal/tal.h>
|
|
|
|
struct db;
|
|
struct db_stmt;
|
|
|
|
size_t db_query_colnum(const struct db_stmt *stmt,
|
|
const char *colname);
|
|
|
|
/* Return next 'row' result of statement */
|
|
bool db_step(struct db_stmt *stmt);
|
|
|
|
/* TODO(cdecker) Remove the v2 suffix after finishing the migration */
|
|
#define db_prepare_v2(db,query) \
|
|
db_prepare_v2_(__FILE__ ":" stringify(__LINE__), db, query)
|
|
|
|
|
|
/**
|
|
* db_exec_prepared -- Execute a prepared statement
|
|
*
|
|
* After preparing a statement using `db_prepare`, and after binding all
|
|
* non-null variables using the `db_bind_*` functions, it can be executed with
|
|
* this function. It is a small, transaction-aware, wrapper around `db_step`,
|
|
* that calls fatal() if the execution fails. This may take ownership of
|
|
* `stmt` if annotated with `take()`and will free it before returning.
|
|
*
|
|
* If you'd like to issue a query and access the rows returned by the query
|
|
* please use `db_query_prepared` instead, since this function will not expose
|
|
* returned results, and the `stmt` can only be used for calls to
|
|
* `db_count_changes` and `db_last_insert_id` after executing.
|
|
*
|
|
* @stmt: The prepared statement to execute
|
|
*/
|
|
bool db_exec_prepared_v2(struct db_stmt *stmt TAKES);
|
|
|
|
/**
|
|
* db_query_prepared -- Execute a prepared query
|
|
*
|
|
* After preparing a query using `db_prepare`, and after binding all non-null
|
|
* variables using the `db_bind_*` functions, it can be executed with this
|
|
* function. This function must be called before calling `db_step` or any of
|
|
* the `db_col_*` column access functions.
|
|
*
|
|
* If you are not executing a read-only statement, please use
|
|
* `db_exec_prepared` instead.
|
|
*
|
|
* @stmt: The prepared statement to execute
|
|
*/
|
|
bool db_query_prepared(struct db_stmt *stmt);
|
|
|
|
size_t db_count_changes(struct db_stmt *stmt);
|
|
void db_report_changes(struct db *db, const char *final, size_t min);
|
|
void db_prepare_for_changes(struct db *db);
|
|
|
|
u64 db_last_insert_id_v2(struct db_stmt *stmt);
|
|
|
|
/**
|
|
* db_prepare -- Prepare a DB query/command
|
|
*
|
|
* Create an instance of `struct db_stmt` that encapsulates a SQL query or command.
|
|
*
|
|
* @query MUST be wrapped in a `SQL()` macro call, since that allows the
|
|
* extraction and translation of the query into the target SQL dialect.
|
|
*
|
|
* It does not execute the query and does not check its validity, but
|
|
* allocates the placeholders detected in the query. The placeholders in the
|
|
* `stmt` can then be bound using the `db_bind_*` functions, and executed
|
|
* using `db_exec_prepared` for write-only statements and `db_query_prepared`
|
|
* for read-only statements.
|
|
*
|
|
* @db: Database to query/exec
|
|
* @query: The SQL statement to compile
|
|
*/
|
|
struct db_stmt *db_prepare_v2_(const char *location, struct db *db,
|
|
const char *query_id);
|
|
|
|
/**
|
|
* db_open - Open or create a database
|
|
*/
|
|
struct db *db_open(const tal_t *ctx, const char *filename);
|
|
|
|
/**
|
|
* Report a statement that changes the wallet
|
|
*
|
|
* Allows the DB driver to report an expanded statement during
|
|
* execution. Changes are queued up and reported to the `db_write` plugin hook
|
|
* upon committing.
|
|
*/
|
|
void db_changes_add(struct db_stmt *db_stmt, const char * expanded);
|
|
void db_assert_no_outstanding_statements(struct db *db);
|
|
|
|
/**
|
|
* Access pending changes that have been added to the current transaction.
|
|
*/
|
|
const char **db_changes(struct db *db);
|
|
|
|
/**
|
|
* Accessor for internal use.
|
|
*
|
|
* Like db_prepare_v2() but creates temporary noop translation, and
|
|
* assumes not a read-only op. Use this inside db-specific backends
|
|
* to re-use the normal db hook and replication logic.
|
|
*/
|
|
struct db_stmt *db_prepare_untranslated(struct db *db, const char *query);
|
|
#endif /* LIGHTNING_DB_UTILS_H */
|