int main(int argc, char** argv){ BaseString sql; if ((handle_options(&argc, &argv, my_long_options, NULL))) return 2; printf("#\n"); printf("# SQL commands for creating the tables in MySQL Server which\n"); printf("# are used by the NDBINFO storage engine to access system\n"); printf("# information and statistics from MySQL Cluster\n"); printf("#\n"); printf("# Only create objects if NDBINFO is supported\n"); printf("SELECT @have_ndbinfo:= COUNT(*) FROM " "information_schema.engines WHERE engine='NDBINFO' " "AND support IN ('YES', 'DEFAULT');\n\n"); printf("# Only create objects if version >= 7.1\n"); sql.assfmt("SELECT @have_ndbinfo:=" " (@@ndbinfo_version >= (7 << 16) | (1 << 8)) || @ndbinfo_skip_version_check"); print_conditional_sql(sql); sql.assfmt("CREATE DATABASE IF NOT EXISTS `%s`", opt_ndbinfo_db); print_conditional_sql(sql); printf("# Set NDBINFO in offline mode during (re)create of tables\n"); printf("# and views to avoid errors caused by no such table or\n"); printf("# different table definition in NDB\n"); sql.assfmt("SET @@global.ndbinfo_offline=TRUE"); print_conditional_sql(sql); { // Lookup tables which existed in other engine before // they were hardcoded into ha_ndbinfo. Drop to allow // the new ndbinfo tables(and in some cases views) to // be created const char* old_lookups[] = { "blocks", "dict_obj_types", "config_params", "ndb$dbtc_apiconnect_state", "ndb$dblqh_tcconnect_state" }; printf("# Drop obsolete lookups in %s\n", opt_ndbinfo_db); for (size_t i = 0; i < sizeof(old_lookups)/sizeof(old_lookups[0]); i++) { sql.assfmt("DROP TABLE IF EXISTS `%s`.`%s`", opt_ndbinfo_db, old_lookups[i]); print_conditional_sql(sql); } } printf("# Drop any old views in %s\n", opt_ndbinfo_db); for (size_t i = 0; i < num_views; i++) { sql.assfmt("DROP VIEW IF EXISTS `%s`.`%s`", opt_ndbinfo_db, views[i].name); print_conditional_sql(sql); } printf("# Drop any old lookup tables in %s\n", opt_ndbinfo_db); for (size_t i = 0; i < num_lookups; i++) { BaseString table_name = replace_tags(lookups[i].name); sql.assfmt("DROP TABLE IF EXISTS `%s`.`%s`", opt_ndbinfo_db, table_name.c_str()); print_conditional_sql(sql); } for (int i = 0; i < Ndbinfo::getNumTables(); i++) { const Ndbinfo::Table& table = Ndbinfo::getTable(i); printf("# %s.%s%s\n", opt_ndbinfo_db, opt_table_prefix, table.m.name); /* Drop the table if it exists */ sql.assfmt("DROP TABLE IF EXISTS `%s`.`%s%s`", opt_ndbinfo_db, opt_table_prefix, table.m.name); print_conditional_sql(sql); /* Create the table */ sql.assfmt("CREATE TABLE `%s`.`%s%s` (", opt_ndbinfo_db, opt_table_prefix, table.m.name); const char* separator = ""; for(int j = 0; j < table.m.ncols ; j++) { const Ndbinfo::Column& col = table.col[j]; sql.appfmt("%s", separator); separator = ","; sql.appfmt("`%s` ", col.name); switch(col.coltype) { case Ndbinfo::Number: sql.appfmt("INT UNSIGNED"); break; case Ndbinfo:: Number64: sql.appfmt("BIGINT UNSIGNED"); break; case Ndbinfo::String: sql.appfmt("VARCHAR(512)"); break; default: fprintf(stderr, "unknown coltype: %d\n", col.coltype); abort(); break; } if (col.comment[0] != '\0') sql.appfmt(" COMMENT \"%s\"", col.comment); } sql.appfmt(") COMMENT=\"%s\" ENGINE=NDBINFO", table.m.comment); print_conditional_sql(sql); } for (size_t i = 0; i < num_lookups; i++) { lookup l = lookups[i]; BaseString table_name = replace_tags(l.name); printf("# %s.%s\n", opt_ndbinfo_db, table_name.c_str()); /* Drop the table if it exists */ sql.assfmt("DROP TABLE IF EXISTS `%s`.`%s`", opt_ndbinfo_db, table_name.c_str()); print_conditional_sql(sql); /* Create lookup table */ sql.assfmt("CREATE TABLE `%s`.`%s` (%s) ENGINE=NDBINFO", opt_ndbinfo_db, table_name.c_str(), l.columns); print_conditional_sql(sql); } for (size_t i = 0; i < num_views; i++) { view v = views[i]; printf("# %s.%s\n", opt_ndbinfo_db, v.name); BaseString view_sql = replace_tags(v.sql); /* Create or replace the view */ BaseString sql; sql.assfmt("CREATE OR REPLACE DEFINER=`root`@`localhost` " "SQL SECURITY INVOKER VIEW `%s`.`%s` AS %s", opt_ndbinfo_db, v.name, view_sql.c_str()); print_conditional_sql(sql); } printf("# Finally turn off offline mode\n"); sql.assfmt("SET @@global.ndbinfo_offline=FALSE"); print_conditional_sql(sql); return 0; }
int main(int argc, char** argv){ BaseString sql; if ((handle_options(&argc, &argv, my_long_options, NULL))) return 2; printf("#\n"); printf("# SQL commands for creating the tables in MySQL Server which\n"); printf("# are used by the NDBINFO storage engine to access system\n"); printf("# information and statistics from MySQL Cluster\n"); printf("#\n"); printf("# Only create objects if NDBINFO is supported\n"); printf("SELECT @have_ndbinfo:= COUNT(*) FROM " "information_schema.engines WHERE engine='NDBINFO' " "AND support IN ('YES', 'DEFAULT');\n\n"); printf("# Only create objects if version >= 7.1\n"); sql.assfmt("SELECT @have_ndbinfo:=" " (@@ndbinfo_version >= (7 << 16) | (1 << 8)) || @ndbinfo_skip_version_check"); print_conditional_sql(sql); printf("# Only create objects if ndbinfo namespace is free\n"); sql.assfmt("SET @@ndbinfo_show_hidden=TRUE"); print_conditional_sql(sql); sql.assfmt("SELECT @have_ndbinfo:= COUNT(*) = 0" " FROM information_schema.tables WHERE" " table_schema = @@ndbinfo_database AND" " LEFT(table_name, LENGTH(@@ndbinfo_table_prefix)) =" " @@ndbinfo_table_prefix AND" " engine != \"ndbinfo\""); print_conditional_sql(sql); sql.assfmt("SET @@ndbinfo_show_hidden=default"); print_conditional_sql(sql); sql.assfmt("CREATE DATABASE IF NOT EXISTS `%s`", opt_ndbinfo_db); print_conditional_sql(sql); printf("# Set NDBINFO in offline mode during (re)create of tables\n"); printf("# and views to avoid errors caused by no such table or\n"); printf("# different table definition in NDB\n"); sql.assfmt("SET @@global.ndbinfo_offline=TRUE"); print_conditional_sql(sql); printf("# Drop any old views in %s\n", opt_ndbinfo_db); for (size_t i = 0; i < num_views; i++) { sql.assfmt("DROP VIEW IF EXISTS `%s`.`%s`", opt_ndbinfo_db, views[i].name); print_conditional_sql(sql); } printf("# Drop any old lookup tables in %s\n", opt_ndbinfo_db); for (size_t i = 0; i < num_lookups; i++) { BaseString table_name = replace_tags(lookups[i].name); sql.assfmt("DROP TABLE IF EXISTS `%s`.`%s`", opt_ndbinfo_db, table_name.c_str()); print_conditional_sql(sql); } for (int i = 0; i < Ndbinfo::getNumTables(); i++) { const Ndbinfo::Table& table = Ndbinfo::getTable(i); printf("# %s.%s%s\n", opt_ndbinfo_db, opt_table_prefix, table.m.name); /* Drop the table if it exists */ sql.assfmt("DROP TABLE IF EXISTS `%s`.`%s%s`", opt_ndbinfo_db, opt_table_prefix, table.m.name); print_conditional_sql(sql); /* Create the table */ sql.assfmt("CREATE TABLE `%s`.`%s%s` (", opt_ndbinfo_db, opt_table_prefix, table.m.name); const char* separator = ""; for(int j = 0; j < table.m.ncols ; j++) { const Ndbinfo::Column& col = table.col[j]; sql.appfmt("%s", separator); separator = ","; sql.appfmt("`%s` ", col.name); switch(col.coltype) { case Ndbinfo::Number: sql.appfmt("INT UNSIGNED"); break; case Ndbinfo:: Number64: sql.appfmt("BIGINT UNSIGNED"); break; case Ndbinfo::String: sql.appfmt("VARCHAR(512)"); break; default: fprintf(stderr, "unknown coltype: %d\n", col.coltype); abort(); break; } if (col.comment[0] != '\0') sql.appfmt(" COMMENT \"%s\"", col.comment); } sql.appfmt(") COMMENT=\"%s\" ENGINE=NDBINFO", table.m.comment); print_conditional_sql(sql); } for (size_t i = 0; i < num_lookups; i++) { lookup l = lookups[i]; BaseString table_name = replace_tags(l.name); printf("# %s.%s\n", opt_ndbinfo_db, table_name.c_str()); /* Create lookup table */ sql.assfmt("CREATE TABLE `%s`.`%s` (%s)", opt_ndbinfo_db, table_name.c_str(), l.columns); print_conditional_sql(sql); /* Insert data */ sql.assfmt("INSERT INTO `%s`.`%s` VALUES ", opt_ndbinfo_db, table_name.c_str()); l.fill(sql); print_conditional_sql(sql); } for (size_t i = 0; i < num_views; i++) { view v = views[i]; printf("# %s.%s\n", opt_ndbinfo_db, v.name); BaseString view_sql = replace_tags(v.sql); /* Create or replace the view */ BaseString sql; sql.assfmt("CREATE OR REPLACE DEFINER=`root@localhost` " "SQL SECURITY INVOKER VIEW `%s`.`%s` AS %s", opt_ndbinfo_db, v.name, view_sql.c_str()); print_conditional_sql(sql); } printf("# Finally turn off offline mode\n"); sql.assfmt("SET @@global.ndbinfo_offline=FALSE"); print_conditional_sql(sql); return 0; }