flydata 0.1.0 → 0.1.1
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.
- data/Gemfile +2 -1
- data/Gemfile.lock +3 -7
- data/VERSION +1 -1
- data/bin/fdmysqldump +2 -2
- data/flydata.gemspec +10 -3
- data/lib/flydata/command/sender.rb +7 -0
- data/lib/flydata/command/status.rb +10 -0
- data/lib/flydata/helpers.rb +1 -0
- data/lib/flydata/table_def/mysql_table_def.rb +92 -41
- data/lib/flydata/table_def/redshift_table_def.rb +7 -2
- data/spec/flydata/fluent-plugins/in_mysql_binlog_flydata_spec.rb +74 -0
- data/spec/flydata/table_def/mysql_table_def_spec.rb +123 -0
- data/spec/flydata/table_def/mysqldump_test_table_all.dump +66 -0
- data/spec/flydata/table_def/mysqldump_test_table_column_comment.dump +41 -0
- data/spec/flydata/table_def/mysqldump_test_table_enum.dump +43 -0
- data/spec/flydata/table_def/mysqldump_test_table_multi_pk.dump +42 -0
- data/spec/flydata/table_def/mysqldump_test_table_no_pk.dump +40 -0
- metadata +11 -4
data/Gemfile
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
source "http://rubygems.org"
|
2
|
+
source "https://rubygems.flydata.com"
|
2
3
|
|
3
4
|
gem "rest-client", "~> 1.6.7"
|
4
5
|
gem "i18n", "~> 0.6.5"
|
@@ -6,7 +7,7 @@ gem "activesupport", "~> 4.0.0"
|
|
6
7
|
gem "json", "~> 1.8.0"
|
7
8
|
gem "highline", "~> 1.6.19"
|
8
9
|
gem "fluentd", "0.10.35"
|
9
|
-
gem "ruby-binlog", ">= 1.0.0"
|
10
|
+
gem "ruby-binlog", ">= 1.0.0"
|
10
11
|
gem "fluent-plugin-mysql-binlog", "~> 0.0.2"
|
11
12
|
gem "mysql2", "~> 0.3.11"
|
12
13
|
|
data/Gemfile.lock
CHANGED
@@ -1,11 +1,6 @@
|
|
1
|
-
GIT
|
2
|
-
remote: https://github.com/hapyrus/ruby-binlog.git
|
3
|
-
revision: e381b4fc411ca2c2402aefc25809ac3c97d75f94
|
4
|
-
specs:
|
5
|
-
ruby-binlog (1.0.0)
|
6
|
-
|
7
1
|
GEM
|
8
2
|
remote: http://rubygems.org/
|
3
|
+
remote: https://rubygems.flydata.com/
|
9
4
|
specs:
|
10
5
|
activemodel (4.0.0)
|
11
6
|
activesupport (= 4.0.0)
|
@@ -100,6 +95,7 @@ GEM
|
|
100
95
|
rspec-expectations (2.14.3)
|
101
96
|
diff-lcs (>= 1.1.3, < 2.0)
|
102
97
|
rspec-mocks (2.14.3)
|
98
|
+
ruby-binlog (1.0.0)
|
103
99
|
ruby-prof (0.14.2)
|
104
100
|
sqlite3 (1.3.8)
|
105
101
|
thread_safe (0.1.3)
|
@@ -126,7 +122,7 @@ DEPENDENCIES
|
|
126
122
|
protected_attributes
|
127
123
|
rest-client (~> 1.6.7)
|
128
124
|
rspec
|
129
|
-
ruby-binlog (>= 1.0.0)
|
125
|
+
ruby-binlog (>= 1.0.0)
|
130
126
|
ruby-prof
|
131
127
|
sqlite3
|
132
128
|
timecop
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.1
|
data/bin/fdmysqldump
CHANGED
@@ -46,13 +46,13 @@ command += " " + ARGV.join(' ')
|
|
46
46
|
IO.popen(command, 'r') do |io|
|
47
47
|
create_flydata_ctl_table = true
|
48
48
|
while !io.eof?
|
49
|
-
mysql_tabledef = Flydata::
|
49
|
+
mysql_tabledef = Flydata::TableDef::MysqlTableDef.create(io)
|
50
50
|
if mysql_tabledef.nil?
|
51
51
|
# stream had no more create table definition
|
52
52
|
break
|
53
53
|
end
|
54
54
|
flydata_tabledef = mysql_tabledef.to_flydata_tabledef
|
55
|
-
puts Flydata::
|
55
|
+
puts Flydata::TableDef::RedshiftTableDef.from_flydata_tabledef(flydata_tabledef, flydata_ctl_table: create_flydata_ctl_table)
|
56
56
|
create_flydata_ctl_table = false
|
57
57
|
end
|
58
58
|
end
|
data/flydata.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "flydata"
|
8
|
-
s.version = "0.1.
|
8
|
+
s.version = "0.1.1"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Koichi Fujikawa"]
|
12
|
-
s.date = "2014-
|
12
|
+
s.date = "2014-05-01"
|
13
13
|
s.description = "FlyData Command Line Interface"
|
14
14
|
s.email = "sysadmin@flydata.co"
|
15
15
|
s.executables = ["fdmysqldump", "flydata"]
|
@@ -43,6 +43,7 @@ Gem::Specification.new do |s|
|
|
43
43
|
"lib/flydata/command/setlogdel.rb",
|
44
44
|
"lib/flydata/command/setup.rb",
|
45
45
|
"lib/flydata/command/start.rb",
|
46
|
+
"lib/flydata/command/status.rb",
|
46
47
|
"lib/flydata/command/stop.rb",
|
47
48
|
"lib/flydata/command/sync.rb",
|
48
49
|
"lib/flydata/command/version.rb",
|
@@ -71,6 +72,12 @@ Gem::Specification.new do |s|
|
|
71
72
|
"spec/flydata/command/sync_spec.rb",
|
72
73
|
"spec/flydata/fluent-plugins/in_mysql_binlog_flydata_spec.rb",
|
73
74
|
"spec/flydata/heroku_spec.rb",
|
75
|
+
"spec/flydata/table_def/mysql_table_def_spec.rb",
|
76
|
+
"spec/flydata/table_def/mysqldump_test_table_all.dump",
|
77
|
+
"spec/flydata/table_def/mysqldump_test_table_column_comment.dump",
|
78
|
+
"spec/flydata/table_def/mysqldump_test_table_enum.dump",
|
79
|
+
"spec/flydata/table_def/mysqldump_test_table_multi_pk.dump",
|
80
|
+
"spec/flydata/table_def/mysqldump_test_table_no_pk.dump",
|
74
81
|
"spec/flydata/util/encryptor_spec.rb",
|
75
82
|
"spec/flydata_spec.rb",
|
76
83
|
"spec/spec_helper.rb",
|
@@ -79,7 +86,7 @@ Gem::Specification.new do |s|
|
|
79
86
|
s.homepage = "http://flydata.co/"
|
80
87
|
s.licenses = ["All right reserved."]
|
81
88
|
s.require_paths = ["lib"]
|
82
|
-
s.rubygems_version = "1.8.
|
89
|
+
s.rubygems_version = "1.8.23"
|
83
90
|
s.summary = "FlyData CLI"
|
84
91
|
|
85
92
|
if s.respond_to? :specification_version then
|
@@ -53,6 +53,13 @@ EOF
|
|
53
53
|
start
|
54
54
|
end
|
55
55
|
end
|
56
|
+
def status
|
57
|
+
if process_exist?
|
58
|
+
say("Process is running.")
|
59
|
+
else
|
60
|
+
say("Process is not running.")
|
61
|
+
end
|
62
|
+
end
|
56
63
|
def kill_all
|
57
64
|
if system("ps ax | grep 'flydata' | grep -v grep | awk '{print \"kill \" $1}' | sh")
|
58
65
|
say("Done.")
|
data/lib/flydata/helpers.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
module Flydata
|
2
|
-
module
|
2
|
+
module TableDef
|
3
3
|
|
4
4
|
class MysqlTableDef
|
5
5
|
TYPE_MAP_M2F = {
|
@@ -15,6 +15,7 @@ class MysqlTableDef
|
|
15
15
|
'decimal' => 'numeric',
|
16
16
|
'double' => 'float8',
|
17
17
|
'double precision' => 'float8',
|
18
|
+
'enum' => 'enum',
|
18
19
|
'fixed' => 'numeric',
|
19
20
|
'float' => 'float4',
|
20
21
|
'int' => 'int4',
|
@@ -49,7 +50,6 @@ class MysqlTableDef
|
|
49
50
|
end
|
50
51
|
|
51
52
|
def self._create(io)
|
52
|
-
|
53
53
|
table_def = ''
|
54
54
|
table_name = nil
|
55
55
|
columns = []
|
@@ -57,24 +57,88 @@ class MysqlTableDef
|
|
57
57
|
comment = nil
|
58
58
|
|
59
59
|
position = :before_create_table
|
60
|
+
|
60
61
|
io.each_line do |line|
|
61
|
-
|
62
|
-
|
63
|
-
|
62
|
+
case position
|
63
|
+
when :before_create_table
|
64
|
+
if line =~ /CREATE TABLE `(.*?)`/
|
65
|
+
position = :in_create_table
|
66
|
+
table_name = $1
|
67
|
+
table_def += line.chomp
|
68
|
+
next
|
69
|
+
end
|
70
|
+
|
71
|
+
when :in_create_table
|
72
|
+
table_def += line.chomp
|
73
|
+
|
74
|
+
# `col_smallint` smallint(6) DEFAULT NULL,
|
75
|
+
if line.strip.start_with?('`')
|
76
|
+
columns << parse_column_line(line)
|
77
|
+
# PRIMARY KEY (`id`)
|
78
|
+
elsif line.strip.start_with?("PRIMARY KEY")
|
79
|
+
parse_primary_key(line, columns)
|
80
|
+
#) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='test table';
|
81
|
+
elsif line.strip.start_with?(')')
|
82
|
+
default_charset = $1 if line =~ /DEFAULT CHARSET\s*=\s*([^\s]+)/
|
83
|
+
comment = $1 if /COMMENT='((?:\\'|[^'])*)'/.match(line)
|
84
|
+
position = :after_create_table
|
85
|
+
else
|
86
|
+
raise "Invalid mysqldump file. It must be a bug...\n#{line}"
|
87
|
+
end
|
88
|
+
|
89
|
+
when :after_create_table
|
90
|
+
unless columns.any? {|column| column[:primary_key]}
|
91
|
+
raise "Primary key must be defined."
|
92
|
+
end
|
93
|
+
break
|
64
94
|
end
|
95
|
+
end
|
96
|
+
position == :after_create_table ? [table_def, table_name, columns, default_charset, comment] : nil
|
97
|
+
end
|
98
|
+
attr_reader :columns, :table_name
|
99
|
+
|
100
|
+
def to_flydata_tabledef
|
101
|
+
tabledef = { table_name: @table_name,
|
102
|
+
columns: @columns,
|
103
|
+
}
|
104
|
+
tabledef[:default_charset] = @default_charset if @default_charset
|
105
|
+
tabledef[:comment] = @comment if @comment
|
65
106
|
|
66
|
-
|
107
|
+
tabledef
|
108
|
+
end
|
67
109
|
|
68
|
-
|
110
|
+
private
|
69
111
|
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
112
|
+
def self.parse_column_line(line)
|
113
|
+
line = line.strip
|
114
|
+
line = line[0..-2] if line.end_with?(',')
|
115
|
+
pos = 0
|
116
|
+
cond = :column_name
|
117
|
+
column = {}
|
118
|
+
|
119
|
+
while pos < line.length
|
120
|
+
#cur_char = line[pos]
|
121
|
+
case cond
|
122
|
+
when :column_name #`column_name` ...
|
123
|
+
pos = line.index('`', 1)
|
124
|
+
column[:name] = line[1..pos-1]
|
125
|
+
cond = :column_type
|
126
|
+
pos += 1
|
127
|
+
when :column_type #... formattype(,,,) ...
|
128
|
+
pos += 1 until line[pos] != ' '
|
129
|
+
start_pos = pos
|
130
|
+
pos += 1 until line[pos].nil? || line[pos] =~ /\s|\(/
|
131
|
+
if line[pos] == '('
|
132
|
+
pos = parse_column_type_values(line, pos)
|
133
|
+
pos += 1
|
134
|
+
end
|
135
|
+
type = line[start_pos..pos-1]
|
74
136
|
TYPE_MAP_M2F.each do |mysql_type, flydata_type|
|
75
137
|
type.gsub!(/\b#{mysql_type}\b/, flydata_type)
|
76
138
|
end
|
77
|
-
column =
|
139
|
+
column[:type] = type
|
140
|
+
cond = :options
|
141
|
+
when :options
|
78
142
|
column[:auto_increment] = true if line =~ /AUTO_INCREMENT/
|
79
143
|
column[:not_null] = true if line =~ /NOT NULL/
|
80
144
|
if /DEFAULT\s+((?:[^'\s]+\b)|(?:'(?:\\'|[^'])*'))/.match(line)
|
@@ -86,41 +150,28 @@ class MysqlTableDef
|
|
86
150
|
if /COMMENT\s+'(((?:\\'|[^'])*))'/.match(line)
|
87
151
|
column[:comment] = $1
|
88
152
|
end
|
89
|
-
columns << column
|
90
|
-
end
|
91
|
-
|
92
|
-
if line =~ /PRIMARY KEY/
|
93
|
-
primary_keys = line.scan(/`(.*?)`/).collect{|item| item[0]}
|
94
|
-
primary_keys.each do |primary_key|
|
95
|
-
column = columns.detect {|column|
|
96
|
-
column[:name] === primary_key
|
97
|
-
}
|
98
|
-
raise "PK #{primary_key} must exist in the definition " if column.nil?
|
99
|
-
column[:primary_key] = true
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|
103
|
-
if line =~ /DEFAULT CHARSET\s*=\s*([^\s]+)/
|
104
|
-
default_charset = $1
|
105
|
-
end
|
106
|
-
|
107
|
-
if line =~ /ENGINE=.*/ # TODO Need better parsing.
|
108
|
-
position = :after_create_table
|
109
153
|
break
|
154
|
+
else
|
155
|
+
raise "Invalid condition. It must be a bug..."
|
110
156
|
end
|
111
157
|
end
|
112
|
-
|
158
|
+
column
|
113
159
|
end
|
114
|
-
attr_reader :columns, :table_name
|
115
160
|
|
116
|
-
def
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
161
|
+
def self.parse_primary_key(line, columns)
|
162
|
+
primary_keys = line.scan(/`(.*?)`/).collect{|item| item[0]}
|
163
|
+
primary_keys.each do |primary_key|
|
164
|
+
column = columns.detect {|column|
|
165
|
+
column[:name] === primary_key
|
166
|
+
}
|
167
|
+
raise "PK #{primary_key} must exist in the definition " if column.nil?
|
168
|
+
column[:primary_key] = true
|
169
|
+
end
|
170
|
+
end
|
122
171
|
|
123
|
-
|
172
|
+
def self.parse_column_type_values(line, pos)
|
173
|
+
#TODO: more better parse
|
174
|
+
line.index(')', pos)
|
124
175
|
end
|
125
176
|
end
|
126
177
|
|
@@ -1,5 +1,5 @@
|
|
1
1
|
module Flydata
|
2
|
-
module
|
2
|
+
module TableDef
|
3
3
|
|
4
4
|
class RedshiftTableDef
|
5
5
|
TYPE_MAP_F2R = {
|
@@ -7,6 +7,7 @@ class RedshiftTableDef
|
|
7
7
|
'char' => {type: 'char', use_params: true},
|
8
8
|
'date' => {type: 'date'},
|
9
9
|
'datetime' => {type: 'timestamp'},
|
10
|
+
'enum' => {type: 'varchar encode bytedict'},
|
10
11
|
'float4' => {type: 'float4'},
|
11
12
|
'float4 unsigned' => {type: 'float4'},
|
12
13
|
'float8' => {type: 'float8'},
|
@@ -132,11 +133,15 @@ EOS
|
|
132
133
|
sql = FLYDATA_CTL_COLUMNS_SQL % [ flydata_tabledef[:table_name] ]
|
133
134
|
values = []
|
134
135
|
flydata_tabledef[:columns].each do |col|
|
135
|
-
values << "('#{flydata_tabledef[:table_name]}', '#{col[:name]}', '#{col[:type]}')"
|
136
|
+
values << "('#{flydata_tabledef[:table_name]}', '#{col[:name]}', '#{escape(col[:type])}')"
|
136
137
|
end
|
137
138
|
sql += values.join(",\n") + ';'
|
138
139
|
sql
|
139
140
|
end
|
141
|
+
|
142
|
+
def self.escape(text)
|
143
|
+
text.gsub("'", "\\\\'")
|
144
|
+
end
|
140
145
|
end
|
141
146
|
|
142
147
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
1
3
|
require 'fluent_plugins_spec_helper'
|
2
4
|
require 'in_mysql_binlog_flydata'
|
3
5
|
require 'timecop'
|
@@ -25,14 +27,32 @@ EOT
|
|
25
27
|
# - 17 WRITE_ROWS_EVENT
|
26
28
|
TEST_EVENT_INSERT=<<EOT
|
27
29
|
{"marker"=>0, "timestamp"=>#{TEST_TIMESTAMP}, "type_code"=>23, "server_id"=>1, "event_length"=>39, "next_position"=>667, "flags"=>1, "event_type"=>"Write_rows", "table_id"=>163, "db_name"=>"#{TEST_DB}", "table_name"=>"#{TEST_TABLE}", "columns"=>["LONG", "BLOB"], "columns_len"=>2, "null_bits_len"=>1, "raw_columns_before_image"=>[], "raw_used_columns"=>[255], "raw_row"=>[252, 3, 0, 0, 0, 3, 0, 102, 111, 111], "rows"=>[["1", "foo"],["2","var"],["3","hoge"]]}
|
30
|
+
EOT
|
31
|
+
TEST_EVENT_TWO_BYTE_INSERT=<<EOT
|
32
|
+
{"marker"=>0, "timestamp"=>#{TEST_TIMESTAMP}, "type_code"=>23, "server_id"=>1, "event_length"=>39, "next_position"=>667, "flags"=>1, "event_type"=>"Write_rows", "table_id"=>163, "db_name"=>"#{TEST_DB}", "table_name"=>"#{TEST_TABLE}", "columns"=>["LONG", "BLOB"], "columns_len"=>2, "null_bits_len"=>1, "raw_columns_before_image"=>[], "raw_used_columns"=>[255], "raw_row"=>[252, 3, 0, 0, 0, 3, 0, 102, 111, 111], "rows"=>[["1", "føø"],["2","vår"],["3","høgé"]]}
|
33
|
+
EOT
|
34
|
+
TEST_EVENT_THREE_BYTE_INSERT=<<EOT
|
35
|
+
{"marker"=>0, "timestamp"=>#{TEST_TIMESTAMP}, "type_code"=>23, "server_id"=>1, "event_length"=>39, "next_position"=>667, "flags"=>1, "event_type"=>"Write_rows", "table_id"=>163, "db_name"=>"#{TEST_DB}", "table_name"=>"#{TEST_TABLE}", "columns"=>["LONG", "BLOB"], "columns_len"=>2, "null_bits_len"=>1, "raw_columns_before_image"=>[], "raw_used_columns"=>[255], "raw_row"=>[252, 3, 0, 0, 0, 3, 0, 102, 111, 111], "rows"=>[["1", "富无无"],["2","易变的"],["3","切实切实"]]}
|
28
36
|
EOT
|
29
37
|
# - 18 UPDATE_ROWS_EVENT
|
30
38
|
TEST_EVENT_UPDATE = <<EOT
|
31
39
|
{"marker"=>0, "timestamp"=>#{TEST_TIMESTAMP}, "type_code"=>24, "server_id"=>1, "event_length"=>78, "next_position"=>2606, "flags"=>1, "event_type"=>"Update_rows", "table_id"=>163, "db_name"=>"#{TEST_DB}", "table_name"=>"#{TEST_TABLE}", "columns"=>["LONG", "BLOB"], "columns_len"=>2, "null_bits_len"=>1, "raw_columns_before_image"=>[255], "raw_used_columns"=>[255], "raw_row"=>[252, 6, 0, 0, 0, 1, 0, 97, 252, 6, 0, 0, 0, 1, 0, 100, 252, 6, 0, 0, 0, 1, 0, 98, 252, 6, 0, 0, 0, 1, 0, 100, 252, 6, 0, 0, 0, 1, 0, 99, 252, 6, 0, 0, 0, 1, 0, 100], "rows"=>[[["1", "foo"], ["1", "wow"]],[["3", "hoge"], ["3", "fuga"]]]}
|
40
|
+
EOT
|
41
|
+
TEST_EVENT_TWO_BYTE_UPDATE = <<EOT
|
42
|
+
{"marker"=>0, "timestamp"=>#{TEST_TIMESTAMP}, "type_code"=>24, "server_id"=>1, "event_length"=>78, "next_position"=>2606, "flags"=>1, "event_type"=>"Update_rows", "table_id"=>163, "db_name"=>"#{TEST_DB}", "table_name"=>"#{TEST_TABLE}", "columns"=>["LONG", "BLOB"], "columns_len"=>2, "null_bits_len"=>1, "raw_columns_before_image"=>[255], "raw_used_columns"=>[255], "raw_row"=>[252, 6, 0, 0, 0, 1, 0, 97, 252, 6, 0, 0, 0, 1, 0, 100, 252, 6, 0, 0, 0, 1, 0, 98, 252, 6, 0, 0, 0, 1, 0, 100, 252, 6, 0, 0, 0, 1, 0, 99, 252, 6, 0, 0, 0, 1, 0, 100], "rows"=>[[["1", "føø"], ["1", "∑ø∑"]],[["3", "høgé"], ["3", "fügå"]]]}
|
43
|
+
EOT
|
44
|
+
TEST_EVENT_THREE_BYTE_UPDATE = <<EOT
|
45
|
+
{"marker"=>0, "timestamp"=>#{TEST_TIMESTAMP}, "type_code"=>24, "server_id"=>1, "event_length"=>78, "next_position"=>2606, "flags"=>1, "event_type"=>"Update_rows", "table_id"=>163, "db_name"=>"#{TEST_DB}", "table_name"=>"#{TEST_TABLE}", "columns"=>["LONG", "BLOB"], "columns_len"=>2, "null_bits_len"=>1, "raw_columns_before_image"=>[255], "raw_used_columns"=>[255], "raw_row"=>[252, 6, 0, 0, 0, 1, 0, 97, 252, 6, 0, 0, 0, 1, 0, 100, 252, 6, 0, 0, 0, 1, 0, 98, 252, 6, 0, 0, 0, 1, 0, 100, 252, 6, 0, 0, 0, 1, 0, 99, 252, 6, 0, 0, 0, 1, 0, 100], "rows"=>[[["1", "富无无"], ["1", "很兴奋"]],[["3", "切实切实"], ["3", "興奮虎"]]]}
|
32
46
|
EOT
|
33
47
|
# - 19 DELETE_ROWS_EVENT
|
34
48
|
TEST_EVENT_DELETE = <<EOT
|
35
49
|
{"marker"=>0, "timestamp"=>#{TEST_TIMESTAMP}, "type_code"=>25, "server_id"=>1, "event_length"=>41, "next_position"=>5365, "flags"=>1, "event_type"=>"Delete_rows", "table_id"=>170, "db_name"=>"#{TEST_DB}", "table_name"=>"#{TEST_TABLE}", "columns"=>["LONG", "BLOB"], "columns_len"=>2, "null_bits_len"=>1, "raw_columns_before_image"=>[], "raw_used_columns"=>[255], "raw_row"=>[252, 2, 0, 0, 0, 5, 0, 104, 111, 104, 111, 103], "rows"=>[["2", "var"],["3","hoge"]]}
|
50
|
+
EOT
|
51
|
+
TEST_EVENT_TWO_BYTE_DELETE = <<EOT
|
52
|
+
{"marker"=>0, "timestamp"=>#{TEST_TIMESTAMP}, "type_code"=>25, "server_id"=>1, "event_length"=>41, "next_position"=>5365, "flags"=>1, "event_type"=>"Delete_rows", "table_id"=>170, "db_name"=>"#{TEST_DB}", "table_name"=>"#{TEST_TABLE}", "columns"=>["LONG", "BLOB"], "columns_len"=>2, "null_bits_len"=>1, "raw_columns_before_image"=>[], "raw_used_columns"=>[255], "raw_row"=>[252, 2, 0, 0, 0, 5, 0, 104, 111, 104, 111, 103], "rows"=>[["2", "vår"],["3","høgé"]]}
|
53
|
+
EOT
|
54
|
+
TEST_EVENT_THREE_BYTE_DELETE = <<EOT
|
55
|
+
{"marker"=>0, "timestamp"=>#{TEST_TIMESTAMP}, "type_code"=>25, "server_id"=>1, "event_length"=>41, "next_position"=>5365, "flags"=>1, "event_type"=>"Delete_rows", "table_id"=>170, "db_name"=>"#{TEST_DB}", "table_name"=>"#{TEST_TABLE}", "columns"=>["LONG", "BLOB"], "columns_len"=>2, "null_bits_len"=>1, "raw_columns_before_image"=>[], "raw_used_columns"=>[255], "raw_row"=>[252, 2, 0, 0, 0, 5, 0, 104, 111, 104, 111, 103], "rows"=>[["2", "易变的"],["3","切实切实"]]}
|
36
56
|
EOT
|
37
57
|
# Unsupported event
|
38
58
|
# - 02 QUERY_EVENT
|
@@ -120,8 +140,14 @@ EOT
|
|
120
140
|
|
121
141
|
let(:plugin) { MysqlBinlogFlydataInput.new }
|
122
142
|
let(:insert_event) { create_event(TEST_EVENT_INSERT) }
|
143
|
+
let(:insert_two_byte_event) { create_event(TEST_EVENT_TWO_BYTE_INSERT) }
|
144
|
+
let(:insert_three_byte_event) { create_event(TEST_EVENT_THREE_BYTE_INSERT) }
|
123
145
|
let(:delete_event) { create_event(TEST_EVENT_DELETE) }
|
146
|
+
let(:delete_two_byte_event) { create_event(TEST_EVENT_TWO_BYTE_DELETE) }
|
147
|
+
let(:delete_three_byte_event) { create_event(TEST_EVENT_THREE_BYTE_DELETE) }
|
124
148
|
let(:update_event) { create_event(TEST_EVENT_UPDATE) }
|
149
|
+
let(:update_two_byte_event) { create_event(TEST_EVENT_TWO_BYTE_UPDATE) }
|
150
|
+
let(:update_three_byte_event) { create_event(TEST_EVENT_THREE_BYTE_UPDATE) }
|
125
151
|
|
126
152
|
let(:query_event) { create_event(TEST_EVENT_QUERY_CREATE_DATABSE) }
|
127
153
|
let(:table_map_event) { create_event(TEST_EVENT_TABLE_MAP) }
|
@@ -160,6 +186,22 @@ EOT
|
|
160
186
|
end
|
161
187
|
end
|
162
188
|
|
189
|
+
context 'when received insert event containing two byte UTF8 chars' do
|
190
|
+
it do
|
191
|
+
table_seq_file.should_receive(:write).exactly(3).with(2)
|
192
|
+
expect_emitted_records_with_rows(insert_two_byte_event, :insert, TEST_TABLE,
|
193
|
+
[{"1"=>"0SL00000001", "2"=>"føø"}, {"1"=>"0SL00000002", "2"=>"vår"}, {"1"=>"0SL00000003", "2"=>"høgé"}])
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
context 'when received insert event containing three byte UTF8 chars' do
|
198
|
+
it do
|
199
|
+
table_seq_file.should_receive(:write).exactly(3).with(2)
|
200
|
+
expect_emitted_records_with_rows(insert_three_byte_event, :insert, TEST_TABLE,
|
201
|
+
[{"1"=>"0SL00000001", "2"=>"富无无"}, {"1"=>"0SL00000002", "2"=>"易变的"}, {"1"=>"0SL00000003", "2"=>"切实切实"}])
|
202
|
+
end
|
203
|
+
end
|
204
|
+
|
163
205
|
context 'when received delete event' do
|
164
206
|
it do
|
165
207
|
table_seq_file.should_receive(:write).twice.with(2)
|
@@ -168,6 +210,22 @@ EOT
|
|
168
210
|
end
|
169
211
|
end
|
170
212
|
|
213
|
+
context 'when received delete event containing two byte UTF8 chars' do
|
214
|
+
it do
|
215
|
+
table_seq_file.should_receive(:write).twice.with(2)
|
216
|
+
expect_emitted_records_with_rows(delete_two_byte_event, :delete, TEST_TABLE,
|
217
|
+
[{"1"=>"0SL00000002", "2"=>"vår"}, {"1"=>"0SL00000003", "2"=>"høgé"}])
|
218
|
+
end
|
219
|
+
end
|
220
|
+
|
221
|
+
context 'when received delete event with containing byte UTF8 chars' do
|
222
|
+
it do
|
223
|
+
table_seq_file.should_receive(:write).twice.with(2)
|
224
|
+
expect_emitted_records_with_rows(delete_three_byte_event, :delete, TEST_TABLE,
|
225
|
+
[{"1"=>"0SL00000002", "2"=>"易变的"}, {"1"=>"0SL00000003", "2"=>"切实切实"}])
|
226
|
+
end
|
227
|
+
end
|
228
|
+
|
171
229
|
context 'when received update event' do
|
172
230
|
it do
|
173
231
|
table_seq_file.should_receive(:write).twice.with(2)
|
@@ -176,6 +234,22 @@ EOT
|
|
176
234
|
end
|
177
235
|
end
|
178
236
|
|
237
|
+
context 'when received update event with two byte utf8 chars' do
|
238
|
+
it do
|
239
|
+
table_seq_file.should_receive(:write).twice.with(2)
|
240
|
+
expect_emitted_records_with_rows(update_two_byte_event, :update, TEST_TABLE,
|
241
|
+
[{"1"=>"0SL00000001", "2"=>"∑ø∑"}, {"1"=>"0SL00000003", "2"=>"fügå"}])
|
242
|
+
end
|
243
|
+
end
|
244
|
+
|
245
|
+
context 'when received update event with three byte utf8 chars' do
|
246
|
+
it do
|
247
|
+
table_seq_file.should_receive(:write).twice.with(2)
|
248
|
+
expect_emitted_records_with_rows(update_three_byte_event, :update, TEST_TABLE,
|
249
|
+
[{"1"=>"0SL00000001", "2"=>"很兴奋"}, {"1"=>"0SL00000003", "2"=>"興奮虎"}])
|
250
|
+
end
|
251
|
+
end
|
252
|
+
|
179
253
|
context 'when received event with another database name' do
|
180
254
|
it do
|
181
255
|
event = insert_event
|
@@ -0,0 +1,123 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'flydata/table_def'
|
3
|
+
|
4
|
+
module Flydata
|
5
|
+
module TableDef
|
6
|
+
|
7
|
+
|
8
|
+
describe MysqlTableDef do
|
9
|
+
|
10
|
+
# file full path which exists in same directory.
|
11
|
+
def full_path(file_name)
|
12
|
+
File.join(File.dirname(__FILE__), file_name)
|
13
|
+
end
|
14
|
+
|
15
|
+
def file_io(file_name)
|
16
|
+
File.new(full_path(file_name))
|
17
|
+
end
|
18
|
+
|
19
|
+
describe '.to_flydata_tabledef' do
|
20
|
+
let(:dump_file_io) { raise "dump_file_io must be override on context." }
|
21
|
+
subject { MysqlTableDef.create(dump_file_io).to_flydata_tabledef }
|
22
|
+
|
23
|
+
context 'when dump file includes single table with all kind of format types' do
|
24
|
+
let(:dump_file_io) { file_io('mysqldump_test_table_all.dump') }
|
25
|
+
|
26
|
+
it 'should set correct table name' do
|
27
|
+
expect(subject[:table_name]).to eq('test_table_all')
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'should set correct table name' do
|
31
|
+
expect(subject[:columns]).to eq(
|
32
|
+
[
|
33
|
+
{:name=>"id", :type=>"int8(20)", :auto_increment=>true, :not_null=>true, :primary_key=>true},
|
34
|
+
{:name=>"col_binary", :type=>"binary(100)", :default=>nil},
|
35
|
+
{:name=>"col_blob", :type=>"varbinary"},
|
36
|
+
{:name=>"col_bool", :type=>"int1(1)", :default=>"0"},
|
37
|
+
{:name=>"col_char", :type=>"varchar(6)", :default=>nil},
|
38
|
+
{:name=>"col_date", :type=>"date", :default=>nil},
|
39
|
+
{:name=>"col_datetime", :type=>"datetime", :default=>nil},
|
40
|
+
{:name=>"col_decimal", :type=>"numeric(5,2)", :default=>nil},
|
41
|
+
{:name=>"col_double", :type=>"float8", :default=>nil},
|
42
|
+
{:name=>"col_float", :type=>"float4", :default=>nil},
|
43
|
+
{:name=>"col_float_4_2", :type=>"float4(4,2)", :default=>nil},
|
44
|
+
{:name=>"col_int", :type=>"int4(11)", :default=>nil},
|
45
|
+
{:name=>"col_int_6", :type=>"int4(6)", :default=>nil},
|
46
|
+
{:name=>"col_longblob", :type=>"varbinary"},
|
47
|
+
{:name=>"col_longtext", :type=>"text"},
|
48
|
+
{:name=>"col_mediumblob", :type=>"varbinary"},
|
49
|
+
{:name=>"col_mediumint", :type=>"int3(9)", :default=>nil},
|
50
|
+
{:name=>"col_mediumtext", :type=>"text"},
|
51
|
+
{:name=>"col_smallint", :type=>"int2(6)", :default=>nil},
|
52
|
+
{:name=>"col_text", :type=>"text"},
|
53
|
+
{:name=>"col_time", :type=>"time", :default=>nil},
|
54
|
+
{:name=>"col_timestamp", :type=>"datetime", :not_null=>true, :default=>"CURRENT_TIMESTAMP"},
|
55
|
+
{:name=>"col_tinyblob", :type=>"varbinary"},
|
56
|
+
{:name=>"col_tinyint", :type=>"int1(4)", :default=>nil},
|
57
|
+
{:name=>"col_tinytext", :type=>"text"},
|
58
|
+
{:name=>"col_varbinary", :type=>"varbinary(255)", :default=>nil},
|
59
|
+
{:name=>"col_varchar", :type=>"varchar(124)", :default=>nil}
|
60
|
+
]
|
61
|
+
)
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'default_charset should be set' do
|
65
|
+
expect(subject[:default_charset]).to eq('utf8')
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'comment should be set' do
|
69
|
+
expect(subject[:comment]).to eq('test table includes all kind of format type')
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
context 'when table does not have primary key' do
|
74
|
+
let(:dump_file_io) { file_io('mysqldump_test_table_no_pk.dump') }
|
75
|
+
it 'should raise an error' do
|
76
|
+
expect{subject}.to raise_error('Primary key must be defined.')
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
context 'when column has comment' do
|
81
|
+
let(:dump_file_io) { file_io('mysqldump_test_table_column_comment.dump') }
|
82
|
+
it 'comment should be set' do
|
83
|
+
expect(subject[:columns]).to eq(
|
84
|
+
[
|
85
|
+
{:name=>"id", :type=>"int4(11)", :not_null=>true, :default=>"0",
|
86
|
+
:comment=>"this is primary key", :primary_key=>true},
|
87
|
+
{:name=>"value", :type=>"text"}
|
88
|
+
]
|
89
|
+
)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
context 'when table has multiple pk' do
|
94
|
+
let(:dump_file_io) { file_io('mysqldump_test_table_multi_pk.dump') }
|
95
|
+
it 'multi pk should be set' do
|
96
|
+
expect(subject[:columns]).to eq(
|
97
|
+
[
|
98
|
+
{:name=>"id1", :type=>"int4(11)", :not_null=>true, :default=>"0", :primary_key=>true},
|
99
|
+
{:name=>"id2", :type=>"int4(11)", :not_null=>true, :default=>"0", :primary_key=>true},
|
100
|
+
{:name=>"value", :type=>"text"}
|
101
|
+
]
|
102
|
+
)
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
context 'when table has enum column' do
|
107
|
+
let(:dump_file_io) { file_io('mysqldump_test_table_enum.dump') }
|
108
|
+
it 'enum columns should be parsed' do
|
109
|
+
expect(subject[:columns]).to eq(
|
110
|
+
[
|
111
|
+
{:name=>"id", :type=>"int4(11)", :not_null=>true, :primary_key=>true},
|
112
|
+
{:name=>"enum_1", :type=>"enum('apple','orange','banana')", :default=>nil},
|
113
|
+
{:name=>"enum_2", :type=>"enum('a','b','c')", :default=>"a"},
|
114
|
+
{:name=>"enum_3", :type=>"enum('e','f','g')", :not_null=>true},
|
115
|
+
]
|
116
|
+
)
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
end
|
123
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
-- MySQL dump 10.13 Distrib 5.6.13, for osx10.9 (x86_64)
|
2
|
+
--
|
3
|
+
-- Host: localhost Database: masashi_test
|
4
|
+
-- ------------------------------------------------------
|
5
|
+
-- Server version 5.6.13-log
|
6
|
+
|
7
|
+
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
|
8
|
+
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
|
9
|
+
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
|
10
|
+
/*!40101 SET NAMES utf8 */;
|
11
|
+
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
|
12
|
+
/*!40103 SET TIME_ZONE='+00:00' */;
|
13
|
+
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
|
14
|
+
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
|
15
|
+
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
16
|
+
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
17
|
+
|
18
|
+
--
|
19
|
+
-- Table structure for table `test_table_all`
|
20
|
+
--
|
21
|
+
|
22
|
+
DROP TABLE IF EXISTS `test_table_all`;
|
23
|
+
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
24
|
+
/*!40101 SET character_set_client = utf8 */;
|
25
|
+
CREATE TABLE `test_table_all` (
|
26
|
+
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
27
|
+
`col_binary` binary(100) DEFAULT NULL,
|
28
|
+
`col_blob` blob,
|
29
|
+
`col_bool` tinyint(1) DEFAULT '0',
|
30
|
+
`col_char` char(6) DEFAULT NULL,
|
31
|
+
`col_date` date DEFAULT NULL,
|
32
|
+
`col_datetime` datetime DEFAULT NULL,
|
33
|
+
`col_decimal` decimal(5,2) DEFAULT NULL,
|
34
|
+
`col_double` double DEFAULT NULL,
|
35
|
+
`col_float` float DEFAULT NULL,
|
36
|
+
`col_float_4_2` float(4,2) DEFAULT NULL,
|
37
|
+
`col_int` int(11) DEFAULT NULL,
|
38
|
+
`col_int_6` int(6) DEFAULT NULL,
|
39
|
+
`col_longblob` longblob,
|
40
|
+
`col_longtext` longtext,
|
41
|
+
`col_mediumblob` mediumblob,
|
42
|
+
`col_mediumint` mediumint(9) DEFAULT NULL,
|
43
|
+
`col_mediumtext` mediumtext,
|
44
|
+
`col_smallint` smallint(6) DEFAULT NULL,
|
45
|
+
`col_text` text,
|
46
|
+
`col_time` time DEFAULT NULL,
|
47
|
+
`col_timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
48
|
+
`col_tinyblob` tinyblob,
|
49
|
+
`col_tinyint` tinyint(4) DEFAULT NULL,
|
50
|
+
`col_tinytext` tinytext,
|
51
|
+
`col_varbinary` varbinary(255) DEFAULT NULL,
|
52
|
+
`col_varchar` varchar(124) DEFAULT NULL,
|
53
|
+
PRIMARY KEY (`id`)
|
54
|
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='test table includes all kind of format type';
|
55
|
+
/*!40101 SET character_set_client = @saved_cs_client */;
|
56
|
+
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
|
57
|
+
|
58
|
+
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
|
59
|
+
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
|
60
|
+
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
|
61
|
+
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
|
62
|
+
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
|
63
|
+
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
|
64
|
+
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
|
65
|
+
|
66
|
+
-- Dump completed on 2014-04-25 12:18:04
|
@@ -0,0 +1,41 @@
|
|
1
|
+
-- MySQL dump 10.13 Distrib 5.6.13, for osx10.9 (x86_64)
|
2
|
+
--
|
3
|
+
-- Host: localhost Database: masashi_test
|
4
|
+
-- ------------------------------------------------------
|
5
|
+
-- Server version 5.6.13-log
|
6
|
+
|
7
|
+
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
|
8
|
+
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
|
9
|
+
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
|
10
|
+
/*!40101 SET NAMES utf8 */;
|
11
|
+
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
|
12
|
+
/*!40103 SET TIME_ZONE='+00:00' */;
|
13
|
+
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
|
14
|
+
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
|
15
|
+
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
16
|
+
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
17
|
+
|
18
|
+
--
|
19
|
+
-- Table structure for table `test_table_column_comment`
|
20
|
+
--
|
21
|
+
|
22
|
+
DROP TABLE IF EXISTS `test_table_column_comment`;
|
23
|
+
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
24
|
+
/*!40101 SET character_set_client = utf8 */;
|
25
|
+
CREATE TABLE `test_table_column_comment` (
|
26
|
+
`id` int(11) NOT NULL DEFAULT '0' COMMENT 'this is primary key',
|
27
|
+
`value` text,
|
28
|
+
PRIMARY KEY (`id`)
|
29
|
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='column comment test';
|
30
|
+
/*!40101 SET character_set_client = @saved_cs_client */;
|
31
|
+
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
|
32
|
+
|
33
|
+
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
|
34
|
+
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
|
35
|
+
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
|
36
|
+
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
|
37
|
+
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
|
38
|
+
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
|
39
|
+
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
|
40
|
+
|
41
|
+
-- Dump completed on 2014-04-25 13:24:35
|
@@ -0,0 +1,43 @@
|
|
1
|
+
-- MySQL dump 10.13 Distrib 5.6.13, for osx10.9 (x86_64)
|
2
|
+
--
|
3
|
+
-- Host: localhost Database: masashi_test
|
4
|
+
-- ------------------------------------------------------
|
5
|
+
-- Server version 5.6.13-log
|
6
|
+
|
7
|
+
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
|
8
|
+
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
|
9
|
+
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
|
10
|
+
/*!40101 SET NAMES utf8 */;
|
11
|
+
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
|
12
|
+
/*!40103 SET TIME_ZONE='+00:00' */;
|
13
|
+
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
|
14
|
+
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
|
15
|
+
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
16
|
+
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
17
|
+
|
18
|
+
--
|
19
|
+
-- Table structure for table `test_table_enum`
|
20
|
+
--
|
21
|
+
|
22
|
+
DROP TABLE IF EXISTS `test_table_enum`;
|
23
|
+
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
24
|
+
/*!40101 SET character_set_client = utf8 */;
|
25
|
+
CREATE TABLE `test_table_enum` (
|
26
|
+
`id` int(11) NOT NULL,
|
27
|
+
`enum_1` enum('apple','orange','banana') DEFAULT NULL,
|
28
|
+
`enum_2` enum('a','b','c') DEFAULT 'a',
|
29
|
+
`enum_3` enum('e','f','g') NOT NULL,
|
30
|
+
PRIMARY KEY (`id`)
|
31
|
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='with enum column';
|
32
|
+
/*!40101 SET character_set_client = @saved_cs_client */;
|
33
|
+
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
|
34
|
+
|
35
|
+
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
|
36
|
+
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
|
37
|
+
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
|
38
|
+
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
|
39
|
+
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
|
40
|
+
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
|
41
|
+
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
|
42
|
+
|
43
|
+
-- Dump completed on 2014-04-25 13:55:12
|
@@ -0,0 +1,42 @@
|
|
1
|
+
-- MySQL dump 10.13 Distrib 5.6.13, for osx10.9 (x86_64)
|
2
|
+
--
|
3
|
+
-- Host: localhost Database: masashi_test
|
4
|
+
-- ------------------------------------------------------
|
5
|
+
-- Server version 5.6.13-log
|
6
|
+
|
7
|
+
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
|
8
|
+
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
|
9
|
+
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
|
10
|
+
/*!40101 SET NAMES utf8 */;
|
11
|
+
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
|
12
|
+
/*!40103 SET TIME_ZONE='+00:00' */;
|
13
|
+
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
|
14
|
+
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
|
15
|
+
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
16
|
+
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
17
|
+
|
18
|
+
--
|
19
|
+
-- Table structure for table `test_table_multi_pk`
|
20
|
+
--
|
21
|
+
|
22
|
+
DROP TABLE IF EXISTS `test_table_multi_pk`;
|
23
|
+
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
24
|
+
/*!40101 SET character_set_client = utf8 */;
|
25
|
+
CREATE TABLE `test_table_multi_pk` (
|
26
|
+
`id1` int(11) NOT NULL DEFAULT '0',
|
27
|
+
`id2` int(11) NOT NULL DEFAULT '0',
|
28
|
+
`value` text,
|
29
|
+
PRIMARY KEY (`id1`,`id2`)
|
30
|
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='multiple primary key';
|
31
|
+
/*!40101 SET character_set_client = @saved_cs_client */;
|
32
|
+
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
|
33
|
+
|
34
|
+
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
|
35
|
+
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
|
36
|
+
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
|
37
|
+
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
|
38
|
+
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
|
39
|
+
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
|
40
|
+
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
|
41
|
+
|
42
|
+
-- Dump completed on 2014-04-25 13:39:30
|
@@ -0,0 +1,40 @@
|
|
1
|
+
-- MySQL dump 10.13 Distrib 5.6.13, for osx10.9 (x86_64)
|
2
|
+
--
|
3
|
+
-- Host: localhost Database: masashi_test
|
4
|
+
-- ------------------------------------------------------
|
5
|
+
-- Server version 5.6.13-log
|
6
|
+
|
7
|
+
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
|
8
|
+
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
|
9
|
+
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
|
10
|
+
/*!40101 SET NAMES utf8 */;
|
11
|
+
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
|
12
|
+
/*!40103 SET TIME_ZONE='+00:00' */;
|
13
|
+
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
|
14
|
+
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
|
15
|
+
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
16
|
+
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
17
|
+
|
18
|
+
--
|
19
|
+
-- Table structure for table `test_table_no_pk`
|
20
|
+
--
|
21
|
+
|
22
|
+
DROP TABLE IF EXISTS `test_table_no_pk`;
|
23
|
+
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
24
|
+
/*!40101 SET character_set_client = utf8 */;
|
25
|
+
CREATE TABLE `test_table_no_pk` (
|
26
|
+
`id` int(11) DEFAULT NULL,
|
27
|
+
`value` text
|
28
|
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='no primary key';
|
29
|
+
/*!40101 SET character_set_client = @saved_cs_client */;
|
30
|
+
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
|
31
|
+
|
32
|
+
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
|
33
|
+
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
|
34
|
+
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
|
35
|
+
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
|
36
|
+
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
|
37
|
+
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
|
38
|
+
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
|
39
|
+
|
40
|
+
-- Dump completed on 2014-04-25 13:48:49
|
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.1.
|
4
|
+
version: 0.1.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-
|
12
|
+
date: 2014-05-01 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rest-client
|
@@ -336,6 +336,7 @@ files:
|
|
336
336
|
- lib/flydata/command/setlogdel.rb
|
337
337
|
- lib/flydata/command/setup.rb
|
338
338
|
- lib/flydata/command/start.rb
|
339
|
+
- lib/flydata/command/status.rb
|
339
340
|
- lib/flydata/command/stop.rb
|
340
341
|
- lib/flydata/command/sync.rb
|
341
342
|
- lib/flydata/command/version.rb
|
@@ -364,6 +365,12 @@ files:
|
|
364
365
|
- spec/flydata/command/sync_spec.rb
|
365
366
|
- spec/flydata/fluent-plugins/in_mysql_binlog_flydata_spec.rb
|
366
367
|
- spec/flydata/heroku_spec.rb
|
368
|
+
- spec/flydata/table_def/mysql_table_def_spec.rb
|
369
|
+
- spec/flydata/table_def/mysqldump_test_table_all.dump
|
370
|
+
- spec/flydata/table_def/mysqldump_test_table_column_comment.dump
|
371
|
+
- spec/flydata/table_def/mysqldump_test_table_enum.dump
|
372
|
+
- spec/flydata/table_def/mysqldump_test_table_multi_pk.dump
|
373
|
+
- spec/flydata/table_def/mysqldump_test_table_no_pk.dump
|
367
374
|
- spec/flydata/util/encryptor_spec.rb
|
368
375
|
- spec/flydata_spec.rb
|
369
376
|
- spec/spec_helper.rb
|
@@ -383,7 +390,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
383
390
|
version: '0'
|
384
391
|
segments:
|
385
392
|
- 0
|
386
|
-
hash:
|
393
|
+
hash: -2999852327908013183
|
387
394
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
388
395
|
none: false
|
389
396
|
requirements:
|
@@ -392,7 +399,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
392
399
|
version: '0'
|
393
400
|
requirements: []
|
394
401
|
rubyforge_project:
|
395
|
-
rubygems_version: 1.8.
|
402
|
+
rubygems_version: 1.8.23
|
396
403
|
signing_key:
|
397
404
|
specification_version: 3
|
398
405
|
summary: FlyData CLI
|