#include #include #include #include "string.h" #include "mysql.h" using namespace std; class mySQLDB { public: mySQLDB(); ~mySQLDB(); int Connect(); bool IsConnected() { return m_isconnected; }; private: MYSQL *m_db; bool m_isconnected; std::wstring_convert > m_myconv; }; mySQLDB::mySQLDB() { m_db = NULL; m_isconnected = true; m_db = mysql_init( m_db ); if( !mysql_real_connect( m_db, "localhost", "root", "wasqra", "draft", 0, NULL, 0 ) ) { cout << "Error connecting to the server: " << mysql_error( m_db ) << endl; m_isconnected = false; } } mySQLDB::~mySQLDB() { mysql_close( m_db ); } int mySQLDB::Connect() { MYSQL_STMT *stmt1; std::wstring query1 = L"SELECT t.table_catalog AS catalog, t.table_schema, t.table_name, \"\" AS owner, CASE WHEN t.engine = 'InnoDB' THEN (SELECT st.table_id FROM information_schema.INNODB_SYS_TABLES st WHERE CONCAT(t.table_schema,'/', t.table_name) = st.name) ELSE (SELECT 0) END AS id FROM information_schema.tables t WHERE t.table_type = 'BASE TABLE' OR t.table_type = 'VIEW';"; std::wstring query2 = L"SELECT kcu.column_name, kcu.ordinal_position, kcu.referenced_table_schema, kcu.referenced_table_name, kcu.referenced_column_name, rc.update_rule, rc.delete_rule FROM information_schema.key_column_usage kcu, information_schema.referential_constraints rc WHERE kcu.constraint_name = rc.constraint_name AND kcu.table_catalog = ? AND kcu.table_schema = ? AND kcu.table_name = ?;"; char *str_data1 = NULL, *str_data2 = NULL, *str_data3 = NULL; int res = mysql_query( m_db, m_myconv.to_bytes( query1.c_str() ).c_str() ); if( res ) { std::cout << "Error executing query: " << mysql_error( m_db ) << std::endl; return 1; } MYSQL_RES *results = mysql_store_result( m_db ); if( !results ) { std::cout << "Error storing query results: " << mysql_error( m_db ) << std::endl; return 1; } stmt1 = mysql_stmt_init( m_db ); if( !stmt1 ) { std::cout << "Error initializing statement: " << mysql_stmt_error( stmt1 ) << std::endl; return 1; } if( mysql_stmt_prepare( stmt1, m_myconv.to_bytes( query2.c_str() ).c_str(), query2.length() ) ) { std::cout << "Error preparing statement: " << mysql_stmt_error( stmt1 ) << std::endl; return 1; } MYSQL_ROW row; while( ( row = mysql_fetch_row( results ) ) != NULL ) { char *catalog_name = row[0] ? row[0] : NULL; char *schema_name = row[1] ? row[1] : NULL; char *table_name = row[2] ? row[2] : NULL; MYSQL_BIND params[3]; unsigned long str_length1, str_length2, str_length3; str_length1 = strlen( catalog_name ) * 2; str_length2 = strlen( schema_name ) * 2; str_length3 = strlen( table_name ) * 2; str_data1 = new char[str_length1], str_data2 = new char[str_length2], str_data3 = new char[str_length3]; memset( str_data1, '\0', str_length1 ); memset( str_data2, '\0', str_length2 ); memset( str_data3, '\0', str_length3 ); memset( params, 0, sizeof( params ) ); strncpy( str_data1, catalog_name, str_length1 ); strncpy( str_data2, schema_name, str_length2 ); strncpy( str_data3, table_name, str_length3 ); params[0].buffer_type = MYSQL_TYPE_STRING; params[0].buffer = (char *) str_data1; params[0].buffer_length = strlen( str_data1 ); params[0].is_null = 0; params[0].length = &str_length1; params[1].buffer_type = MYSQL_TYPE_STRING; params[1].buffer = (char *) str_data2; params[1].buffer_length = strlen( str_data2 ); params[1].is_null = 0; params[1].length = &str_length2; params[2].buffer_type = MYSQL_TYPE_STRING; params[2].buffer = (char *) str_data3; params[2].buffer_length = strlen( str_data3 ); params[2].is_null = 0; params[2].length = &str_length3; if( mysql_stmt_bind_param( stmt1, params ) ) { std::cout << "Error binding parameters to the query: " << mysql_stmt_error( stmt1 ) << std::endl; return 1; } MYSQL_RES *prepare_meta_results = mysql_stmt_result_metadata( stmt1 ); if( !prepare_meta_results ) { std::cout << "Error preparing meta results: " << mysql_stmt_error( stmt1 ) << std::endl; return 1; } std::cout << "Catalog is: " << catalog_name << ", schema is: " << schema_name << ", table is: " << table_name << std::endl; if( mysql_stmt_execute( stmt1 ) ) { const char *error = mysql_stmt_error( stmt1 ); std::cout << "Error executing prepared query: " << mysql_stmt_error( stmt1 ) << std::endl; return 1; } std::cout << "Indexes are successfully retrieved" << std::endl; delete str_data1; str_data1 = NULL; delete str_data2; str_data2 = NULL; delete str_data3; str_data3 = NULL; } mysql_stmt_close( stmt1 ); } int main(int argc, char **argv) { mySQLDB db; if( db.Connect() ) std::cout << "Errors encountered" << endl; }