<commit_before>#include "JSONConfigState.h"
#include "System/Macros.h"
#include "ConfigServer.h"

#define JSON_STRING(obj, member) \
    json.PrintString(#member); \
    json.PrintColon(); \
    json.PrintString(obj->member);
    
#define JSON_NUMBER(obj, member) \
    json.PrintString(#member); \
    json.PrintColon(); \
    json.PrintNumber(obj->member);

#define JSON_BOOL(obj, member) \
    json.PrintString(#member); \
    json.PrintColon(); \
    json.PrintBool(obj->member);

#define JSON_IDLIST(obj, member) \
    json.PrintString(#member); \
    json.PrintColon(); \
    WriteIDList(obj->member);


JSONConfigState::JSONConfigState(ConfigServer* configServer_, ConfigState& configState_, JSONSession& json_) :
 configServer(configServer_),
 configState(configState_),
 json(json_)
{
}

void JSONConfigState::Write()
{
    json.Start();
    
    WriteQuorums();
    json.PrintComma();
    WriteDatabases();
    json.PrintComma();
    WriteTables();
    json.PrintComma();
    WriteShards();
    json.PrintComma();
    WriteShardServers();
    
    // json.End() is called when the session is flushed
}
    
void JSONConfigState::WriteQuorums()
{
    ConfigQuorum*   quorum;
    
    json.PrintString("quorums");
    json.PrintColon();
    json.PrintArrayStart();

    FOREACH(quorum, configState.quorums)
        WriteQuorum(quorum);

    json.PrintArrayEnd();
}

void JSONConfigState::WriteQuorum(ConfigQuorum* quorum)
{
    json.PrintObjectStart();
    
    json.PrintString("quorumID");
    json.PrintColon();
    json.PrintNumber(quorum->quorumID);
    json.PrintComma();

    json.PrintString("hasPrimary");
    json.PrintColon();
    if (quorum->hasPrimary)
        json.PrintString("true");
    else
        json.PrintString("false");
    json.PrintComma();

    if (quorum->hasPrimary)
    {
        json.PrintString("primaryID");
        json.PrintColon();
        json.PrintNumber(quorum->primaryID);
        json.PrintComma();
    }
    
    json.PrintString("paxosID");
    json.PrintColon();
    json.PrintNumber(quorum->paxosID);
    json.PrintComma();

    json.PrintString("activeNodes");
    json.PrintColon();
    WriteIDList(quorum->activeNodes);
    json.PrintComma();

    json.PrintString("inactiveNodes");
    json.PrintColon();
    WriteIDList(quorum->inactiveNodes);
    json.PrintComma();

    json.PrintString("shards");
    json.PrintColon();
    WriteIDList(quorum->shards);

    json.PrintObjectEnd();
}

void JSONConfigState::WriteDatabases()
{
    ConfigDatabase*   database;
    
    json.PrintString("databases");
    json.PrintColon();
    json.PrintArrayStart();

    FOREACH(database, configState.databases)
        WriteDatabase(database);

    json.PrintArrayEnd();
}

void JSONConfigState::WriteDatabase(ConfigDatabase* database)
{
    json.PrintObjectStart();
    
    JSON_NUMBER(database, databaseID);
    json.PrintComma();
    JSON_STRING(database, name);
    json.PrintComma();
    JSON_IDLIST(database, tables);
    
    json.PrintObjectEnd();
}

void JSONConfigState::WriteTables()
{
    ConfigTable*   table;
    
    json.PrintString("tables");
    json.PrintColon();
    json.PrintArrayStart();

    FOREACH(table, configState.tables)
        WriteTable(table);

    json.PrintArrayEnd();
}

void JSONConfigState::WriteTable(ConfigTable* table)
{
    json.PrintObjectStart();
    
    JSON_NUMBER(table, tableID);
    json.PrintComma();
    JSON_NUMBER(table, databaseID);
    json.PrintComma();
    JSON_STRING(table, name);
    json.PrintComma();
    JSON_IDLIST(table, shards);
    
    json.PrintObjectEnd();
}

void JSONConfigState::WriteShards()
{
    ConfigShard*   shard;
    
    json.PrintString("shards");
    json.PrintColon();
    json.PrintArrayStart();

    FOREACH(shard, configState.shards)
        WriteShard(shard);

    json.PrintArrayEnd();
}

void JSONConfigState::WriteShard(ConfigShard* shard)
{
    json.PrintObjectStart();
    
    JSON_NUMBER(shard, shardID);
    json.PrintComma();
    JSON_NUMBER(shard, quorumID);
    json.PrintComma();
    JSON_NUMBER(shard, tableID);
    json.PrintComma();
    JSON_STRING(shard, firstKey);
    json.PrintComma();
    JSON_STRING(shard, lastKey);
    json.PrintComma();
    JSON_NUMBER(shard, shardSize);
    json.PrintComma();
    JSON_STRING(shard, splitKey);
    json.PrintComma();
    JSON_BOOL(shard, isDeleted);

    json.PrintObjectEnd();
}

void JSONConfigState::WriteShardServers()
{
    ConfigShardServer*   shardServer;
    
    json.PrintString("shardServers");
    json.PrintColon();
    json.PrintArrayStart();

    FOREACH(shardServer, configState.shardServers)
        WriteShardServer(shardServer);

    json.PrintArrayEnd();
}

void JSONConfigState::WriteShardServer(ConfigShardServer* server)
{
    json.PrintObjectStart();
<commit_msg>Improved webadmin.<commit_after>#include "JSONConfigState.h"
#include "System/Macros.h"
#include "ConfigServer.h"

#define JSON_STRING(obj, member) \
    json.PrintString(#member); \
    json.PrintColon(); \
    json.PrintString(obj->member);
    
#define JSON_NUMBER(obj, member) \
    json.PrintString(#member); \
    json.PrintColon(); \
    json.PrintNumber(obj->member);

#define JSON_BOOL(obj, member) \
    json.PrintString(#member); \
    json.PrintColon(); \
    json.PrintBool(obj->member);

#define JSON_IDLIST(obj, member) \
    json.PrintString(#member); \
    json.PrintColon(); \
    WriteIDList(obj->member);


JSONConfigState::JSONConfigState(ConfigServer* configServer_, ConfigState& configState_, JSONSession& json_) :
 configServer(configServer_),
 configState(configState_),
 json(json_)
{
}

void JSONConfigState::Write()
{
    json.Start();
    
    WriteQuorums();
    json.PrintComma();
    WriteDatabases();
    json.PrintComma();
    WriteTables();
    json.PrintComma();
    WriteShards();
    json.PrintComma();
    WriteShardServers();
    
    // json.End() is called when the session is flushed
}
    
void JSONConfigState::WriteQuorums()
{
    ConfigQuorum*   quorum;
    
    json.PrintString("quorums");
    json.PrintColon();
    json.PrintArrayStart();

    FOREACH(quorum, configState.quorums)
        WriteQuorum(quorum);

    json.PrintArrayEnd();
}

void JSONConfigState::WriteQuorum(ConfigQuorum* quorum)
{
    json.PrintObjectStart();
    
    json.PrintString("quorumID");
    json.PrintColon();
    json.PrintNumber(quorum->quorumID);
    json.PrintComma();

    json.PrintString("hasPrimary");
    json.PrintColon();
    if (quorum->hasPrimary)
        json.PrintString("true");
    else
        json.PrintString("false");
    json.PrintComma();

    if (quorum->hasPrimary)
    {
        json.PrintString("primaryID");
        json.PrintColon();
        json.PrintNumber(quorum->primaryID);
        json.PrintComma();
    }
    
    json.PrintString("paxosID");
    json.PrintColon();
    json.PrintNumber(quorum->paxosID);
    json.PrintComma();

    json.PrintString("activeNodes");
    json.PrintColon();
    WriteIDList(quorum->activeNodes);
    json.PrintComma();

    json.PrintString("inactiveNodes");
    json.PrintColon();
    WriteIDList(quorum->inactiveNodes);
    json.PrintComma();

    json.PrintString("shards");
    json.PrintColon();
    WriteIDList(quorum->shards);

    json.PrintObjectEnd();
}

void JSONConfigState::WriteDatabases()
{
    ConfigDatabase*   database;
    
    json.PrintString("databases");
    json.PrintColon();
    json.PrintArrayStart();

    FOREACH(database, configState.databases)
        WriteDatabase(database);

    json.PrintArrayEnd();
}

void JSONConfigState::WriteDatabase(ConfigDatabase* database)
{
    json.PrintObjectStart();
    
    JSON_NUMBER(database, databaseID);
    json.PrintComma();
    JSON_STRING(database, name);
    json.PrintComma();
    JSON_IDLIST(database, tables);
    
    json.PrintObjectEnd();
}

void JSONConfigState::WriteTables()
{
    ConfigTable*   table;
    
    json.PrintString("tables");
    json.PrintColon();
    json.PrintArrayStart();

    FOREACH(table, configState.tables)
        WriteTable(table);

    json.PrintArrayEnd();
}

void JSONConfigState::WriteTable(ConfigTable* table)
{
    json.PrintObjectStart();
    
    JSON_NUMBER(table, tableID);
    json.PrintComma();
    JSON_NUMBER(table, databaseID);
    json.PrintComma();
    JSON_STRING(table, name);
    json.PrintComma();
    JSON_IDLIST(table, shards);
    
    json.PrintObjectEnd();
}

void JSONConfigState::WriteShards()
{
    ConfigShard*   shard;
    
    json.PrintString("shards");
    json.PrintColon();
    json.PrintArrayStart();

    FOREACH(shard, configState.shards)
        WriteShard(shard);

    json.PrintArrayEnd();
}

void JSONConfigState::WriteShard(ConfigShard* shard)
{
    json.PrintObjectStart();
    
    JSON_NUMBER(shard, shardID);
    json.PrintComma();
    JSON_NUMBER(shard, quorumID);
    json.PrintComma();
    JSON_NUMBER(shard, tableID);
    json.PrintComma();
    JSON_STRING(shard, firstKey);
    json.PrintComma();
    JSON_STRING(shard, lastKey);
    json.PrintComma();
    JSON_NUMBER(shard, shardSize);
    json.PrintComma();
    JSON_STRING(shard, splitKey);
    json.PrintComma();
    JSON_BOOL(shard, isSplitable);
    json.PrintComma();
    JSON_BOOL(shard, isDeleted);

    json.PrintObjectEnd();
}

void JSONConfigState::WriteShardServers()
{
    ConfigShardServer*   shardServer;
    
    json.PrintString("shardServers");
    json.PrintColon();
    json.PrintArrayStart();

    FOREACH(shardServer, configState.shardServers)
        WriteShardServer(shardServer);

    json.PrintArrayEnd();
}

void JSONConfigState::WriteShardServer(ConfigShardServer* server)
{
    json.PrintObjectStart();

{'fraction_non_alphanumeric': 0.13825698556144178, 'fraction_numerical': 0.0, 'mean_word_length': 3.5651967757230913, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 27, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '6808741', 'n_tokens_mistral': 3184, 'n_tokens_neox': 3128, 'n_words': 430}