Read stream supernode role directly by member ID

This commit is contained in:
evgeny committed 2026-10-14 16:49:40 +02:00
1 parent d2f8e57118
commit a4f508feed
2 files changed
+48 -6

No files matched your search

+23 -6
View File
@@ -221,13 +221,30 @@ int stream_member_online(struct UTUN_INSTANCE *inst, uint64_t group_id, uint64_t
return node && topo_node_best_path(node) != NULL;
}
/* Роль относится к каналу, не к устройству или глобальному media_delivery. */
/* Роль читается по ID из блока владельца канала, без загрузки остальных участников и снимков узлов. */
int stream_member_supernode(struct UTUN_INSTANCE *inst, uint64_t group_id, uint64_t member_id) {
struct TOPO_GROUP *group = inst && inst->topo_groups ? topo_groups_find(inst->topo_groups, group_id) : NULL;
if (!group || group->stopping || group->group_type != TOPO_GROUP_TYPE_CHAT) return 0;
struct topo_connect_peer *peers = NULL; size_t count = 0;
if (topo_node_sqlite_get_connect_peers(inst->topo_sqlite_db, group->channel_id, &peers, &count) < 0) return -1;
int supernode = 0;
for (size_t i = 0; i < count; i++) if (peers[i].node_id == member_id) { supernode = peers[i].supernode; break; }
u_free(peers); return supernode;
if (!inst->topo_sqlite_db || !group->channel_id[0]) {
DEBUG_ERROR(DEBUG_CATEGORY_STREAM, "member role missing DB/channel group=%llx", (unsigned long long)group_id); return -1;
}
for (const char *p = group->channel_id; *p; p++) if (*p < '0' || *p > '9') {
DEBUG_ERROR(DEBUG_CATEGORY_STREAM, "member role invalid channel namespace group=%llx", (unsigned long long)group_id); return -1;
}
char query[192];
snprintf(query, sizeof(query), "SELECT adm_tags FROM \"peers_%s\" WHERE node_id=? AND deleted=0", group->channel_id);
sqlite3 *db = inst->topo_sqlite_db; sqlite3_stmt *statement = NULL;
int result = -1, rc = sqlite3_prepare_v2(db, query, -1, &statement, NULL);
if (rc == SQLITE_OK) rc = sqlite3_bind_int64(statement, 1, (sqlite3_int64)member_id);
if (rc == SQLITE_OK) rc = sqlite3_step(statement);
if (rc == SQLITE_ROW) {
const char *tags = (const char *)sqlite3_column_text(statement, 0); char value[16];
result = tags && json_flat_get(tags, "supernode", value, sizeof(value)) == 0 && !strcmp(value, "yes");
} else if (rc == SQLITE_DONE) result = 0;
else DEBUG_ERROR(DEBUG_CATEGORY_STREAM, "member role query failed group=%llx member=%llx rc=%d: %s",
(unsigned long long)group_id, (unsigned long long)member_id, rc, sqlite3_errmsg(db));
sqlite3_finalize(statement);
DEBUG_TRACE(DEBUG_CATEGORY_STREAM, "member role group=%llx member=%llx supernode=%d",
(unsigned long long)group_id, (unsigned long long)member_id, result);
return result;
}