You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
103 lines
5.5 KiB
103 lines
5.5 KiB
#ifndef TOPO_NODE_SQLITE_H |
|
#define TOPO_NODE_SQLITE_H |
|
|
|
#include <sqlite3.h> |
|
#include <stdint.h> |
|
#include <stddef.h> |
|
#include <time.h> |
|
#include "topo_node.h" |
|
|
|
#define PEERS_JOIN_SIG_SIZE 64 |
|
#define PEERS_JOIN_TS_SIZE 8 |
|
#define PEERS_UPDATE_SIG_SIZE 64 |
|
|
|
/* flags byte in wire format */ |
|
#define PEERS_FLAG_HAS_JOIN 0x01 |
|
|
|
int topo_node_sqlite_init(sqlite3* db); |
|
|
|
/* Персистентная запись адресов узла в node_addresses (источник истины — BGP/topo_group). |
|
* DELETE + INSERT из ni->v4_addrs/v6_addrs, классификация config_type/nat_type из SOCKMETA. */ |
|
int topo_node_sqlite_addrs_put(sqlite3* db, uint64_t node_id, struct TOPO_NODE* ni); |
|
|
|
/* Есть ли у узла запись мембера хотя бы в одной peers_<ch> (реальный мембер с ключами). */ |
|
int topo_node_sqlite_member_exists(sqlite3* db, uint64_t node_id); |
|
|
|
/* Список channel_id (uint64) всех peers_<ch>, где узел является членом. 0=ок. */ |
|
int topo_node_sqlite_get_member_channels(sqlite3* db, uint64_t node_id, |
|
uint64_t** out_ch_ids, int* out_count); |
|
|
|
int topo_node_sqlite_channel_put(sqlite3* db, const char* channel_id, |
|
const char* name, uint64_t owner_node_id, |
|
const uint8_t* x25519_pub, const uint8_t* x25519_priv, |
|
const uint8_t* ed25519_pub, const uint8_t* ed25519_priv, |
|
const uint8_t* signature); |
|
|
|
/* Упрощённый плейсхолдер мембера от topo_group (source=1, не участвует в merkle-хеше). */ |
|
int topo_node_sqlite_member_placeholder_put(sqlite3* db, const char* channel_id, uint64_t node_id, |
|
const uint8_t* x25519_pubkey, const uint8_t* ed25519_pubkey); |
|
|
|
/* Обновляет только блок мембера (keys/join/update_sig/update_ts/userinfo), не трогая блок владельца. */ |
|
int topo_node_sqlite_member_block_put(sqlite3* db, const char* channel_id, uint64_t node_id, |
|
const uint8_t* join_sig, uint64_t join_ts, |
|
const uint8_t* update_sig, uint64_t update_ts, |
|
const uint8_t* x25519_pubkey, const uint8_t* ed25519_pubkey, const char* userinfo, |
|
const uint8_t* creator_sig); |
|
|
|
/* Обновляет только блок владельца (adm_tags/adm_tags_sig/storage). */ |
|
int topo_node_sqlite_member_owner_put(sqlite3* db, const char* channel_id, uint64_t node_id, |
|
const char* adm_tags, const uint8_t* adm_tags_sig, int storage); |
|
|
|
int topo_node_sqlite_member_get_join(sqlite3* db, const char* channel_id, uint64_t node_id, |
|
uint8_t* join_sig_out, uint64_t* join_ts_out); |
|
|
|
int topo_node_sqlite_member_del(sqlite3* db, const char* channel_id, uint64_t node_id); |
|
|
|
int topo_node_sqlite_node_update_verified(sqlite3* db, uint64_t node_id, |
|
const char* name, const uint8_t* x25519, const uint8_t* ed25519, uint64_t update_ts, time_t created_at); |
|
|
|
int topo_node_sqlite_channel_get(sqlite3* db, const char* channel_id, |
|
char* name_out, int name_sz, uint64_t* owner_node_id, |
|
uint8_t* x25519_pub, uint8_t* ed25519_pub, uint8_t* signature); |
|
|
|
int topo_node_sqlite_channel_get_priv(sqlite3* db, const char* channel_id, |
|
uint8_t* ed25519_priv_out); |
|
|
|
/* Прочитать оба канальных privkey (x25519 + ed25519). Возвращает 0 если оба есть. */ |
|
int topo_node_sqlite_channel_get_privs(sqlite3* db, const char* channel_id, |
|
uint8_t* x25519_priv_out, uint8_t* ed25519_priv_out); |
|
|
|
/* Записать оба канальных privkey (импорт прав админа). */ |
|
int topo_node_sqlite_channel_set_privs(sqlite3* db, const char* channel_id, |
|
const uint8_t* x25519_priv, const uint8_t* ed25519_priv); |
|
|
|
int topo_node_sqlite_channel_peers_all(sqlite3* db, const char* channel_id, |
|
uint8_t* buf, size_t buf_sz, size_t* out_len); |
|
|
|
int topo_node_sqlite_node_set_online(sqlite3* db, uint64_t node_id, int online); |
|
int topo_node_sqlite_node_get_online(sqlite3* db, uint64_t node_id); |
|
int topo_node_sqlite_get_ed25519_pubkey(sqlite3* db, uint64_t node_id, uint8_t pubkey_out[32]); |
|
|
|
/** Пересчитывает node_type во всех peers_* таблицах на основе addr_type из node_addresses */ |
|
int topo_node_sqlite_nodeinfo_updated(sqlite3* db, uint64_t node_id); |
|
|
|
/** Обновляет RTT узла: node_addresses.rtt и все peers_*.node_RTT */ |
|
void topo_node_sqlite_update_rtt(sqlite3* db, uint64_t node_id, uint16_t rtt); |
|
|
|
/** |
|
* @brief Загружает TOPO_NODE из SQLite (ref_count=0). |
|
* @param groups нужен для выделения адресов из memory_pool |
|
* @return TOPO_NODE* или NULL если узел не найден/нет адресов |
|
* |
|
* Загружает pubkey, name из nodes, IPv4/UDP-адреса из node_addresses. |
|
* Вызывающий должен передать владение через topo_node_registry_acquire(). |
|
*/ |
|
struct TOPO_NODE* topo_node_sqlite_node_load(sqlite3* db, struct TOPO_GROUPS* groups, uint64_t node_id); |
|
|
|
int topo_node_sqlite_set_connected(sqlite3* db, const char* channel_id, uint64_t node_id, int connected); |
|
int topo_node_sqlite_get_connected_peers(sqlite3* db, const char* channel_id, uint64_t** out_ids, int* out_count); |
|
int topo_node_sqlite_get_public_peers(sqlite3* db, const char* channel_id, uint64_t** out_ids, int* out_count, uint64_t self_node_id); |
|
int topo_node_sqlite_get_local_peers(sqlite3* db, const char* channel_id, uint64_t** out_ids, int* out_count, uint64_t self_node_id); |
|
int topo_node_sqlite_get_supernode_peers(sqlite3* db, const char* channel_id, uint64_t** out_ids, int* out_count); |
|
|
|
#endif
|
|
|