chat: колонка source (плейсхолдер topo_group, вне merkle-хеша) + placeholder_put
This commit is contained in:
1 parent
b69dcb4eab
commit
195e903fe6
4 files changed
+45
-7
No files matched your search
@@ -233,6 +233,9 @@ int topo_node_sqlite_init(sqlite3* db) {
|
||||
snprintf(isql, sizeof(isql),
|
||||
"ALTER TABLE \"%s\" ADD COLUMN connected INTEGER NOT NULL DEFAULT 0", tbl);
|
||||
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);
|
||||
}
|
||||
@@ -279,7 +282,9 @@ int topo_node_sqlite_channel_put(sqlite3* db, const char* channel_id,
|
||||
" node_RTT INTEGER," /* RTT до узла в мс, часть индекса (node_type, node_RTT) */
|
||||
" connected 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);
|
||||
@@ -378,6 +383,29 @@ int topo_node_sqlite_member_put(sqlite3* db, const char* channel_id, uint64_t no
|
||||
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),
|
||||
* НЕ трогая adm_tags/adm_tags_sig/storage (блок владельца) и локальные поля. */
|
||||
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_ts=excluded.update_ts,"
|
||||
" userinfo=excluded.userinfo,"
|
||||
" creator_sig=excluded.creator_sig", peers_tbl);
|
||||
" creator_sig=excluded.creator_sig,"
|
||||
" source=0", 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);
|
||||
|
||||
Reference in new issue
Block a user