| 2950 | } |
| 2951 | |
| 2952 | static void wallet_peer_save(struct wallet *w, struct peer *peer) |
| 2953 | { |
| 2954 | const char *addr = |
| 2955 | fmt_wireaddr_internal(tmpctx, &peer->addr); |
| 2956 | struct db_stmt *stmt = |
| 2957 | db_prepare_v2(w->db, SQL("SELECT id FROM peers WHERE node_id = ?")); |
| 2958 | |
| 2959 | db_bind_node_id(stmt, &peer->id); |
| 2960 | db_query_prepared(stmt); |
| 2961 | |
| 2962 | if (db_step(stmt)) { |
| 2963 | /* So we already knew this peer, just return its dbid */ |
| 2964 | peer_set_dbid(peer, db_col_u64(stmt, "id")); |
| 2965 | tal_free(stmt); |
| 2966 | |
| 2967 | /* Since we're at it update the wireaddr, feature bits */ |
| 2968 | stmt = db_prepare_v2( |
| 2969 | w->db, SQL("UPDATE peers SET address = ?, feature_bits = ? WHERE id = ?")); |
| 2970 | db_bind_text(stmt, addr); |
| 2971 | db_bind_talarr(stmt, peer->their_features); |
| 2972 | db_bind_u64(stmt, peer->dbid); |
| 2973 | db_exec_prepared_v2(take(stmt)); |
| 2974 | |
| 2975 | } else { |
| 2976 | /* Unknown peer, create it from scratch */ |
| 2977 | tal_free(stmt); |
| 2978 | stmt = db_prepare_v2(w->db, |
| 2979 | SQL("INSERT INTO peers (node_id, address, feature_bits) VALUES (?, ?, ?);") |
| 2980 | ); |
| 2981 | db_bind_node_id(stmt, &peer->id); |
| 2982 | db_bind_text(stmt, addr); |
| 2983 | db_bind_talarr(stmt, peer->their_features); |
| 2984 | db_exec_prepared_v2(stmt); |
| 2985 | peer_set_dbid(peer, db_last_insert_id_v2(take(stmt))); |
| 2986 | } |
| 2987 | |
| 2988 | if (peer->last_known_addr) { |
| 2989 | u8 *wire = tal_arr(tmpctx, u8, 0); |
| 2990 | towire_wireaddr(&wire, peer->last_known_addr); |
| 2991 | stmt = db_prepare_v2(w->db, |
| 2992 | SQL("UPDATE peers SET last_known_address = ? WHERE id = ?;")); |
| 2993 | db_bind_talarr(stmt, wire); |
| 2994 | db_bind_u64(stmt, peer->dbid); |
| 2995 | db_exec_prepared_v2(take(stmt)); |
| 2996 | } |
| 2997 | } |
| 2998 | |
| 2999 | bool channel_exists_by_id(struct wallet *w, u64 dbid) { |
| 3000 | struct db_stmt *stmt; |
no test coverage detected