gamma 0.1.7 → 0.2.0

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
- SHA1:
3
- metadata.gz: eddbdd518cc437aa37849d0d87ec4e9f6fdc726d
4
- data.tar.gz: 8d6f3c05fffb45b7cc622f113e51e3f53a451024
2
+ SHA256:
3
+ metadata.gz: 7d404140fc674781a746207fd1aac842168089729524c03862731dc4ac1c3be6
4
+ data.tar.gz: 98314431134675ac63c19e594d2a8175a7c69b1adf3f16fbb2da5f4666a00aa7
5
5
  SHA512:
6
- metadata.gz: ca6074f5e1871af0db1bf377a7fe435f1c26f51de1524961cfe7a9a7fef2f83b98348afb281c96a368c1e850cfd9dc2bb68620ce74b895ccee1635ec419d93f3
7
- data.tar.gz: bf5ed88d704f86f870a97a5e70bbfc38b85a1fe5a8cc9a6c4d0a8d7603421301cb9d32018386dbbe27523eb673ca686b92f17e98732b86f52ae342a64ac95764
6
+ metadata.gz: 244af3cecb957aed2f8aa8c6ad5a1dcb3a5d0a320cb17805e327622476092bc94334e91d2518dc4008a6100bd0aa40f299b2983766bf9f8ae3314144533ef5fc
7
+ data.tar.gz: daa2b883c86cb2a452e1331bb911f9963f8d9c28096ec71d4b8e7b8c9103b007e2bb0836773a27f8ab821fdfa99a8866e1bb093de53bb8d0a9e2006f89f64cfe
data/Gemfile.lock CHANGED
@@ -1,46 +1,46 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- gamma (0.1.7)
4
+ gamma (0.2.0)
5
5
  activesupport
6
6
  colorize (~> 0.8.1)
7
7
  mysql2
8
+ parallel
8
9
  thor (~> 0.20)
9
10
 
10
11
  GEM
11
12
  remote: https://rubygems.org/
12
13
  specs:
13
- activesupport (5.1.5)
14
+ activesupport (7.0.3.1)
14
15
  concurrent-ruby (~> 1.0, >= 1.0.2)
15
- i18n (~> 0.7)
16
- minitest (~> 5.1)
17
- tzinfo (~> 1.1)
18
- coderay (1.1.2)
16
+ i18n (>= 1.6, < 2)
17
+ minitest (>= 5.1)
18
+ tzinfo (~> 2.0)
19
+ coderay (1.1.3)
19
20
  colorize (0.8.1)
20
- concurrent-ruby (1.0.5)
21
- i18n (0.9.5)
21
+ concurrent-ruby (1.1.10)
22
+ i18n (1.12.0)
22
23
  concurrent-ruby (~> 1.0)
23
- method_source (0.9.0)
24
- minitest (5.11.3)
25
- mysql2 (0.4.10)
26
- pry (0.11.3)
27
- coderay (~> 1.1.0)
28
- method_source (~> 0.9.0)
24
+ method_source (1.0.0)
25
+ minitest (5.16.2)
26
+ mysql2 (0.5.4)
27
+ parallel (1.22.1)
28
+ pry (0.14.1)
29
+ coderay (~> 1.1)
30
+ method_source (~> 1.0)
29
31
  rake (10.5.0)
30
- thor (0.20.0)
31
- thread_safe (0.3.6)
32
- tzinfo (1.2.5)
33
- thread_safe (~> 0.1)
32
+ thor (0.20.3)
33
+ tzinfo (2.0.5)
34
+ concurrent-ruby (~> 1.0)
34
35
 
35
36
  PLATFORMS
36
- ruby
37
+ arm64-darwin-21
37
38
 
38
39
  DEPENDENCIES
39
- bundler (~> 1.16)
40
40
  gamma!
41
41
  minitest (~> 5.0)
42
42
  pry
43
43
  rake (~> 10.0)
44
44
 
45
45
  BUNDLED WITH
46
- 1.16.1
46
+ 2.2.32
data/gamma.gemspec CHANGED
@@ -1,35 +1,34 @@
1
-
2
- lib = File.expand_path("../lib", __FILE__)
1
+ lib = File.expand_path('lib', __dir__)
3
2
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require "gamma/version"
3
+ require 'gamma/version'
5
4
 
6
5
  Gem::Specification.new do |spec|
7
- spec.name = "gamma"
6
+ spec.name = 'gamma'
8
7
  spec.version = Gamma::VERSION
9
- spec.authors = ["Shinsuke Nishio"]
10
- spec.email = ["nishio@densan-labs.net"]
8
+ spec.authors = ['Shinsuke Nishio']
9
+ spec.email = ['nishio@densan-labs.net']
11
10
 
12
- spec.summary = %q{DBSync}
13
- spec.description = %q{DBSync}
14
- spec.homepage = "https://github.com/nishio-dens/gamma"
15
- spec.license = "MIT"
11
+ spec.summary = 'DBSync'
12
+ spec.description = 'DBSync'
13
+ spec.homepage = 'https://github.com/nishio-dens/gamma'
14
+ spec.license = 'MIT'
16
15
 
17
16
  spec.files = `git ls-files -z`.split("\x0").reject do |f|
18
17
  f.match(%r{^(test|spec|features)/})
19
18
  end
20
- spec.bindir = "exe"
19
+ spec.bindir = 'exe'
21
20
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
22
- spec.require_paths = ["lib"]
21
+ spec.require_paths = ['lib']
23
22
 
24
- spec.add_dependency "mysql2"
25
- spec.add_dependency "activesupport"
26
- spec.add_dependency "thor", "~> 0.20"
27
- spec.add_dependency "colorize", "~> 0.8.1"
23
+ spec.add_dependency 'activesupport'
24
+ spec.add_dependency 'colorize', '~> 0.8.1'
25
+ spec.add_dependency 'mysql2'
26
+ spec.add_dependency 'parallel'
27
+ spec.add_dependency 'thor', '~> 0.20'
28
28
 
29
- spec.required_ruby_version = ">= 2.3.0"
29
+ spec.required_ruby_version = '>= 2.3.0'
30
30
 
31
- spec.add_development_dependency "bundler", "~> 1.16"
32
- spec.add_development_dependency "rake", "~> 10.0"
33
- spec.add_development_dependency "minitest", "~> 5.0"
34
- spec.add_development_dependency "pry"
31
+ spec.add_development_dependency 'minitest', '~> 5.0'
32
+ spec.add_development_dependency 'pry'
33
+ spec.add_development_dependency 'rake', '~> 10.0'
35
34
  end
@@ -1,11 +1,13 @@
1
+ require 'parallel'
2
+
1
3
  class Gamma::Command::Apply < Gamma::Command
2
4
  def initialize(opts)
3
5
  @database_settings = Gamma::DatabaseSettings.new(opts[:settings])
4
6
  # TODO: support postgres adapter
5
7
  @in_client = Gamma::DatabaseConnector::MysqlConnector.new(@database_settings.in_database)
6
8
  @out_client = Gamma::DatabaseConnector::MysqlConnector.new(@database_settings.out_database)
7
- @hook_root_dir = opts[:hook_dir] || "."
8
- @syncdb = Gamma::SyncDatabase.new(opts[:sync_history] || "./history.json")
9
+ @hook_root_dir = opts[:hook_dir] || '.'
10
+ @syncdb = Gamma::SyncDatabase.new(opts[:sync_history] || './history.json')
9
11
  @data_parser = Gamma::Parser::DataParser.new(opts[:data], @hook_root_dir, @in_client, @out_client, apply: true)
10
12
  end
11
13
 
@@ -13,15 +15,23 @@ class Gamma::Command::Apply < Gamma::Command
13
15
  tables = @data_parser.gamma_tables
14
16
  output_setting_warning(tables)
15
17
 
16
- tables.each do |t|
18
+ sync = lambda do |t|
17
19
  logger.info("[#{t.sync_mode}] Sync Start #{t.table_name}".green)
18
20
 
19
21
  case t.sync_mode
20
- when "replace"
22
+ when 'replace'
21
23
  Gamma::Importer::Replace.new(@in_client, @out_client, t, apply: true).execute
24
+ when 'force_replace'
25
+ Gamma::Importer::Replace.new(@in_client, @out_client, t, apply: true, ignore_error: true).execute
22
26
  else
23
27
  logger.info("[#{t.sync_mode}] Sync Failed #{t.table_name}. Unknown Sync mode".red)
24
28
  end
25
29
  end
30
+
31
+ if ENV['PARALLEL_COUNT']
32
+ Parallel.each(tables, in_processes: ENV['PARALLEL_COUNT'].to_i) { |t| sync.call(t) }
33
+ else
34
+ tables.each { |t| sync.call(t) }
35
+ end
26
36
  end
27
37
  end
@@ -19,6 +19,8 @@ class Gamma::Command::Dryrun < Gamma::Command
19
19
  case t.sync_mode
20
20
  when "replace"
21
21
  Gamma::Importer::Replace.new(@in_client, @out_client, t).execute
22
+ when "force_replace"
23
+ Gamma::Importer::Replace.new(@in_client, @out_client, t, ignore_error: true).execute
22
24
  else
23
25
  logger.info("[#{t.sync_mode}] Sync Failed #{t.table_name}. Unknown Sync mode".red)
24
26
  end
@@ -1,11 +1,12 @@
1
1
  class Gamma::Importer::Replace < Gamma::Importer
2
2
  BATCH_SIZE = 1000
3
3
 
4
- def initialize(in_client, out_client, table, apply: false)
4
+ def initialize(in_client, out_client, table, apply: false, ignore_error: false)
5
5
  @in_client = in_client
6
6
  @out_client = out_client
7
7
  @table = table
8
8
  @apply = apply
9
+ @ignore_error = ignore_error
9
10
  end
10
11
 
11
12
  def execute
@@ -19,22 +20,26 @@ class Gamma::Importer::Replace < Gamma::Importer
19
20
 
20
21
  def batch_sync
21
22
  columns = @table.in_exist_columns & @table.out_exist_columns
22
- primary_key = "id" # TODO: Fixme
23
+ primary_key = 'id' # TODO: Fixme
23
24
 
24
25
  current_in_pid = 0
25
- while true do
26
- select_columns = columns.map { |c| "`#{c}`" }.join(",")
26
+ while true
27
+ select_columns = columns.map { |c| "`#{c}`" }.join(',')
27
28
  break unless select_columns.present?
28
29
 
29
30
  in_query = "SELECT #{select_columns} FROM #{@table.table_name} WHERE #{primary_key} > #{current_in_pid} ORDER BY #{primary_key} ASC LIMIT #{BATCH_SIZE}"
30
- logger.info(in_query) if ENV["DEBUG"]
31
+ logger.info(in_query) if ENV['DEBUG']
31
32
  in_records = @in_client.client.query(in_query).to_a
32
33
 
33
34
  break unless in_records.present?
34
35
 
35
36
  out_records = exist_records(select_columns, primary_key, in_records.map { |v| v[primary_key] })
36
37
 
37
- in_records.map { |ir| [ir, out_records.find { |v| ir[primary_key] == v[primary_key] }] }.each do |in_record, out_record|
38
+ in_records.map do |ir|
39
+ [ir, out_records.find do |v|
40
+ ir[primary_key] == v[primary_key]
41
+ end]
42
+ end.each do |in_record, out_record|
38
43
  if out_record.present?
39
44
  update_out_record(in_record, out_record, primary_key)
40
45
  else
@@ -44,14 +49,14 @@ class Gamma::Importer::Replace < Gamma::Importer
44
49
 
45
50
  current_in_pid = in_records.last[primary_key]
46
51
  end
47
- rescue => e
52
+ rescue StandardError => e
48
53
  logger.error("Sync Error #{@table.table_name} \n #{e}\n #{e.backtrace.join("\n")}".red)
49
54
  end
50
55
 
51
56
  def exist_records(select_columns, primary_key, in_pids)
52
57
  return [] unless in_pids.present?
53
58
 
54
- query = "SELECT #{select_columns} FROM #{@table.table_name} WHERE #{primary_key} in (#{in_pids.join(",")})"
59
+ query = "SELECT #{select_columns} FROM #{@table.table_name} WHERE #{primary_key} in (#{in_pids.join(',')})"
55
60
  @out_client.client.query(query).to_a
56
61
  end
57
62
 
@@ -67,10 +72,10 @@ class Gamma::Importer::Replace < Gamma::Importer
67
72
  UPDATE `#{@table.table_name}` SET #{values} WHERE #{primary_key} = #{record[primary_key]}
68
73
  EOS
69
74
  query = query.strip_heredoc
70
- logger.info(query) if ENV["DEBUG"]
75
+ logger.info(query) if ENV['DEBUG']
71
76
 
72
77
  if @apply
73
- @out_client.client.query(query)
78
+ exec_query(query)
74
79
  else
75
80
  logger.info("DRYRUN: #{query}")
76
81
  end
@@ -80,17 +85,17 @@ class Gamma::Importer::Replace < Gamma::Importer
80
85
  def insert_out_record(in_record)
81
86
  record = @table.record_value(in_record)
82
87
  columns = (@table.in_exist_columns & @table.out_exist_columns).reject { |c| record[c].nil? }
83
- select_columns = columns.map { |c| "`#{c}`" }.join(",")
88
+ select_columns = columns.map { |c| "`#{c}`" }.join(',')
84
89
  values = insert_record_values(record, columns)
85
90
 
86
91
  query = <<-EOS
87
92
  INSERT INTO #{@table.table_name}(#{select_columns}) VALUES (#{values})
88
93
  EOS
89
94
  query = query.strip_heredoc
90
- logger.info(query) if ENV["DEBUG"]
95
+ logger.info(query) if ENV['DEBUG']
91
96
 
92
97
  if @apply
93
- @out_client.client.query(query)
98
+ exec_query(query)
94
99
  else
95
100
  logger.info("DRYRUN: #{query}")
96
101
  end
@@ -100,23 +105,34 @@ class Gamma::Importer::Replace < Gamma::Importer
100
105
  r = record
101
106
  columns.map do |v|
102
107
  c = if r[v].is_a?(Time)
103
- r[v].strftime("%Y-%m-%d %H:%M:%S")
108
+ r[v].strftime('%Y-%m-%d %H:%M:%S')
104
109
  else
105
110
  r[v]
106
111
  end
107
- "\"#{c.to_s.gsub('"', '\"').gsub("'", "\'")}\""
108
- end.join(",")
112
+ "\"#{@out_client.client.escape(c.to_s)}\""
113
+ end.join(',')
109
114
  end
110
115
 
111
116
  def update_record_values(record, columns)
112
117
  r = record
113
118
  columns.map do |v|
114
119
  c = if r[v].is_a?(Time)
115
- r[v].strftime("%Y-%m-%d %H:%M:%S")
120
+ r[v].strftime('%Y-%m-%d %H:%M:%S')
116
121
  else
117
122
  r[v]
118
123
  end
119
- "`#{v}` = \"#{c.to_s.gsub('"', '\"').gsub("'", "\'")}\""
120
- end.join(",")
124
+ "`#{v}` = \"#{@out_client.client.escape(c.to_s)}\""
125
+ end.join(',')
126
+ end
127
+
128
+ def exec_query(query)
129
+ @out_client.client.query(query)
130
+ rescue StandardError => e
131
+ if @ignore_error
132
+ logger.error('An ERROR has occurred and ignore it.')
133
+ logger.error(e)
134
+ else
135
+ throw e
136
+ end
121
137
  end
122
138
  end
data/lib/gamma/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Gamma
2
- VERSION = "0.1.7"
2
+ VERSION = '0.2.0'
3
3
  end
metadata CHANGED
@@ -1,29 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gamma
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.7
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shinsuke Nishio
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-03-09 00:00:00.000000000 Z
11
+ date: 2022-07-22 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: mysql2
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ">="
18
- - !ruby/object:Gem::Version
19
- version: '0'
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - ">="
25
- - !ruby/object:Gem::Version
26
- version: '0'
27
13
  - !ruby/object:Gem::Dependency
28
14
  name: activesupport
29
15
  requirement: !ruby/object:Gem::Requirement
@@ -39,61 +25,61 @@ dependencies:
39
25
  - !ruby/object:Gem::Version
40
26
  version: '0'
41
27
  - !ruby/object:Gem::Dependency
42
- name: thor
28
+ name: colorize
43
29
  requirement: !ruby/object:Gem::Requirement
44
30
  requirements:
45
31
  - - "~>"
46
32
  - !ruby/object:Gem::Version
47
- version: '0.20'
33
+ version: 0.8.1
48
34
  type: :runtime
49
35
  prerelease: false
50
36
  version_requirements: !ruby/object:Gem::Requirement
51
37
  requirements:
52
38
  - - "~>"
53
39
  - !ruby/object:Gem::Version
54
- version: '0.20'
40
+ version: 0.8.1
55
41
  - !ruby/object:Gem::Dependency
56
- name: colorize
42
+ name: mysql2
57
43
  requirement: !ruby/object:Gem::Requirement
58
44
  requirements:
59
- - - "~>"
45
+ - - ">="
60
46
  - !ruby/object:Gem::Version
61
- version: 0.8.1
47
+ version: '0'
62
48
  type: :runtime
63
49
  prerelease: false
64
50
  version_requirements: !ruby/object:Gem::Requirement
65
51
  requirements:
66
- - - "~>"
52
+ - - ">="
67
53
  - !ruby/object:Gem::Version
68
- version: 0.8.1
54
+ version: '0'
69
55
  - !ruby/object:Gem::Dependency
70
- name: bundler
56
+ name: parallel
71
57
  requirement: !ruby/object:Gem::Requirement
72
58
  requirements:
73
- - - "~>"
59
+ - - ">="
74
60
  - !ruby/object:Gem::Version
75
- version: '1.16'
76
- type: :development
61
+ version: '0'
62
+ type: :runtime
77
63
  prerelease: false
78
64
  version_requirements: !ruby/object:Gem::Requirement
79
65
  requirements:
80
- - - "~>"
66
+ - - ">="
81
67
  - !ruby/object:Gem::Version
82
- version: '1.16'
68
+ version: '0'
83
69
  - !ruby/object:Gem::Dependency
84
- name: rake
70
+ name: thor
85
71
  requirement: !ruby/object:Gem::Requirement
86
72
  requirements:
87
73
  - - "~>"
88
74
  - !ruby/object:Gem::Version
89
- version: '10.0'
90
- type: :development
75
+ version: '0.20'
76
+ type: :runtime
91
77
  prerelease: false
92
78
  version_requirements: !ruby/object:Gem::Requirement
93
79
  requirements:
94
80
  - - "~>"
95
81
  - !ruby/object:Gem::Version
96
- version: '10.0'
82
+ version: '0.20'
97
83
  - !ruby/object:Gem::Dependency
98
84
  name: minitest
99
85
  requirement: !ruby/object:Gem::Requirement
@@ -122,6 +108,20 @@ dependencies:
122
108
  - - ">="
123
109
  - !ruby/object:Gem::Version
124
110
  version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rake
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '10.0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '10.0'
125
125
  description: DBSync
126
126
  email:
127
127
  - nishio@densan-labs.net
@@ -164,7 +164,7 @@ homepage: https://github.com/nishio-dens/gamma
164
164
  licenses:
165
165
  - MIT
166
166
  metadata: {}
167
- post_install_message:
167
+ post_install_message:
168
168
  rdoc_options: []
169
169
  require_paths:
170
170
  - lib
@@ -179,9 +179,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
179
179
  - !ruby/object:Gem::Version
180
180
  version: '0'
181
181
  requirements: []
182
- rubyforge_project:
183
- rubygems_version: 2.6.8
184
- signing_key:
182
+ rubygems_version: 3.2.32
183
+ signing_key:
185
184
  specification_version: 4
186
185
  summary: DBSync
187
186
  test_files: []