flydata 0.2.12 → 0.2.13
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/flydata.gemspec +4 -4
- data/lib/flydata/{errors.rb → agent_errors.rb} +0 -0
- data/lib/flydata/command/sender.rb +30 -6
- data/lib/flydata/command/sync.rb +1 -1
- data/lib/flydata/compatibility_check.rb +18 -14
- data/lib/flydata/parser/mysql/mysql_alter_table.treetop +63 -4
- data/spec/flydata/command/sender_spec.rb +3 -3
- data/spec/flydata/compatibility_check_spec.rb +17 -9
- data/spec/flydata/parser/mysql/alter_table_parser_spec.rb +256 -0
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7d20120a45eeb0e80acb2738e924ff664454d8bf
|
4
|
+
data.tar.gz: 96aadd0c65100102b2e659d063fbc1d9a391f56d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: be0a985f146c83e734435c5a84d38d32b0daf8e0c32a59f8774c6b1570d360cfcab3b42fc327cd01b8a54ba4229718b6e7049cc9c635f11c1bf333d163d02e79
|
7
|
+
data.tar.gz: 09f3b5918fbe79bbdf86d0570f73524a646d7f507a89c3fe0ae4df9d846e3724577b52da4ee73dcd0f10172128664f2c9121b9d0f5d513ba38f5a5f84f4229d9
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.2.
|
1
|
+
0.2.13
|
data/flydata.gemspec
CHANGED
@@ -2,16 +2,16 @@
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
3
|
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
|
-
# stub: flydata 0.2.
|
5
|
+
# stub: flydata 0.2.13 ruby lib
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
8
|
s.name = "flydata"
|
9
|
-
s.version = "0.2.
|
9
|
+
s.version = "0.2.13"
|
10
10
|
|
11
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
12
12
|
s.require_paths = ["lib"]
|
13
13
|
s.authors = ["Koichi Fujikawa", "Masashi Miyazaki", "Matthew Luu", "Mak Inada", "Sriram NS"]
|
14
|
-
s.date = "2014-11-
|
14
|
+
s.date = "2014-11-08"
|
15
15
|
s.description = "FlyData Agent"
|
16
16
|
s.email = "sysadmin@flydata.com"
|
17
17
|
s.executables = ["fdmysqldump", "flydata", "serverinfo"]
|
@@ -33,6 +33,7 @@ Gem::Specification.new do |s|
|
|
33
33
|
"flydata.gemspec",
|
34
34
|
"lib/fly_data_model.rb",
|
35
35
|
"lib/flydata.rb",
|
36
|
+
"lib/flydata/agent_errors.rb",
|
36
37
|
"lib/flydata/api/base.rb",
|
37
38
|
"lib/flydata/api/data_entry.rb",
|
38
39
|
"lib/flydata/api/data_port.rb",
|
@@ -58,7 +59,6 @@ Gem::Specification.new do |s|
|
|
58
59
|
"lib/flydata/compatibility_check.rb",
|
59
60
|
"lib/flydata/credentials.rb",
|
60
61
|
"lib/flydata/cron.rb",
|
61
|
-
"lib/flydata/errors.rb",
|
62
62
|
"lib/flydata/fluent-plugins/in_mysql_binlog_flydata.rb",
|
63
63
|
"lib/flydata/fluent-plugins/mysql/alter_table_query_handler.rb",
|
64
64
|
"lib/flydata/fluent-plugins/mysql/binlog_position.rb",
|
File without changes
|
@@ -20,6 +20,11 @@ module Flydata
|
|
20
20
|
return
|
21
21
|
end
|
22
22
|
|
23
|
+
# Ends orphan_proceses if there is any
|
24
|
+
orphan_processes.each do |pid|
|
25
|
+
Process.kill(:TERM, pid)
|
26
|
+
end
|
27
|
+
|
23
28
|
wait_until_server_ready(options)
|
24
29
|
|
25
30
|
dp = flydata.data_port.get
|
@@ -29,8 +34,8 @@ module Flydata
|
|
29
34
|
say('Starting sender process.') unless options[:quiet]
|
30
35
|
Dir.chdir(FLYDATA_HOME){
|
31
36
|
Kernel.system("bash #{File.dirname(__FILE__)}/../../../bin/serverinfo", :out => ["#{FLYDATA_HOME}/flydata.log",'a'], :err => ["#{FLYDATA_HOME}/flydata.log",'a'])
|
32
|
-
|
33
|
-
Kernel.system("fluentd #{
|
37
|
+
daemon_opt = opts.no_daemon? ? "" : daemon_option
|
38
|
+
Kernel.system("ruby `which fluentd` #{daemon_opt} -l #{FLYDATA_HOME}/flydata.log -c #{FLYDATA_HOME}/flydata.conf -p #{File.dirname(__FILE__)}/../fluent-plugins")
|
34
39
|
}
|
35
40
|
Kernel.sleep 5
|
36
41
|
|
@@ -51,7 +56,7 @@ EOF
|
|
51
56
|
end
|
52
57
|
|
53
58
|
say('Stopping sender process.') unless options[:quiet]
|
54
|
-
if Kernel.system("kill `cat #{
|
59
|
+
if Kernel.system("kill `cat #{pid_file}`") and wait_until_client_stop(options)
|
55
60
|
say('Done.') unless options[:quiet]
|
56
61
|
return true
|
57
62
|
end
|
@@ -65,7 +70,7 @@ EOF
|
|
65
70
|
end
|
66
71
|
|
67
72
|
say('Stopping input plugins and flushing the client buffer.') unless options[:quiet]
|
68
|
-
Kernel.system("kill -USR1 `cat #{
|
73
|
+
Kernel.system("kill -USR1 `cat #{pid_file}`")
|
69
74
|
|
70
75
|
retry_count = 12
|
71
76
|
1.upto(retry_count) do |i|
|
@@ -79,7 +84,7 @@ EOF
|
|
79
84
|
def restart(options = {})
|
80
85
|
if process_exist?
|
81
86
|
say('Restarting sender process.') unless options[:quiet]
|
82
|
-
if Kernel.system("kill -HUP `cat #{
|
87
|
+
if Kernel.system("kill -HUP `cat #{pid_file}`")
|
83
88
|
say('Done.') unless options[:quiet]
|
84
89
|
return true
|
85
90
|
else
|
@@ -99,7 +104,7 @@ EOF
|
|
99
104
|
end
|
100
105
|
def process_exist?
|
101
106
|
# Returns true if the process is running
|
102
|
-
`[ -f #{
|
107
|
+
`[ -f #{pid_file} ] && pgrep -P \`cat #{pid_file}\``.to_i > 0
|
103
108
|
end
|
104
109
|
def kill_all(optiosn = {})
|
105
110
|
if Kernel.system("ps ax | grep 'flydata' | grep -v grep | awk '{print \"kill \" $1}' | sh")
|
@@ -111,6 +116,19 @@ EOF
|
|
111
116
|
end
|
112
117
|
|
113
118
|
private
|
119
|
+
# Return a list of fluentd parent processes run by the same user for the
|
120
|
+
# same flydata.pid file but not the process managed by the file itself.
|
121
|
+
CMD = %Q{ps -u `whoami` -o ppid,pid,args | grep '^ *1 ' | grep '\\%s' | egrep -v "\\b`cat %s`\\b"}
|
122
|
+
def orphan_processes
|
123
|
+
cmd = CMD % [ daemon_option, pid_file ]
|
124
|
+
result = `#{cmd}`
|
125
|
+
orphan_pids = []
|
126
|
+
result.each_line do |line|
|
127
|
+
orphan_pids << line.split[1].to_i
|
128
|
+
end
|
129
|
+
orphan_pids
|
130
|
+
end
|
131
|
+
|
114
132
|
def wait_until_server_ready(options = {})
|
115
133
|
retry_count = 10
|
116
134
|
1.upto(retry_count) do |i|
|
@@ -181,6 +199,12 @@ EOF
|
|
181
199
|
say("Checking the client buffer #{client_buffer}") unless options[:quiet]
|
182
200
|
Dir.glob("#{client_buffer}/*").empty?
|
183
201
|
end
|
202
|
+
def pid_file
|
203
|
+
"#{FLYDATA_HOME}/flydata.pid"
|
204
|
+
end
|
205
|
+
def daemon_option
|
206
|
+
"-d #{pid_file}"
|
207
|
+
end
|
184
208
|
end
|
185
209
|
end
|
186
210
|
end
|
data/lib/flydata/command/sync.rb
CHANGED
@@ -39,22 +39,26 @@ module Flydata
|
|
39
39
|
SSL_PORT=45327
|
40
40
|
|
41
41
|
def check_outgoing_ports
|
42
|
-
|
43
|
-
|
44
|
-
raise AgentCompatibilityError,
|
45
|
-
"Cannot connect to outisde ports. Please check to make sure you have these outgoing ports open: #{TCP_PORT},#{SSL_PORT}"
|
46
|
-
end
|
47
|
-
end
|
42
|
+
ports = [TCP_PORT]
|
43
|
+
ports << SSL_PORT unless ENV['FLYDATA_ENV_KEY'] == 'development'
|
48
44
|
|
49
|
-
private
|
50
|
-
def can_connect_to_port?(port)
|
51
45
|
url = @dp["servers"].first
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
46
|
+
errors = {}
|
47
|
+
ports.each do |port|
|
48
|
+
begin
|
49
|
+
e = TCPSocket.new(url, port)
|
50
|
+
e.close
|
51
|
+
rescue => e
|
52
|
+
errors[port] = e
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
unless errors.empty?
|
57
|
+
message = "Cannot connect to outisde ports. Please check to make sure you have these outgoing ports open."
|
58
|
+
errors.each do |port, e|
|
59
|
+
message += " Port #{port}, Error #{e.class.name}: #{e.to_s}"
|
60
|
+
end
|
61
|
+
raise AgentCompatibilityError, message
|
58
62
|
end
|
59
63
|
end
|
60
64
|
end
|
@@ -100,7 +100,7 @@ grammar MysqlAlterTable
|
|
100
100
|
action_hash
|
101
101
|
end
|
102
102
|
}
|
103
|
-
/ add_key
|
103
|
+
/ add_key opt_column sp col_name_def opt_place {
|
104
104
|
def action
|
105
105
|
ret = { action: :add_column }
|
106
106
|
ret.merge!(col_name_def.column_def)
|
@@ -110,7 +110,7 @@ grammar MysqlAlterTable
|
|
110
110
|
ret
|
111
111
|
end
|
112
112
|
}
|
113
|
-
/ add_key
|
113
|
+
/ add_key opt_column nsp '(' nsp col_name_def ( comma col_name_def )* nsp ')' {
|
114
114
|
def action
|
115
115
|
ret = [col_name_def.column_def]
|
116
116
|
ret += 0.upto(elements[6].elements.count - 1).collect do |i|
|
@@ -119,6 +119,30 @@ grammar MysqlAlterTable
|
|
119
119
|
ret.collect{|v| {action: :add_column}.merge(v) }
|
120
120
|
end
|
121
121
|
}
|
122
|
+
# Re-using col_name and col_name_def for now
|
123
|
+
# TODO Refactor later to match sql_yacc.yy more closely
|
124
|
+
/ change_sym opt_column sp col_name sp col_name_def opt_place {
|
125
|
+
def action
|
126
|
+
ret = { action: :change_column }
|
127
|
+
ret[:old_column] = col_name.value
|
128
|
+
ret.merge!(col_name_def.column_def)
|
129
|
+
if elements[6].nonterminal?
|
130
|
+
ret.merge!(elements[6].elements[1].pos_def_option)
|
131
|
+
end
|
132
|
+
ret
|
133
|
+
end
|
134
|
+
}
|
135
|
+
/ modify_sym opt_column sp col_name_def opt_place {
|
136
|
+
def action
|
137
|
+
ret = { action: :change_column }
|
138
|
+
ret.merge!(col_name_def.column_def)
|
139
|
+
ret[:old_column] = ret[:column]
|
140
|
+
if elements[4].nonterminal?
|
141
|
+
ret.merge!(elements[4].elements[1].pos_def_option)
|
142
|
+
end
|
143
|
+
ret
|
144
|
+
end
|
145
|
+
}
|
122
146
|
/ drop_key sp primary_sym sp key_sym {
|
123
147
|
def action
|
124
148
|
{ action: :drop_primary_key }
|
@@ -138,7 +162,7 @@ grammar MysqlAlterTable
|
|
138
162
|
}
|
139
163
|
end
|
140
164
|
}
|
141
|
-
/ drop_key
|
165
|
+
/ drop_key opt_column sp col_name {
|
142
166
|
def action
|
143
167
|
{ action: :drop_column,
|
144
168
|
column: col_name.value, }
|
@@ -578,6 +602,10 @@ grammar MysqlAlterTable
|
|
578
602
|
}
|
579
603
|
end
|
580
604
|
|
605
|
+
rule opt_place
|
606
|
+
( sp pos_def )?
|
607
|
+
end
|
608
|
+
|
581
609
|
rule pos_def
|
582
610
|
'first'i {
|
583
611
|
def pos_def_option
|
@@ -929,7 +957,6 @@ grammar MysqlAlterTable
|
|
929
957
|
rule table_key 'table'i end
|
930
958
|
rule add_key 'add'i end
|
931
959
|
rule drop_key 'drop'i end
|
932
|
-
rule col_key 'column'i end
|
933
960
|
|
934
961
|
|
935
962
|
######## Common rules
|
@@ -967,6 +994,7 @@ grammar MysqlAlterTable
|
|
967
994
|
|
968
995
|
rule value
|
969
996
|
quoted_value { def raw_value; text_raw_value; end }
|
997
|
+
/ double_quoted_value { def raw_value; text_raw_value; end }
|
970
998
|
/ ident_sym { def raw_value; text_value; end }
|
971
999
|
end
|
972
1000
|
|
@@ -974,10 +1002,22 @@ grammar MysqlAlterTable
|
|
974
1002
|
"'" text "'" { def text_raw_value; text.text_value; end }
|
975
1003
|
end
|
976
1004
|
|
1005
|
+
rule double_quoted_value
|
1006
|
+
'"' text_within_double_quotes '"' {
|
1007
|
+
def text_raw_value
|
1008
|
+
text_within_double_quotes.text_value
|
1009
|
+
end
|
1010
|
+
}
|
1011
|
+
end
|
1012
|
+
|
977
1013
|
rule text
|
978
1014
|
("\\\\" / "\\'" / !"'" . )*
|
979
1015
|
end
|
980
1016
|
|
1017
|
+
rule text_within_double_quotes
|
1018
|
+
('\\\\' / '\\"' / !'"' . )*
|
1019
|
+
end
|
1020
|
+
|
981
1021
|
rule ident
|
982
1022
|
ident_sys / keyword
|
983
1023
|
end
|
@@ -1298,4 +1338,23 @@ grammar MysqlAlterTable
|
|
1298
1338
|
/ extended_sym
|
1299
1339
|
/ use_frm_sym
|
1300
1340
|
end
|
1341
|
+
|
1342
|
+
## Change column related rules
|
1343
|
+
|
1344
|
+
rule change_sym
|
1345
|
+
'change'i ![A-Za-z0-9_]
|
1346
|
+
end
|
1347
|
+
|
1348
|
+
rule modify_sym
|
1349
|
+
'modify'i ![A-Za-z0-9_]
|
1350
|
+
end
|
1351
|
+
|
1352
|
+
rule column_sym
|
1353
|
+
'column'i ![A-Za-z0-9_]
|
1354
|
+
end
|
1355
|
+
|
1356
|
+
rule opt_column
|
1357
|
+
( sp column_sym )?
|
1358
|
+
end
|
1359
|
+
|
1301
1360
|
end
|
@@ -26,7 +26,7 @@ module Flydata
|
|
26
26
|
expect(Kernel).to receive(:system).with( Regexp.new(
|
27
27
|
"bash .+/../../../bin/serverinfo"), :out => [Regexp.new(".+/flydata.log"),'a'], :err => [Regexp.new(".+/flydata.log"),'a'])
|
28
28
|
expect(Kernel).to receive(:system).with( Regexp.new(
|
29
|
-
"fluentd -d .+/flydata.pid -l .+/flydata.log -c .+/flydata.conf -p .+/\.\./fluent-plugins"))
|
29
|
+
"ruby `which fluentd` -d .+/flydata.pid -l .+/flydata.log -c .+/flydata.conf -p .+/\.\./fluent-plugins"))
|
30
30
|
subject.start(false)
|
31
31
|
end
|
32
32
|
end
|
@@ -36,7 +36,7 @@ module Flydata
|
|
36
36
|
expect(Kernel).to receive(:system).with( Regexp.new(
|
37
37
|
"bash .+/../../../bin/serverinfo"), :out => [Regexp.new(".+/flydata.log"),'a'], :err => [Regexp.new(".+/flydata.log"),'a'])
|
38
38
|
expect(Kernel).to receive(:system).with(Regexp.new(
|
39
|
-
"fluentd -l .+/flydata.log -c .+/flydata.conf -p .+/\.\./fluent-plugins"))
|
39
|
+
"ruby `which fluentd` -l .+/flydata.log -c .+/flydata.conf -p .+/\.\./fluent-plugins"))
|
40
40
|
subject.start(false)
|
41
41
|
end
|
42
42
|
end
|
@@ -46,7 +46,7 @@ module Flydata
|
|
46
46
|
expect(Kernel).to receive(:system).with( Regexp.new(
|
47
47
|
"bash .+/../../../bin/serverinfo"), :out => [Regexp.new(".+/flydata.log"),'a'], :err => [Regexp.new(".+/flydata.log"),'a'])
|
48
48
|
expect(Kernel).to receive(:system).with(Regexp.new(
|
49
|
-
"fluentd -l .+/flydata.log -c .+/flydata.conf -p .+/\.\./fluent-plugins"))
|
49
|
+
"ruby `which fluentd` -l .+/flydata.log -c .+/flydata.conf -p .+/\.\./fluent-plugins"))
|
50
50
|
subject.start(false)
|
51
51
|
end
|
52
52
|
end
|
@@ -7,17 +7,25 @@ module Flydata
|
|
7
7
|
end
|
8
8
|
|
9
9
|
describe "#check" do
|
10
|
-
subject { AgentCompatibilityCheck.new(
|
10
|
+
subject { AgentCompatibilityCheck.new("servers" => ['localhost']) }
|
11
11
|
context "runs all check methods" do
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
12
|
+
context "when all ports are accessible" do
|
13
|
+
let(:sock) { double('sock') }
|
14
|
+
before do
|
15
|
+
allow(TCPSocket).to receive(:new).and_return(sock)
|
16
|
+
allow(sock).to receive(:close)
|
17
|
+
end
|
18
|
+
it "does nothing" do
|
19
|
+
subject.check
|
20
|
+
end
|
16
21
|
end
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
22
|
+
context "when a port access fails" do
|
23
|
+
before do
|
24
|
+
allow(TCPSocket).to receive(:new).and_raise(Errno::ETIMEDOUT)
|
25
|
+
end
|
26
|
+
it do
|
27
|
+
expect{subject.check_outgoing_ports}.to raise_error(Flydata::AgentCompatibilityCheck::AgentCompatibilityError, /ports/)
|
28
|
+
end
|
21
29
|
end
|
22
30
|
end
|
23
31
|
end
|
@@ -1333,5 +1333,261 @@ describe 'MysqlAlterTableParser' do
|
|
1333
1333
|
let(:alter_table_action) { "REMOVE PARTITIONING" }
|
1334
1334
|
it_behaves_like "a parser parsing a nonbreaking query"
|
1335
1335
|
end
|
1336
|
+
|
1337
|
+
## Change and modify column related tests
|
1338
|
+
shared_examples "test optional column" do |*examples|
|
1339
|
+
context "with column" do
|
1340
|
+
it_behaves_like *examples do
|
1341
|
+
let(:column) {" COLUMN"}
|
1342
|
+
end
|
1343
|
+
end
|
1344
|
+
context "without column" do
|
1345
|
+
it_behaves_like *examples do
|
1346
|
+
let(:column) { "" }
|
1347
|
+
end
|
1348
|
+
end
|
1349
|
+
end
|
1350
|
+
shared_examples "test position" do |*examples|
|
1351
|
+
context "with after" do
|
1352
|
+
it_behaves_like *examples do
|
1353
|
+
let(:position) {" after test_name"}
|
1354
|
+
let(:position_hash){
|
1355
|
+
{ after: "test_name" }
|
1356
|
+
}
|
1357
|
+
end
|
1358
|
+
end
|
1359
|
+
context "with first" do
|
1360
|
+
it_behaves_like *examples do
|
1361
|
+
let(:position) {" first"}
|
1362
|
+
let(:position_hash){
|
1363
|
+
{ position: :first }
|
1364
|
+
}
|
1365
|
+
end
|
1366
|
+
end
|
1367
|
+
context "with none" do
|
1368
|
+
it_behaves_like *examples do
|
1369
|
+
let(:position) {""}
|
1370
|
+
let(:position_hash){
|
1371
|
+
{}
|
1372
|
+
}
|
1373
|
+
end
|
1374
|
+
end
|
1375
|
+
end
|
1376
|
+
shared_examples "test not null" do |*examples|
|
1377
|
+
context "with not null option" do
|
1378
|
+
it_behaves_like *examples do
|
1379
|
+
let(:not_null) {" not null"}
|
1380
|
+
let(:not_null_hash){
|
1381
|
+
{ not_null: true }
|
1382
|
+
}
|
1383
|
+
end
|
1384
|
+
end
|
1385
|
+
context "without not null option" do
|
1386
|
+
it_behaves_like *examples do
|
1387
|
+
let(:not_null) {""}
|
1388
|
+
let(:not_null_hash){
|
1389
|
+
{}
|
1390
|
+
}
|
1391
|
+
end
|
1392
|
+
end
|
1393
|
+
end
|
1394
|
+
shared_examples "test default for timestamp" do |*examples|
|
1395
|
+
context "timestamp" do
|
1396
|
+
it_behaves_like *examples do
|
1397
|
+
let(:default) {" default current_timestamp"}
|
1398
|
+
let(:default_hash){
|
1399
|
+
{ default: "current_timestamp" }
|
1400
|
+
}
|
1401
|
+
end
|
1402
|
+
end
|
1403
|
+
context "timestamp" do
|
1404
|
+
it_behaves_like *examples do
|
1405
|
+
let(:default) {" default localtime"}
|
1406
|
+
let(:default_hash){
|
1407
|
+
{ default: "current_timestamp" }
|
1408
|
+
}
|
1409
|
+
end
|
1410
|
+
end
|
1411
|
+
context "none" do
|
1412
|
+
it_behaves_like *examples do
|
1413
|
+
let(:default) {""}
|
1414
|
+
let(:default_hash){
|
1415
|
+
{}
|
1416
|
+
}
|
1417
|
+
end
|
1418
|
+
end
|
1419
|
+
end
|
1420
|
+
shared_examples "test default for varchar" do |*examples|
|
1421
|
+
context "null" do
|
1422
|
+
it_behaves_like *examples do
|
1423
|
+
let(:default) {" default NULL"}
|
1424
|
+
let(:default_hash){
|
1425
|
+
{ default: nil }
|
1426
|
+
}
|
1427
|
+
end
|
1428
|
+
end
|
1429
|
+
context "empty string" do
|
1430
|
+
it_behaves_like *examples do
|
1431
|
+
let(:default) {" default ''"}
|
1432
|
+
let(:default_hash){
|
1433
|
+
{ default: "" }
|
1434
|
+
}
|
1435
|
+
end
|
1436
|
+
end
|
1437
|
+
context "string with spaces" do
|
1438
|
+
it_behaves_like *examples do
|
1439
|
+
let(:default) {" default '0 0 0 0 0 0'"}
|
1440
|
+
let(:default_hash){
|
1441
|
+
{ default: "0 0 0 0 0 0" }
|
1442
|
+
}
|
1443
|
+
end
|
1444
|
+
end
|
1445
|
+
context "none" do
|
1446
|
+
it_behaves_like *examples do
|
1447
|
+
let(:default) {""}
|
1448
|
+
let(:default_hash){
|
1449
|
+
{}
|
1450
|
+
}
|
1451
|
+
end
|
1452
|
+
end
|
1453
|
+
end
|
1454
|
+
shared_examples "test auto increment" do |*examples|
|
1455
|
+
context "with auto_increment" do
|
1456
|
+
it_behaves_like *examples do
|
1457
|
+
let(:auto_increment) {" auto_increment"}
|
1458
|
+
let(:auto_increment_hash){
|
1459
|
+
{ auto_increment: true }
|
1460
|
+
}
|
1461
|
+
end
|
1462
|
+
end
|
1463
|
+
context "without auto_increment" do
|
1464
|
+
it_behaves_like *examples do
|
1465
|
+
let(:auto_increment) {""}
|
1466
|
+
let(:auto_increment_hash){
|
1467
|
+
{}
|
1468
|
+
}
|
1469
|
+
end
|
1470
|
+
end
|
1471
|
+
end
|
1472
|
+
shared_examples "test comment" do |*examples|
|
1473
|
+
context "with a comment" do
|
1474
|
+
it_behaves_like *examples do
|
1475
|
+
let(:comment) {" COMMENT 'Hello World!'"}
|
1476
|
+
end
|
1477
|
+
end
|
1478
|
+
context "with a double quoted comment" do
|
1479
|
+
it_behaves_like *examples do
|
1480
|
+
let(:comment) {%q| comment "Hello World!"|}
|
1481
|
+
end
|
1482
|
+
end
|
1483
|
+
context "with a backslash inside double quotes" do
|
1484
|
+
it_behaves_like *examples do
|
1485
|
+
let(:comment) {%q| comment "\\\\"|}
|
1486
|
+
end
|
1487
|
+
end
|
1488
|
+
context "with special characters" do
|
1489
|
+
it_behaves_like *examples do
|
1490
|
+
let(:comment) {%q| comment "https://flydata.com $ \\\\'\"\n\t"|}
|
1491
|
+
end
|
1492
|
+
end
|
1493
|
+
context "without a comment" do
|
1494
|
+
it_behaves_like *examples do
|
1495
|
+
let(:comment) {""}
|
1496
|
+
end
|
1497
|
+
end
|
1498
|
+
end
|
1499
|
+
shared_examples "test unique" do |*examples|
|
1500
|
+
context "with unique" do
|
1501
|
+
it_behaves_like *examples do
|
1502
|
+
let(:unique) {" UNIQUE"}
|
1503
|
+
let(:unique_hash){
|
1504
|
+
{ unique: true }
|
1505
|
+
}
|
1506
|
+
end
|
1507
|
+
end
|
1508
|
+
context "without unique" do
|
1509
|
+
it_behaves_like *examples do
|
1510
|
+
let(:unique) {""}
|
1511
|
+
let(:unique_hash){
|
1512
|
+
{}
|
1513
|
+
}
|
1514
|
+
end
|
1515
|
+
end
|
1516
|
+
end
|
1517
|
+
shared_examples "test column definition" do |*examples|
|
1518
|
+
context "varchar" do
|
1519
|
+
it_behaves_like "test not null", "test default for varchar", "test comment", *examples do
|
1520
|
+
let(:col_def) {"varchar(256)#{not_null}#{default}#{comment}"}
|
1521
|
+
let(:col_def_hash) {
|
1522
|
+
{ type: "varchar(768)" }.merge!(not_null_hash).merge!(default_hash)
|
1523
|
+
}
|
1524
|
+
end
|
1525
|
+
end
|
1526
|
+
context "timestamp" do
|
1527
|
+
it_behaves_like "test not null", "test default for timestamp", *examples do
|
1528
|
+
let(:col_def) {"timestamp#{not_null}#{default}"}
|
1529
|
+
let(:col_def_hash) {
|
1530
|
+
{ type: "datetime" }.merge!(not_null_hash).merge!(default_hash)
|
1531
|
+
}
|
1532
|
+
end
|
1533
|
+
end
|
1534
|
+
context "integer" do
|
1535
|
+
it_behaves_like "test not null", "test auto increment", "test comment", *examples do
|
1536
|
+
let(:col_def) {"int(11)#{not_null}#{auto_increment}#{comment}"}
|
1537
|
+
let(:col_def_hash) {
|
1538
|
+
{ type: "int4(11)" }.merge!(not_null_hash).merge!(auto_increment_hash)
|
1539
|
+
}
|
1540
|
+
end
|
1541
|
+
end
|
1542
|
+
context "decimal" do
|
1543
|
+
it_behaves_like "test not null", "test unique", *examples do
|
1544
|
+
let(:col_def) {"decimal(10,2)#{not_null}#{unique}"}
|
1545
|
+
let(:col_def_hash) {
|
1546
|
+
{ type: "numeric(10,2)" }.merge!(not_null_hash).merge!(unique_hash)
|
1547
|
+
}
|
1548
|
+
end
|
1549
|
+
end
|
1550
|
+
end
|
1551
|
+
shared_examples "test parser parsing a change column" do
|
1552
|
+
let(:action_hash) {
|
1553
|
+
change_action_hash.merge!({
|
1554
|
+
action: :change_column,
|
1555
|
+
query: alter_table_action
|
1556
|
+
})
|
1557
|
+
}
|
1558
|
+
it_behaves_like "a parser parsing a single action alter table query"
|
1559
|
+
end
|
1560
|
+
context 'change column' do
|
1561
|
+
context 'change column name' do
|
1562
|
+
let(:alter_table_action) { "change#{column} name name1 #{col_def}#{position}" }
|
1563
|
+
let(:change_action_hash) {
|
1564
|
+
{
|
1565
|
+
old_column: "name",
|
1566
|
+
column: "name1",
|
1567
|
+
}.merge!(position_hash).merge!(col_def_hash)
|
1568
|
+
}
|
1569
|
+
it_behaves_like "test optional column", "test column definition", "test position", "test parser parsing a change column"
|
1570
|
+
end
|
1571
|
+
context 'no change to column name' do
|
1572
|
+
let(:alter_table_action) { "change#{column} name1 name1 #{col_def}#{position}" }
|
1573
|
+
let(:change_action_hash) {
|
1574
|
+
{
|
1575
|
+
old_column: "name1",
|
1576
|
+
column: "name1",
|
1577
|
+
}.merge!(position_hash).merge!(col_def_hash)
|
1578
|
+
}
|
1579
|
+
it_behaves_like "test optional column", "test column definition", "test position", "test parser parsing a change column"
|
1580
|
+
end
|
1581
|
+
end
|
1582
|
+
context 'modify column' do
|
1583
|
+
let(:alter_table_action) { "modify#{column} name1 #{col_def}#{position}" }
|
1584
|
+
let(:change_action_hash) {
|
1585
|
+
{
|
1586
|
+
old_column: "name1",
|
1587
|
+
column: "name1",
|
1588
|
+
}.merge!(position_hash).merge!(col_def_hash)
|
1589
|
+
}
|
1590
|
+
it_behaves_like "test optional column", "test column definition", "test position", "test parser parsing a change column"
|
1591
|
+
end
|
1336
1592
|
end
|
1337
1593
|
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.2.
|
4
|
+
version: 0.2.13
|
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: 2014-11-
|
15
|
+
date: 2014-11-08 00:00:00.000000000 Z
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
18
18
|
name: rest-client
|
@@ -416,6 +416,7 @@ files:
|
|
416
416
|
- flydata.gemspec
|
417
417
|
- lib/fly_data_model.rb
|
418
418
|
- lib/flydata.rb
|
419
|
+
- lib/flydata/agent_errors.rb
|
419
420
|
- lib/flydata/api/base.rb
|
420
421
|
- lib/flydata/api/data_entry.rb
|
421
422
|
- lib/flydata/api/data_port.rb
|
@@ -441,7 +442,6 @@ files:
|
|
441
442
|
- lib/flydata/compatibility_check.rb
|
442
443
|
- lib/flydata/credentials.rb
|
443
444
|
- lib/flydata/cron.rb
|
444
|
-
- lib/flydata/errors.rb
|
445
445
|
- lib/flydata/fluent-plugins/in_mysql_binlog_flydata.rb
|
446
446
|
- lib/flydata/fluent-plugins/mysql/alter_table_query_handler.rb
|
447
447
|
- lib/flydata/fluent-plugins/mysql/binlog_position.rb
|