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

Contents of /misc/mysql_splitter/splitter.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1284 - (show annotations) (download)
Mon Apr 11 05:14:37 2011 UTC (13 years, 1 month ago) by torben
File size: 2857 byte(s)
small refactoring
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 while ( in.good() ) {
105 in.getline(linebuf, BUFSIZE);
106
107 string line(linebuf);
108
109
110 //if (line.substr(0, 15) == "CREATE DATABASE" ) {
111 if ( boost::starts_with(line, "CREATE DATABASE") ) {
112
113 if (out.is_open() ) {
114 out.close();
115 }
116
117 boost::trim(line);
118 string dbname = get_db_name(line);
119 cout << ">" << dbname << endl;
120
121
122 ostringstream oss;
123 oss << dbname << "_dump.sql";
124
125 string filename = oss.str();
126
127 bool did_exist = boost::filesystem::exists(filename);
128
129 out.open( filename.c_str(), ios::app );
130
131
132
133 if (!out.is_open() ) {
134 cout << "could not create outfile " << filename << endl;
135 return 3;
136 }
137
138 if (!did_exist) {
139 out << header.str() << endl; //write preamble in new file
140 }
141
142 }
143
144
145 if (out.is_open() ) {
146 out << line << endl;
147 } else {
148 header << line << endl; //collect preamble for later use
149 }
150
151 }
152
153
154 if(out.is_open())
155 out.close();
156
157
158 in.close();
159 }

  ViewVC Help
Powered by ViewVC 1.1.20