--- misc/mysql_splitter/splitter.cpp 2011/03/13 18:16:34 1231 +++ misc/mysql_splitter/splitter.cpp 2011/05/11 11:11:42 1459 @@ -4,37 +4,94 @@ #include #include + #include #include +#include + +namespace po = boost::program_options; using namespace std; const int BUFSIZE = 1024*1024; -string getLastWord(string input) { +string remove_comments(string in) { + bool isComment = false; + ostringstream out; + for (int i=0; i words; words = boost::split(words, input, boost::is_any_of(" ") ); string last = words.back(); - - boost::erase_all(last, ";"); boost::trim(last); - - return last; } int main(int argc, char** argv) { - if (argc != 2) { - cout << "Usage: splitter " << endl; + + po::options_description desc("Mysql dump file splitter:\nAllowed options"); + desc.add_options() + ("help", "produce help message") + ("data", "ignore ceate tablestatements") + ("input-file", po::value< string >(), "input file") + ; + + po::positional_options_description p; + p.add("input-file", -1); + + + po::variables_map vm; + po::store( po::command_line_parser(argc, argv).options(desc).positional(p).run(), vm); + po::notify(vm); + + if (vm.count("help")) { + cout << desc << "\n"; + return 1; + } + + + + if ( vm.count("input-file") == 0) { + cout << desc << endl; return 1; } + char linebuf[BUFSIZE]; - ifstream in(argv[1]); + string inputfile = vm["input-file"].as< string >(); + if (! boost::filesystem::exists(inputfile) ) { + cout << "No file named " << inputfile << endl; + return 1; + } + + + ifstream in( inputfile.c_str() ); ofstream out; ostringstream header; @@ -42,23 +99,28 @@ if (!in.is_open() ) { cout << "Could not open " << argv[1] << endl; return 2; - } + } + + time_t start = time(NULL); + + const char* SEARCH = "CREATE DATABASE"; + const int SEARCHLEN = strlen(SEARCH); while ( in.good() ) { in.getline(linebuf, BUFSIZE); - string line(linebuf); - //if (line.substr(0, 15) == "CREATE DATABASE" ) { - if ( boost::starts_with(line, "CREATE DATABASE") ) { + //if ( boost::starts_with(line, "CREATE DATABASE") ) { + if (strncmp(linebuf,SEARCH, SEARCHLEN) == 0) { + string line(linebuf); if (out.is_open() ) { out.close(); } boost::trim(line); - string dbname = getLastWord(line); + string dbname = get_db_name(line); cout << ">" << dbname << endl; @@ -86,16 +148,20 @@ if (out.is_open() ) { - out << line << endl; + out << linebuf << endl; } else { - header << line << endl; //collect preamble for later use + header << linebuf << endl; //collect preamble for later use } } if(out.is_open()) - out.close(); + out.close(); + + time_t end = time(NULL); + + cout << "Elapsed " << (end-start) << " seconds" << endl; in.close();