/[projects]/misc/mysql_splitter/splitter.cpp
ViewVC logotype

Contents of /misc/mysql_splitter/splitter.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1458 - (show annotations) (download)
Wed May 11 10:14:11 2011 UTC (13 years ago) by torben
File size: 2979 byte(s)
Keep track of the elapsed time
1 #include <iostream>
2 #include <fstream>
3 #include <sstream>
4 #include <string>
5 #include <vector>
6
7
8 #include <boost/algorithm/string.hpp>
9 #include <boost/filesystem.hpp>
10 #include <boost/program_options.hpp>
11
12 namespace po = boost::program_options;
13
14 using namespace std;
15
16 const int BUFSIZE = 1024*1024;
17
18 string remove_comments(string in) {
19 bool isComment = false;
20 ostringstream out;
21 for (int i=0; i<in.length() -1; i++) {
22 if (in.at(i) == '/' && in.at(i+1) == '*')
23 isComment = true;
24
25 if (in.at(i) == '*' && in.at(i+1) == '/') {
26 i++;
27 isComment = false;
28 continue;
29 }
30
31 if (isComment == false)
32 out << in.at(i) ;
33 }
34
35 return out.str();
36 }
37
38 string get_db_name(string input) {
39 input = remove_comments(input);
40
41 boost::erase_all(input,"`");
42 boost::erase_all(input, ";");
43 boost::trim(input);
44
45 vector<string> words;
46 words = boost::split(words, input, boost::is_any_of(" ") );
47
48 string last = words.back();
49 boost::trim(last);
50
51 return last;
52 }
53
54
55 int main(int argc, char** argv) {
56
57 po::options_description desc("Mysql dump file splitter:\nAllowed options");
58 desc.add_options()
59 ("help", "produce help message")
60 ("data", "ignore ceate tablestatements")
61 ("input-file", po::value< string >(), "input file")
62 ;
63
64 po::positional_options_description p;
65 p.add("input-file", -1);
66
67
68 po::variables_map vm;
69 po::store( po::command_line_parser(argc, argv).options(desc).positional(p).run(), vm);
70 po::notify(vm);
71
72 if (vm.count("help")) {
73 cout << desc << "\n";
74 return 1;
75 }
76
77
78
79 if ( vm.count("input-file") == 0) {
80 cout << desc << endl;
81 return 1;
82 }
83
84
85 char linebuf[BUFSIZE];
86
87 string inputfile = vm["input-file"].as< string >();
88 if (! boost::filesystem::exists(inputfile) ) {
89 cout << "No file named " << inputfile << endl;
90 return 1;
91 }
92
93
94 ifstream in( inputfile.c_str() );
95 ofstream out;
96
97 ostringstream header;
98
99 if (!in.is_open() ) {
100 cout << "Could not open " << argv[1] << endl;
101 return 2;
102 }
103
104 time_t start = time(NULL);
105
106 while ( in.good() ) {
107 in.getline(linebuf, BUFSIZE);
108
109 string line(linebuf);
110
111
112 //if (line.substr(0, 15) == "CREATE DATABASE" ) {
113 if ( boost::starts_with(line, "CREATE DATABASE") ) {
114
115 if (out.is_open() ) {
116 out.close();
117 }
118
119 boost::trim(line);
120 string dbname = get_db_name(line);
121 cout << ">" << dbname << endl;
122
123
124 ostringstream oss;
125 oss << dbname << "_dump.sql";
126
127 string filename = oss.str();
128
129 bool did_exist = boost::filesystem::exists(filename);
130
131 out.open( filename.c_str(), ios::app );
132
133
134
135 if (!out.is_open() ) {
136 cout << "could not create outfile " << filename << endl;
137 return 3;
138 }
139
140 if (!did_exist) {
141 out << header.str() << endl; //write preamble in new file
142 }
143
144 }
145
146
147 if (out.is_open() ) {
148 out << line << endl;
149 } else {
150 header << line << endl; //collect preamble for later use
151 }
152
153 }
154
155
156 if(out.is_open())
157 out.close();
158
159 time_t end = time(NULL);
160
161 cout << "Elapsed " << (end-start) << " seconds" << endl;
162
163
164 in.close();
165 }

  ViewVC Help
Powered by ViewVC 1.1.20