flydata 0.5.4 → 0.5.5

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d35ee35146966b2d980eb979c3d36c23ce0c5d36
4
- data.tar.gz: 9789cbe06d27163a5afc8cfaf9c44a2bf9de495a
3
+ metadata.gz: 0882affb434c077a4d37f2127b7ca91aab356603
4
+ data.tar.gz: 83d402b1b492178d70a4bb6f71a2ada8c515e43e
5
5
  SHA512:
6
- metadata.gz: 4a7fc6bf22d826f3f7444b0ca85724576f517ded96ed56023a1497b2bc2e2e6e6cc1d561a899d01be0d55b7e1de7cba78aec158e7a78a125b588cd07b7e04479
7
- data.tar.gz: f2390bf2dd00890e0cb7e2948d5a7930a2266d3d87aecabe0119e20bb7c97ebe3d3cacf6a6f82348495a9374bd3652ce8fa248d17dda19178128ad68b4bf4dc4
6
+ metadata.gz: add50b1e166a42d338de4c386272e207bc4089b4ba746cdf52f961f8a344ecd0a676b6411bd0552239b6960d208d51bb9ac13f01448f85704a55a8805ec87104
7
+ data.tar.gz: 3028bb9b76675e98bf31eac4c6226ceb1abd001f019fa5702403632d29310b79b7e1a7b3f21a5e5bf71146ef3a778dfa62efe9db47c6f792f2552d505245bf44
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.5.4
1
+ 0.5.5
@@ -193,7 +193,7 @@ EOS
193
193
 
194
194
  case redshift_type
195
195
  when 'timestamp'
196
- if default_value.upcase == "CURRENT_TIMESTAMP"
196
+ if /^CURRENT_TIMESTAMP/ === default_value.upcase
197
197
  'SYSDATE'
198
198
  else
199
199
  "'#{self.parse_timestamp(remove_single_quote(default_value))}'"
@@ -334,6 +334,12 @@ EOT
334
334
  it_behaves_like *examples
335
335
  end
336
336
 
337
+ context 'when default_value is CURRENT_TIMESTAMP(6)' do
338
+ let(:default_value) { 'CURRENT_TIMESTAMP(6)' }
339
+ let(:default_value_sql) { "SYSDATE" }
340
+ it_behaves_like *examples
341
+ end
342
+
337
343
  context 'when default_value is 0000-00-00 00:00:00' do
338
344
  let(:default_value) { "'0000-00-00 00:00:00'" }
339
345
  let(:default_value_sql) { "'0001-01-01 00:00:00.000000'" }
@@ -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.5.4 ruby lib
5
+ # stub: flydata 0.5.5 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "flydata"
9
- s.version = "0.5.4"
9
+ s.version = "0.5.5"
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 = "2015-09-08"
14
+ s.date = "2015-09-11"
15
15
  s.description = "FlyData Agent"
16
16
  s.email = "sysadmin@flydata.com"
17
17
  s.executables = ["fdmysqldump", "flydata", "serverinfo"]
@@ -101,6 +101,7 @@ Gem::Specification.new do |s|
101
101
  "lib/flydata/command/conf.rb",
102
102
  "lib/flydata/command/crontab.rb",
103
103
  "lib/flydata/command/encrypt.rb",
104
+ "lib/flydata/command/exclusive_runnable.rb",
104
105
  "lib/flydata/command/helper.rb",
105
106
  "lib/flydata/command/kill_all.rb",
106
107
  "lib/flydata/command/login.rb",
@@ -174,6 +175,7 @@ Gem::Specification.new do |s|
174
175
  "spec/flydata/command/conf_spec.rb",
175
176
  "spec/flydata/command/crontab_spec.rb",
176
177
  "spec/flydata/command/encrypt_spec.rb",
178
+ "spec/flydata/command/exclusive_runnable_spec.rb",
177
179
  "spec/flydata/command/helper_spec.rb",
178
180
  "spec/flydata/command/kill_all_spec.rb",
179
181
  "spec/flydata/command/login_spec.rb",
@@ -1,6 +1,7 @@
1
1
  require 'slop'
2
2
  require 'flydata/api_client'
3
3
  require 'flydata/command_loggable'
4
+ require 'flydata/command/exclusive_runnable'
4
5
  require 'flydata/preference/data_entry_preference'
5
6
 
6
7
 
@@ -8,6 +9,9 @@ module Flydata
8
9
  module Command
9
10
  class Base
10
11
  include CommandLoggable
12
+ include ExclusiveRunnable
13
+
14
+ self.exclusive_run_home = FLYDATA_HOME
11
15
 
12
16
  def initialize(options = Slop.new)
13
17
  @api_client = ApiClient.instance
@@ -0,0 +1,74 @@
1
+ require 'json'
2
+
3
+ module Flydata
4
+ module Command
5
+
6
+ module ExclusiveRunnable
7
+ def self.included base
8
+ base.extend ClassMethods
9
+
10
+ base.class_variable_set(:@@exclusive_run_home, ENV['HOME'])
11
+ end
12
+
13
+ module ClassMethods
14
+ def run_exclusive(method, options = {})
15
+ saved_method = :"__#{method}"
16
+ alias_method saved_method, method
17
+
18
+ define_method(method) do |*args|
19
+ result = nil
20
+ exclusive_run_info = nil
21
+ begin
22
+ info = self.class.load_exclusive_run_info
23
+ if info
24
+ raise "Command `#{info['command']}` is already running. Wait until the command completes or stop the command. (pid:#{info['pid']})"
25
+ end
26
+ exclusive_run_info = { command: self.class.command(method, options), pid: Process.pid }
27
+ self.class.save_exclusive_run_info(exclusive_run_info)
28
+ result = send(saved_method, *args)
29
+ ensure
30
+ self.class.delete_exclusive_run_info if exclusive_run_info
31
+ end
32
+ result
33
+ end
34
+ end
35
+ def exclusive_run_home
36
+ @@exclusive_run_home
37
+ end
38
+ def exclusive_run_home=(value)
39
+ @@exclusive_run_home = value
40
+ end
41
+ def exclusive_run_info_path
42
+ File.join(exclusive_run_home, "exclusive_run.info")
43
+ end
44
+
45
+ def load_exclusive_run_info
46
+ path = exclusive_run_info_path
47
+ return nil unless File.exists?(path)
48
+
49
+ JSON.parse(File.open(path){|f| f.read})
50
+ end
51
+
52
+ def save_exclusive_run_info(info)
53
+ path = exclusive_run_info_path
54
+ File.open(path, "w"){|f| f.write(info.to_json)}
55
+ end
56
+
57
+ def delete_exclusive_run_info
58
+ path = exclusive_run_info_path
59
+ File.delete(path) if File.exists?(path)
60
+ end
61
+
62
+ def command(subcommand, options = {})
63
+ return options[:command] if options[:command]
64
+
65
+ modules = self.name.split('::')
66
+
67
+ cmd = modules.last.downcase
68
+ subcommand == :run ? cmd : "#{cmd}:#{subcommand}"
69
+ end
70
+ end
71
+ end
72
+
73
+ end
74
+ end
@@ -17,7 +17,8 @@ module Flydata
17
17
  log: nil,
18
18
  log_level: 'info',
19
19
  log_rotate_age: 10,
20
- log_rotate_size: 10*1024*1024
20
+ log_rotate_size: 4294967295 # Set 4GB For disabling log rotation
21
+ #log_rotate_size: 10*1024*1024
21
22
  }
22
23
 
23
24
  def self.slop_start
@@ -19,6 +19,7 @@ module Flydata
19
19
  helper.restart
20
20
  end
21
21
  end
22
+ run_exclusive :run
22
23
  end
23
24
  end
24
25
  end
@@ -21,6 +21,7 @@ module Flydata
21
21
  helper.start
22
22
  end
23
23
  end
24
+ run_exclusive :run
24
25
  end
25
26
  end
26
27
  end
@@ -18,6 +18,7 @@ module Flydata
18
18
  helper.stop
19
19
  end
20
20
  end
21
+ run_exclusive :run
21
22
  end
22
23
  end
23
24
  end
@@ -1,4 +1,3 @@
1
- require 'fiber'
2
1
  require 'msgpack'
3
2
  require 'mysql2'
4
3
  require 'rest_client'
@@ -23,6 +22,7 @@ module Flydata
23
22
 
24
23
  class Sync < Base
25
24
  include Helpers
25
+
26
26
  INSERT_PROGRESS_INTERVAL = 1000
27
27
  SERVER_DATA_PROCESSING_TIMEOUT = 3600 # seconds
28
28
 
@@ -101,6 +101,7 @@ module Flydata
101
101
  last_message = ALL_DONE_MESSAGE_TEMPLATE % [redshift_console_url, dashboard_url]
102
102
  log_info_stdout(last_message)
103
103
  end
104
+ run_exclusive :run
104
105
 
105
106
  # Public method
106
107
  # - Called from Sender#start/restart
@@ -136,6 +137,7 @@ EOS
136
137
  end
137
138
  log_info_stdout("Buffers have been flushed and the sender process has been stopped.")
138
139
  end
140
+ run_exclusive :flush
139
141
 
140
142
  # Command: flydata sync:reset
141
143
  # - Arguments
@@ -204,7 +206,7 @@ EOS
204
206
  sync_fm.table_rev_file_paths(*@input_tables),
205
207
  sync_fm.table_ddl_file_paths(*@input_tables)
206
208
  ]
207
- new_tables_after_reset = @new_tables + @input_tables
209
+ new_tables_after_reset = @unsynced_tables + @input_tables
208
210
  if @input_tables.empty? or @full_tables.empty? or @full_tables.all?{|ft| new_tables_after_reset.include?(ft)}
209
211
  delete_files << sync_fm.binlog_path
210
212
  delete_files << sync_fm.sent_binlog_path
@@ -215,6 +217,7 @@ EOS
215
217
  sync_fm.close
216
218
  log_info_stdout("Reset completed successfully.")
217
219
  end
220
+ run_exclusive :reset
218
221
 
219
222
  # Depricated Command: flydata sync:skip
220
223
  # skip initial sync
@@ -228,6 +231,7 @@ EOS
228
231
  log_info_stdout("-> #{binlog_path}")
229
232
  log_info_stdout("Run 'flydata start' to start continuous sync.")
230
233
  end
234
+ run_exclusive :skip
231
235
 
232
236
  # Command: flydata sync:generate_table_ddl
233
237
  # - Arguments
@@ -249,10 +253,11 @@ EOS
249
253
  Flydata::MysqlCompatibilityCheck.new(dp, de['mysql_data_entry_preference']).check
250
254
 
251
255
  # Set instance variables
252
- set_current_tables(tables, include_invalid_tables: true)
256
+ set_current_tables(tables, include_all_tables: true)
253
257
 
254
258
  do_generate_table_ddl(de)
255
259
  end
260
+ run_exclusive :generate_table_ddl
256
261
 
257
262
  # Command: flydata sync:fix_binlogpos
258
263
  # - Arguments
@@ -301,6 +306,7 @@ EOS
301
306
  sync_fm.save_binlog(new_binlog_info)
302
307
  log_info_stdout("Done!")
303
308
  end
309
+ run_exclusive :fix_binlogpos
304
310
 
305
311
  private
306
312
 
@@ -317,9 +323,9 @@ EOS
317
323
  # #initial_sync knows where to resume from.
318
324
  log_info_stdout("Resuming the initial sync...")
319
325
  initial_sync(de, options.merge(sync_resumed: true))
320
- elsif !@new_tables.empty?
326
+ elsif !@unsynced_tables.empty?
321
327
  show_purpose_name
322
- unsynced_table_message = "We've noticed that these tables have not been synced yet: #{@new_tables.join(", ")}\n"
328
+ unsynced_table_message = "We've noticed that these tables have not been synced yet: #{@unsynced_tables.join(", ")}\n"
323
329
  unless @ddl_tables.empty?
324
330
  unsynced_table_message <<
325
331
  " WARNING: We've noticed that at least one of these tables have not had their DDL generated yet.\n" +
@@ -847,7 +853,7 @@ EOM
847
853
  schema_name = (de['schema_name'] || nil)
848
854
  mp = de['mysql_data_entry_preference']
849
855
 
850
- tables = opts.all_tables? ? @full_tables : (@input_tables.empty? ? @new_tables : @input_tables)
856
+ tables = opts.all_tables? ? @full_tables : (@input_tables.empty? ? @unsynced_tables : @input_tables)
851
857
 
852
858
  raise "There are no valid unsynced tables, if you want to just get ddl for all tables, please run \`flydata sync:generate_table_ddl --all-tables\`" if tables.empty?
853
859
 
@@ -897,8 +903,7 @@ EOS
897
903
  end
898
904
  end
899
905
 
900
- fixed_tables = @invalid_tables & tables_without_error
901
- fixed_tables.each {|table| table_validity_hash[table] = nil }
906
+ tables_without_error.each {|table| table_validity_hash[table] = nil }
902
907
  flydata.data_entry.update_table_validity(de['id'], {updated_tables: table_validity_hash}) unless table_validity_hash.empty?
903
908
 
904
909
  sync_fm = create_sync_file_manager(de)
@@ -944,16 +949,17 @@ Thank you for using FlyData!
944
949
  sync_info = sync_fm.load_sync_info
945
950
  sync_resumed = options[:resume] && !!sync_info
946
951
 
947
- @invalid_tables = de['mysql_data_entry_preference']['invalid_tables'] # tables marked as invalid as a result of previous check
948
- @full_tables = options[:include_invalid_tables] ? de['mysql_data_entry_preference']['tables'] + @invalid_tables : de['mysql_data_entry_preference']['tables']
952
+ #full_tables will either include all tables including invalid tables or all valid tables that aren't new tables
953
+ @full_tables = options[:include_all_tables] ? de['mysql_data_entry_preference']['tables'] + de['mysql_data_entry_preference']['invalid_tables'] :
954
+ de['mysql_data_entry_preference']['tables'] - de['mysql_data_entry_preference']['new_tables']
949
955
 
950
- @new_tables = sync_fm.get_new_table_list(@full_tables, "pos")
956
+ @unsynced_tables = sync_fm.get_new_table_list(@full_tables, "pos") # Get list of tables that do not have a .pos file
951
957
  @ddl_tables = sync_fm.get_new_table_list(@full_tables, "generated_ddl")
952
958
 
953
959
  @input_tables = sync_resumed ? sync_info[:tables] : input_tables
954
960
  @input_tables ||= []
955
961
  @full_initial_sync = sync_resumed ? sync_info[:initial_sync] :
956
- (@new_tables == @full_tables)
962
+ (@unsynced_tables == @full_tables)
957
963
 
958
964
  sync_fm.close
959
965
 
@@ -980,7 +986,7 @@ Thank you for using FlyData!
980
986
  elsif !@input_tables.empty?
981
987
  @input_tables
982
988
  else
983
- @new_tables
989
+ @unsynced_tables
984
990
  end
985
991
  end
986
992
 
@@ -991,7 +997,7 @@ Thank you for using FlyData!
991
997
  elsif !@input_tables.empty?
992
998
  @input_tables
993
999
  else
994
- @new_tables
1000
+ @unsynced_tables
995
1001
  end
996
1002
  end
997
1003
 
@@ -1012,6 +1018,7 @@ Thank you for using FlyData!
1012
1018
  mp['tables'] = mp['tables'].split(",").uniq
1013
1019
  end
1014
1020
  mp['invalid_tables'] = mp['invalid_tables'].kind_of?(String) ? mp['invalid_tables'].split(",").uniq : []
1021
+ mp['new_tables'] = mp['new_tables'].kind_of?(String) ? mp['new_tables'].split(",").uniq : []
1015
1022
 
1016
1023
  unless mp['ssl_ca_content'].to_s.strip.empty?
1017
1024
  sync_fm = create_sync_file_manager(de)
@@ -0,0 +1,129 @@
1
+ require 'spec_helper'
2
+ require 'flydata/command/exclusive_runnable'
3
+
4
+ module Flydata
5
+ module Command
6
+
7
+ class Exclusiverunnabletest
8
+ include ExclusiveRunnable
9
+
10
+ def long_running_command
11
+ sleep 0.2
12
+ "result1"
13
+ end
14
+ run_exclusive :long_running_command
15
+
16
+ def normal_method_call
17
+ "result2"
18
+ end
19
+ run_exclusive :normal_method_call
20
+ end
21
+
22
+ describe Exclusiverunnabletest do
23
+ let(:subject_object) { described_class.new }
24
+
25
+ let(:file_path) { "/tmp" }
26
+ let(:lock_file) { File.join(file_path, 'exclusive_run.info') }
27
+ let(:lock_file_content) { { command: 'exclusiverunnabletest:long_running_command', pid: 234 } }
28
+
29
+ before do
30
+ described_class.exclusive_run_home = file_path
31
+ end
32
+
33
+ describe '#normal_method_call' do
34
+ subject { subject_object.normal_method_call }
35
+ it "runs the method body normally" do
36
+ is_expected.to eq "result2"
37
+ end
38
+
39
+ context "when a lock file already exists" do
40
+ before do
41
+ File.open(lock_file, "w") {|f| f.write(lock_file_content)}
42
+ end
43
+
44
+ it "does not delete the lock file" do
45
+ expect{ subject }.to raise_error
46
+
47
+ expect(File.exists?(lock_file)).to eq true
48
+ end
49
+
50
+ after do
51
+ File.delete(lock_file) if File.exists?(lock_file)
52
+ end
53
+ end
54
+ end
55
+
56
+ describe '#long_running_command' do
57
+ subject { subject_object.long_running_command }
58
+ context 'run alone' do
59
+ context "check while the command is running" do
60
+ it "creates a lock file" do
61
+ th = Thread.new{ subject }
62
+
63
+ sleep 0.1
64
+
65
+ expect(File.exists?(lock_file)).to eq true
66
+
67
+ th.join
68
+ end
69
+ end
70
+ context "check after the command is finished" do
71
+ it "creates a lock file but it's gone" do
72
+ th = Thread.new{ subject }
73
+
74
+ th.join
75
+
76
+ expect(File.exists?(lock_file)).to eq false
77
+ end
78
+ end
79
+ end
80
+
81
+ context 'run two commands concurrently' do
82
+ it "raises an error for the second command" do
83
+ th = Thread.new{ subject }
84
+ sleep 0.1
85
+ expect{ subject_object.normal_method_call }.to raise_exception(
86
+ /`exclusiverunnabletest:long_running_command` is already running\..*\(pid: *[0-9]+\)/)
87
+
88
+ th.join
89
+ end
90
+ end
91
+ context 'run two commands sequentially' do
92
+ it "runs both commands successfully" do
93
+ th = Thread.new{ subject }
94
+
95
+ th.join
96
+
97
+ expect( subject_object.normal_method_call ).to eq "result2"
98
+ end
99
+ end
100
+ end
101
+
102
+ describe '.command' do
103
+ subject { described_class.command(method_symbol, options) }
104
+
105
+ let(:options) { {} }
106
+ context 'with :run' do
107
+ let(:method_symbol) { :run }
108
+ it 'uses the class name as the command' do
109
+ is_expected.to eq "exclusiverunnabletest"
110
+ end
111
+ end
112
+ context 'with a method' do
113
+ let(:method_symbol) { :a_method }
114
+ it 'uses the class name and the method as the command ' do
115
+ is_expected.to eq "exclusiverunnabletest:a_method"
116
+ end
117
+ end
118
+ context 'with a :command option' do
119
+ let(:options) { { command: 'another_command' } }
120
+ let(:method_symbol) { :a_method }
121
+ it 'uses the command given as an option' do
122
+ is_expected.to eq "another_command"
123
+ end
124
+ end
125
+ end
126
+ end
127
+
128
+ end
129
+ end
@@ -33,8 +33,9 @@ module Flydata
33
33
  "data_port_key"=>"a458c641",
34
34
  "mysql_data_entry_preference" =>
35
35
  { "host"=>"localhost", "port"=>3306, "username"=>"masashi",
36
- "password"=>"welcome", "database"=>"sync_test", "tables"=>["table1", "table2"],
36
+ "password"=>"welcome", "database"=>"sync_test", "tables"=>["table1", "table2", "table4"],
37
37
  "invalid_tables"=>["table3"],
38
+ "new_tables"=>["table4"],
38
39
  "mysqldump_dir"=>default_mysqldump_dir, "forwarder" => "tcpforwarder",
39
40
  "data_servers"=>"localhost:9905" }
40
41
  }
@@ -91,8 +92,9 @@ module Flydata
91
92
  let (:db_byte) { 1 }
92
93
  let (:disk_byte) { 100 }
93
94
  before do
94
- expect(subject).to receive(:flydata).and_return(flydata)
95
+ expect(subject).to receive(:flydata).and_return(flydata).at_least(:once)
95
96
  expect(flydata).to receive(:data_port).and_return(dp)
97
+ allow(flydata).to receive(:data_entry).and_return(default_data_entry)
96
98
  expect(dp).to receive(:get).and_return(default_data_port)
97
99
  allow(File).to receive(:exists?).and_return(false)
98
100
  expect(default_sync_fm).to receive(:load_dump_pos).and_return(default_dump_pos)
@@ -110,7 +112,7 @@ module Flydata
110
112
  before do
111
113
  expect(default_sync_fm).to receive(:save_sync_info).once
112
114
  expect(subject).to receive(:free_disk_space).and_return(disk_byte)
113
- expect(File).to receive(:dirname)
115
+ expect(File).to receive(:dirname)
114
116
  end
115
117
  it 'will export to dump file' do
116
118
  expect(subject).to receive(:call_block_or_return_io)
@@ -140,7 +142,7 @@ module Flydata
140
142
  before do
141
143
  allow(subject).to receive(:data_entry).and_return(default_data_entry)
142
144
  allow_any_instance_of(Flydata::Api::DataEntry).to receive(:update_table_validity).and_return(true)
143
- subject.send(:set_current_tables, nil, include_invalid_tables: true)
145
+ subject.send(:set_current_tables, nil, include_all_tables: true)
144
146
  end
145
147
  shared_examples 'throws an error' do
146
148
  it "throws an error" do
@@ -152,7 +154,7 @@ module Flydata
152
154
  context 'with full options' do
153
155
  it 'issues mysqldump command with expected parameters' do
154
156
  expect(Open3).to receive(:popen3).with(
155
- 'mysqldump -h localhost -P 3306 -umasashi -p"welcome" --default-character-set=utf8 --protocol=tcp -d sync_test table1 table2 table3')
157
+ 'mysqldump -h localhost -P 3306 -umasashi -p"welcome" --default-character-set=utf8 --protocol=tcp -d sync_test table1 table2 table4 table3')
156
158
  subject.send(:do_generate_table_ddl, default_data_entry)
157
159
  end
158
160
  end
@@ -174,7 +176,7 @@ module Flydata
174
176
  end
175
177
  it "uses the default port" do
176
178
  expect(Open3).to receive(:popen3).with(
177
- 'mysqldump -h localhost -umasashi -p"welcome" --default-character-set=utf8 --protocol=tcp -d sync_test table1 table2 table3')
179
+ 'mysqldump -h localhost -umasashi -p"welcome" --default-character-set=utf8 --protocol=tcp -d sync_test table1 table2 table4 table3')
178
180
  subject.send(:do_generate_table_ddl, default_data_entry)
179
181
  end
180
182
  end
@@ -184,7 +186,7 @@ module Flydata
184
186
  end
185
187
  it "uses the specified port" do
186
188
  expect(Open3).to receive(:popen3).with(
187
- 'mysqldump -h localhost -P 1234 -umasashi -p"welcome" --default-character-set=utf8 --protocol=tcp -d sync_test table1 table2 table3')
189
+ 'mysqldump -h localhost -P 1234 -umasashi -p"welcome" --default-character-set=utf8 --protocol=tcp -d sync_test table1 table2 table4 table3')
188
190
  subject.send(:do_generate_table_ddl, default_data_entry)
189
191
  end
190
192
  end
@@ -206,7 +208,7 @@ module Flydata
206
208
  end
207
209
  it "call mysqldump without MYSQL_PW set" do
208
210
  expect(Open3).to receive(:popen3).with(
209
- 'mysqldump -h localhost -P 3306 -umasashi --default-character-set=utf8 --protocol=tcp -d sync_test table1 table2 table3')
211
+ 'mysqldump -h localhost -P 3306 -umasashi --default-character-set=utf8 --protocol=tcp -d sync_test table1 table2 table4 table3')
210
212
  subject.send(:do_generate_table_ddl, default_data_entry)
211
213
  end
212
214
  end
@@ -217,7 +219,7 @@ module Flydata
217
219
  end
218
220
  it "call mysqldump with MYSQL_PW set with correct symbols" do
219
221
  expect(Open3).to receive(:popen3).with(
220
- 'mysqldump -h localhost -P 3306 -umasashi -p"welcome&!@^@#^" --default-character-set=utf8 --protocol=tcp -d sync_test table1 table2 table3')
222
+ 'mysqldump -h localhost -P 3306 -umasashi -p"welcome&!@^@#^" --default-character-set=utf8 --protocol=tcp -d sync_test table1 table2 table4 table3')
221
223
  subject.send(:do_generate_table_ddl, default_data_entry)
222
224
  end
223
225
  end
@@ -238,8 +240,9 @@ module Flydata
238
240
  before do
239
241
  default_data_entry['mysql_data_entry_preference']['tables'] = []
240
242
  default_data_entry['mysql_data_entry_preference']['invalid_tables'] = []
243
+ default_data_entry['mysql_data_entry_preference']['new_tables'] = []
241
244
  allow(sync_cmd).to receive(:data_entry).and_return(default_data_entry)
242
- sync_cmd.send(:set_current_tables, nil, include_invalid_tables: true)
245
+ sync_cmd.send(:set_current_tables, nil, include_all_tables: true)
243
246
  end
244
247
  it 'should raise error' do
245
248
  expect{sync_cmd.send(:do_generate_table_ddl, default_data_entry)}.to raise_error
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.5.4
4
+ version: 0.5.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Koichi Fujikawa
@@ -12,7 +12,7 @@ authors:
12
12
  autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
- date: 2015-09-08 00:00:00.000000000 Z
15
+ date: 2015-09-11 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: rest-client
@@ -538,6 +538,7 @@ files:
538
538
  - lib/flydata/command/conf.rb
539
539
  - lib/flydata/command/crontab.rb
540
540
  - lib/flydata/command/encrypt.rb
541
+ - lib/flydata/command/exclusive_runnable.rb
541
542
  - lib/flydata/command/helper.rb
542
543
  - lib/flydata/command/kill_all.rb
543
544
  - lib/flydata/command/login.rb
@@ -611,6 +612,7 @@ files:
611
612
  - spec/flydata/command/conf_spec.rb
612
613
  - spec/flydata/command/crontab_spec.rb
613
614
  - spec/flydata/command/encrypt_spec.rb
615
+ - spec/flydata/command/exclusive_runnable_spec.rb
614
616
  - spec/flydata/command/helper_spec.rb
615
617
  - spec/flydata/command/kill_all_spec.rb
616
618
  - spec/flydata/command/login_spec.rb