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

Contents of /misc/mysql_splitter/splitter.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1460 - (show annotations) (download)
Wed May 11 19:19:07 2011 UTC (13 years ago) by torben
File size: 3140 byte(s)
warningectomy
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 (unsigned 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 const char* SEARCH = "CREATE DATABASE";
107 const int SEARCHLEN = strlen(SEARCH);
108
109 while ( in.good() ) {
110 in.getline(linebuf, BUFSIZE);
111
112
113 //if (line.substr(0, 15) == "CREATE DATABASE" ) {
114 //if ( boost::starts_with(line, "CREATE DATABASE") ) {
115 if (strncmp(linebuf,SEARCH, SEARCHLEN) == 0) {
116
117 string line(linebuf);
118 if (out.is_open() ) {
119 out.close();
120 }
121
122 boost::trim(line);
123 string dbname = get_db_name(line);
124 cout << ">" << dbname << endl;
125
126
127 ostringstream oss;
128 oss << dbname << "_dump.sql";
129
130 string filename = oss.str();
131
132 bool did_exist = boost::filesystem::exists(filename);
133
134 out.open( filename.c_str(), ios::app );
135
136
137
138 if (!out.is_open() ) {
139 cout << "could not create outfile " << filename << endl;
140 return 3;
141 }
142
143 if (!did_exist) {
144 out << header.str() << endl; //write preamble in new file
145 }
146
147 }
148
149
150 if (out.is_open() ) {
151 out << linebuf << endl;
152 } else {
153 header << linebuf << endl; //collect preamble for later use
154 }
155
156 }
157
158
159 if(out.is_open())
160 out.close();
161
162 time_t end = time(NULL);
163
164 cout << "Elapsed " << (end-start) << " seconds" << endl;
165
166
167 in.close();
168 }

  ViewVC Help
Powered by ViewVC 1.1.20