flydata 0.6.4 → 0.6.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +1 -0
- data/Gemfile.lock +2 -0
- data/VERSION +1 -1
- data/flydata-core/lib/flydata-core/table_def/base.rb +31 -0
- data/flydata-core/lib/flydata-core/table_def/mysql_table_def.rb +9 -30
- data/flydata-core/lib/flydata-core/table_def/postgresql_table_def.rb +111 -0
- data/flydata-core/lib/flydata-core/table_def/redshift_table_def.rb +4 -1
- data/flydata-core/spec/table_def/postgresql_table_def_spec.rb +348 -0
- data/flydata-core/spec/table_def/redshift_table_def_spec.rb +25 -0
- data/flydata.gemspec +0 -0
- data/lib/flydata.rb +0 -7
- data/lib/flydata/command/base.rb +3 -2
- data/lib/flydata/fluent-plugins/flydata_plugin_ext/base.rb +5 -0
- data/lib/flydata/fluent-plugins/flydata_plugin_ext/flush_support.rb +52 -0
- data/lib/flydata/fluent-plugins/flydata_plugin_ext/flydata_sync.rb +55 -0
- data/lib/flydata/fluent-plugins/{idle_event_detector.rb → flydata_plugin_ext/idle_event_detector.rb} +0 -0
- data/lib/flydata/fluent-plugins/{preference.rb → flydata_plugin_ext/preference.rb} +2 -14
- data/lib/flydata/fluent-plugins/flydata_plugin_ext/transaction_support.rb +58 -0
- data/lib/flydata/fluent-plugins/in_mysql_binlog_flydata.rb +55 -135
- data/lib/flydata/fluent-plugins/mysql/dml_record_handler.rb +9 -4
- data/lib/flydata/helper/server.rb +7 -0
- data/lib/flydata/preference/data_entry_preference.rb +5 -13
- data/lib/flydata/source.rb +1 -1
- data/lib/flydata/source/data_entry.rb +29 -0
- data/lib/flydata/source/sync.rb +19 -0
- data/lib/flydata/source/sync_generate_table_ddl.rb +47 -7
- data/lib/flydata/source_mysql/data_entry.rb +22 -0
- data/lib/flydata/source_mysql/parser/dump_parser.rb +1 -1
- data/lib/flydata/source_mysql/parser/mysql_alter_table.treetop +8 -3
- data/lib/flydata/source_mysql/sync.rb +1 -8
- data/lib/flydata/source_mysql/sync_generate_table_ddl.rb +11 -16
- data/lib/flydata/source_postgresql/data_entry.rb +21 -0
- data/lib/flydata/source_postgresql/sync.rb +29 -0
- data/lib/flydata/source_postgresql/sync_generate_table_ddl.rb +126 -0
- data/spec/flydata/fluent-plugins/{idle_event_detector_spec.rb → flydata_plugin_ext/idle_event_detector_spec.rb} +1 -1
- data/spec/flydata/fluent-plugins/in_mysql_binlog_flydata_spec.rb +10 -0
- data/spec/flydata/source_mysql/parser/alter_table_parser_spec.rb +119 -0
- data/spec/flydata/source_mysql/parser/dump_parser_spec.rb +32 -1
- data/spec/flydata/source_mysql/sync_generate_table_ddl_spec.rb +4 -4
- metadata +31 -5
@@ -16,6 +16,7 @@ module Fluent
|
|
16
16
|
TEST_TABLE_BINLOG_POS = File.join(FLYDATA_HOME, "positions/#{TEST_TABLE}.binlog.pos")
|
17
17
|
TEST_TABLES = "#{TEST_TABLE},test_table_1,test_table_2,test_table_3"
|
18
18
|
TEST_POSITION_FILE = "test_position.binlog.pos"
|
19
|
+
TEST_SENT_POSITION_FILE = "test_position.binlog.sent.pos"
|
19
20
|
TEST_REVISION_FILE = File.join(FLYDATA_HOME, "positions/#{TEST_TABLE}.rev")
|
20
21
|
TEST_TIMESTAMP = 1389214083
|
21
22
|
TEST_TABLE_APPEND_ONLY = "test_table_4"
|
@@ -203,6 +204,13 @@ EOT
|
|
203
204
|
f
|
204
205
|
end
|
205
206
|
|
207
|
+
let(:sent_position_file) do
|
208
|
+
f = double('sent_position_file')
|
209
|
+
allow(f).to receive(:exists?).and_return(true)
|
210
|
+
allow(f).to receive(:read).and_return('test_sent_position')
|
211
|
+
f
|
212
|
+
end
|
213
|
+
|
206
214
|
def create_file(file_path, content)
|
207
215
|
File.open(file_path, 'w') {|f| f.write(content)}
|
208
216
|
end
|
@@ -228,6 +236,8 @@ EOT
|
|
228
236
|
setup_initial_flydata_files
|
229
237
|
allow(MysqlBinlogInput::BinlogUtil).to receive(:to_hash) {|e| e}
|
230
238
|
allow(Mysql::BinLogPositionFile).to receive(:new).with(TEST_POSITION_FILE).and_return(binlog_position_file)
|
239
|
+
allow(Mysql::BinLogPositionFile).to receive(:new).with(TEST_SENT_POSITION_FILE).
|
240
|
+
and_return(sent_position_file)
|
231
241
|
allow(Flydata::Mysql::TableMeta).to receive(:update)
|
232
242
|
allow(plugin).to receive(:`).with("mysql -V").and_return("mysql Ver 14.14 Distrib 5.5.40")
|
233
243
|
allow(plugin).to receive(:`).with(/^echo 'select version\(\);'/).and_return("version()\n5.5.40-0ubuntu0.12.04.1-log")
|
@@ -33,6 +33,86 @@ describe 'MysqlAlterTableParser' do
|
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
36
|
+
context 'with space between type and meta' do
|
37
|
+
let(:query) { "alter table test_table add column value varchar (26)" }
|
38
|
+
it do
|
39
|
+
expect(subject).to eq({
|
40
|
+
type: :alter_table,
|
41
|
+
table_name: "test_table",
|
42
|
+
actions: [{
|
43
|
+
action: :add_column,
|
44
|
+
column: "value",
|
45
|
+
type: "varchar(78)",
|
46
|
+
query: "add column value varchar (26)"
|
47
|
+
}]
|
48
|
+
})
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
context 'with space before meta value' do
|
53
|
+
let(:query) { "alter table test_table add column value varchar( 26)" }
|
54
|
+
it do
|
55
|
+
expect(subject).to eq({
|
56
|
+
type: :alter_table,
|
57
|
+
table_name: "test_table",
|
58
|
+
actions: [{
|
59
|
+
action: :add_column,
|
60
|
+
column: "value",
|
61
|
+
type: "varchar(78)",
|
62
|
+
query: "add column value varchar( 26)"
|
63
|
+
}]
|
64
|
+
})
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
context 'with space after meta value' do
|
69
|
+
let(:query) { "alter table test_table add column value varchar(26 )" }
|
70
|
+
it do
|
71
|
+
expect(subject).to eq({
|
72
|
+
type: :alter_table,
|
73
|
+
table_name: "test_table",
|
74
|
+
actions: [{
|
75
|
+
action: :add_column,
|
76
|
+
column: "value",
|
77
|
+
type: "varchar(78)",
|
78
|
+
query: "add column value varchar(26 )"
|
79
|
+
}]
|
80
|
+
})
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
context 'with space before and after meta value' do
|
85
|
+
let(:query) { "alter table test_table add column value varchar( 26 )" }
|
86
|
+
it do
|
87
|
+
expect(subject).to eq({
|
88
|
+
type: :alter_table,
|
89
|
+
table_name: "test_table",
|
90
|
+
actions: [{
|
91
|
+
action: :add_column,
|
92
|
+
column: "value",
|
93
|
+
type: "varchar(78)",
|
94
|
+
query: "add column value varchar( 26 )"
|
95
|
+
}]
|
96
|
+
})
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
context 'with spaces everywhere' do
|
101
|
+
let(:query) { "alter table test_table add column value varchar ( 26 )" }
|
102
|
+
it do
|
103
|
+
expect(subject).to eq({
|
104
|
+
type: :alter_table,
|
105
|
+
table_name: "test_table",
|
106
|
+
actions: [{
|
107
|
+
action: :add_column,
|
108
|
+
column: "value",
|
109
|
+
type: "varchar(78)",
|
110
|
+
query: "add column value varchar ( 26 )"
|
111
|
+
}]
|
112
|
+
})
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
36
116
|
context 'with a non-ascii table name' do
|
37
117
|
let(:query) { "alter table `テスト` add column value varchar(26)" }
|
38
118
|
it do
|
@@ -83,6 +163,23 @@ describe 'MysqlAlterTableParser' do
|
|
83
163
|
end
|
84
164
|
end
|
85
165
|
|
166
|
+
context 'data_type without meta' do
|
167
|
+
let(:query) { "alter table test_table add value int not null" }
|
168
|
+
it do
|
169
|
+
expect(subject).to eq({
|
170
|
+
type: :alter_table,
|
171
|
+
table_name: "test_table",
|
172
|
+
actions: [{
|
173
|
+
action: :add_column,
|
174
|
+
column: "value",
|
175
|
+
type: "int4(11)",
|
176
|
+
not_null: true,
|
177
|
+
query: "add value int not null"
|
178
|
+
}]
|
179
|
+
})
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
86
183
|
context 'with multiple columns' do
|
87
184
|
shared_examples 'test result hash' do
|
88
185
|
it do
|
@@ -103,6 +200,7 @@ describe 'MysqlAlterTableParser' do
|
|
103
200
|
})
|
104
201
|
end
|
105
202
|
end
|
203
|
+
|
106
204
|
context 'with spaces before opening bracket' do
|
107
205
|
let(:query) { "alter table test_table add column (value1 varchar(26), value2 varchar(26))" }
|
108
206
|
let(:expected_query) {"add column (value1 varchar(26), value2 varchar(26))"}
|
@@ -115,6 +213,27 @@ describe 'MysqlAlterTableParser' do
|
|
115
213
|
end
|
116
214
|
end
|
117
215
|
|
216
|
+
context 'with multiple columns without bracket without the keyword "COLUMN"' do
|
217
|
+
let(:query) { "alter table test_table add value1 varchar(26), add value2 varchar(26)" }
|
218
|
+
it do
|
219
|
+
expect(subject).to eq({
|
220
|
+
type: :alter_table,
|
221
|
+
table_name: "test_table",
|
222
|
+
actions: [{
|
223
|
+
action: :add_column,
|
224
|
+
column: "value1",
|
225
|
+
type: "varchar(78)",
|
226
|
+
query: "add value1 varchar(26)"
|
227
|
+
},{
|
228
|
+
action: :add_column,
|
229
|
+
column: "value2",
|
230
|
+
type: "varchar(78)",
|
231
|
+
query: "add value2 varchar(26)"
|
232
|
+
}]
|
233
|
+
})
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
118
237
|
context 'with multiple columns and without the keyword "COLUMN"' do
|
119
238
|
let(:query) { "alter table test_table add ( value1 varchar(26), value2 varchar(26) )" }
|
120
239
|
it do
|
@@ -322,16 +322,29 @@ EOT
|
|
322
322
|
expect(source_table.table_name).to eq('users_login')
|
323
323
|
expect(values_set).to eq(expected_values)
|
324
324
|
nil
|
325
|
+
=begin
|
326
|
+
# Use this when _parse2 is used
|
325
327
|
}.once
|
328
|
+
=end
|
329
|
+
# =begin
|
330
|
+
# Use this when _parse is used
|
331
|
+
}.never
|
332
|
+
# =end
|
326
333
|
end
|
327
334
|
expect(insert_record_block).to receive(:call).never
|
328
335
|
|
329
|
-
#
|
336
|
+
# check_point_block
|
330
337
|
[
|
331
338
|
{state: Flydata::Parser::State::CREATE_TABLE},
|
332
339
|
{state: Flydata::Parser::State::INSERT_RECORD},
|
340
|
+
=begin
|
341
|
+
# Use this when _parse2 is used
|
333
342
|
{state: Flydata::Parser::State::CREATE_TABLE,
|
334
343
|
last_pos: index_after(dump_content, 'UNLOCK TABLES;')}
|
344
|
+
=end
|
345
|
+
# =begin
|
346
|
+
# Use this when _parse is used
|
347
|
+
# =end
|
335
348
|
].each do |expected_params|
|
336
349
|
expect(check_point_block).to receive(:call) { |source_table, last_pos, bytesize, binlog_pos, state, substate|
|
337
350
|
expect(source_table.table_name).to eq('users_login') if source_table
|
@@ -346,10 +359,21 @@ EOT
|
|
346
359
|
end
|
347
360
|
expect(check_point_block).to receive(:call).never
|
348
361
|
|
362
|
+
=begin
|
363
|
+
# Use this when _parse2 is used
|
349
364
|
binlog_pos = default_parser.parse(
|
350
365
|
dump_io, create_table_block, insert_record_block, check_point_block
|
351
366
|
)
|
352
367
|
expect(binlog_pos).to eq(default_binlog_pos)
|
368
|
+
=end
|
369
|
+
# =begin
|
370
|
+
# Use this when _parse is used
|
371
|
+
expect {
|
372
|
+
binlog_pos = default_parser.parse(
|
373
|
+
dump_io, create_table_block, insert_record_block,
|
374
|
+
check_point_block)
|
375
|
+
}.to raise_error(DumpParseError)
|
376
|
+
# =end
|
353
377
|
end
|
354
378
|
end
|
355
379
|
|
@@ -851,7 +875,14 @@ EOT
|
|
851
875
|
end
|
852
876
|
context 'with various escape chars 1' do
|
853
877
|
let(:value) { %Q|\\r\t\\Z| }
|
878
|
+
=begin
|
879
|
+
# Use this when _parse2 is used
|
854
880
|
let(:expected_value) { %Q|\r\t\x1a| }
|
881
|
+
=end
|
882
|
+
# =begin
|
883
|
+
# Use this when _parse is used
|
884
|
+
let(:expected_value) { %Q|\r\t\\Z| }
|
885
|
+
# =end
|
855
886
|
it 'returns correct chars' do
|
856
887
|
expect(subject).to eq([[expected_value]])
|
857
888
|
end
|
@@ -12,7 +12,7 @@ describe SyncGenerateTableDdl do
|
|
12
12
|
'host' => 'localhost',
|
13
13
|
'port' => 3306,
|
14
14
|
'username' => 'masashi',
|
15
|
-
'password' => '
|
15
|
+
'password' => 'welcomes',
|
16
16
|
'database' => 'sync_test',
|
17
17
|
}
|
18
18
|
} }
|
@@ -42,7 +42,7 @@ describe SyncGenerateTableDdl do
|
|
42
42
|
context 'with full options' do
|
43
43
|
it 'issues mysqldump command with expected parameters' do
|
44
44
|
expect(Open3).to receive(:popen3).with(
|
45
|
-
'mysqldump -h localhost -P 3306 -umasashi -
|
45
|
+
'mysqldump -h localhost -P 3306 -umasashi -pwelcomes --default-character-set=utf8 --protocol=tcp -d sync_test table1 table2 table4 table3')
|
46
46
|
|
47
47
|
subject
|
48
48
|
end
|
@@ -65,7 +65,7 @@ describe SyncGenerateTableDdl do
|
|
65
65
|
end
|
66
66
|
it "uses the default port" do
|
67
67
|
expect(Open3).to receive(:popen3).with(
|
68
|
-
'mysqldump -h localhost -umasashi -
|
68
|
+
'mysqldump -h localhost -umasashi -pwelcomes --default-character-set=utf8 --protocol=tcp -d sync_test table1 table2 table4 table3')
|
69
69
|
subject
|
70
70
|
end
|
71
71
|
end
|
@@ -75,7 +75,7 @@ describe SyncGenerateTableDdl do
|
|
75
75
|
end
|
76
76
|
it "uses the specified port" do
|
77
77
|
expect(Open3).to receive(:popen3).with(
|
78
|
-
'mysqldump -h localhost -P 1234 -umasashi -
|
78
|
+
'mysqldump -h localhost -P 1234 -umasashi -pwelcomes --default-character-set=utf8 --protocol=tcp -d sync_test table1 table2 table4 table3')
|
79
79
|
subject
|
80
80
|
end
|
81
81
|
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.6.
|
4
|
+
version: 0.6.5
|
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: 2016-
|
15
|
+
date: 2016-02-08 00:00:00.000000000 Z
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
18
18
|
name: rest-client
|
@@ -162,6 +162,20 @@ dependencies:
|
|
162
162
|
- - ~>
|
163
163
|
- !ruby/object:Gem::Version
|
164
164
|
version: '0.3'
|
165
|
+
- !ruby/object:Gem::Dependency
|
166
|
+
name: pg
|
167
|
+
requirement: !ruby/object:Gem::Requirement
|
168
|
+
requirements:
|
169
|
+
- - ~>
|
170
|
+
- !ruby/object:Gem::Version
|
171
|
+
version: 0.18.4
|
172
|
+
type: :runtime
|
173
|
+
prerelease: false
|
174
|
+
version_requirements: !ruby/object:Gem::Requirement
|
175
|
+
requirements:
|
176
|
+
- - ~>
|
177
|
+
- !ruby/object:Gem::Version
|
178
|
+
version: 0.18.4
|
165
179
|
- !ruby/object:Gem::Dependency
|
166
180
|
name: slop
|
167
181
|
requirement: !ruby/object:Gem::Requirement
|
@@ -536,7 +550,9 @@ files:
|
|
536
550
|
- flydata-core/lib/flydata-core/string_utils.rb
|
537
551
|
- flydata-core/lib/flydata-core/table_def.rb
|
538
552
|
- flydata-core/lib/flydata-core/table_def/autoload_redshift_table_def.rb
|
553
|
+
- flydata-core/lib/flydata-core/table_def/base.rb
|
539
554
|
- flydata-core/lib/flydata-core/table_def/mysql_table_def.rb
|
555
|
+
- flydata-core/lib/flydata-core/table_def/postgresql_table_def.rb
|
540
556
|
- flydata-core/lib/flydata-core/table_def/redshift_table_def.rb
|
541
557
|
- flydata-core/lib/flydata-core/table_def/sync_redshift_table_def.rb
|
542
558
|
- flydata-core/lib/flydata-core/thread_context.rb
|
@@ -578,6 +594,7 @@ files:
|
|
578
594
|
- flydata-core/spec/table_def/mysqldump_test_unique_key2.dump
|
579
595
|
- flydata-core/spec/table_def/mysqldump_test_unique_key3.dump
|
580
596
|
- flydata-core/spec/table_def/mysqldump_test_unsigned.dump
|
597
|
+
- flydata-core/spec/table_def/postgresql_table_def_spec.rb
|
581
598
|
- flydata-core/spec/table_def/redshift_table_def_spec.rb
|
582
599
|
- flydata-core/spec/table_def/sync_redshift_table_def_spec.rb
|
583
600
|
- flydata-core/spec/wrapper_forwardable_spec.rb
|
@@ -616,7 +633,12 @@ files:
|
|
616
633
|
- lib/flydata/cron.rb
|
617
634
|
- lib/flydata/errors.rb
|
618
635
|
- lib/flydata/event/api_event_sender.rb
|
619
|
-
- lib/flydata/fluent-plugins/
|
636
|
+
- lib/flydata/fluent-plugins/flydata_plugin_ext/base.rb
|
637
|
+
- lib/flydata/fluent-plugins/flydata_plugin_ext/flush_support.rb
|
638
|
+
- lib/flydata/fluent-plugins/flydata_plugin_ext/flydata_sync.rb
|
639
|
+
- lib/flydata/fluent-plugins/flydata_plugin_ext/idle_event_detector.rb
|
640
|
+
- lib/flydata/fluent-plugins/flydata_plugin_ext/preference.rb
|
641
|
+
- lib/flydata/fluent-plugins/flydata_plugin_ext/transaction_support.rb
|
620
642
|
- lib/flydata/fluent-plugins/in_mysql_binlog_flydata.rb
|
621
643
|
- lib/flydata/fluent-plugins/mysql/alter_table_query_handler.rb
|
622
644
|
- lib/flydata/fluent-plugins/mysql/binlog_position_file.rb
|
@@ -631,7 +653,6 @@ files:
|
|
631
653
|
- lib/flydata/fluent-plugins/mysql/table_meta.rb
|
632
654
|
- lib/flydata/fluent-plugins/mysql/truncate_table_query_handler.rb
|
633
655
|
- lib/flydata/fluent-plugins/out_forward_ssl.rb
|
634
|
-
- lib/flydata/fluent-plugins/preference.rb
|
635
656
|
- lib/flydata/flydata_crontab.sh
|
636
657
|
- lib/flydata/helper/action/agent_action.rb
|
637
658
|
- lib/flydata/helper/action/check_abnormal_shutdown.rb
|
@@ -663,6 +684,7 @@ files:
|
|
663
684
|
- lib/flydata/queueable_thread.rb
|
664
685
|
- lib/flydata/source.rb
|
665
686
|
- lib/flydata/source/component.rb
|
687
|
+
- lib/flydata/source/data_entry.rb
|
666
688
|
- lib/flydata/source/errors.rb
|
667
689
|
- lib/flydata/source/generate_source_dump.rb
|
668
690
|
- lib/flydata/source/parse_dump_and_send.rb
|
@@ -676,6 +698,7 @@ files:
|
|
676
698
|
- lib/flydata/source_mysql/command/mysql_command_base.rb
|
677
699
|
- lib/flydata/source_mysql/command/mysqlbinlog.rb
|
678
700
|
- lib/flydata/source_mysql/command/mysqldump.rb
|
701
|
+
- lib/flydata/source_mysql/data_entry.rb
|
679
702
|
- lib/flydata/source_mysql/generate_source_dump.rb
|
680
703
|
- lib/flydata/source_mysql/mysql_compatibility_check.rb
|
681
704
|
- lib/flydata/source_mysql/parse_dump_and_send.rb
|
@@ -687,6 +710,9 @@ files:
|
|
687
710
|
- lib/flydata/source_mysql/sync.rb
|
688
711
|
- lib/flydata/source_mysql/sync_generate_table_ddl.rb
|
689
712
|
- lib/flydata/source_mysql/table_ddl.rb
|
713
|
+
- lib/flydata/source_postgresql/data_entry.rb
|
714
|
+
- lib/flydata/source_postgresql/sync.rb
|
715
|
+
- lib/flydata/source_postgresql/sync_generate_table_ddl.rb
|
690
716
|
- lib/flydata/source_zendesk/sync_generate_table_ddl.rb
|
691
717
|
- lib/flydata/source_zendesk/zendesk_flydata_tabledefs.rb
|
692
718
|
- lib/flydata/sync_file_manager.rb
|
@@ -718,7 +744,7 @@ files:
|
|
718
744
|
- spec/flydata/command/sync_spec.rb
|
719
745
|
- spec/flydata/command/version_spec.rb
|
720
746
|
- spec/flydata/compatibility_check_spec.rb
|
721
|
-
- spec/flydata/fluent-plugins/idle_event_detector_spec.rb
|
747
|
+
- spec/flydata/fluent-plugins/flydata_plugin_ext/idle_event_detector_spec.rb
|
722
748
|
- spec/flydata/fluent-plugins/in_mysql_binlog_flydata_spec.rb
|
723
749
|
- spec/flydata/fluent-plugins/mysql/alter_table_query_handler_spec.rb
|
724
750
|
- spec/flydata/fluent-plugins/mysql/binlog_query_dispatcher_spec.rb
|