Removed json.hpp from include files

This seems to speedup compile time, and also lead to smaller binary
v2.x_pg_PrepStmtBase_240714
René Cannaò 2 years ago
parent 483b8335d3
commit fde8ace076

@ -2,12 +2,7 @@
#define CLASS_BASE_SESSION_H
#include "proxysql.h"
/*
#include "MySQL_Variables.h"
#include "../deps/json/json.hpp"
using json = nlohmann::json;
*/
class MySQL_Session;
class PgSQL_Session;

@ -8,8 +8,13 @@
#include "cpp.h"
#include "MySQL_Variables.h"
#include "../deps/json/json.hpp"
using json = nlohmann::json;
//#include "../deps/json/json.hpp"
//using json = nlohmann::json;
#ifndef PROXYJSON
#define PROXYJSON
namespace nlohmann { class json; }
#endif // PROXYJSON
class MySQL_Session;
class PgSQL_Session;

@ -6,6 +6,11 @@
#include "MySQL_Protocol.h"
#ifndef PROXYJSON
#define PROXYJSON
namespace nlohmann { class json; }
#endif // PROXYJSON
#ifndef uchar
typedef unsigned char uchar;
#endif
@ -274,6 +279,6 @@ class MySQL_Data_Stream
void reset_connection();
void get_client_myds_info_json(json&);
void get_client_myds_info_json(nlohmann::json&);
};
#endif /* __CLASS_MYSQL_DATA_STREAM_H */

@ -23,8 +23,10 @@
#define SPOOKYV2
#endif
#include "../deps/json/json.hpp"
using json = nlohmann::json;
#ifndef PROXYJSON
#define PROXYJSON
namespace nlohmann { class json; }
#endif // PROXYJSON
#ifdef DEBUG
/* */
@ -300,7 +302,7 @@ class MyHGC { // MySQL Host Group Container
bool connection_warming;
bool configured; // this variable controls if attributes are configured or not. If not configured, they do not apply
bool initialized; // this variable controls if attributes were ever configured or not. Used by reset_attributes()
json ignore_session_variables_json; // the JSON format of ignore_session_variables
nlohmann::json * ignore_session_variables_json = NULL; // the JSON format of ignore_session_variables
} attributes;
struct {
int64_t weight;
@ -1204,47 +1206,5 @@ private:
uint64_t get_mysql_servers_v2_checksum(SQLite3_result* incoming_mysql_servers_v2 = nullptr);
};
/**
* @brief Helper function used to try to extract a value from the JSON field 'servers_defaults'.
*
* @param j JSON object constructed from 'servers_defaults' field.
* @param hid Hostgroup for which the 'servers_defaults' is defined in 'mysql_hostgroup_attributes'. Used for
* error logging.
* @param key The key for the value to be extracted.
* @param val_check A validation function, checks if the value is within a expected range.
*
* @return The value extracted from the supplied JSON. In case of error '-1', and error cause is logged.
*/
template <typename T, typename std::enable_if<std::is_integral<T>::value, bool>::type = true>
T j_get_srv_default_int_val(
const json& j, uint32_t hid, const string& key, const function<bool(T)>& val_check
) {
if (j.find(key) != j.end()) {
const json::value_t val_type = j[key].type();
const char* type_name = j[key].type_name();
if (val_type == json::value_t::number_integer || val_type == json::value_t::number_unsigned) {
T val = j[key].get<T>();
if (val_check(val)) {
return val;
} else {
proxy_error(
"Invalid value %ld supplied for 'mysql_hostgroup_attributes.servers_defaults.%s' for hostgroup %d."
" Value NOT UPDATED.\n",
static_cast<int64_t>(val), key.c_str(), hid
);
}
} else {
proxy_error(
"Invalid type '%s'(%hhu) supplied for 'mysql_hostgroup_attributes.servers_defaults.%s' for hostgroup %d."
" Value NOT UPDATED.\n",
type_name, static_cast<std::uint8_t>(val_type), key.c_str(), hid
);
}
}
return static_cast<T>(-1);
}
#endif /* __CLASS_MYSQL_HOSTGROUPS_MANAGER_H */

@ -15,8 +15,10 @@
#include "cpp.h"
#include "MySQL_Variables.h"
#include "../deps/json/json.hpp"
using json = nlohmann::json;
#ifndef PROXYJSON
#define PROXYJSON
namespace nlohmann { class json; }
#endif // PROXYJSON
extern class MySQL_Variables mysql_variables;
@ -428,7 +430,7 @@ class MySQL_Session
* params.
*/
void finishQuery(MySQL_Data_Stream *myds, MySQL_Connection *myconn, bool);
void generate_proxysql_internal_session_json(json &);
void generate_proxysql_internal_session_json(nlohmann::json &);
bool known_query_for_locked_on_hostgroup(uint64_t);
void unable_to_parse_set_statement(bool *);
bool has_any_backend();

@ -4,8 +4,11 @@
#include "proxysql.h"
#include "cpp.h"
#include "../deps/json/json.hpp"
using json = nlohmann::json;
#ifndef PROXYJSON
#define PROXYJSON
namespace nlohmann { class json; }
#endif // PROXYJSON
class PgSQL_SrvC;
@ -252,8 +255,8 @@ public:
class PgSQL_Variable {
public:
char *value = (char*)"";
void fill_server_internal_session(json &j, int conn_num, int idx);
void fill_client_internal_session(json &j, int idx);
void fill_server_internal_session(nlohmann::json &j, int conn_num, int idx);
void fill_client_internal_session(nlohmann::json &j, int idx);
};
enum pgsql_charset_action {

@ -23,8 +23,10 @@
#define SPOOKYV2
#endif
#include "../deps/json/json.hpp"
using json = nlohmann::json;
#ifndef PROXYJSON
#define PROXYJSON
namespace nlohmann { class json; }
#endif // PROXYJSON
#ifdef DEBUG
/* */
@ -287,7 +289,7 @@ class PgSQL_HGC { // MySQL Host Group Container
bool connection_warming;
bool configured; // this variable controls if attributes are configured or not. If not configured, they do not apply
bool initialized; // this variable controls if attributes were ever configured or not. Used by reset_attributes()
json ignore_session_variables_json; // the JSON format of ignore_session_variables
nlohmann::json * ignore_session_variables_json = NULL; // the JSON format of ignore_session_variables
} attributes;
struct {
int64_t weight;
@ -1117,47 +1119,5 @@ private:
uint64_t get_pgsql_servers_v2_checksum(SQLite3_result* incoming_pgsql_servers_v2 = nullptr);
};
/**
* @brief Helper function used to try to extract a value from the JSON field 'servers_defaults'.
*
* @param j JSON object constructed from 'servers_defaults' field.
* @param hid Hostgroup for which the 'servers_defaults' is defined in 'pgsql_hostgroup_attributes'. Used for
* error logging.
* @param key The key for the value to be extracted.
* @param val_check A validation function, checks if the value is within a expected range.
*
* @return The value extracted from the supplied JSON. In case of error '-1', and error cause is logged.
*/
template <typename T, typename std::enable_if<std::is_integral<T>::value, bool>::type = true>
T PgSQL_j_get_srv_default_int_val(
const json& j, uint32_t hid, const string& key, const function<bool(T)>& val_check
) {
if (j.find(key) != j.end()) {
const json::value_t val_type = j[key].type();
const char* type_name = j[key].type_name();
if (val_type == json::value_t::number_integer || val_type == json::value_t::number_unsigned) {
T val = j[key].get<T>();
if (val_check(val)) {
return val;
} else {
proxy_error(
"Invalid value %ld supplied for 'pgsql_hostgroup_attributes.servers_defaults.%s' for hostgroup %d."
" Value NOT UPDATED.\n",
static_cast<int64_t>(val), key.c_str(), hid
);
}
} else {
proxy_error(
"Invalid type '%s'(%hhu) supplied for 'pgsql_hostgroup_attributes.servers_defaults.%s' for hostgroup %d."
" Value NOT UPDATED.\n",
type_name, static_cast<std::uint8_t>(val_type), key.c_str(), hid
);
}
}
return static_cast<T>(-1);
}
#endif /* __CLASS_POSTGRESQL_HOSTGROUPS_MANAGER_H */

@ -10,8 +10,13 @@
#include "cpp.h"
#include "PgSQL_Variables.h"
#include "../deps/json/json.hpp"
using json = nlohmann::json;
//#include "../deps/json/json.hpp"
//using json = nlohmann::json;
#ifndef PROXYJSON
#define PROXYJSON
namespace nlohmann { class json; }
#endif // PROXYJSON
extern class PgSQL_Variables pgsql_variables;
@ -399,7 +404,7 @@ public:
* params.
*/
void finishQuery(PgSQL_Data_Stream* myds, PgSQL_Connection* myconn, bool);
void generate_proxysql_internal_session_json(json&);
void generate_proxysql_internal_session_json(nlohmann::json&);
bool known_query_for_locked_on_hostgroup(uint64_t);
void unable_to_parse_set_statement(bool*);
bool has_any_backend();

@ -4,8 +4,13 @@
#include "proxysql.h"
#include "cpp.h"
#include "../deps/json/json.hpp"
using json = nlohmann::json;
//#include "../deps/json/json.hpp"
//using json = nlohmann::json;
#ifndef PROXYJSON
#define PROXYJSON
namespace nlohmann { class json; }
#endif // PROXYJSON
//#define STATUS_MYSQL_CONNECTION_TRANSACTION 0x00000001 // DEPRECATED
#define STATUS_MYSQL_CONNECTION_COMPRESSION 0x00000002
@ -26,8 +31,8 @@ class MySQLServers_SslParams;
class Variable {
public:
char *value = (char*)"";
void fill_server_internal_session(json &j, int idx);
void fill_client_internal_session(json &j, int idx);
void fill_server_internal_session(nlohmann::json &j, int idx);
void fill_client_internal_session(nlohmann::json &j, int idx);
};
enum charset_action {
@ -264,7 +269,7 @@ class MySQL_Connection {
unsigned long get_mysql_thread_id() { return mysql ? mysql->thread_id : 0; }
static void set_ssl_params(MYSQL *mysql, MySQLServers_SslParams *ssl_params);
void get_mysql_info_json(json&);
void get_backend_conn_info_json(json&);
void get_mysql_info_json(nlohmann::json&);
void get_backend_conn_info_json(nlohmann::json&);
};
#endif /* __CLASS_MYSQL_CONNECTION_H */

@ -10,8 +10,12 @@
#define DIGEST_STATS_FAST_MINSIZE 100000
#define DIGEST_STATS_FAST_THREADS 4
#include "../deps/json/json.hpp"
//#include "../deps/json/json.hpp"
#ifndef PROXYJSON
#define PROXYJSON
namespace nlohmann { class json; }
#endif // PROXYJSON
#include "khash.h"
KHASH_MAP_INIT_STR(khStrInt, int)
@ -204,20 +208,7 @@ class Query_Processor_Output {
free(comment);
}
}
void get_info_json(nlohmann::json& j) {
j["create_new_connection"] = create_new_conn;
j["reconnect"] = reconnect;
j["sticky_conn"] = sticky_conn;
j["cache_timeout"] = cache_timeout;
j["cache_ttl"] = cache_ttl;
j["delay"] = delay;
j["destination_hostgroup"] = destination_hostgroup;
j["firewall_whitelist_mode"] = firewall_whitelist_mode;
j["multiplex"] = multiplex;
j["timeout"] = timeout;
j["retries"] = retries;
j["max_lag_ms"] = max_lag_ms;
}
void get_info_json(nlohmann::json& j);
};
static char *commands_counters_desc[MYSQL_COM_QUERY___NONE];

@ -41,7 +41,10 @@ void MyHGC::reset_attributes() {
attributes.comment = NULL;
free(attributes.ignore_session_variables_text);
attributes.ignore_session_variables_text = NULL;
attributes.ignore_session_variables_json = json();
if (attributes.ignore_session_variables_json) {
delete attributes.ignore_session_variables_json;
attributes.ignore_session_variables_json = NULL;
}
}
MyHGC::~MyHGC() {

@ -1,3 +1,7 @@
#include "../deps/json/json.hpp"
//using json = nlohmann::json;
#define PROXYJSON
//#include "btree_map.h"
#include "proxysql.h"
#include "cpp.h"
@ -10,6 +14,7 @@
#define SPOOKYV2
#endif
MySQL_Authentication::MySQL_Authentication() {
#ifdef DEBUG
if (glovars.has_debug==false) {

@ -1,3 +1,7 @@
#include "../deps/json/json.hpp"
using json = nlohmann::json;
#define PROXYJSON
#include "MySQL_HostGroups_Manager.h"
#include "proxysql.h"
#include "cpp.h"
@ -82,6 +86,50 @@ static int wait_for_mysql(MYSQL *mysql, int status) {
}
}
/**
* @brief Helper function used to try to extract a value from the JSON field 'servers_defaults'.
*
* @param j JSON object constructed from 'servers_defaults' field.
* @param hid Hostgroup for which the 'servers_defaults' is defined in 'mysql_hostgroup_attributes'. Used for
* error logging.
* @param key The key for the value to be extracted.
* @param val_check A validation function, checks if the value is within a expected range.
*
* @return The value extracted from the supplied JSON. In case of error '-1', and error cause is logged.
*/
template <typename T, typename std::enable_if<std::is_integral<T>::value, bool>::type = true>
T j_get_srv_default_int_val(
const json& j, uint32_t hid, const string& key, const function<bool(T)>& val_check
) {
if (j.find(key) != j.end()) {
const json::value_t val_type = j[key].type();
const char* type_name = j[key].type_name();
if (val_type == json::value_t::number_integer || val_type == json::value_t::number_unsigned) {
T val = j[key].get<T>();
if (val_check(val)) {
return val;
} else {
proxy_error(
"Invalid value %ld supplied for 'mysql_hostgroup_attributes.servers_defaults.%s' for hostgroup %d."
" Value NOT UPDATED.\n",
static_cast<int64_t>(val), key.c_str(), hid
);
}
} else {
proxy_error(
"Invalid type '%s'(%hhu) supplied for 'mysql_hostgroup_attributes.servers_defaults.%s' for hostgroup %d."
" Value NOT UPDATED.\n",
type_name, static_cast<std::uint8_t>(val_type), key.c_str(), hid
);
}
}
return static_cast<T>(-1);
}
//static void * HGCU_thread_run() {
static void * HGCU_thread_run() {
PtrArray *conn_array=new PtrArray();
@ -6369,14 +6417,16 @@ void MySQL_HostGroups_Manager::generate_mysql_hostgroup_attributes_table() {
if (myhgc->attributes.ignore_session_variables_text == NULL) {
myhgc->attributes.ignore_session_variables_text = strdup(ignore_session_variables);
if (strlen(ignore_session_variables) != 0) { // only if there is a valid JSON
myhgc->attributes.ignore_session_variables_json = json::parse(ignore_session_variables);
if (myhgc->attributes.ignore_session_variables_json != nullptr) { delete myhgc->attributes.ignore_session_variables_json; }
myhgc->attributes.ignore_session_variables_json = new json(json::parse(ignore_session_variables));
}
} else {
if (strcmp(myhgc->attributes.ignore_session_variables_text, ignore_session_variables) != 0) {
free(myhgc->attributes.ignore_session_variables_text);
myhgc->attributes.ignore_session_variables_text = strdup(ignore_session_variables);
if (strlen(ignore_session_variables) != 0) { // only if there is a valid JSON
myhgc->attributes.ignore_session_variables_json = json::parse(ignore_session_variables);
if (myhgc->attributes.ignore_session_variables_json != nullptr) { delete myhgc->attributes.ignore_session_variables_json; }
myhgc->attributes.ignore_session_variables_json = new json(json::parse(ignore_session_variables));
}
// TODO: assign the variables
}

@ -1,3 +1,7 @@
#include "../deps/json/json.hpp"
using json = nlohmann::json;
#define PROXYJSON
#include <fstream>
#include "proxysql.h"
#include "cpp.h"
@ -10,9 +14,6 @@
#include <dirent.h>
#include <libgen.h>
#include "../deps/json/json.hpp"
using json = nlohmann::json;
#ifdef DEBUG
#define DEB "_DEBUG"
#else

@ -7,6 +7,11 @@
0.2.0902
* original implementation
*/
#include "../deps/json/json.hpp"
using json = nlohmann::json;
#define PROXYJSON
#include <map>
#include <memory>
#include <mutex>

@ -1,3 +1,7 @@
#include "../deps/json/json.hpp"
using json = nlohmann::json;
#define PROXYJSON
#include <openssl/rand.h>
#include "proxysql.h"
#include "cpp.h"

@ -1,3 +1,7 @@
#include "../deps/json/json.hpp"
using json = nlohmann::json;
#define PROXYJSON
#include "MySQL_HostGroups_Manager.h"
#include "MySQL_Thread.h"
#include "proxysql.h"

@ -1,3 +1,7 @@
#include "../deps/json/json.hpp"
using json = nlohmann::json;
#define PROXYJSON
//#define __CLASS_STANDARD_MYSQL_THREAD_H
#include <functional>

@ -1,3 +1,7 @@
#include "../deps/json/json.hpp"
using json = nlohmann::json;
#define PROXYJSON
//#include "btree_map.h"
#include "proxysql.h"
#include "cpp.h"

@ -1,3 +1,7 @@
#include "../deps/json/json.hpp"
using json = nlohmann::json;
#define PROXYJSON
#include "PgSQL_HostGroups_Manager.h"
#include "proxysql.h"
#include "cpp.h"

@ -1,3 +1,7 @@
#include "../deps/json/json.hpp"
using json = nlohmann::json;
#define PROXYJSON
#include "PgSQL_HostGroups_Manager.h"
#include "proxysql.h"
#include "cpp.h"
@ -122,6 +126,49 @@ static int wait_for_pgsql(MYSQL *mysql, int status) {
}
}
/**
* @brief Helper function used to try to extract a value from the JSON field 'servers_defaults'.
*
* @param j JSON object constructed from 'servers_defaults' field.
* @param hid Hostgroup for which the 'servers_defaults' is defined in 'pgsql_hostgroup_attributes'. Used for
* error logging.
* @param key The key for the value to be extracted.
* @param val_check A validation function, checks if the value is within a expected range.
*
* @return The value extracted from the supplied JSON. In case of error '-1', and error cause is logged.
*/
template <typename T, typename std::enable_if<std::is_integral<T>::value, bool>::type = true>
T PgSQL_j_get_srv_default_int_val(
const json& j, uint32_t hid, const string& key, const function<bool(T)>& val_check
) {
if (j.find(key) != j.end()) {
const json::value_t val_type = j[key].type();
const char* type_name = j[key].type_name();
if (val_type == json::value_t::number_integer || val_type == json::value_t::number_unsigned) {
T val = j[key].get<T>();
if (val_check(val)) {
return val;
} else {
proxy_error(
"Invalid value %ld supplied for 'pgsql_hostgroup_attributes.servers_defaults.%s' for hostgroup %d."
" Value NOT UPDATED.\n",
static_cast<int64_t>(val), key.c_str(), hid
);
}
} else {
proxy_error(
"Invalid type '%s'(%hhu) supplied for 'pgsql_hostgroup_attributes.servers_defaults.%s' for hostgroup %d."
" Value NOT UPDATED.\n",
type_name, static_cast<std::uint8_t>(val_type), key.c_str(), hid
);
}
}
return static_cast<T>(-1);
}
#if 0
static void reader_cb(struct ev_loop *loop, struct ev_io *w, int revents) {
pthread_mutex_lock(&ev_loop_mutex);
@ -921,7 +968,10 @@ void PgSQL_HGC::reset_attributes() {
attributes.comment = NULL;
free(attributes.ignore_session_variables_text);
attributes.ignore_session_variables_text = NULL;
attributes.ignore_session_variables_json = json();
if (attributes.ignore_session_variables_json) {
delete attributes.ignore_session_variables_json;
attributes.ignore_session_variables_json = NULL;
}
}
PgSQL_HGC::~PgSQL_HGC() {
@ -7303,14 +7353,16 @@ void PgSQL_HostGroups_Manager::generate_pgsql_hostgroup_attributes_table() {
if (myhgc->attributes.ignore_session_variables_text == NULL) {
myhgc->attributes.ignore_session_variables_text = strdup(ignore_session_variables);
if (strlen(ignore_session_variables) != 0) { // only if there is a valid JSON
myhgc->attributes.ignore_session_variables_json = json::parse(ignore_session_variables);
if (myhgc->attributes.ignore_session_variables_json != nullptr) { delete myhgc->attributes.ignore_session_variables_json; }
myhgc->attributes.ignore_session_variables_json = new json(json::parse(ignore_session_variables));
}
} else {
if (strcmp(myhgc->attributes.ignore_session_variables_text, ignore_session_variables) != 0) {
free(myhgc->attributes.ignore_session_variables_text);
myhgc->attributes.ignore_session_variables_text = strdup(ignore_session_variables);
if (strlen(ignore_session_variables) != 0) { // only if there is a valid JSON
myhgc->attributes.ignore_session_variables_json = json::parse(ignore_session_variables);
if (myhgc->attributes.ignore_session_variables_json != nullptr) { delete myhgc->attributes.ignore_session_variables_json; }
myhgc->attributes.ignore_session_variables_json = new json(json::parse(ignore_session_variables));
}
// TODO: assign the variables
}

@ -1,3 +1,7 @@
#include "../deps/json/json.hpp"
using json = nlohmann::json;
#define PROXYJSON
#include <fstream>
#include "proxysql.h"
#include "cpp.h"
@ -10,8 +14,6 @@
#include <dirent.h>
#include <libgen.h>
#include "../deps/json/json.hpp"
using json = nlohmann::json;
#ifdef DEBUG
#define DEB "_DEBUG"

@ -1,3 +1,7 @@
#include "../deps/json/json.hpp"
using json = nlohmann::json;
#define PROXYJSON
#include "PgSQL_HostGroups_Manager.h"
#include "PgSQL_Thread.h"
#include "proxysql.h"

@ -1,3 +1,7 @@
#include "../deps/json/json.hpp"
using json = nlohmann::json;
#define PROXYJSON
//#define __CLASS_STANDARD_MYSQL_THREAD_H
#include <functional>

@ -1,3 +1,7 @@
#include "../deps/json/json.hpp"
using json = nlohmann::json;
#define PROXYJSON
#include <iostream> // std::cout
#include <sstream> // std::stringstream
#include <fstream>
@ -120,6 +124,10 @@ char * proxysql_version = NULL;
#include "proxysql_find_charset.h"
template <typename T, typename std::enable_if<std::is_integral<T>::value, bool>::type = true>
T j_get_srv_default_int_val(
const json& j, uint32_t hid, const string& key, const function<bool(T)>& val_check);
static const vector<string> mysql_servers_tablenames = {
"mysql_servers",

@ -1,3 +1,7 @@
#include "../deps/json/json.hpp"
using json = nlohmann::json;
#define PROXYJSON
#include "proxysql.h"
#include "cpp.h"
#include "httpserver.hpp"
@ -17,7 +21,7 @@
extern ProxySQL_Admin *GloAdmin;
using namespace httpserver;
using nlohmann::json;
//using nlohmann::json;
class sync_resource : public http_resource {
private:

@ -1,3 +1,7 @@
#include "../deps/json/json.hpp"
using json = nlohmann::json;
#define PROXYJSON
#include <iostream> // std::cout
#include <algorithm> // std::sort
#include <vector> // std::vector
@ -3403,6 +3407,21 @@ bool Query_Processor::pgsql_whitelisted_sqli_fingerprint(char* _s) {
return ret;
}
void Query_Processor_Output::get_info_json(json& j) {
j["create_new_connection"] = create_new_conn;
j["reconnect"] = reconnect;
j["sticky_conn"] = sticky_conn;
j["cache_timeout"] = cache_timeout;
j["cache_ttl"] = cache_ttl;
j["delay"] = delay;
j["destination_hostgroup"] = destination_hostgroup;
j["firewall_whitelist_mode"] = firewall_whitelist_mode;
j["multiplex"] = multiplex;
j["timeout"] = timeout;
j["retries"] = retries;
j["max_lag_ms"] = max_lag_ms;
}
template
Query_Processor_Output* Query_Processor::process_mysql_query<MySQL_Session*, Query_Info*>(Client_Session<MySQL_Session*>, void*, unsigned int, Query_Info_T<Query_Info*>);

@ -1,3 +1,7 @@
#include "../deps/json/json.hpp"
using json = nlohmann::json;
#define PROXYJSON
#include "MySQL_HostGroups_Manager.h"
#include "proxysql.h"
#include "cpp.h"

@ -1,3 +1,7 @@
#include "../deps/json/json.hpp"
using json = nlohmann::json;
#define PROXYJSON
#include "proxysql.h"
#include "cpp.h"
#include <zlib.h>

@ -1,4 +1,9 @@
#define MAIN_PROXY_SQLITE3
#include "../deps/json/json.hpp"
using json = nlohmann::json;
#define PROXYJSON
#include <iostream>
#include <thread>
#include "btree_map.h"

Loading…
Cancel
Save