flydata 0.0.5.6 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +8 -0
- data/Gemfile.lock +36 -1
- data/VERSION +1 -1
- data/bin/fdmysqldump +59 -0
- data/flydata.gemspec +49 -5
- data/lib/flydata.rb +3 -1
- data/lib/flydata/api/data_entry.rb +4 -0
- data/lib/flydata/api/redshift_cluster.rb +15 -0
- data/lib/flydata/cli.rb +1 -0
- data/lib/flydata/command/base.rb +8 -2
- data/lib/flydata/command/conf.rb +48 -0
- data/lib/flydata/command/encrypt.rb +18 -0
- data/lib/flydata/command/sender.rb +10 -3
- data/lib/flydata/command/setlogdel.rb +1 -1
- data/lib/flydata/command/setup.rb +26 -3
- data/lib/flydata/command/sync.rb +962 -0
- data/lib/flydata/command/version.rb +10 -0
- data/lib/flydata/fluent-plugins/in_mysql_binlog_flydata.rb +305 -0
- data/lib/flydata/fluent-plugins/out_forward_ssl.rb +91 -0
- data/lib/flydata/fluent-plugins/preference.rb +92 -0
- data/lib/flydata/helpers.rb +13 -1
- data/lib/flydata/preference/data_entry_preference.rb +98 -0
- data/lib/flydata/sync_file_manager.rb +120 -0
- data/lib/flydata/table_def.rb +2 -0
- data/lib/flydata/table_def/mysql_table_def.rb +128 -0
- data/lib/flydata/table_def/redshift_table_def.rb +144 -0
- data/lib/flydata/util/encryptor.rb +53 -0
- data/spec/fluent_plugins_spec_helper.rb +19 -0
- data/spec/flydata/command/sender_spec.rb +3 -29
- data/spec/flydata/command/sync_spec.rb +1049 -0
- data/spec/flydata/fluent-plugins/in_mysql_binlog_flydata_spec.rb +204 -0
- data/spec/flydata/util/encryptor_spec.rb +96 -0
- data/spec/spec_helper.rb +1 -0
- data/tmpl/redshift_mysql_data_entry.conf.tmpl +11 -0
- metadata +153 -4
@@ -0,0 +1,204 @@
|
|
1
|
+
require 'fluent_plugins_spec_helper'
|
2
|
+
require 'in_mysql_binlog_flydata'
|
3
|
+
require 'timecop'
|
4
|
+
|
5
|
+
module Fluent
|
6
|
+
|
7
|
+
TEST_TAG = "test_tag"
|
8
|
+
TEST_DB = "test_db"
|
9
|
+
TEST_TABLE = "test_table"
|
10
|
+
TEST_SEQUENCE_FILE = /positions\/#{TEST_TABLE}.pos$/
|
11
|
+
TEST_TABLES = "#{TEST_TABLE},test_table_1,test_table_2,test_table_3"
|
12
|
+
TEST_POSITION_FILE = "test_position.log"
|
13
|
+
TEST_TIMESTAMP = 1389214083
|
14
|
+
TEST_CONFIG = <<EOT
|
15
|
+
tag #{TEST_TAG}
|
16
|
+
database #{TEST_DB}
|
17
|
+
tables #{TEST_TABLES}
|
18
|
+
position_file #{TEST_POSITION_FILE}
|
19
|
+
EOT
|
20
|
+
|
21
|
+
# mysqlbinlog event
|
22
|
+
# http://dev.mysql.com/doc/refman/5.7/en/mysqlbinlog-hexdump.html
|
23
|
+
|
24
|
+
# Supported events
|
25
|
+
# - 17 WRITE_ROWS_EVENT
|
26
|
+
TEST_EVENT_INSERT=<<EOT
|
27
|
+
{"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"]]}
|
28
|
+
EOT
|
29
|
+
# - 18 UPDATE_ROWS_EVENT
|
30
|
+
TEST_EVENT_UPDATE = <<EOT
|
31
|
+
{"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"]]]}
|
32
|
+
EOT
|
33
|
+
# - 19 DELETE_ROWS_EVENT
|
34
|
+
TEST_EVENT_DELETE = <<EOT
|
35
|
+
{"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"]]}
|
36
|
+
EOT
|
37
|
+
# Unsupported event
|
38
|
+
# - 02 QUERY_EVENT
|
39
|
+
# QUERY: BEGIN
|
40
|
+
TEST_EVENT_QUERY_BEGIN = <<EOT
|
41
|
+
{"marker"=>0, "timestamp"=>#{TEST_TIMESTAMP}, "type_code"=>2, "server_id"=>1, "event_length"=>73, "next_position"=>2472, "flags"=>8, "event_type"=>"Query", "thread_id"=>71, "exec_time"=>0, "error_code"=>0, "variables"=>[0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 6, 3, 115, 116, 100, 4, 33, 0, 33, 0, 8, 0], "db_name"=>"#{TEST_DB}", "query"=>"BEGIN"}
|
42
|
+
EOT
|
43
|
+
# QUERY: create database
|
44
|
+
TEST_EVENT_QUERY_CREATE_DATABSE = <<EOT
|
45
|
+
{"marker"=>0, "timestamp"=>1389309478, "type_code"=>2, "server_id"=>1, "event_length"=>89, "next_position"=>196, "flags"=>8, "event_type"=>"Query", "thread_id"=>39, "exec_time"=>0, "error_code"=>0, "variables"=>[0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 6, 3, 115, 116, 100, 4, 33, 0, 33, 0, 8, 0], "db_name"=>"test_db", "query"=>"create database test_db"}
|
46
|
+
EOT
|
47
|
+
# QUERY: create table
|
48
|
+
TEST_EVENT_QUERY_CREATE_TABLE = <<EOT
|
49
|
+
{"marker"=>0, "timestamp"=>1389309656, "type_code"=>2, "server_id"=>1, "event_length"=>121, "next_position"=>317, "flags"=>0, "event_type"=>"Query", "thread_id"=>42, "exec_time"=>0, "error_code"=>0, "variables"=>[0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 6, 3, 115, 116, 100, 4, 33, 0, 33, 0, 8, 0], "db_name"=>"test_db", "query"=>"create table test_table(id int primary key, value text)"}
|
50
|
+
EOT
|
51
|
+
# QUERY: drop table
|
52
|
+
TEST_EVENT_QUERY_DROP_TABLE = <<EOT
|
53
|
+
{"marker"=>0, "timestamp"=>1389309995, "type_code"=>2, "server_id"=>1, "event_length"=>115, "next_position"=>568, "flags"=>0, "event_type"=>"Query", "thread_id"=>42, "exec_time"=>0, "error_code"=>0, "variables"=>[0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 6, 3, 115, 116, 100, 4, 33, 0, 33, 0, 8, 0], "db_name"=>"test_db", "query"=>"DROP TABLE `test_table` /* generated by server */"}
|
54
|
+
EOT
|
55
|
+
# QUERY: alter table add column
|
56
|
+
TEST_EVENT_QUERY_ALTER_TABLE_ADD_COLUMN = <<EOT
|
57
|
+
{"marker"=>0, "timestamp"=>1389310404, "type_code"=>2, "server_id"=>1, "event_length"=>111, "next_position"=>800, "flags"=>0, "event_type"=>"Query", "thread_id"=>42, "exec_time"=>0, "error_code"=>0, "variables"=>[0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 6, 3, 115, 116, 100, 4, 33, 0, 33, 0, 8, 0], "db_name"=>"test_db", "query"=>"alter table test_table add column sum integer"}
|
58
|
+
EOT
|
59
|
+
# QUERY: alter table drop column
|
60
|
+
TEST_EVENT_QUERY_ALTER_TABLE_DROP_COLUMN = <<EOT
|
61
|
+
{"marker"=>0, "timestamp"=>1389310533, "type_code"=>2, "server_id"=>1, "event_length"=>104, "next_position"=>904, "flags"=>0, "event_type"=>"Query", "thread_id"=>42, "exec_time"=>0, "error_code"=>0, "variables"=>[0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 6, 3, 115, 116, 100, 4, 33, 0, 33, 0, 8, 0], "db_name"=>"test_db", "query"=>"alter table test_table drop column sum"}
|
62
|
+
EOT
|
63
|
+
# QUERY: alter table modify column
|
64
|
+
TEST_EVENT_QUERY_ALTER_TABLE_MODIFY_COLUMN = <<EOT
|
65
|
+
{"marker"=>0, "timestamp"=>1389310735, "type_code"=>2, "server_id"=>1, "event_length"=>112, "next_position"=>1352, "flags"=>0, "event_type"=>"Query", "thread_id"=>48, "exec_time"=>0, "error_code"=>0, "variables"=>[0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 6, 3, 115, 116, 100, 4, 33, 0, 33, 0, 8, 0], "db_name"=>"test_db", "query"=>"alter table test_table modify column sum float"}
|
66
|
+
EOT
|
67
|
+
# - 03 STOP_EVENT
|
68
|
+
TEST_EVENT_STOP = <<EOT
|
69
|
+
{"marker"=>0, "timestamp"=>1389309286, "type_code"=>3, "server_id"=>1, "event_length"=>19, "next_position"=>2929, "flags"=>0, "event_type"=>"Stop"}
|
70
|
+
EOT
|
71
|
+
# - 04 ROTATE_EVENT
|
72
|
+
TEST_EVENT_ROTATE = <<EOT
|
73
|
+
{"marker"=>0, "timestamp"=>0, "type_code"=>4, "server_id"=>1, "event_length"=>43, "next_position"=>0, "flags"=>32, "event_type"=>"Rotate", "binlog_file"=>"mysql-bin.000048", "binlog_pos"=>2883}
|
74
|
+
EOT
|
75
|
+
# - 0f FORMAT_DESCRIPTION_EVENT
|
76
|
+
TEST_EVENT_FORMAT_DESC = <<EOT
|
77
|
+
{"marker"=>0, "timestamp"=>1389292075, "type_code"=>15, "server_id"=>1, "event_length"=>103, "next_position"=>0, "flags"=>0, "event_type"=>"Format_desc", "binlog_version"=>0, "created_ts"=>2560145104, "log_header_len"=>71}
|
78
|
+
EOT
|
79
|
+
# - 10 XID_EVENT
|
80
|
+
TEST_EVENT_XID = <<EOT
|
81
|
+
{"marker"=>0, "timestamp"=>#{TEST_TIMESTAMP}, "type_code"=>16, "server_id"=>1, "event_length"=>27, "next_position"=>2633, "flags"=>0, "event_type"=>"Xid", "xid_id"=>129345}
|
82
|
+
EOT
|
83
|
+
|
84
|
+
# - 13 TABLE_MAP_EVENT
|
85
|
+
TEST_EVENT_TABLE_MAP = <<EOT
|
86
|
+
{"marker"=>0, "timestamp"=>#{TEST_TIMESTAMP}, "type_code"=>19, "server_id"=>1, "event_length"=>56, "next_position"=>2528, "flags"=>1, "event_type"=>"Table_map", "table_id"=>163, "db_name"=>"#{TEST_DB}", "table_name"=>"#{TEST_TABLE}", "raw_columns"=>[3, 252], "columns"=>["LONG", "BLOB"], "metadata"=>[2], "null_bits"=>[3]}
|
87
|
+
EOT
|
88
|
+
# la
|
89
|
+
TEST_EVENT_INCIDENT = <<EOT
|
90
|
+
{"marker"=>0, "timestamp"=>0, "type_code"=>26, "server_id"=>1, "event_length"=>40, "next_position"=>2883, "flags"=>32, "event_type"=>"Incident", "incident_type"=>175, "message"=>"Operation canceled"}
|
91
|
+
EOT
|
92
|
+
|
93
|
+
describe MysqlBinlogFlydataInput do
|
94
|
+
def create_event(event_str)
|
95
|
+
event = eval(event_str)
|
96
|
+
allow(event).to receive(:event_type).and_return(event["event_type"])
|
97
|
+
event
|
98
|
+
end
|
99
|
+
|
100
|
+
def expect_emitted_records(event, records)
|
101
|
+
records = [records] unless records.kind_of?(Array)
|
102
|
+
records.each do |r|
|
103
|
+
expect(Engine).to receive(:emit).with(TEST_TAG, TEST_TIMESTAMP, r).ordered
|
104
|
+
end
|
105
|
+
plugin.event_listener(event)
|
106
|
+
end
|
107
|
+
|
108
|
+
def expect_no_emitted_record(event)
|
109
|
+
expect(Engine).to receive(:emit).never
|
110
|
+
plugin.event_listener(event)
|
111
|
+
end
|
112
|
+
|
113
|
+
def expect_emitted_records_with_rows(event, type, table, rows)
|
114
|
+
rows = [rows] unless rows.kind_of?(Array)
|
115
|
+
records = rows.collect do |row|
|
116
|
+
{ "type"=>type, "table_name"=>table, "respect_order"=>true, "seq"=>2, "row"=>row }
|
117
|
+
end
|
118
|
+
expect_emitted_records(event, records)
|
119
|
+
end
|
120
|
+
|
121
|
+
let(:plugin) { MysqlBinlogFlydataInput.new }
|
122
|
+
let(:insert_event) { create_event(TEST_EVENT_INSERT) }
|
123
|
+
let(:delete_event) { create_event(TEST_EVENT_DELETE) }
|
124
|
+
let(:update_event) { create_event(TEST_EVENT_UPDATE) }
|
125
|
+
|
126
|
+
let(:query_event) { create_event(TEST_EVENT_QUERY_CREATE_DATABSE) }
|
127
|
+
let(:table_map_event) { create_event(TEST_EVENT_TABLE_MAP) }
|
128
|
+
let(:xid_event) { create_event(TEST_EVENT_XID) }
|
129
|
+
|
130
|
+
let(:now) { Time.now }
|
131
|
+
|
132
|
+
let(:table_seq_file) {
|
133
|
+
f = double('table_seq_file')
|
134
|
+
f.stub(:read).and_return('1')
|
135
|
+
f.stub(:rewind)
|
136
|
+
f.stub(:truncate)
|
137
|
+
f
|
138
|
+
}
|
139
|
+
|
140
|
+
before do
|
141
|
+
allow(MysqlBinlogInput::BinlogUtil).to receive(:to_hash) {|e| e}
|
142
|
+
allow(File).to receive(:open).with(TEST_POSITION_FILE).and_return('test_position')
|
143
|
+
allow(File).to receive(:exists?).with(TEST_POSITION_FILE).and_return(true)
|
144
|
+
allow(File).to receive(:open).with(TEST_SEQUENCE_FILE, "r+").and_yield(table_seq_file)
|
145
|
+
Timecop.freeze(now)
|
146
|
+
end
|
147
|
+
|
148
|
+
after do
|
149
|
+
Timecop.return
|
150
|
+
end
|
151
|
+
|
152
|
+
describe '#event_listener' do
|
153
|
+
before { Test.configure_plugin(plugin, TEST_CONFIG) }
|
154
|
+
|
155
|
+
context 'when received insert event' do
|
156
|
+
it do
|
157
|
+
table_seq_file.should_receive(:write).exactly(3).with(2)
|
158
|
+
expect_emitted_records_with_rows(insert_event, :insert, TEST_TABLE,
|
159
|
+
[{"1"=>"0SL00000001", "2"=>"foo"}, {"1"=>"0SL00000002", "2"=>"var"}, {"1"=>"0SL00000003", "2"=>"hoge"}])
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
context 'when received delete event' do
|
164
|
+
it do
|
165
|
+
table_seq_file.should_receive(:write).twice.with(2)
|
166
|
+
expect_emitted_records_with_rows(delete_event, :delete, TEST_TABLE,
|
167
|
+
[{"1"=>"0SL00000002", "2"=>"var"}, {"1"=>"0SL00000003", "2"=>"hoge"}])
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
context 'when received update event' do
|
172
|
+
it do
|
173
|
+
table_seq_file.should_receive(:write).twice.with(2)
|
174
|
+
expect_emitted_records_with_rows(update_event, :update, TEST_TABLE,
|
175
|
+
[{"1"=>"0SL00000001", "2"=>"wow"}, {"1"=>"0SL00000003", "2"=>"fuga"}])
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
context 'when received event with another database name' do
|
180
|
+
it do
|
181
|
+
event = insert_event
|
182
|
+
event['db_name'] = 'another_db'
|
183
|
+
expect_no_emitted_record(event)
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
context 'when received event with unsupported table name' do
|
188
|
+
it do
|
189
|
+
event = insert_event
|
190
|
+
event['table_name'] = 'another_table'
|
191
|
+
expect_no_emitted_record(event)
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
195
|
+
context 'when received unsupported event' do
|
196
|
+
it do
|
197
|
+
expect_no_emitted_record(query_event)
|
198
|
+
expect_no_emitted_record(table_map_event)
|
199
|
+
expect_no_emitted_record(xid_event)
|
200
|
+
end
|
201
|
+
end
|
202
|
+
end
|
203
|
+
end
|
204
|
+
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Flydata
|
4
|
+
module Util
|
5
|
+
|
6
|
+
describe Encryptor do
|
7
|
+
let(:default_key) { "test_key" }
|
8
|
+
let(:default_text) { "test_text" }
|
9
|
+
|
10
|
+
describe '.encrypt' do
|
11
|
+
context 'text is nil' do
|
12
|
+
it do
|
13
|
+
expect {
|
14
|
+
Flydata::Util::Encryptor.encrypt(nil, default_key)
|
15
|
+
}.to raise_error(ArgumentError)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
context 'text is empty' do
|
19
|
+
it do
|
20
|
+
expect {
|
21
|
+
Flydata::Util::Encryptor.encrypt('', default_key)
|
22
|
+
}.to raise_error(ArgumentError)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
context 'key is nil' do
|
26
|
+
it do
|
27
|
+
expect {
|
28
|
+
Flydata::Util::Encryptor.encrypt(default_text, nil)
|
29
|
+
}.to raise_error(ArgumentError)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
context 'key is empty' do
|
33
|
+
it do
|
34
|
+
expect {
|
35
|
+
Flydata::Util::Encryptor.encrypt(default_text, '')
|
36
|
+
}.to raise_error(ArgumentError)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
context 'text and key are valid' do
|
40
|
+
it do
|
41
|
+
e_t = Flydata::Util::Encryptor.encrypt(default_text, default_key)
|
42
|
+
expect(e_t).not_to eq(default_text)
|
43
|
+
expect(Flydata::Util::Encryptor.decrypt(e_t, default_key)).to eq(default_text)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe '.decrypt' do
|
49
|
+
context 'text is invalid' do
|
50
|
+
it do
|
51
|
+
expect(Flydata::Util::Encryptor.decrypt('abcde', default_key)).to eq('abcde')
|
52
|
+
end
|
53
|
+
end
|
54
|
+
context 'text is valid' do
|
55
|
+
it do
|
56
|
+
e_t = Flydata::Util::Encryptor.encrypt(default_text, default_key)
|
57
|
+
expect(e_t).not_to eq(default_text)
|
58
|
+
expect(Flydata::Util::Encryptor.decrypt(e_t, default_key)).to eq(default_text)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
describe '.decrypt!' do
|
64
|
+
context 'text is nil' do
|
65
|
+
it do
|
66
|
+
expect {
|
67
|
+
Flydata::Util::Encryptor.decrypt!(nil, default_key)
|
68
|
+
}.to raise_error(ArgumentError)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
context 'text is empty' do
|
72
|
+
it do
|
73
|
+
expect {
|
74
|
+
Flydata::Util::Encryptor.decrypt!('', default_key)
|
75
|
+
}.to raise_error(ArgumentError)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
context 'key is nil' do
|
79
|
+
it do
|
80
|
+
expect {
|
81
|
+
Flydata::Util::Encryptor.decrypt!(default_text, nil)
|
82
|
+
}.to raise_error(ArgumentError)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
context 'key is empty' do
|
86
|
+
it do
|
87
|
+
expect {
|
88
|
+
Flydata::Util::Encryptor.decrypt!(default_text, '')
|
89
|
+
}.to raise_error(ArgumentError)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -2,6 +2,7 @@ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
|
2
2
|
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
3
3
|
require 'rspec'
|
4
4
|
require 'active_record' # for Flydata::Heroku
|
5
|
+
require 'protected_attributes'
|
5
6
|
require 'flydata'
|
6
7
|
|
7
8
|
# Requires supporting files with custom matchers and macros, etc,
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# Custom configuration for flydata client
|
2
|
+
# This file is yaml format. http://www.yaml.org/
|
3
|
+
# Please remove '#' to enable custom option settings.
|
4
|
+
mysql_data_entry_preference:
|
5
|
+
#host: localhost
|
6
|
+
#port: 3306
|
7
|
+
#username: root
|
8
|
+
#password: abcd
|
9
|
+
#database: dev
|
10
|
+
#tables: users,country,rows
|
11
|
+
#mysqldump_dir: /mnt/dump
|
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.0
|
4
|
+
version: 0.1.0
|
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-04-18 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rest-client
|
@@ -107,6 +107,54 @@ dependencies:
|
|
107
107
|
- - '='
|
108
108
|
- !ruby/object:Gem::Version
|
109
109
|
version: 0.10.35
|
110
|
+
- !ruby/object:Gem::Dependency
|
111
|
+
name: ruby-binlog
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
113
|
+
none: false
|
114
|
+
requirements:
|
115
|
+
- - ! '>='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 1.0.0
|
118
|
+
type: :runtime
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - ! '>='
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: 1.0.0
|
126
|
+
- !ruby/object:Gem::Dependency
|
127
|
+
name: fluent-plugin-mysql-binlog
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
129
|
+
none: false
|
130
|
+
requirements:
|
131
|
+
- - ~>
|
132
|
+
- !ruby/object:Gem::Version
|
133
|
+
version: 0.0.2
|
134
|
+
type: :runtime
|
135
|
+
prerelease: false
|
136
|
+
version_requirements: !ruby/object:Gem::Requirement
|
137
|
+
none: false
|
138
|
+
requirements:
|
139
|
+
- - ~>
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
version: 0.0.2
|
142
|
+
- !ruby/object:Gem::Dependency
|
143
|
+
name: mysql2
|
144
|
+
requirement: !ruby/object:Gem::Requirement
|
145
|
+
none: false
|
146
|
+
requirements:
|
147
|
+
- - ~>
|
148
|
+
- !ruby/object:Gem::Version
|
149
|
+
version: 0.3.11
|
150
|
+
type: :runtime
|
151
|
+
prerelease: false
|
152
|
+
version_requirements: !ruby/object:Gem::Requirement
|
153
|
+
none: false
|
154
|
+
requirements:
|
155
|
+
- - ~>
|
156
|
+
- !ruby/object:Gem::Version
|
157
|
+
version: 0.3.11
|
110
158
|
- !ruby/object:Gem::Dependency
|
111
159
|
name: bundler
|
112
160
|
requirement: !ruby/object:Gem::Requirement
|
@@ -155,6 +203,22 @@ dependencies:
|
|
155
203
|
- - ! '>='
|
156
204
|
- !ruby/object:Gem::Version
|
157
205
|
version: '0'
|
206
|
+
- !ruby/object:Gem::Dependency
|
207
|
+
name: timecop
|
208
|
+
requirement: !ruby/object:Gem::Requirement
|
209
|
+
none: false
|
210
|
+
requirements:
|
211
|
+
- - ! '>='
|
212
|
+
- !ruby/object:Gem::Version
|
213
|
+
version: '0'
|
214
|
+
type: :development
|
215
|
+
prerelease: false
|
216
|
+
version_requirements: !ruby/object:Gem::Requirement
|
217
|
+
none: false
|
218
|
+
requirements:
|
219
|
+
- - ! '>='
|
220
|
+
- !ruby/object:Gem::Version
|
221
|
+
version: '0'
|
158
222
|
- !ruby/object:Gem::Dependency
|
159
223
|
name: sqlite3
|
160
224
|
requirement: !ruby/object:Gem::Requirement
|
@@ -171,9 +235,74 @@ dependencies:
|
|
171
235
|
- - ! '>='
|
172
236
|
- !ruby/object:Gem::Version
|
173
237
|
version: '0'
|
238
|
+
- !ruby/object:Gem::Dependency
|
239
|
+
name: ruby-prof
|
240
|
+
requirement: !ruby/object:Gem::Requirement
|
241
|
+
none: false
|
242
|
+
requirements:
|
243
|
+
- - ! '>='
|
244
|
+
- !ruby/object:Gem::Version
|
245
|
+
version: '0'
|
246
|
+
type: :development
|
247
|
+
prerelease: false
|
248
|
+
version_requirements: !ruby/object:Gem::Requirement
|
249
|
+
none: false
|
250
|
+
requirements:
|
251
|
+
- - ! '>='
|
252
|
+
- !ruby/object:Gem::Version
|
253
|
+
version: '0'
|
254
|
+
- !ruby/object:Gem::Dependency
|
255
|
+
name: activemodel
|
256
|
+
requirement: !ruby/object:Gem::Requirement
|
257
|
+
none: false
|
258
|
+
requirements:
|
259
|
+
- - ~>
|
260
|
+
- !ruby/object:Gem::Version
|
261
|
+
version: 4.0.0
|
262
|
+
type: :development
|
263
|
+
prerelease: false
|
264
|
+
version_requirements: !ruby/object:Gem::Requirement
|
265
|
+
none: false
|
266
|
+
requirements:
|
267
|
+
- - ~>
|
268
|
+
- !ruby/object:Gem::Version
|
269
|
+
version: 4.0.0
|
270
|
+
- !ruby/object:Gem::Dependency
|
271
|
+
name: activerecord
|
272
|
+
requirement: !ruby/object:Gem::Requirement
|
273
|
+
none: false
|
274
|
+
requirements:
|
275
|
+
- - ~>
|
276
|
+
- !ruby/object:Gem::Version
|
277
|
+
version: 4.0.0
|
278
|
+
type: :development
|
279
|
+
prerelease: false
|
280
|
+
version_requirements: !ruby/object:Gem::Requirement
|
281
|
+
none: false
|
282
|
+
requirements:
|
283
|
+
- - ~>
|
284
|
+
- !ruby/object:Gem::Version
|
285
|
+
version: 4.0.0
|
286
|
+
- !ruby/object:Gem::Dependency
|
287
|
+
name: protected_attributes
|
288
|
+
requirement: !ruby/object:Gem::Requirement
|
289
|
+
none: false
|
290
|
+
requirements:
|
291
|
+
- - ! '>='
|
292
|
+
- !ruby/object:Gem::Version
|
293
|
+
version: '0'
|
294
|
+
type: :development
|
295
|
+
prerelease: false
|
296
|
+
version_requirements: !ruby/object:Gem::Requirement
|
297
|
+
none: false
|
298
|
+
requirements:
|
299
|
+
- - ! '>='
|
300
|
+
- !ruby/object:Gem::Version
|
301
|
+
version: '0'
|
174
302
|
description: FlyData Command Line Interface
|
175
303
|
email: sysadmin@flydata.co
|
176
304
|
executables:
|
305
|
+
- fdmysqldump
|
177
306
|
- flydata
|
178
307
|
extensions: []
|
179
308
|
extra_rdoc_files: []
|
@@ -184,6 +313,7 @@ files:
|
|
184
313
|
- Gemfile.lock
|
185
314
|
- Rakefile
|
186
315
|
- VERSION
|
316
|
+
- bin/fdmysqldump
|
187
317
|
- bin/flydata
|
188
318
|
- flydata.gemspec
|
189
319
|
- lib/fly_data_model.rb
|
@@ -191,10 +321,13 @@ files:
|
|
191
321
|
- lib/flydata/api/base.rb
|
192
322
|
- lib/flydata/api/data_entry.rb
|
193
323
|
- lib/flydata/api/data_port.rb
|
324
|
+
- lib/flydata/api/redshift_cluster.rb
|
194
325
|
- lib/flydata/api_client.rb
|
195
326
|
- lib/flydata/cli.rb
|
196
327
|
- lib/flydata/command/base.rb
|
328
|
+
- lib/flydata/command/conf.rb
|
197
329
|
- lib/flydata/command/crontab.rb
|
330
|
+
- lib/flydata/command/encrypt.rb
|
198
331
|
- lib/flydata/command/kill_all.rb
|
199
332
|
- lib/flydata/command/login.rb
|
200
333
|
- lib/flydata/command/restart.rb
|
@@ -204,21 +337,37 @@ files:
|
|
204
337
|
- lib/flydata/command/setup.rb
|
205
338
|
- lib/flydata/command/start.rb
|
206
339
|
- lib/flydata/command/stop.rb
|
340
|
+
- lib/flydata/command/sync.rb
|
341
|
+
- lib/flydata/command/version.rb
|
207
342
|
- lib/flydata/credentials.rb
|
208
343
|
- lib/flydata/cron.rb
|
344
|
+
- lib/flydata/fluent-plugins/in_mysql_binlog_flydata.rb
|
345
|
+
- lib/flydata/fluent-plugins/out_forward_ssl.rb
|
346
|
+
- lib/flydata/fluent-plugins/preference.rb
|
209
347
|
- lib/flydata/flydata_crontab.sh
|
210
348
|
- lib/flydata/helpers.rb
|
211
349
|
- lib/flydata/heroku.rb
|
212
350
|
- lib/flydata/heroku/configuration_methods.rb
|
213
351
|
- lib/flydata/heroku/instance_methods.rb
|
214
352
|
- lib/flydata/log_monitor.rb
|
353
|
+
- lib/flydata/preference/data_entry_preference.rb
|
215
354
|
- lib/flydata/proxy.rb
|
355
|
+
- lib/flydata/sync_file_manager.rb
|
356
|
+
- lib/flydata/table_def.rb
|
357
|
+
- lib/flydata/table_def/mysql_table_def.rb
|
358
|
+
- lib/flydata/table_def/redshift_table_def.rb
|
359
|
+
- lib/flydata/util/encryptor.rb
|
360
|
+
- spec/fluent_plugins_spec_helper.rb
|
216
361
|
- spec/fly_data_model_spec.rb
|
217
362
|
- spec/flydata/api/data_entry_spec.rb
|
218
363
|
- spec/flydata/command/sender_spec.rb
|
364
|
+
- spec/flydata/command/sync_spec.rb
|
365
|
+
- spec/flydata/fluent-plugins/in_mysql_binlog_flydata_spec.rb
|
219
366
|
- spec/flydata/heroku_spec.rb
|
367
|
+
- spec/flydata/util/encryptor_spec.rb
|
220
368
|
- spec/flydata_spec.rb
|
221
369
|
- spec/spec_helper.rb
|
370
|
+
- tmpl/redshift_mysql_data_entry.conf.tmpl
|
222
371
|
homepage: http://flydata.co/
|
223
372
|
licenses:
|
224
373
|
- All right reserved.
|
@@ -234,7 +383,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
234
383
|
version: '0'
|
235
384
|
segments:
|
236
385
|
- 0
|
237
|
-
hash:
|
386
|
+
hash: 1795094757284592242
|
238
387
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
239
388
|
none: false
|
240
389
|
requirements:
|
@@ -243,7 +392,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
243
392
|
version: '0'
|
244
393
|
requirements: []
|
245
394
|
rubyforge_project:
|
246
|
-
rubygems_version: 1.8.
|
395
|
+
rubygems_version: 1.8.24
|
247
396
|
signing_key:
|
248
397
|
specification_version: 3
|
249
398
|
summary: FlyData CLI
|