flydata 0.6.3 → 0.6.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Rakefile +2 -2
- data/VERSION +1 -1
- data/bin/fdredshift +78 -0
- data/circle.yml +1 -1
- data/ext/flydata/{parser/mysql → source_mysql/parser}/.gitignore +0 -0
- data/ext/flydata/{parser/mysql → source_mysql/parser}/dump_parser_ext.cpp +3 -3
- data/ext/flydata/source_mysql/parser/extconf.rb +3 -0
- data/ext/flydata/{parser/mysql → source_mysql/parser}/parser.txt +0 -0
- data/ext/flydata/{parser/mysql → source_mysql/parser}/sql_parser.cpp +0 -0
- data/ext/flydata/{parser/mysql → source_mysql/parser}/sql_parser.h +0 -0
- data/flydata-core/lib/flydata-core/mysql/binlog_pos.rb +34 -32
- data/flydata-core/lib/flydata-core/mysql/compatibility_checker.rb +20 -0
- data/flydata-core/lib/flydata-core/table_def/mysql_table_def.rb +12 -4
- data/flydata-core/lib/flydata-core/table_def/redshift_table_def.rb +60 -6
- data/flydata-core/spec/mysql/binlog_pos_spec.rb +474 -0
- data/flydata-core/spec/table_def/mysql_table_def_spec.rb +57 -0
- data/flydata-core/spec/table_def/mysql_to_redshift_table_def_spec.rb +174 -20
- data/flydata-core/spec/table_def/mysqldump_test_col_comment_with_AUTO_INCREMENT_keyword.dump +43 -0
- data/flydata-core/spec/table_def/mysqldump_test_col_comment_with_not_null_keyword.dump +43 -0
- data/flydata-core/spec/table_def/mysqldump_test_col_comment_with_unique_keyword.dump +43 -0
- data/flydata-core/spec/table_def/mysqldump_test_col_comment_with_unsigned_keyword.dump +43 -0
- data/flydata-core/spec/table_def/redshift_table_def_spec.rb +41 -8
- data/flydata.gemspec +0 -0
- data/lib/flydata/cli.rb +11 -5
- data/lib/flydata/command/base.rb +14 -1
- data/lib/flydata/command/exclusive_runnable.rb +42 -12
- data/lib/flydata/command/helper.rb +6 -6
- data/lib/flydata/command/sender.rb +4 -3
- data/lib/flydata/command/setup.rb +30 -381
- data/lib/flydata/command/stop.rb +1 -0
- data/lib/flydata/command/sync.rb +273 -301
- data/lib/flydata/compatibility_check.rb +24 -117
- data/lib/flydata/fluent-plugins/in_mysql_binlog_flydata.rb +3 -3
- data/lib/flydata/fluent-plugins/mysql/alter_table_query_handler.rb +2 -2
- data/lib/flydata/fluent-plugins/mysql/binlog_record_handler.rb +6 -6
- data/lib/flydata/fluent-plugins/mysql/truncate_table_query_handler.rb +0 -1
- data/lib/flydata/parser.rb +14 -0
- data/lib/flydata/{parser_provider.rb → parser/parser_provider.rb} +6 -4
- data/lib/flydata/parser/source_table.rb +33 -0
- data/lib/flydata/source.rb +105 -0
- data/lib/flydata/source/component.rb +21 -0
- data/lib/flydata/source/errors.rb +7 -0
- data/lib/flydata/source/generate_source_dump.rb +72 -0
- data/lib/flydata/source/parse_dump_and_send.rb +52 -0
- data/lib/flydata/source/setup.rb +31 -0
- data/lib/flydata/source/source_pos.rb +45 -0
- data/lib/flydata/source/sync.rb +56 -0
- data/lib/flydata/source/sync_generate_table_ddl.rb +43 -0
- data/lib/flydata/source_file/setup.rb +17 -0
- data/lib/flydata/source_file/sync.rb +14 -0
- data/lib/flydata/{command → source_mysql/command}/mysql.rb +2 -1
- data/lib/flydata/{command → source_mysql/command}/mysql_command_base.rb +2 -4
- data/lib/flydata/{command → source_mysql/command}/mysqlbinlog.rb +2 -1
- data/lib/flydata/{command → source_mysql/command}/mysqldump.rb +2 -1
- data/lib/flydata/source_mysql/generate_source_dump.rb +53 -0
- data/lib/flydata/source_mysql/mysql_compatibility_check.rb +114 -0
- data/lib/flydata/source_mysql/parse_dump_and_send.rb +28 -0
- data/lib/flydata/{parser/mysql → source_mysql/parser}/.gitignore +0 -0
- data/lib/flydata/{parser/mysql → source_mysql/parser}/dump_parser.rb +32 -67
- data/lib/flydata/{parser/mysql → source_mysql/parser}/mysql_alter_table.treetop +0 -0
- data/lib/flydata/source_mysql/setup.rb +24 -0
- data/lib/flydata/source_mysql/source_pos.rb +21 -0
- data/lib/flydata/source_mysql/sync.rb +45 -0
- data/lib/flydata/source_mysql/sync_generate_table_ddl.rb +40 -0
- data/lib/flydata/{mysql → source_mysql}/table_ddl.rb +6 -17
- data/lib/flydata/source_zendesk/sync_generate_table_ddl.rb +30 -0
- data/lib/flydata/source_zendesk/zendesk_flydata_tabledefs.rb +133 -0
- data/lib/flydata/sync_file_manager.rb +132 -73
- data/lib/flydata/table_ddl.rb +18 -0
- data/spec/flydata/cli_spec.rb +1 -0
- data/spec/flydata/command/exclusive_runnable_spec.rb +19 -8
- data/spec/flydata/command/sender_spec.rb +1 -1
- data/spec/flydata/command/setup_spec.rb +4 -4
- data/spec/flydata/command/sync_spec.rb +97 -134
- data/spec/flydata/compatibility_check_spec.rb +16 -289
- data/spec/flydata/fluent-plugins/mysql/alter_table_query_handler_spec.rb +3 -3
- data/spec/flydata/fluent-plugins/mysql/dml_record_handler_spec.rb +1 -1
- data/spec/flydata/fluent-plugins/mysql/shared_query_handler_context.rb +4 -2
- data/spec/flydata/fluent-plugins/mysql/truncate_query_handler_spec.rb +1 -1
- data/spec/flydata/source_mysql/generate_source_dump_spec.rb +69 -0
- data/spec/flydata/source_mysql/mysql_compatibility_check_spec.rb +280 -0
- data/spec/flydata/{parser/mysql → source_mysql/parser}/alter_table_parser_spec.rb +2 -2
- data/spec/flydata/{parser/mysql → source_mysql/parser}/dump_parser_spec.rb +75 -70
- data/spec/flydata/source_mysql/sync_generate_table_ddl_spec.rb +137 -0
- data/spec/flydata/{mysql → source_mysql}/table_ddl_spec.rb +2 -2
- data/spec/flydata/source_spec.rb +140 -0
- data/spec/flydata/source_zendesk/sync_generate_table_ddl_spec.rb +33 -0
- data/spec/flydata/sync_file_manager_spec.rb +157 -77
- data/tmpl/redshift_mysql_data_entry.conf.tmpl +1 -1
- metadata +56 -23
- data/ext/flydata/parser/mysql/extconf.rb +0 -3
- data/lib/flydata/mysql/binlog_position.rb +0 -22
- data/spec/flydata/mysql/binlog_position_spec.rb +0 -35
@@ -0,0 +1,114 @@
|
|
1
|
+
require 'mysql2'
|
2
|
+
require 'flydata/compatibility_check'
|
3
|
+
require 'flydata-core/mysql/config'
|
4
|
+
require 'flydata-core/mysql/command_generator'
|
5
|
+
require 'flydata-core/mysql/compatibility_checker'
|
6
|
+
require 'flydata-core/errors'
|
7
|
+
|
8
|
+
module Flydata
|
9
|
+
module SourceMysql
|
10
|
+
|
11
|
+
class MysqlCompatibilityCheck < CompatibilityCheck
|
12
|
+
include InitialSyncChecks
|
13
|
+
|
14
|
+
def initialize(dp_hash, de_hash, options={})
|
15
|
+
super
|
16
|
+
@db_opts = FlydataCore::Mysql::Config.build_mysql_db_opts(de_hash)
|
17
|
+
@dump_dir = options[:dump_dir] || nil
|
18
|
+
@backup_dir = options[:backup_dir] || nil
|
19
|
+
@tables = de_hash['tables']
|
20
|
+
end
|
21
|
+
|
22
|
+
def print_errors
|
23
|
+
return if @errors.empty?
|
24
|
+
log_error_stderr "There may be some compatibility issues with your MySQL credentials: "
|
25
|
+
@errors.each do |error|
|
26
|
+
log_error_stderr " * #{error.message}"
|
27
|
+
end
|
28
|
+
raise "Please correct these errors if you wish to run FlyData Sync"
|
29
|
+
end
|
30
|
+
|
31
|
+
def check_compatibility56_variable
|
32
|
+
FlydataCore::Mysql::MySqlVersion57CompabilityChecker.new(@db_opts).do_check
|
33
|
+
end
|
34
|
+
|
35
|
+
def check_mysql_user_compat
|
36
|
+
FlydataCore::Mysql::SyncPermissionChecker.new(@db_opts).do_check
|
37
|
+
end
|
38
|
+
|
39
|
+
def check_mysql_protocol_tcp_compat
|
40
|
+
query = FlydataCore::Mysql::CommandGenerator.generate_mysql_show_grants_cmd(@db_opts)
|
41
|
+
|
42
|
+
Open3.popen3(query) do |stdin, stdout, stderr|
|
43
|
+
stdin.close
|
44
|
+
while !stderr.eof?
|
45
|
+
lines = []
|
46
|
+
while line = stderr.gets; lines << line.strip; end
|
47
|
+
err_reason = lines.join(" ")
|
48
|
+
log_error("Error occured during access to mysql server.", {err: err_reason})
|
49
|
+
|
50
|
+
unless /Warning: Using a password on the command line interface can be insecure/ === err_reason
|
51
|
+
raise FlydataCore::MysqlCompatibilityError, "Cannot connect to MySQL database. Please make sure you can connect with this command:\n $ mysql -u #{@db_opts[:username]} -h #{@db_opts[:host]} -P #{@db_opts[:port]} #{@db_opts[:database]} --protocol=tcp -p"
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def check_mysql_parameters_compat
|
58
|
+
begin
|
59
|
+
FlydataCore::Mysql::OptionalBinlogParameterChecker.new(@db_opts).do_check
|
60
|
+
rescue FlydataCore::MysqlCompatibilityError => e
|
61
|
+
log_warn_stderr(e.to_s)
|
62
|
+
end
|
63
|
+
FlydataCore::Mysql::RequiredBinlogParameterChecker.new(@db_opts).do_check
|
64
|
+
end
|
65
|
+
|
66
|
+
def check_rds_master_status
|
67
|
+
if is_rds?
|
68
|
+
FlydataCore::Mysql::RdsMasterStatusChecker.new(@db_opts).do_check
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def check_mysql_binlog_retention
|
73
|
+
if is_rds?
|
74
|
+
run_rds_retention_check
|
75
|
+
else
|
76
|
+
run_mysql_retention_check
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
# If table_type='VIEW' or engine='MEMORY', raise error.
|
81
|
+
def check_mysql_table_types
|
82
|
+
return if @tables.empty?
|
83
|
+
option = @db_opts.dup.merge(tables: @tables)
|
84
|
+
FlydataCore::Mysql::TableTypeChecker.new(option).do_check
|
85
|
+
end
|
86
|
+
|
87
|
+
def run_mysql_retention_check
|
88
|
+
FlydataCore::Mysql::NonRdsRetentionChecker.new(@db_opts).do_check
|
89
|
+
end
|
90
|
+
|
91
|
+
def run_rds_retention_check
|
92
|
+
FlydataCore::Mysql::RdsRetentionChecker.new(@db_opts).do_check
|
93
|
+
rescue Mysql2::Error => e
|
94
|
+
if e.message =~ /command denied to user/
|
95
|
+
retention_hours = FlydataCore::Mysql::RdsRetentionChecker::BINLOG_RETENTION_HOURS
|
96
|
+
log_warn_stderr("[WARNING]Cannot verify RDS retention period on current MySQL user account.\n" +
|
97
|
+
"To see retention period, please run this on your RDS:\n" +
|
98
|
+
" $> call mysql.rds_show_configuration;\n" +
|
99
|
+
"Please verify that the hours is not nil and is at least #{retention_hours} hours\n" +
|
100
|
+
"To set binlog retention hours, you can run this on your RDS:\n" +
|
101
|
+
" $> call mysql.rds_set_configuration('binlog retention hours', #{retention_hours});\n"
|
102
|
+
)
|
103
|
+
else
|
104
|
+
raise e
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
def is_rds?(hostname = @db_opts[:host])
|
109
|
+
hostname.match(/rds.amazonaws.com$/) != nil
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
end
|
114
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'flydata/source/parse_dump_and_send'
|
2
|
+
require 'flydata-core/table_def/mysql_table_def'
|
3
|
+
require 'flydata/source_mysql/parser/dump_parser'
|
4
|
+
require 'flydata-core/mysql/binlog_pos'
|
5
|
+
|
6
|
+
module Flydata
|
7
|
+
module SourceMysql
|
8
|
+
|
9
|
+
class ParseDumpAndSend < Source::ParseDumpAndSend
|
10
|
+
def value_converters
|
11
|
+
FlydataCore::TableDef::MysqlTableDef::VALUE_CONVERTERS
|
12
|
+
end
|
13
|
+
|
14
|
+
def parse_dump(dump_pos_info, dmpio,
|
15
|
+
create_table_block, insert_record_block, check_point_source_pos_block)
|
16
|
+
|
17
|
+
check_point_binlog_block = Proc.new { |source_table, last_pos, bytesize, binlog_hash, state, substate|
|
18
|
+
source_pos = FlydataCore::Mysql::BinlogPos.new(binlog_hash) # SourcePos object is BinlogPos in SourceMysql
|
19
|
+
|
20
|
+
check_point_source_pos_block.call(source_table, last_pos, bytesize, source_pos, state, substate)
|
21
|
+
}
|
22
|
+
Parser::MysqlDumpParser.new(dump_pos_info).parse(dmpio,
|
23
|
+
create_table_block, insert_record_block, check_point_binlog_block)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
File without changes
|
@@ -1,13 +1,16 @@
|
|
1
1
|
require 'fiber'
|
2
2
|
require 'io/wait'
|
3
3
|
require 'mysql2'
|
4
|
+
require 'flydata/parser'
|
5
|
+
require 'flydata/parser/source_table'
|
4
6
|
require 'flydata-core/mysql/config'
|
5
7
|
require 'flydata-core/mysql/command_generator'
|
8
|
+
require 'flydata-core/mysql/binlog_pos'
|
6
9
|
#require 'ruby-prof' # to enable profiling, also set the class' RUN_PROFILE
|
7
10
|
|
8
11
|
module Flydata
|
9
|
-
module
|
10
|
-
module
|
12
|
+
module SourceMysql
|
13
|
+
module Parser
|
11
14
|
|
12
15
|
module MysqlAccessible
|
13
16
|
def mysql_conf(conf)
|
@@ -29,38 +32,6 @@ module Flydata
|
|
29
32
|
end
|
30
33
|
end
|
31
34
|
|
32
|
-
class MysqlTable
|
33
|
-
def initialize(table_name, columns = {}, primary_keys = [])
|
34
|
-
@table_name = table_name
|
35
|
-
@columns = columns
|
36
|
-
@column_names = columns.collect{|k,v| v[:column_name]}
|
37
|
-
@primary_keys = primary_keys
|
38
|
-
@value_converters = {}
|
39
|
-
end
|
40
|
-
|
41
|
-
attr_accessor :table_name, :columns, :column_names, :primary_keys, :value_converters
|
42
|
-
|
43
|
-
def add_column(column)
|
44
|
-
cn = column[:column_name]
|
45
|
-
@columns[cn] = column
|
46
|
-
@column_names << cn
|
47
|
-
end
|
48
|
-
|
49
|
-
def set_value_converters(converter_hash)
|
50
|
-
@value_converters ||= {} # for backward compatibility with an old marshal dump object
|
51
|
-
@columns.each_with_index do |(k, v), i|
|
52
|
-
type = v[:format_type]
|
53
|
-
if converter_hash.has_key?(type)
|
54
|
-
@value_converters[i] = converter_hash[type]
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
def set_column_names
|
60
|
-
@column_names = columns.collect{|k,v| v[:column_name]}
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
35
|
class MysqlDumpGenerator
|
65
36
|
def initialize(conf)
|
66
37
|
@conf = conf
|
@@ -289,21 +260,15 @@ EOS
|
|
289
260
|
|
290
261
|
class MysqlDumpParser
|
291
262
|
|
292
|
-
module State
|
293
|
-
START = 'START'
|
294
|
-
CREATE_TABLE = 'CREATE_TABLE'
|
295
|
-
CREATE_TABLE_COLUMNS = 'CREATE_TABLE_COLUMNS'
|
296
|
-
CREATE_TABLE_CONSTRAINTS = 'CREATE_TABLE_CONSTRAINTS'
|
297
|
-
INSERT_RECORD = 'INSERT_RECORD'
|
298
|
-
PARSING_INSERT_RECORD = 'PARSING_INSERT_RECORD'
|
299
|
-
end
|
300
|
-
|
301
263
|
attr_accessor :binlog_pos
|
302
264
|
BINLOG_INV_ERROR_CHUNK_SIZE = 250
|
303
265
|
|
304
|
-
def initialize(
|
305
|
-
|
306
|
-
|
266
|
+
def initialize(dump_pos_info = {})
|
267
|
+
binlog_pos_object = dump_pos_info[:source_pos]
|
268
|
+
raise ArgumentError.new("source position is required") unless binlog_pos_object
|
269
|
+
|
270
|
+
@binlog_pos = { binfile: binlog_pos_object.filename, pos: binlog_pos_object.pos }
|
271
|
+
@dump_pos_info = dump_pos_info
|
307
272
|
end
|
308
273
|
|
309
274
|
def parse(dmpio, create_table_block, insert_record_block, check_point_block)
|
@@ -313,7 +278,7 @@ EOS
|
|
313
278
|
|
314
279
|
dump_io = nil
|
315
280
|
invalid_file = false
|
316
|
-
current_state = State::START
|
281
|
+
current_state = Flydata::Parser::State::START
|
317
282
|
substate = nil
|
318
283
|
buffered_line = nil
|
319
284
|
bytesize = 0
|
@@ -336,7 +301,7 @@ EOS
|
|
336
301
|
|
337
302
|
# -- Server version 5.6.21-log
|
338
303
|
if line.start_with?('-- Server version')
|
339
|
-
current_state = State::CREATE_TABLE
|
304
|
+
current_state = Flydata::Parser::State::CREATE_TABLE
|
340
305
|
check_point_block.call(nil, dump_io.pos, bytesize, @binlog_pos, current_state)
|
341
306
|
end
|
342
307
|
end
|
@@ -348,8 +313,8 @@ EOS
|
|
348
313
|
# CREATE TABLE `active_admin_comments` (
|
349
314
|
m = /^CREATE TABLE `(?<table_name>[^`]+)`/.match(line)
|
350
315
|
if m
|
351
|
-
current_table =
|
352
|
-
current_state = State::CREATE_TABLE_COLUMNS
|
316
|
+
current_table = Flydata::Parser::SourceTable.new(m[:table_name])
|
317
|
+
current_state = Flydata::Parser::State::CREATE_TABLE_COLUMNS
|
353
318
|
end
|
354
319
|
end
|
355
320
|
|
@@ -359,7 +324,7 @@ EOS
|
|
359
324
|
# PRIMARY KEY (`id`),
|
360
325
|
if line.start_with?(')')
|
361
326
|
create_table_block.call(current_table)
|
362
|
-
current_state = State::INSERT_RECORD
|
327
|
+
current_state = Flydata::Parser::State::INSERT_RECORD
|
363
328
|
check_point_block.call(current_table, dump_io.pos, bytesize, @binlog_pos, current_state)
|
364
329
|
elsif m = /^PRIMARY KEY \((?<primary_keys>[^\)]+)\)/.match(line)
|
365
330
|
current_table.primary_keys = m[:primary_keys].split(',').collect do |pk_str|
|
@@ -417,7 +382,7 @@ EOS
|
|
417
382
|
|
418
383
|
current_table.add_column(column)
|
419
384
|
else
|
420
|
-
current_state = State::CREATE_TABLE_CONSTRAINTS
|
385
|
+
current_state = Flydata::Parser::State::CREATE_TABLE_CONSTRAINTS
|
421
386
|
buffered_line = line
|
422
387
|
state_create_table_constraints.call
|
423
388
|
end
|
@@ -428,9 +393,9 @@ EOS
|
|
428
393
|
|
429
394
|
if line.start_with?('INSERT')
|
430
395
|
buffered_line = line
|
431
|
-
current_state = State::PARSING_INSERT_RECORD
|
396
|
+
current_state = Flydata::Parser::State::PARSING_INSERT_RECORD
|
432
397
|
elsif line.start_with?('UNLOCK')
|
433
|
-
current_state = State::CREATE_TABLE
|
398
|
+
current_state = Flydata::Parser::State::CREATE_TABLE
|
434
399
|
check_point_block.call(current_table, dump_io.pos, bytesize, @binlog_pos, current_state)
|
435
400
|
end
|
436
401
|
end
|
@@ -446,7 +411,7 @@ EOS
|
|
446
411
|
newe.set_backtrace(e.backtrace)
|
447
412
|
raise newe
|
448
413
|
end
|
449
|
-
current_state = State::INSERT_RECORD
|
414
|
+
current_state = Flydata::Parser::State::INSERT_RECORD
|
450
415
|
|
451
416
|
if insert_record_block.call(current_table, values_set)
|
452
417
|
values_set = nil
|
@@ -457,11 +422,11 @@ EOS
|
|
457
422
|
# Start reading file from top
|
458
423
|
begin
|
459
424
|
# resume(only when using dump file)
|
460
|
-
if @
|
461
|
-
dmpio.pos = @
|
462
|
-
current_state = @
|
463
|
-
substate = @
|
464
|
-
current_table = @
|
425
|
+
if @dump_pos_info[:last_pos] && (@dump_pos_info[:last_pos].to_i != -1)
|
426
|
+
dmpio.pos = @dump_pos_info[:last_pos].to_i
|
427
|
+
current_state = @dump_pos_info[:state]
|
428
|
+
substate = @dump_pos_info[:substate]
|
429
|
+
current_table = @dump_pos_info[:source_table]
|
465
430
|
bytesize = dmpio.pos
|
466
431
|
end
|
467
432
|
|
@@ -469,17 +434,17 @@ EOS
|
|
469
434
|
|
470
435
|
until dump_io.eof? do
|
471
436
|
case current_state
|
472
|
-
when State::START
|
437
|
+
when Flydata::Parser::State::START
|
473
438
|
state_start.call
|
474
|
-
when State::CREATE_TABLE
|
439
|
+
when Flydata::Parser::State::CREATE_TABLE
|
475
440
|
state_create_table.call
|
476
|
-
when State::CREATE_TABLE_COLUMNS
|
441
|
+
when Flydata::Parser::State::CREATE_TABLE_COLUMNS
|
477
442
|
state_create_table_columns.call
|
478
|
-
when State::CREATE_TABLE_CONSTRAINTS
|
443
|
+
when Flydata::Parser::State::CREATE_TABLE_CONSTRAINTS
|
479
444
|
state_create_table_constraints.call
|
480
|
-
when State::INSERT_RECORD
|
445
|
+
when Flydata::Parser::State::INSERT_RECORD
|
481
446
|
state_insert_record.call
|
482
|
-
when State::PARSING_INSERT_RECORD
|
447
|
+
when Flydata::Parser::State::PARSING_INSERT_RECORD
|
483
448
|
state_parsing_insert_record.call
|
484
449
|
end
|
485
450
|
end
|
@@ -747,4 +712,4 @@ EOT
|
|
747
712
|
end
|
748
713
|
end
|
749
714
|
|
750
|
-
require 'flydata/parser/
|
715
|
+
require 'flydata/source_mysql/parser/dump_parser_ext'
|
File without changes
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'flydata/source/setup'
|
2
|
+
require 'flydata/sync_file_manager'
|
3
|
+
|
4
|
+
module Flydata
|
5
|
+
module SourceMysql
|
6
|
+
|
7
|
+
class Setup < Source::Setup
|
8
|
+
def initial_run_need_restart?
|
9
|
+
overinstall?
|
10
|
+
end
|
11
|
+
|
12
|
+
def initial_run_complete_message
|
13
|
+
overinstall? ? :all_done : :initial_sync
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def overinstall?
|
19
|
+
File.exists?(Flydata::SyncFileManager.new(de).source_pos_path)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'flydata/source/source_pos'
|
2
|
+
require 'flydata/compatibility_check'
|
3
|
+
require 'flydata-core/mysql/command_generator'
|
4
|
+
require 'flydata-core/mysql/binlog_pos'
|
5
|
+
|
6
|
+
module Flydata
|
7
|
+
module SourceMysql
|
8
|
+
|
9
|
+
class SourcePos < Source::SourcePos
|
10
|
+
def create_source_pos(source_pos_str)
|
11
|
+
FlydataCore::Mysql::BinlogPos.new(source_pos_str)
|
12
|
+
end
|
13
|
+
|
14
|
+
def resume_pos(source_pos)
|
15
|
+
#TODO check Binlog file (source_pos.filename) is available
|
16
|
+
FlydataCore::Mysql::BinlogPos.new(source_pos.filename, 4) # 4 is the first position of binlog file
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'flydata/source/sync'
|
2
|
+
|
3
|
+
module Flydata
|
4
|
+
module SourceMysql
|
5
|
+
|
6
|
+
class Sync < Source::Sync
|
7
|
+
def setup
|
8
|
+
mp = de['mysql_data_entry_preference']
|
9
|
+
|
10
|
+
if mp['tables_append_only']
|
11
|
+
mp['tables_append_only'] = mp['tables_append_only'].split(",").uniq
|
12
|
+
mp['tables'] = (mp['tables'].split(",") + mp['tables_append_only']).uniq
|
13
|
+
else
|
14
|
+
mp['tables'] = mp['tables'].split(",").uniq
|
15
|
+
end
|
16
|
+
mp['invalid_tables'] = mp['invalid_tables'].kind_of?(String) ? mp['invalid_tables'].split(",").uniq : []
|
17
|
+
mp['new_tables'] = mp['new_tables'].kind_of?(String) ? mp['new_tables'].split(",").uniq : []
|
18
|
+
|
19
|
+
unless mp['ssl_ca_content'].to_s.strip.empty?
|
20
|
+
sync_fm = SyncFileManager.new(de)
|
21
|
+
sync_fm.save_ssl_ca(mp['ssl_ca_content'])
|
22
|
+
mp['ssl_ca'] = sync_fm.ssl_ca_path
|
23
|
+
mp['sslca'] = mp['ssl_ca']
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def supported?
|
28
|
+
true
|
29
|
+
end
|
30
|
+
|
31
|
+
def table_lists
|
32
|
+
de['mysql_data_entry_preference'].select {|key, value| %w(tables new_tables invalid_tables tables_append_only).include?(key)}
|
33
|
+
end
|
34
|
+
|
35
|
+
def data_servers
|
36
|
+
de['mysql_data_entry_preference']['data_servers']
|
37
|
+
end
|
38
|
+
|
39
|
+
def forwarder
|
40
|
+
de['mysql_data_entry_preference']['forwarder']
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'flydata/source/sync_generate_table_ddl'
|
2
|
+
require 'flydata/source_mysql/mysql_compatibility_check'
|
3
|
+
require 'flydata-core/mysql/command_generator'
|
4
|
+
|
5
|
+
module Flydata
|
6
|
+
module SourceMysql
|
7
|
+
|
8
|
+
class SyncGenerateTableDdl < Source::SyncGenerateTableDdl
|
9
|
+
def run_compatibility_check
|
10
|
+
MysqlCompatibilityCheck.new(dp, de['mysql_data_entry_preference']).check
|
11
|
+
if `which mysqldump`.empty?
|
12
|
+
raise "mysqldump is not installed. mysqldump is required to run the command"
|
13
|
+
end
|
14
|
+
%w(host username database).each do |conf_name|
|
15
|
+
raise "MySQL `#{conf_name}` is neither defined in the data entry nor the local config file" if de['mysql_data_entry_preference'][conf_name].to_s.empty?
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def generate_flydata_tabledef(tables, options)
|
20
|
+
mp = de['mysql_data_entry_preference']
|
21
|
+
options = options.merge(mp)
|
22
|
+
flydata_tabledefs = []
|
23
|
+
error_list = []
|
24
|
+
missing_tables = FlydataCore::Mysql::CommandGenerator.each_mysql_tabledef(tables, options) do |mysql_tabledef, error|
|
25
|
+
if error
|
26
|
+
error_list << error.err_hash
|
27
|
+
next
|
28
|
+
end
|
29
|
+
flydata_tabledefs << mysql_tabledef.to_flydata_tabledef
|
30
|
+
end
|
31
|
+
if missing_tables
|
32
|
+
missing_tables.each {|missing_table| error_list << { error: 'table does not exist in the MySQL database', table: missing_table } }
|
33
|
+
end
|
34
|
+
|
35
|
+
[flydata_tabledefs, error_list]
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|