|
|
|
@ -233,6 +233,9 @@ int topo_node_sqlite_init(sqlite3* db) { |
|
|
|
snprintf(isql, sizeof(isql), |
|
|
|
snprintf(isql, sizeof(isql), |
|
|
|
"ALTER TABLE \"%s\" ADD COLUMN connected INTEGER NOT NULL DEFAULT 0", tbl); |
|
|
|
"ALTER TABLE \"%s\" ADD COLUMN connected INTEGER NOT NULL DEFAULT 0", tbl); |
|
|
|
sqlite3_exec(db, isql, NULL, NULL, NULL); |
|
|
|
sqlite3_exec(db, isql, NULL, NULL, NULL); |
|
|
|
|
|
|
|
snprintf(isql, sizeof(isql), |
|
|
|
|
|
|
|
"ALTER TABLE \"%s\" ADD COLUMN source INTEGER NOT NULL DEFAULT 0", tbl); |
|
|
|
|
|
|
|
sqlite3_exec(db, isql, NULL, NULL, NULL); |
|
|
|
} |
|
|
|
} |
|
|
|
sqlite3_finalize(s); |
|
|
|
sqlite3_finalize(s); |
|
|
|
} |
|
|
|
} |
|
|
|
@ -279,7 +282,9 @@ int topo_node_sqlite_channel_put(sqlite3* db, const char* channel_id, |
|
|
|
" node_RTT INTEGER," /* RTT до узла в мс, часть индекса (node_type, node_RTT) */ |
|
|
|
" node_RTT INTEGER," /* RTT до узла в мс, часть индекса (node_type, node_RTT) */ |
|
|
|
" connected INTEGER NOT NULL DEFAULT 0," /* 1 = было активное подключение к узлу */ |
|
|
|
" connected INTEGER NOT NULL DEFAULT 0," /* 1 = было активное подключение к узлу */ |
|
|
|
" storage INTEGER NOT NULL DEFAULT 0," /* 1 = приоритетный хранитель аттачей */ |
|
|
|
" storage INTEGER NOT NULL DEFAULT 0," /* 1 = приоритетный хранитель аттачей */ |
|
|
|
" local_nick TEXT" /* локальный ник (GUI only, не синхронизируется) */ |
|
|
|
" local_nick TEXT," /* локальный ник (GUI only, не синхронизируется) */ |
|
|
|
|
|
|
|
" source INTEGER NOT NULL DEFAULT 0" /* 0=полная merkle-запись 1=упрощённый плейсхолдер topo_group
|
|
|
|
|
|
|
|
(не участвует в merkle-хеше, дополняется полной записью) */ |
|
|
|
")"; |
|
|
|
")"; |
|
|
|
|
|
|
|
|
|
|
|
int ddl_sz = snprintf(NULL, 0, ddl_tmpl, peers_tbl); |
|
|
|
int ddl_sz = snprintf(NULL, 0, ddl_tmpl, peers_tbl); |
|
|
|
@ -378,6 +383,29 @@ int topo_node_sqlite_member_put(sqlite3* db, const char* channel_id, uint64_t no |
|
|
|
return 0; |
|
|
|
return 0; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Упрощённый плейсхолдер мембера от topo_group: только node_id + pubkeys, source=1.
|
|
|
|
|
|
|
|
* Не участвует в merkle-хеше. Если запись уже есть (полная merkle) — не трогает её. |
|
|
|
|
|
|
|
* Позже полная merkle-запись дополняет/перезаписывает блоки и сбрасывает source=0. */ |
|
|
|
|
|
|
|
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) { |
|
|
|
|
|
|
|
if (!db || !channel_id || !x25519_pubkey || !ed25519_pubkey) return -1; |
|
|
|
|
|
|
|
char peers_tbl[80]; peers_table_name(channel_id, peers_tbl, sizeof(peers_tbl)); |
|
|
|
|
|
|
|
char sql[512]; |
|
|
|
|
|
|
|
snprintf(sql, sizeof(sql), |
|
|
|
|
|
|
|
"INSERT INTO \"%s\"(node_id, x25519_pubkey, ed25519_pubkey, join_sig, join_ts, source)" |
|
|
|
|
|
|
|
" VALUES(?,?,?,?,0,1)" |
|
|
|
|
|
|
|
" ON CONFLICT(node_id) DO NOTHING", peers_tbl); |
|
|
|
|
|
|
|
sqlite3_stmt* stmt = NULL; |
|
|
|
|
|
|
|
if (sqlite3_prepare_v2(db, sql, -1, &stmt, NULL) != SQLITE_OK) return -1; |
|
|
|
|
|
|
|
sqlite3_bind_int64(stmt, 1, (sqlite3_int64)node_id); |
|
|
|
|
|
|
|
sqlite3_bind_blob(stmt, 2, x25519_pubkey, 32, SQLITE_STATIC); |
|
|
|
|
|
|
|
sqlite3_bind_blob(stmt, 3, ed25519_pubkey, 32, SQLITE_STATIC); |
|
|
|
|
|
|
|
static const unsigned char zsig[PEERS_JOIN_SIG_SIZE] = {0}; |
|
|
|
|
|
|
|
sqlite3_bind_blob(stmt, 4, zsig, PEERS_JOIN_SIG_SIZE, SQLITE_STATIC); |
|
|
|
|
|
|
|
int rc = sqlite3_step(stmt); sqlite3_finalize(stmt); |
|
|
|
|
|
|
|
return rc == SQLITE_DONE ? 0 : -1; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/* Обновляет только блок мембера (keys/join/update_sig/update_ts/userinfo),
|
|
|
|
/* Обновляет только блок мембера (keys/join/update_sig/update_ts/userinfo),
|
|
|
|
* НЕ трогая adm_tags/adm_tags_sig/storage (блок владельца) и локальные поля. */ |
|
|
|
* НЕ трогая adm_tags/adm_tags_sig/storage (блок владельца) и локальные поля. */ |
|
|
|
int topo_node_sqlite_member_block_put(sqlite3* db, const char* channel_id, uint64_t node_id, |
|
|
|
int topo_node_sqlite_member_block_put(sqlite3* db, const char* channel_id, uint64_t node_id, |
|
|
|
@ -400,7 +428,8 @@ int topo_node_sqlite_member_block_put(sqlite3* db, const char* channel_id, uint6 |
|
|
|
" update_sig=excluded.update_sig," |
|
|
|
" update_sig=excluded.update_sig," |
|
|
|
" update_ts=excluded.update_ts," |
|
|
|
" update_ts=excluded.update_ts," |
|
|
|
" userinfo=excluded.userinfo," |
|
|
|
" userinfo=excluded.userinfo," |
|
|
|
" creator_sig=excluded.creator_sig", peers_tbl); |
|
|
|
" creator_sig=excluded.creator_sig," |
|
|
|
|
|
|
|
" source=0", peers_tbl); |
|
|
|
sqlite3_stmt* stmt = NULL; |
|
|
|
sqlite3_stmt* stmt = NULL; |
|
|
|
if (sqlite3_prepare_v2(db, sql, -1, &stmt, NULL) != SQLITE_OK) return -1; |
|
|
|
if (sqlite3_prepare_v2(db, sql, -1, &stmt, NULL) != SQLITE_OK) return -1; |
|
|
|
sqlite3_bind_int64(stmt, 1, (sqlite3_int64)node_id); |
|
|
|
sqlite3_bind_int64(stmt, 1, (sqlite3_int64)node_id); |
|
|
|
|