diff --git a/lightningd/peer_control.c b/lightningd/peer_control.c index 561070f54..387195b05 100644 --- a/lightningd/peer_control.c +++ b/lightningd/peer_control.c @@ -181,7 +181,7 @@ static void free_peer(struct peer *peer, const char *why) command_fail(peer->opening_cmd, "%s", why); peer->opening_cmd = NULL; } - wallet_channel_delete(peer->ld->wallet, peer->channel->id); + wallet_channel_delete(peer->ld->wallet, peer->channel->id, peer->dbid); tal_free(peer); } diff --git a/wallet/wallet.c b/wallet/wallet.c index 4c16c56d3..99e604651 100644 --- a/wallet/wallet.c +++ b/wallet/wallet.c @@ -866,12 +866,22 @@ void wallet_channel_save(struct wallet *w, struct wallet_channel *chan) tal_free(tmpctx); } -void wallet_channel_delete(struct wallet *w, u64 wallet_id) +void wallet_channel_delete(struct wallet *w, u64 wallet_id, u64 peer_dbid) { sqlite3_stmt *stmt; - stmt = db_prepare(w->db, "DELETE FROM channels WHERE id=?"); + /* FIXME: The line to clean up if we're last channel for peer would + * be better as a trigger. */ + stmt = db_prepare(w->db, + "DELETE FROM channels WHERE id=?"); sqlite3_bind_int64(stmt, 1, wallet_id); db_exec_prepared(w->db, stmt); + + stmt = db_prepare(w->db, + "DELETE FROM peers WHERE id = ? AND NOT EXISTS" + " (SELECT 1 FROM channels WHERE peer_id = ?)"); + sqlite3_bind_int64(stmt, 1, peer_dbid); + sqlite3_bind_int64(stmt, 2, peer_dbid); + db_exec_prepared(w->db, stmt); } int wallet_extract_owned_outputs(struct wallet *w, const struct bitcoin_tx *tx, diff --git a/wallet/wallet.h b/wallet/wallet.h index 334d948db..25f20bf88 100644 --- a/wallet/wallet.h +++ b/wallet/wallet.h @@ -225,8 +225,10 @@ void wallet_channel_save(struct wallet *w, struct wallet_channel *chan); /** * wallet_channel_delete -- After resolving a channel, forget about it + * + * Deletes peer too if no more channels. */ -void wallet_channel_delete(struct wallet *w, u64 wallet_id); +void wallet_channel_delete(struct wallet *w, u64 wallet_id, u64 peer_dbid); /** * wallet_channel_config_save -- Upsert a channel_config into the database