Loading mysql-test/r/ndb_config.result +1 −0 Original line number Diff line number Diff line Loading @@ -3,3 +3,4 @@ ndbd,1,localhost ndbd,2,localhost ndb_mgmd,3, mysqld,4, mysqld,5, mysqld,6, mysq 1 localhost 41943040 12582912 2 localhost 41943040 12582912 1 2 ndbd,1,localhost ndbd,2,localhost ndb_mgmd,3, mysqld,4, mysqld,5, mysqld,6, mysqld,7, mysql-test/t/ndb_config.test +1 −0 Original line number Diff line number Diff line Loading @@ -5,5 +5,6 @@ --exec $NDB_TOOLS_DIR/ndb_config --no-defaults --query=nodeid,host,DataMemory,IndexMemory --type=ndbd 2> /dev/null --exec $NDB_TOOLS_DIR/ndb_config --no-defaults -r \\n -f " " --query=nodeid,host,DataMemory,IndexMemory --type=ndbd 2> /dev/null --exec $NDB_TOOLS_DIR/ndb_config --no-defaults --query=nodeid --type=ndbd --host=localhost 2> /dev/null --exec $NDB_TOOLS_DIR/ndb_config --no-defaults --query=type,nodeid,host --config-file=$NDB_BACKUP_DIR/config.ini 2> /dev/null # End of 4.1 tests ndb/src/mgmsrv/InitConfigFileParser.cpp +12 −7 Original line number Diff line number Diff line Loading @@ -31,8 +31,10 @@ static void require(bool v) { if(!v) abort();} //**************************************************************************** // Ctor / Dtor //**************************************************************************** InitConfigFileParser::InitConfigFileParser(){ InitConfigFileParser::InitConfigFileParser(FILE * out) { m_info = new ConfigInfo(); m_errstream = out ? out : stdout; } InitConfigFileParser::~InitConfigFileParser() { Loading @@ -42,11 +44,12 @@ InitConfigFileParser::~InitConfigFileParser() { //**************************************************************************** // Read Config File //**************************************************************************** InitConfigFileParser::Context::Context(const ConfigInfo * info) InitConfigFileParser::Context::Context(const ConfigInfo * info, FILE * out) : m_userProperties(true), m_configValues(1000, 20) { m_config = new Properties(true); m_defaults = new Properties(true); m_errstream = out; } InitConfigFileParser::Context::~Context(){ Loading @@ -61,7 +64,7 @@ Config * InitConfigFileParser::parseConfig(const char * filename) { FILE * file = fopen(filename, "r"); if(file == 0){ ndbout << "Error opening file: " << filename << endl; fprintf(m_errstream, "Error opening file: %s\n", filename); return 0; } Loading @@ -75,7 +78,7 @@ InitConfigFileParser::parseConfig(FILE * file) { char line[MAX_LINE_LENGTH]; Context ctx(m_info); Context ctx(m_info, m_errstream); ctx.m_lineno = 0; ctx.m_currentSection = 0; Loading Loading @@ -571,8 +574,9 @@ InitConfigFileParser::Context::reportError(const char * fmt, ...){ va_start(ap, fmt); if (fmt != 0) BaseString::vsnprintf(buf, sizeof(buf)-1, fmt, ap); ndbout << "Error line " << m_lineno << ": " << buf << endl; va_end(ap); fprintf(m_errstream, "Error line %d: %s\n", m_lineno, buf); //m_currentSection->print(); } Loading @@ -585,6 +589,7 @@ InitConfigFileParser::Context::reportWarning(const char * fmt, ...){ va_start(ap, fmt); if (fmt != 0) BaseString::vsnprintf(buf, sizeof(buf)-1, fmt, ap); ndbout << "Warning line " << m_lineno << ": " << buf << endl; va_end(ap); fprintf(m_errstream, "Warning line %d: %s\n", m_lineno, buf); } ndb/src/mgmsrv/InitConfigFileParser.hpp +4 −2 Original line number Diff line number Diff line Loading @@ -34,11 +34,12 @@ class ConfigInfo; * object if the config file has correct syntax and semantic. */ class InitConfigFileParser { FILE * m_errstream; public: /** * Constructor */ InitConfigFileParser(); InitConfigFileParser(FILE * errstream = stdout); ~InitConfigFileParser(); /** Loading @@ -60,7 +61,7 @@ public: * Context = Which section in init config file we are currently parsing */ struct Context { Context(const ConfigInfo *); Context(const ConfigInfo *, FILE * out); ~Context(); ContextSectionType type; ///< Section type (e.g. default section,section) Loading @@ -82,6 +83,7 @@ public: ConfigValuesFactory m_configValues; // public: FILE * m_errstream; void reportError(const char * msg, ...); void reportWarning(const char * msg, ...); }; Loading ndb/tools/ndb_config.cpp +104 −59 Original line number Diff line number Diff line Loading @@ -40,6 +40,7 @@ static const char * g_type = 0; static const char * g_host = 0; static const char * g_field_delimiter=","; static const char * g_row_delimiter=" "; static const char * g_config_file = 0; int g_print_full_config, opt_ndb_shm; my_bool opt_core; Loading Loading @@ -90,6 +91,9 @@ static struct my_option my_long_options[] = { "rows", 'r', "Row separator", (gptr*) &g_row_delimiter, (gptr*) &g_row_delimiter, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, { "config-file", 256, "Path to config.ini", (gptr*) &g_config_file, (gptr*) &g_config_file, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, { 0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0} }; Loading Loading @@ -124,7 +128,7 @@ struct Match { int m_key; BaseString m_value; virtual int eval(NdbMgmHandle, const Iter&); virtual int eval(const Iter&); }; struct Apply Loading @@ -132,18 +136,21 @@ struct Apply Apply() {} Apply(int val) { m_key = val;} int m_key; virtual int apply(NdbMgmHandle, const Iter&); virtual int apply(const Iter&); }; struct NodeTypeApply : public Apply { virtual int apply(NdbMgmHandle, const Iter&); virtual int apply(const Iter&); }; static int parse_query(Vector<Apply*>&, int &argc, char**& argv); static int parse_where(Vector<Match*>&, int &argc, char**& argv); static int eval(NdbMgmHandle, const Iter&, const Vector<Match*>&); static int apply(NdbMgmHandle, const Iter&, const Vector<Apply*>&); static int eval(const Iter&, const Vector<Match*>&); static int apply(const Iter&, const Vector<Apply*>&); static ndb_mgm_configuration* fetch_configuration(); static ndb_mgm_configuration* load_configuration(); int main(int argc, char** argv){ NDB_INIT(argv[0]); Loading @@ -154,51 +161,16 @@ main(int argc, char** argv){ ndb_std_get_one_option))) return -1; NdbMgmHandle mgm = ndb_mgm_create_handle(); if(mgm == NULL) { fprintf(stderr, "Cannot create handle to management server.\n"); exit(-1); } ndb_mgm_set_error_stream(mgm, stderr); if (ndb_mgm_set_connectstring(mgm, g_connectstring)) { fprintf(stderr, "* %5d: %s\n", ndb_mgm_get_latest_error(mgm), ndb_mgm_get_latest_error_msg(mgm)); fprintf(stderr, "* %s", ndb_mgm_get_latest_error_desc(mgm)); exit(-1); } ndb_mgm_configuration * conf = 0; if(ndb_mgm_connect(mgm, try_reconnect-1, 5, 1)) { fprintf(stderr, "Connect failed"); fprintf(stderr, " code: %d, msg: %s\n", ndb_mgm_get_latest_error(mgm), ndb_mgm_get_latest_error_msg(mgm)); exit(-1); } else if(g_verbose) { fprintf(stderr, "Connected to %s:%d\n", ndb_mgm_get_connected_host(mgm), ndb_mgm_get_connected_port(mgm)); } if (g_config_file) conf = load_configuration(); else conf = fetch_configuration(); ndb_mgm_configuration * conf = ndb_mgm_get_configuration(mgm, 0); if (conf == 0) { fprintf(stderr, "Could not get configuration"); fprintf(stderr, "code: %d, msg: %s\n", ndb_mgm_get_latest_error(mgm), ndb_mgm_get_latest_error_msg(mgm)); exit(-1); } else if(g_verbose) { fprintf(stderr, "Fetched configuration\n"); return -1; } Vector<Apply*> select_list; Loading @@ -224,12 +196,12 @@ main(int argc, char** argv){ iter.first(); for(iter.first(); iter.valid(); iter.next()) { if(eval(mgm, iter, where_clause)) if(eval(iter, where_clause)) { if(prev) printf("%s", g_row_delimiter); prev= true; apply(mgm, iter, select_list); apply(iter, select_list); } } printf("\n"); Loading Loading @@ -323,11 +295,11 @@ template class Vector<Match*>; static int eval(NdbMgmHandle mgm, const Iter& iter, const Vector<Match*>& where) eval(const Iter& iter, const Vector<Match*>& where) { for(unsigned i = 0; i<where.size(); i++) { if(where[i]->eval(mgm, iter) == 0) if(where[i]->eval(iter) == 0) return 0; } Loading @@ -336,11 +308,11 @@ eval(NdbMgmHandle mgm, const Iter& iter, const Vector<Match*>& where) static int apply(NdbMgmHandle mgm, const Iter& iter, const Vector<Apply*>& list) apply(const Iter& iter, const Vector<Apply*>& list) { for(unsigned i = 0; i<list.size(); i++) { list[i]->apply(mgm, iter); list[i]->apply(iter); if(i + 1 != list.size()) printf("%s", g_field_delimiter); } Loading @@ -348,19 +320,19 @@ apply(NdbMgmHandle mgm, const Iter& iter, const Vector<Apply*>& list) } int Match::eval(NdbMgmHandle h, const Iter& iter) Match::eval(const Iter& iter) { Uint32 val32; Uint64 val64; const char* valc; if (iter.get(m_key, &val32) == 0) { if(atoi(m_value.c_str()) != val32) if(atoi(m_value.c_str()) != (int)val32) return 0; } else if(iter.get(m_key, &val64) == 0) { if(strtoll(m_value.c_str(), (char **)NULL, 10) != val64) if(strtoll(m_value.c_str(), (char **)NULL, 10) != (long long)val64) return 0; } else if(iter.get(m_key, &valc) == 0) Loading @@ -376,7 +348,7 @@ Match::eval(NdbMgmHandle h, const Iter& iter) } int Apply::apply(NdbMgmHandle h, const Iter& iter) Apply::apply(const Iter& iter) { Uint32 val32; Uint64 val64; Loading @@ -397,7 +369,7 @@ Apply::apply(NdbMgmHandle h, const Iter& iter) } int NodeTypeApply::apply(NdbMgmHandle h, const Iter& iter) NodeTypeApply::apply(const Iter& iter) { Uint32 val32; if (iter.get(CFG_TYPE_OF_SECTION, &val32) == 0) Loading @@ -406,3 +378,76 @@ NodeTypeApply::apply(NdbMgmHandle h, const Iter& iter) } return 0; } ndb_mgm_configuration* fetch_configuration() { ndb_mgm_configuration* conf = 0; NdbMgmHandle mgm = ndb_mgm_create_handle(); if(mgm == NULL) { fprintf(stderr, "Cannot create handle to management server.\n"); return 0; } ndb_mgm_set_error_stream(mgm, stderr); if (ndb_mgm_set_connectstring(mgm, g_connectstring)) { fprintf(stderr, "* %5d: %s\n", ndb_mgm_get_latest_error(mgm), ndb_mgm_get_latest_error_msg(mgm)); fprintf(stderr, "* %s", ndb_mgm_get_latest_error_desc(mgm)); goto noconnect; } if(ndb_mgm_connect(mgm, try_reconnect-1, 5, 1)) { fprintf(stderr, "Connect failed"); fprintf(stderr, " code: %d, msg: %s\n", ndb_mgm_get_latest_error(mgm), ndb_mgm_get_latest_error_msg(mgm)); goto noconnect; } else if(g_verbose) { fprintf(stderr, "Connected to %s:%d\n", ndb_mgm_get_connected_host(mgm), ndb_mgm_get_connected_port(mgm)); } conf = ndb_mgm_get_configuration(mgm, 0); if(conf == 0) { fprintf(stderr, "Could not get configuration"); fprintf(stderr, "code: %d, msg: %s\n", ndb_mgm_get_latest_error(mgm), ndb_mgm_get_latest_error_msg(mgm)); } else if(g_verbose) { fprintf(stderr, "Fetched configuration\n"); } ndb_mgm_disconnect(mgm); noconnect: ndb_mgm_destroy_handle(&mgm); return conf; } #include <Config.hpp> ndb_mgm_configuration* load_configuration() { InitConfigFileParser parser(stderr); if (g_verbose) fprintf(stderr, "Using config.ini : %s", g_config_file); Config* conf = parser.parseConfig(g_config_file); if (conf) return conf->m_configValues; return 0; } Loading
mysql-test/r/ndb_config.result +1 −0 Original line number Diff line number Diff line Loading @@ -3,3 +3,4 @@ ndbd,1,localhost ndbd,2,localhost ndb_mgmd,3, mysqld,4, mysqld,5, mysqld,6, mysq 1 localhost 41943040 12582912 2 localhost 41943040 12582912 1 2 ndbd,1,localhost ndbd,2,localhost ndb_mgmd,3, mysqld,4, mysqld,5, mysqld,6, mysqld,7,
mysql-test/t/ndb_config.test +1 −0 Original line number Diff line number Diff line Loading @@ -5,5 +5,6 @@ --exec $NDB_TOOLS_DIR/ndb_config --no-defaults --query=nodeid,host,DataMemory,IndexMemory --type=ndbd 2> /dev/null --exec $NDB_TOOLS_DIR/ndb_config --no-defaults -r \\n -f " " --query=nodeid,host,DataMemory,IndexMemory --type=ndbd 2> /dev/null --exec $NDB_TOOLS_DIR/ndb_config --no-defaults --query=nodeid --type=ndbd --host=localhost 2> /dev/null --exec $NDB_TOOLS_DIR/ndb_config --no-defaults --query=type,nodeid,host --config-file=$NDB_BACKUP_DIR/config.ini 2> /dev/null # End of 4.1 tests
ndb/src/mgmsrv/InitConfigFileParser.cpp +12 −7 Original line number Diff line number Diff line Loading @@ -31,8 +31,10 @@ static void require(bool v) { if(!v) abort();} //**************************************************************************** // Ctor / Dtor //**************************************************************************** InitConfigFileParser::InitConfigFileParser(){ InitConfigFileParser::InitConfigFileParser(FILE * out) { m_info = new ConfigInfo(); m_errstream = out ? out : stdout; } InitConfigFileParser::~InitConfigFileParser() { Loading @@ -42,11 +44,12 @@ InitConfigFileParser::~InitConfigFileParser() { //**************************************************************************** // Read Config File //**************************************************************************** InitConfigFileParser::Context::Context(const ConfigInfo * info) InitConfigFileParser::Context::Context(const ConfigInfo * info, FILE * out) : m_userProperties(true), m_configValues(1000, 20) { m_config = new Properties(true); m_defaults = new Properties(true); m_errstream = out; } InitConfigFileParser::Context::~Context(){ Loading @@ -61,7 +64,7 @@ Config * InitConfigFileParser::parseConfig(const char * filename) { FILE * file = fopen(filename, "r"); if(file == 0){ ndbout << "Error opening file: " << filename << endl; fprintf(m_errstream, "Error opening file: %s\n", filename); return 0; } Loading @@ -75,7 +78,7 @@ InitConfigFileParser::parseConfig(FILE * file) { char line[MAX_LINE_LENGTH]; Context ctx(m_info); Context ctx(m_info, m_errstream); ctx.m_lineno = 0; ctx.m_currentSection = 0; Loading Loading @@ -571,8 +574,9 @@ InitConfigFileParser::Context::reportError(const char * fmt, ...){ va_start(ap, fmt); if (fmt != 0) BaseString::vsnprintf(buf, sizeof(buf)-1, fmt, ap); ndbout << "Error line " << m_lineno << ": " << buf << endl; va_end(ap); fprintf(m_errstream, "Error line %d: %s\n", m_lineno, buf); //m_currentSection->print(); } Loading @@ -585,6 +589,7 @@ InitConfigFileParser::Context::reportWarning(const char * fmt, ...){ va_start(ap, fmt); if (fmt != 0) BaseString::vsnprintf(buf, sizeof(buf)-1, fmt, ap); ndbout << "Warning line " << m_lineno << ": " << buf << endl; va_end(ap); fprintf(m_errstream, "Warning line %d: %s\n", m_lineno, buf); }
ndb/src/mgmsrv/InitConfigFileParser.hpp +4 −2 Original line number Diff line number Diff line Loading @@ -34,11 +34,12 @@ class ConfigInfo; * object if the config file has correct syntax and semantic. */ class InitConfigFileParser { FILE * m_errstream; public: /** * Constructor */ InitConfigFileParser(); InitConfigFileParser(FILE * errstream = stdout); ~InitConfigFileParser(); /** Loading @@ -60,7 +61,7 @@ public: * Context = Which section in init config file we are currently parsing */ struct Context { Context(const ConfigInfo *); Context(const ConfigInfo *, FILE * out); ~Context(); ContextSectionType type; ///< Section type (e.g. default section,section) Loading @@ -82,6 +83,7 @@ public: ConfigValuesFactory m_configValues; // public: FILE * m_errstream; void reportError(const char * msg, ...); void reportWarning(const char * msg, ...); }; Loading
ndb/tools/ndb_config.cpp +104 −59 Original line number Diff line number Diff line Loading @@ -40,6 +40,7 @@ static const char * g_type = 0; static const char * g_host = 0; static const char * g_field_delimiter=","; static const char * g_row_delimiter=" "; static const char * g_config_file = 0; int g_print_full_config, opt_ndb_shm; my_bool opt_core; Loading Loading @@ -90,6 +91,9 @@ static struct my_option my_long_options[] = { "rows", 'r', "Row separator", (gptr*) &g_row_delimiter, (gptr*) &g_row_delimiter, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, { "config-file", 256, "Path to config.ini", (gptr*) &g_config_file, (gptr*) &g_config_file, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, { 0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0} }; Loading Loading @@ -124,7 +128,7 @@ struct Match { int m_key; BaseString m_value; virtual int eval(NdbMgmHandle, const Iter&); virtual int eval(const Iter&); }; struct Apply Loading @@ -132,18 +136,21 @@ struct Apply Apply() {} Apply(int val) { m_key = val;} int m_key; virtual int apply(NdbMgmHandle, const Iter&); virtual int apply(const Iter&); }; struct NodeTypeApply : public Apply { virtual int apply(NdbMgmHandle, const Iter&); virtual int apply(const Iter&); }; static int parse_query(Vector<Apply*>&, int &argc, char**& argv); static int parse_where(Vector<Match*>&, int &argc, char**& argv); static int eval(NdbMgmHandle, const Iter&, const Vector<Match*>&); static int apply(NdbMgmHandle, const Iter&, const Vector<Apply*>&); static int eval(const Iter&, const Vector<Match*>&); static int apply(const Iter&, const Vector<Apply*>&); static ndb_mgm_configuration* fetch_configuration(); static ndb_mgm_configuration* load_configuration(); int main(int argc, char** argv){ NDB_INIT(argv[0]); Loading @@ -154,51 +161,16 @@ main(int argc, char** argv){ ndb_std_get_one_option))) return -1; NdbMgmHandle mgm = ndb_mgm_create_handle(); if(mgm == NULL) { fprintf(stderr, "Cannot create handle to management server.\n"); exit(-1); } ndb_mgm_set_error_stream(mgm, stderr); if (ndb_mgm_set_connectstring(mgm, g_connectstring)) { fprintf(stderr, "* %5d: %s\n", ndb_mgm_get_latest_error(mgm), ndb_mgm_get_latest_error_msg(mgm)); fprintf(stderr, "* %s", ndb_mgm_get_latest_error_desc(mgm)); exit(-1); } ndb_mgm_configuration * conf = 0; if(ndb_mgm_connect(mgm, try_reconnect-1, 5, 1)) { fprintf(stderr, "Connect failed"); fprintf(stderr, " code: %d, msg: %s\n", ndb_mgm_get_latest_error(mgm), ndb_mgm_get_latest_error_msg(mgm)); exit(-1); } else if(g_verbose) { fprintf(stderr, "Connected to %s:%d\n", ndb_mgm_get_connected_host(mgm), ndb_mgm_get_connected_port(mgm)); } if (g_config_file) conf = load_configuration(); else conf = fetch_configuration(); ndb_mgm_configuration * conf = ndb_mgm_get_configuration(mgm, 0); if (conf == 0) { fprintf(stderr, "Could not get configuration"); fprintf(stderr, "code: %d, msg: %s\n", ndb_mgm_get_latest_error(mgm), ndb_mgm_get_latest_error_msg(mgm)); exit(-1); } else if(g_verbose) { fprintf(stderr, "Fetched configuration\n"); return -1; } Vector<Apply*> select_list; Loading @@ -224,12 +196,12 @@ main(int argc, char** argv){ iter.first(); for(iter.first(); iter.valid(); iter.next()) { if(eval(mgm, iter, where_clause)) if(eval(iter, where_clause)) { if(prev) printf("%s", g_row_delimiter); prev= true; apply(mgm, iter, select_list); apply(iter, select_list); } } printf("\n"); Loading Loading @@ -323,11 +295,11 @@ template class Vector<Match*>; static int eval(NdbMgmHandle mgm, const Iter& iter, const Vector<Match*>& where) eval(const Iter& iter, const Vector<Match*>& where) { for(unsigned i = 0; i<where.size(); i++) { if(where[i]->eval(mgm, iter) == 0) if(where[i]->eval(iter) == 0) return 0; } Loading @@ -336,11 +308,11 @@ eval(NdbMgmHandle mgm, const Iter& iter, const Vector<Match*>& where) static int apply(NdbMgmHandle mgm, const Iter& iter, const Vector<Apply*>& list) apply(const Iter& iter, const Vector<Apply*>& list) { for(unsigned i = 0; i<list.size(); i++) { list[i]->apply(mgm, iter); list[i]->apply(iter); if(i + 1 != list.size()) printf("%s", g_field_delimiter); } Loading @@ -348,19 +320,19 @@ apply(NdbMgmHandle mgm, const Iter& iter, const Vector<Apply*>& list) } int Match::eval(NdbMgmHandle h, const Iter& iter) Match::eval(const Iter& iter) { Uint32 val32; Uint64 val64; const char* valc; if (iter.get(m_key, &val32) == 0) { if(atoi(m_value.c_str()) != val32) if(atoi(m_value.c_str()) != (int)val32) return 0; } else if(iter.get(m_key, &val64) == 0) { if(strtoll(m_value.c_str(), (char **)NULL, 10) != val64) if(strtoll(m_value.c_str(), (char **)NULL, 10) != (long long)val64) return 0; } else if(iter.get(m_key, &valc) == 0) Loading @@ -376,7 +348,7 @@ Match::eval(NdbMgmHandle h, const Iter& iter) } int Apply::apply(NdbMgmHandle h, const Iter& iter) Apply::apply(const Iter& iter) { Uint32 val32; Uint64 val64; Loading @@ -397,7 +369,7 @@ Apply::apply(NdbMgmHandle h, const Iter& iter) } int NodeTypeApply::apply(NdbMgmHandle h, const Iter& iter) NodeTypeApply::apply(const Iter& iter) { Uint32 val32; if (iter.get(CFG_TYPE_OF_SECTION, &val32) == 0) Loading @@ -406,3 +378,76 @@ NodeTypeApply::apply(NdbMgmHandle h, const Iter& iter) } return 0; } ndb_mgm_configuration* fetch_configuration() { ndb_mgm_configuration* conf = 0; NdbMgmHandle mgm = ndb_mgm_create_handle(); if(mgm == NULL) { fprintf(stderr, "Cannot create handle to management server.\n"); return 0; } ndb_mgm_set_error_stream(mgm, stderr); if (ndb_mgm_set_connectstring(mgm, g_connectstring)) { fprintf(stderr, "* %5d: %s\n", ndb_mgm_get_latest_error(mgm), ndb_mgm_get_latest_error_msg(mgm)); fprintf(stderr, "* %s", ndb_mgm_get_latest_error_desc(mgm)); goto noconnect; } if(ndb_mgm_connect(mgm, try_reconnect-1, 5, 1)) { fprintf(stderr, "Connect failed"); fprintf(stderr, " code: %d, msg: %s\n", ndb_mgm_get_latest_error(mgm), ndb_mgm_get_latest_error_msg(mgm)); goto noconnect; } else if(g_verbose) { fprintf(stderr, "Connected to %s:%d\n", ndb_mgm_get_connected_host(mgm), ndb_mgm_get_connected_port(mgm)); } conf = ndb_mgm_get_configuration(mgm, 0); if(conf == 0) { fprintf(stderr, "Could not get configuration"); fprintf(stderr, "code: %d, msg: %s\n", ndb_mgm_get_latest_error(mgm), ndb_mgm_get_latest_error_msg(mgm)); } else if(g_verbose) { fprintf(stderr, "Fetched configuration\n"); } ndb_mgm_disconnect(mgm); noconnect: ndb_mgm_destroy_handle(&mgm); return conf; } #include <Config.hpp> ndb_mgm_configuration* load_configuration() { InitConfigFileParser parser(stderr); if (g_verbose) fprintf(stderr, "Using config.ini : %s", g_config_file); Config* conf = parser.parseConfig(g_config_file); if (conf) return conf->m_configValues; return 0; }