/**************************** * ExecuteSlash - meta commands ***************************/ static int ExecuteSlash( SQLHDBC hDbc, char *szSQL, char cDelimiter, int bColumnNames, int bHTMLTable ) { SQLRETURN ret; szSQL ++; if ( memcmp( szSQL, "tables", 6 ) == 0 ) { return display_tables( hDbc ); } else if ( memcmp( szSQL, "columns", 7 ) == 0 ) { return display_columns( hDbc, szSQL + 7 ); } else if ( memcmp( szSQL, "ac", 2 ) == 0 ) { if ( version3 ) { ret = SQLSetConnectAttr( hDbc, SQL_ATTR_AUTOCOMMIT, (SQLPOINTER)SQL_AUTOCOMMIT_ON, 0 ); if ( SQL_SUCCEEDED( ret ) ) { ac_off = 0; } } else { ret = SQLSetConnectOption( hDbc, SQL_ATTR_AUTOCOMMIT, SQL_AUTOCOMMIT_ON ); if ( SQL_SUCCEEDED( ret ) ) { ac_off = 0; } } if ( !bBatch ) { printf( "AUTOCOMMIT ON (return status = %d)\n", ret ); } if ( bVerbose && !SQL_SUCCEEDED( ret )) { DumpODBCLog( hEnv, hDbc, 0 ); } } else if ( memcmp( szSQL, "noac", 4 ) == 0 ) { if ( version3 ) { ret = SQLSetConnectAttr( hDbc, SQL_ATTR_AUTOCOMMIT, (SQLPOINTER)SQL_AUTOCOMMIT_OFF, 0 ); if ( SQL_SUCCEEDED( ret ) ) { ac_off = 1; } } else { ret = SQLSetConnectOption( hDbc, SQL_ATTR_AUTOCOMMIT, SQL_AUTOCOMMIT_OFF ); if ( SQL_SUCCEEDED( ret ) ) { ac_off = 1; } } if ( !bBatch ) { printf( "AUTOCOMMIT OFF (return status = %d)\n", ret ); } if ( bVerbose && !SQL_SUCCEEDED( ret )) { DumpODBCLog( hEnv, hDbc, 0 ); } } else if ( memcmp( szSQL, "commit", 6 ) == 0 ) { if ( version3 ) { ret = SQLEndTran( SQL_HANDLE_DBC, hDbc, SQL_COMMIT ); } else { ret = SQLTransact( hEnv, hDbc, SQL_COMMIT ); } if ( !bBatch ) { printf( "COMMIT (return status = %d)\n", ret ); } if ( bVerbose && !SQL_SUCCEEDED( ret )) { DumpODBCLog( hEnv, hDbc, 0 ); } } else if ( memcmp( szSQL, "rollback", 8 ) == 0 ) { if ( version3 ) { ret = SQLEndTran( SQL_HANDLE_DBC, hDbc, SQL_ROLLBACK ); } else { ret = SQLTransact( hEnv, hDbc, SQL_ROLLBACK ); } if ( !bBatch ) { printf( "ROLLBACK (return status = %d)\n", ret ); } if ( bVerbose && !SQL_SUCCEEDED( ret )) { DumpODBCLog( hEnv, hDbc, 0 ); } } else if ( memcmp( szSQL, "quit", 4 ) == 0 ) { return 0; } else { printf( "\nUnknown metacommand '%s'\n\n", szSQL ); } return 1; }
int main(int argc, char* argv[]) { //example usage: //dsv_filter_example <dsv file name> //dsv_filter_example <dsv file name> <input delimiter> //dsv_filter_example <dsv file name> <input delimiter> <output delimiter> std::string file_name = ""; std::string input_delimiter = "|"; std::string output_delimiter = "|"; if (2 == argc) { file_name = argv[1]; } else if (3 == argc) { file_name = argv[1]; input_delimiter = argv[2]; } else if (4 == argc) { file_name = argv[1]; input_delimiter = argv[2]; output_delimiter = argv[3]; } dsv_filter filter; filter.set_input_delimiter(input_delimiter); filter.set_output_delimiter(output_delimiter); if (!file_name.empty()) { if (filter.load(file_name)) std::cout << "Successfully loaded " << filter.file_name() << "\n"; else { std::cerr << "Error - Failed to load: " << file_name << std::endl; return 1; } } std::vector<bool> selected_column_list(filter.column_count(),true); std::deque<std::string> query_history; std::string query; for ( ; ; ) { std::cout << "\nEnter query: "; std::getline(std::cin,query); strtk::remove_leading_trailing(" \t\n\r",query); if (query.empty()) continue; else if (query_history.empty() || (query_history.back() != query)) { query_history.push_back(query); } if (0 == strtk::ifind("exec",query)) { if (!lookup_history(query_history,query)) continue; } if (strtk::imatch(query,"exit") || strtk::imatch(query,"quit")) break; else if (strtk::imatch(query,"help")) { print_help(); continue; } else if (strtk::imatch(query,"list")) { display_columns(filter); continue; } else if (0 == strtk::ifind("load",query)) { load_dsv(query,filter); continue; } else if (strtk::imatch(query,"history")) { query_history.pop_back(); display_history(query_history); continue; } else if (0 == strtk::ifind("output_delimiter",query)) { set_output_delimiter(query,filter); continue; } else if (0 == strtk::ifind("input_delimiter",query)) { set_input_delimiter(query,filter); continue; } else if ((0 == strtk::ifind("information",query)) || (0 == strtk::ifind("info",query))) { information(filter); continue; } selected_column_list.resize(filter.column_count(),true); std::fill_n(selected_column_list.begin(),selected_column_list.size(),true); bool count_mode = false; if(!parse_query(query,selected_column_list,count_mode,filter)) continue; else if(filter.add_filter(query)) generate_results(selected_column_list,filter,count_mode); else { std::cout << filter.error() << std::endl; continue; } } return 0; }