flydata 0.5.16 → 0.5.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/VERSION +1 -1
- data/ext/flydata/json/json_ext.cpp +1 -1
- data/ext/flydata/parser/mysql/sql_parser.cpp +30 -30
- data/flydata.gemspec +0 -0
- data/lib/flydata/command/exclusive_runnable.rb +7 -0
- data/lib/flydata/command/sync.rb +1 -0
- data/lib/flydata/sync_file_manager.rb +4 -0
- data/spec/flydata/parser/mysql/dump_parser_spec.rb +28 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: db5ab3ad859c85fb9fcdb2171ad04b0f2e468eb9
|
4
|
+
data.tar.gz: 1225c311e10046702a2cf89b5b2d3f8114022ee9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c4c2d116d3279e3794b510898bf385aa7aaa22703afdca15bfcae4d7574764ccaa84731b159a98cac7b745de1f46b6fc4e1cf547e06183ee8e46a2c1abc95b60
|
7
|
+
data.tar.gz: 746ccd2cc7cac24b1745e9c08a3184acaa9b7f37a0ed25f2015dd077acb997a3cf25caa812d17c0f78a5591d95b7dd618a38efb61e3f9722e7da13183df34825
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.5.
|
1
|
+
0.5.17
|
@@ -262,7 +262,7 @@ static VALUE rb_json_generate_kv_pairs(VALUE self, VALUE key_ary, VALUE value_ar
|
|
262
262
|
}
|
263
263
|
ss << "}";
|
264
264
|
|
265
|
-
std::string str = ss.str();
|
265
|
+
const std::string& str = ss.str();
|
266
266
|
VALUE json = rb_str_new(str.data(), str.size());
|
267
267
|
int enc = rb_enc_find_index("UTF-8");
|
268
268
|
rb_enc_associate_index(json, enc);
|
@@ -54,7 +54,7 @@ long parse_insert_query(const char* sql, long len, ParserCallbackHandler& ch)
|
|
54
54
|
break;
|
55
55
|
|
56
56
|
case value:
|
57
|
-
if ($DEBUG) std::cout << "value[" << *current << "]: " << std::endl << std::flush;
|
57
|
+
if ($DEBUG) std::cout << "value[" << *current << "(0x" << std::hex << (*current & 0xff) << ")]: " << std::endl << std::flush;
|
58
58
|
if (*current == '\'') {
|
59
59
|
status = first_char;
|
60
60
|
} else if (*current == 'N') {
|
@@ -76,7 +76,7 @@ long parse_insert_query(const char* sql, long len, ParserCallbackHandler& ch)
|
|
76
76
|
break;
|
77
77
|
|
78
78
|
case first_zero:
|
79
|
-
if ($DEBUG) std::cout << "first_zero[" << *current << "]: " << std::endl << std::flush;
|
79
|
+
if ($DEBUG) std::cout << "first_zero[" << *current << "(0x" << std::hex << (*current & 0xff) << ")]: " << std::endl << std::flush;
|
80
80
|
if (*current == ',') {
|
81
81
|
ch.value_callback(mark, value_len - 1, true);//value_callback :end_value
|
82
82
|
mark = 0; value_len = 0; //mark_reset
|
@@ -102,7 +102,7 @@ long parse_insert_query(const char* sql, long len, ParserCallbackHandler& ch)
|
|
102
102
|
break;
|
103
103
|
|
104
104
|
case leading_zero:
|
105
|
-
if ($DEBUG) std::cout << "leading_zero[" << *current << "]: " << std::endl << std::flush;
|
105
|
+
if ($DEBUG) std::cout << "leading_zero[" << *current << "(0x" << std::hex << (*current & 0xff) << ")]: " << std::endl << std::flush;
|
106
106
|
if (*current == ',') {
|
107
107
|
ch.value_callback(mark, value_len - 1, true);//value_callback :end_value
|
108
108
|
mark = 0; value_len = 0; //mark_reset
|
@@ -126,7 +126,7 @@ long parse_insert_query(const char* sql, long len, ParserCallbackHandler& ch)
|
|
126
126
|
break;
|
127
127
|
|
128
128
|
case number:
|
129
|
-
if ($DEBUG) std::cout << "number[" << *current << "]: " << std::endl << std::flush;
|
129
|
+
if ($DEBUG) std::cout << "number[" << *current << "(0x" << std::hex << (*current & 0xff) << ")]: " << std::endl << std::flush;
|
130
130
|
if ((*current >= '0' && *current <= '9') || *current == '.' || *current == 'e' || *current == 'E' || *current == '-') {
|
131
131
|
status = number;
|
132
132
|
} else if (*current == ',') {
|
@@ -144,7 +144,7 @@ long parse_insert_query(const char* sql, long len, ParserCallbackHandler& ch)
|
|
144
144
|
break;
|
145
145
|
|
146
146
|
case null_n:
|
147
|
-
if ($DEBUG) std::cout << "null_n[" << *current << "]: " << std::endl << std::flush;
|
147
|
+
if ($DEBUG) std::cout << "null_n[" << *current << "(0x" << std::hex << (*current & 0xff) << ")]: " << std::endl << std::flush;
|
148
148
|
if (*current == 'U') {
|
149
149
|
status = null_u;
|
150
150
|
} else {
|
@@ -153,7 +153,7 @@ long parse_insert_query(const char* sql, long len, ParserCallbackHandler& ch)
|
|
153
153
|
break;
|
154
154
|
|
155
155
|
case null_u:
|
156
|
-
if ($DEBUG) std::cout << "null_u[" << *current << "]: " << std::endl << std::flush;
|
156
|
+
if ($DEBUG) std::cout << "null_u[" << *current << "(0x" << std::hex << (*current & 0xff) << ")]: " << std::endl << std::flush;
|
157
157
|
if (*current == 'L') {
|
158
158
|
status = null_l1;
|
159
159
|
} else {
|
@@ -162,7 +162,7 @@ long parse_insert_query(const char* sql, long len, ParserCallbackHandler& ch)
|
|
162
162
|
break;
|
163
163
|
|
164
164
|
case null_l1:
|
165
|
-
if ($DEBUG) std::cout << "null_l1[" << *current << "]: " << std::endl << std::flush;
|
165
|
+
if ($DEBUG) std::cout << "null_l1[" << *current << "(0x" << std::hex << (*current & 0xff) << ")]: " << std::endl << std::flush;
|
166
166
|
if (*current == 'L') {
|
167
167
|
status = null_l2;
|
168
168
|
} else {
|
@@ -171,7 +171,7 @@ long parse_insert_query(const char* sql, long len, ParserCallbackHandler& ch)
|
|
171
171
|
break;
|
172
172
|
|
173
173
|
case null_l2:
|
174
|
-
if ($DEBUG) std::cout << "null_l2[" << *current << "]: " << std::endl << std::flush;
|
174
|
+
if ($DEBUG) std::cout << "null_l2[" << *current << "(0x" << std::hex << (*current & 0xff) << ")]: " << std::endl << std::flush;
|
175
175
|
if (*current == ',') {
|
176
176
|
//# 0 is NULL pointer
|
177
177
|
ch.value_callback(0, 0, true);//value_callback 0 :end_value
|
@@ -189,7 +189,7 @@ long parse_insert_query(const char* sql, long len, ParserCallbackHandler& ch)
|
|
189
189
|
break;
|
190
190
|
|
191
191
|
case hex_blob:
|
192
|
-
if ($DEBUG) std::cout << "hex_blob[" << *current << "]: " << std::endl << std::flush;
|
192
|
+
if ($DEBUG) std::cout << "hex_blob[" << *current << "(0x" << std::hex << (*current & 0xff) << ")]: " << std::endl << std::flush;
|
193
193
|
if ((*current >= '0' && *current <= '9') ||
|
194
194
|
(*current >= 'A' && *current <= 'F') ||
|
195
195
|
(*current >= 'a' && *current <= 'f')) {
|
@@ -200,7 +200,7 @@ long parse_insert_query(const char* sql, long len, ParserCallbackHandler& ch)
|
|
200
200
|
break;
|
201
201
|
|
202
202
|
case hex_blob_number:
|
203
|
-
if ($DEBUG) std::cout << "hex_blob_number[" << *current << "]: " << std::endl << std::flush;
|
203
|
+
if ($DEBUG) std::cout << "hex_blob_number[" << *current << "(0x" << std::hex << (*current & 0xff) << ")]: " << std::endl << std::flush;
|
204
204
|
if ((*current >= '0' && *current <= '9') ||
|
205
205
|
(*current >= 'A' && *current <= 'F') ||
|
206
206
|
(*current >= 'a' && *current <= 'f')) {
|
@@ -220,7 +220,7 @@ long parse_insert_query(const char* sql, long len, ParserCallbackHandler& ch)
|
|
220
220
|
break;
|
221
221
|
|
222
222
|
case first_char:
|
223
|
-
if ($DEBUG) std::cout << "first_char[" << *current << "]: " << std::endl << std::flush;
|
223
|
+
if ($DEBUG) std::cout << "first_char[" << *current << "(0x" << std::hex << (*current & 0xff) << ")]: " << std::endl << std::flush;
|
224
224
|
if (*current == '\'') {
|
225
225
|
mark = current; value_len = 1; //mark
|
226
226
|
ch.value_callback(mark, value_len - 1, true);//value_callback, :end_value
|
@@ -248,8 +248,8 @@ long parse_insert_query(const char* sql, long len, ParserCallbackHandler& ch)
|
|
248
248
|
break;
|
249
249
|
|
250
250
|
case utf8_2_firstbyte:
|
251
|
-
if ($DEBUG) std::cout << "utf8_2_firstbyte[" << *current << "]: " << std::endl << std::flush;
|
252
|
-
if ((*current &
|
251
|
+
if ($DEBUG) std::cout << "utf8_2_firstbyte[" << *current << "(0x" << std::hex << (*current & 0xff) << ")]: " << std::endl << std::flush;
|
252
|
+
if ((*current & 0xc0) == 0x80) {
|
253
253
|
temp_mark = 0; //temp_mark reset)
|
254
254
|
status = following_char;
|
255
255
|
} else {
|
@@ -262,8 +262,8 @@ long parse_insert_query(const char* sql, long len, ParserCallbackHandler& ch)
|
|
262
262
|
break;
|
263
263
|
|
264
264
|
case utf8_3_firstbyte:
|
265
|
-
if ($DEBUG) std::cout << "utf8_3_firstbyte[" << *current << "]: " << std::endl << std::flush;
|
266
|
-
if ((*current &
|
265
|
+
if ($DEBUG) std::cout << "utf8_3_firstbyte[" << *current << "(0x" << std::hex << (*current & 0xff) << ")]: " << std::endl << std::flush;
|
266
|
+
if ((*current & 0xc0) == 0x80) {
|
267
267
|
status = utf8_3_secondbyte;
|
268
268
|
} else {
|
269
269
|
status = utf8_3_err_secondbyte;
|
@@ -271,8 +271,8 @@ long parse_insert_query(const char* sql, long len, ParserCallbackHandler& ch)
|
|
271
271
|
break;
|
272
272
|
|
273
273
|
case utf8_3_secondbyte:
|
274
|
-
if ($DEBUG) std::cout << "utf8_3_secondbyte[" << *current << "]: " << std::endl << std::flush;
|
275
|
-
if ((*current &
|
274
|
+
if ($DEBUG) std::cout << "utf8_3_secondbyte[" << *current << "(0x" << std::hex << (*current & 0xff) << ")]: " << std::endl << std::flush;
|
275
|
+
if ((*current & 0xc0) == 0x80) {
|
276
276
|
temp_mark = 0; //temp_mark reset)
|
277
277
|
status = following_char;
|
278
278
|
} else {
|
@@ -285,7 +285,7 @@ long parse_insert_query(const char* sql, long len, ParserCallbackHandler& ch)
|
|
285
285
|
break;
|
286
286
|
|
287
287
|
case utf8_3_err_secondbyte:
|
288
|
-
if ($DEBUG) std::cout << "utf8_3_err_secondbyte[" << *current << "]: " << std::endl << std::flush;
|
288
|
+
if ($DEBUG) std::cout << "utf8_3_err_secondbyte[" << *current << "(0x" << std::hex << (*current & 0xff) << ")]: " << std::endl << std::flush;
|
289
289
|
ch.value_callback(mark, temp_mark - mark, false);//value_callback mark...temp_mark
|
290
290
|
mark = 0; value_len = 0; //mark_reset
|
291
291
|
ch.value_callback("\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd", 9, false); //value_callback "\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd"
|
@@ -294,8 +294,8 @@ long parse_insert_query(const char* sql, long len, ParserCallbackHandler& ch)
|
|
294
294
|
break;
|
295
295
|
|
296
296
|
case utf8_4_firstbyte:
|
297
|
-
if ($DEBUG) std::cout << "utf8_4_firstbyte[" << *current << "]: " << std::endl << std::flush;
|
298
|
-
if ((*current &
|
297
|
+
if ($DEBUG) std::cout << "utf8_4_firstbyte[" << *current << "(0x" << std::hex << (*current & 0xff) << ")]: " << std::endl << std::flush;
|
298
|
+
if ((*current & 0xc0) == 0x80) {
|
299
299
|
status = utf8_4_secondbyte;
|
300
300
|
} else {
|
301
301
|
status = utf8_4_err_secondbyte;
|
@@ -303,8 +303,8 @@ long parse_insert_query(const char* sql, long len, ParserCallbackHandler& ch)
|
|
303
303
|
break;
|
304
304
|
|
305
305
|
case utf8_4_secondbyte:
|
306
|
-
if ($DEBUG) std::cout << "utf8_4_secondbyte[" << *current << "]: " << std::endl << std::flush;
|
307
|
-
if ((*current &
|
306
|
+
if ($DEBUG) std::cout << "utf8_4_secondbyte[" << *current << "(0x" << std::hex << (*current & 0xff) << ")]: " << std::endl << std::flush;
|
307
|
+
if ((*current & 0xc0) == 0x80) {
|
308
308
|
status = utf8_4_thirdbyte;
|
309
309
|
} else {
|
310
310
|
status = utf8_4_err_thirdbyte;
|
@@ -312,13 +312,13 @@ long parse_insert_query(const char* sql, long len, ParserCallbackHandler& ch)
|
|
312
312
|
break;
|
313
313
|
|
314
314
|
case utf8_4_err_secondbyte:
|
315
|
-
if ($DEBUG) std::cout << "utf8_4_err_secondbyte[" << *current << "]: " << std::endl << std::flush;
|
315
|
+
if ($DEBUG) std::cout << "utf8_4_err_secondbyte[" << *current << "(0x" << std::hex << (*current & 0xff) << ")]: " << std::endl << std::flush;
|
316
316
|
status = utf8_4_err_thirdbyte;
|
317
317
|
break;
|
318
318
|
|
319
319
|
case utf8_4_thirdbyte:
|
320
|
-
if ($DEBUG) std::cout << "utf8_4_thirdbyte[" << *current << "]: " << std::endl << std::flush;
|
321
|
-
if ((*current &
|
320
|
+
if ($DEBUG) std::cout << "utf8_4_thirdbyte[" << *current << "(0x" << std::hex << (*current & 0xff) << ")]: " << std::endl << std::flush;
|
321
|
+
if ((*current & 0xc0) == 0x80) {
|
322
322
|
temp_mark = 0; //temp_mark reset)
|
323
323
|
status = following_char;
|
324
324
|
} else {
|
@@ -331,7 +331,7 @@ long parse_insert_query(const char* sql, long len, ParserCallbackHandler& ch)
|
|
331
331
|
break;
|
332
332
|
|
333
333
|
case utf8_4_err_thirdbyte:
|
334
|
-
if ($DEBUG) std::cout << "utf8_4_err_thirdbyte[" << *current << "]: " << std::endl << std::flush;
|
334
|
+
if ($DEBUG) std::cout << "utf8_4_err_thirdbyte[" << *current << "(0x" << std::hex << (*current & 0xff) << ")]: " << std::endl << std::flush;
|
335
335
|
ch.value_callback(mark, temp_mark - mark, false);//value_callback mark...temp_mark
|
336
336
|
mark = 0; value_len = 0; //mark_reset
|
337
337
|
ch.value_callback("\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd", 12, false); //value_callback "\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd"
|
@@ -340,7 +340,7 @@ long parse_insert_query(const char* sql, long len, ParserCallbackHandler& ch)
|
|
340
340
|
break;
|
341
341
|
|
342
342
|
case following_char:
|
343
|
-
if ($DEBUG) std::cout << "following_char[" << *current << "]: " << std::endl << std::flush;
|
343
|
+
if ($DEBUG) std::cout << "following_char[" << *current << "(0x" << std::hex << (*current & 0xff) << ")]: " << std::endl << std::flush;
|
344
344
|
if (*current == '\'') {
|
345
345
|
ch.value_callback(mark, value_len - 1, true);//value_callback, :end_value
|
346
346
|
mark = 0; value_len = 0; //mark_reset
|
@@ -364,7 +364,7 @@ long parse_insert_query(const char* sql, long len, ParserCallbackHandler& ch)
|
|
364
364
|
break;
|
365
365
|
|
366
366
|
case escape:
|
367
|
-
if ($DEBUG) std::cout << "escape[" << *current << "]: " << std::endl << std::flush;
|
367
|
+
if ($DEBUG) std::cout << "escape[" << *current << "(0x" << std::hex << (*current & 0xff) << ")]: " << std::endl << std::flush;
|
368
368
|
if (*current == '\"') {
|
369
369
|
ch.value_callback("\"", 1, false);//value_callback '\"'
|
370
370
|
mark = 0; value_len = 0;
|
@@ -401,12 +401,12 @@ long parse_insert_query(const char* sql, long len, ParserCallbackHandler& ch)
|
|
401
401
|
break;
|
402
402
|
|
403
403
|
case error:
|
404
|
-
if ($DEBUG) std::cout << "error[" << *current <<
|
404
|
+
if ($DEBUG) std::cout << "error[" << *current << std::endl << std::flush;
|
405
405
|
ret = pos - 1;
|
406
406
|
break;
|
407
407
|
|
408
408
|
default:
|
409
|
-
if ($DEBUG) std::cout << "default[" << *current << "]: " << std::endl << std::flush;
|
409
|
+
if ($DEBUG) std::cout << "default[" << *current << "(0x" << std::hex << (*current & 0xff) << ")]: " << std::endl << std::flush;
|
410
410
|
break;
|
411
411
|
}//switch
|
412
412
|
if (ret != -1)
|
data/flydata.gemspec
CHANGED
Binary file
|
@@ -21,6 +21,13 @@ module ExclusiveRunnable
|
|
21
21
|
begin
|
22
22
|
info = self.class.load_exclusive_run_info
|
23
23
|
if info
|
24
|
+
#TODO If the previous command terminates abnormally,
|
25
|
+
# 'exclusive_run.info' file won't be deleted even the pid
|
26
|
+
# doesn't exist anymore.
|
27
|
+
# This prevents execution of any commands afterwards, and
|
28
|
+
# the user will see this misleading error message.
|
29
|
+
# Introducing "--force-run" option can be a solution.
|
30
|
+
|
24
31
|
raise "Command `#{info['command']}` is already running. Wait until the command completes or stop the command. (pid:#{info['pid']})"
|
25
32
|
end
|
26
33
|
exclusive_run_info = { command: self.class.command(method, options), pid: Process.pid }
|
data/lib/flydata/command/sync.rb
CHANGED
@@ -177,6 +177,7 @@ EOS
|
|
177
177
|
if @input_tables.empty? or @full_tables.empty? or @full_tables.all?{|ft| new_tables_after_reset.include?(ft)}
|
178
178
|
delete_files << sync_fm.binlog_path
|
179
179
|
delete_files << sync_fm.sent_binlog_path
|
180
|
+
delete_files << sync_fm.lock_pid_file
|
180
181
|
end
|
181
182
|
delete_files.flatten.each do |path|
|
182
183
|
FileUtils.rm(path) if File.exists?(path)
|
@@ -291,7 +291,7 @@ CREATE TABLE `users_login` (
|
|
291
291
|
|
292
292
|
LOCK TABLES `users_login` WRITE;
|
293
293
|
/*!40000 ALTER TABLE `users_login` DISABLE KEYS */;
|
294
|
-
INSERT INTO `users_login` VALUES (15,46,'moodier\xED\xB1\
|
294
|
+
INSERT INTO `users_login` VALUES (15,46,'moodier\xED\xB1\x22','2001-10-02 08:18:08','1986-06-11 22:50:10'),(35,6,'missあいうえおteer','1991-10-15 19:38:07','1970-10-01 22:03:10'),(52,33,'sub\\\\field','1972-08-23 20:16:08','1974-10-10 23:28:11');
|
295
295
|
INSERT INTO `users_login` VALUES (373,31,'out\\'swearing','1979-10-07 08:10:08','2006-02-22 16:26:04'),(493,8,'schizophrenic','1979-07-06 07:34:07','1970-08-09 01:21:01');
|
296
296
|
/*!40000 ALTER TABLE `users_login` ENABLE KEYS */;
|
297
297
|
UNLOCK TABLES;
|
@@ -1080,6 +1080,33 @@ EOS
|
|
1080
1080
|
expect(subject).to eq([["test\x1ctest"]])
|
1081
1081
|
end
|
1082
1082
|
end
|
1083
|
+
|
1084
|
+
context 'with various characters' do
|
1085
|
+
context 'UTF-8 1 byte char' do
|
1086
|
+
let(:target_line) {"INSERT INTO `test_table` VALUES ('testtest');"}
|
1087
|
+
it 'should convert correctly' do
|
1088
|
+
expect(subject).to eq([["testtest"]])
|
1089
|
+
end
|
1090
|
+
end
|
1091
|
+
context 'UTF-8 2 byte char' do
|
1092
|
+
let(:target_line) {"INSERT INTO `test_table` VALUES ('testðtest');"}
|
1093
|
+
it 'should convert correctly' do
|
1094
|
+
expect(subject).to eq([["testðtest"]])
|
1095
|
+
end
|
1096
|
+
end
|
1097
|
+
context 'UTF-8 3 byte char' do
|
1098
|
+
let(:target_line) {"INSERT INTO `test_table` VALUES ('testあtest');"}
|
1099
|
+
it 'should convert correctly' do
|
1100
|
+
expect(subject).to eq([["testあtest"]])
|
1101
|
+
end
|
1102
|
+
end
|
1103
|
+
context 'UTF-8 4 byte char' do
|
1104
|
+
let(:target_line) {"INSERT INTO `test_table` VALUES ('test\xf0\x90\x85\x83test');"}
|
1105
|
+
it 'should convert correctly' do
|
1106
|
+
expect(subject).to eq([["test\xf0\x90\x85\x83test"]])
|
1107
|
+
end
|
1108
|
+
end
|
1109
|
+
end
|
1083
1110
|
end
|
1084
1111
|
end
|
1085
1112
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: flydata
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.17
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Koichi Fujikawa
|
@@ -12,7 +12,7 @@ authors:
|
|
12
12
|
autorequire:
|
13
13
|
bindir: bin
|
14
14
|
cert_chain: []
|
15
|
-
date: 2015-11-
|
15
|
+
date: 2015-11-10 00:00:00.000000000 Z
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
18
18
|
name: rest-client
|