| 2968 | } |
| 2969 | |
| 2970 | static void wallet_peer_save(struct wallet *w, struct peer *peer) |
| 2971 | { |
| 2972 | const char *addr = |
| 2973 | fmt_wireaddr_internal(tmpctx, &peer->addr); |
| 2974 | struct db_stmt *stmt = |
| 2975 | db_prepare_v2(w->db, SQL("SELECT id FROM peers WHERE node_id = ?")); |
| 2976 | |
| 2977 | db_bind_node_id(stmt, &peer->id); |
| 2978 | db_query_prepared(stmt); |
| 2979 | |
| 2980 | if (db_step(stmt)) { |
| 2981 | /* So we already knew this peer, just return its dbid */ |
| 2982 | peer_set_dbid(peer, db_col_u64(stmt, "id")); |
| 2983 | tal_free(stmt); |
| 2984 | |
| 2985 | /* Since we're at it update the wireaddr, feature bits */ |
| 2986 | stmt = db_prepare_v2( |
| 2987 | w->db, SQL("UPDATE peers SET address = ?, feature_bits = ? WHERE id = ?")); |
| 2988 | db_bind_text(stmt, addr); |
| 2989 | db_bind_talarr(stmt, peer->their_features); |
| 2990 | db_bind_u64(stmt, peer->dbid); |
| 2991 | db_exec_prepared_v2(take(stmt)); |
| 2992 | |
| 2993 | } else { |
| 2994 | /* Unknown peer, create it from scratch */ |
| 2995 | tal_free(stmt); |
| 2996 | stmt = db_prepare_v2(w->db, |
| 2997 | SQL("INSERT INTO peers (node_id, address, feature_bits) VALUES (?, ?, ?);") |
| 2998 | ); |
| 2999 | db_bind_node_id(stmt, &peer->id); |
| 3000 | db_bind_text(stmt, addr); |
| 3001 | db_bind_talarr(stmt, peer->their_features); |
| 3002 | db_exec_prepared_v2(stmt); |
| 3003 | peer_set_dbid(peer, db_last_insert_id_v2(take(stmt))); |
| 3004 | } |
| 3005 | |
| 3006 | if (peer->last_known_addr) { |
| 3007 | u8 *wire = tal_arr(tmpctx, u8, 0); |
| 3008 | towire_wireaddr(&wire, peer->last_known_addr); |
| 3009 | stmt = db_prepare_v2(w->db, |
| 3010 | SQL("UPDATE peers SET last_known_address = ? WHERE id = ?;")); |
| 3011 | db_bind_talarr(stmt, wire); |
| 3012 | db_bind_u64(stmt, peer->dbid); |
| 3013 | db_exec_prepared_v2(take(stmt)); |
| 3014 | } |
| 3015 | } |
| 3016 | |
| 3017 | bool channel_exists_by_id(struct wallet *w, u64 dbid) { |
| 3018 | struct db_stmt *stmt; |
no test coverage detected