Read stream supernode role directly by member ID
This commit is contained in:
1 parent
d2f8e57118
commit
a4f508feed
2 files changed
+48
-6
No files matched your search
@@ -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;
|
||||
}
|
||||
Reference in new issue
Block a user