mysql_import 0.1.0 → 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 +4 -4
- data/lib/mysql_import/logger.rb +63 -15
- data/lib/mysql_import/version.rb +1 -1
- data/lib/mysql_import.rb +21 -12
- data/mysql_import.gemspec +2 -2
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6db72f5a5672da5ee918069f82585950e325cb47
|
4
|
+
data.tar.gz: a5db440198b9b79f3c2fb497abf2dc89c0ebbb6d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f7d95ea5b111c74d41bf02551dd76d7b522a9dc611093452ef6dd64621cb8960a7902578c29738396d35f996a26cdd1a7bdd8cb6929615106e738cb62f25a462
|
7
|
+
data.tar.gz: fea69a70e010fc80136200dd814903892b367a415a6c5298afebe8b2d0eafb4370462782df042b4b59fba4c4dbb9c9fd40bf89d7d12128463bce32fb5baf914a
|
data/lib/mysql_import/logger.rb
CHANGED
@@ -1,23 +1,71 @@
|
|
1
1
|
require 'logger'
|
2
2
|
|
3
|
-
class MysqlImport
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
3
|
+
class MysqlImport
|
4
|
+
class Logger < SimpleDelegator
|
5
|
+
def initialize(logger, debug)
|
6
|
+
case logger
|
7
|
+
when String
|
8
|
+
obj = ::Logger.new(arg)
|
9
|
+
when NilClass
|
10
|
+
obj = ::Logger.new(STDOUT)
|
11
|
+
obj.formatter = ->(seveity, datetime, progname, message) { "#{String === message ? message : message.inspect}\n" }
|
12
|
+
when FalseClass
|
13
|
+
obj = ::Logger.new('/dev/null')
|
14
|
+
else
|
15
|
+
obj = logger
|
16
|
+
end
|
17
|
+
|
18
|
+
obj.level = debug ? ::Logger::DEBUG : ::Logger::INFO
|
19
|
+
__setobj__(obj)
|
15
20
|
end
|
21
|
+
end
|
22
|
+
|
23
|
+
module Logging
|
24
|
+
def initialize(config, opts ={}, sql_opts = {})
|
25
|
+
@logger = Logger.new(opts[:log], opts.fetch(:debug, false))
|
16
26
|
|
17
|
-
|
18
|
-
|
27
|
+
LoadDataInfile2::Client.class_exec(@logger) do |logger|
|
28
|
+
define_method :build_sql_with_logging do |file, options|
|
29
|
+
options = {} unless options
|
30
|
+
build_sql_without_logging(file, options).tap {|sql| logger.debug("sql: #{sql}") }
|
31
|
+
end
|
32
|
+
alias_method :build_sql_without_logging, :build_sql
|
33
|
+
alias_method :build_sql, :build_sql_with_logging
|
34
|
+
end
|
35
|
+
|
36
|
+
super
|
19
37
|
end
|
20
38
|
|
21
|
-
|
39
|
+
def import(*filters)
|
40
|
+
super
|
41
|
+
ensure
|
42
|
+
logger.info('Imported tables:')
|
43
|
+
if result.imported.size > 0
|
44
|
+
result.imported.sort.each {|t| logger.info(" #{t[0]} (#{t[1]} sec)") }
|
45
|
+
else
|
46
|
+
result.logger.info(' nothing...')
|
47
|
+
end
|
48
|
+
if result.skipped.size > 0
|
49
|
+
logger.info('Skipped tables:')
|
50
|
+
result.skipped.sort.each {|t| logger.info(" #{t}") }
|
51
|
+
end
|
52
|
+
|
53
|
+
result.clear
|
54
|
+
end
|
55
|
+
|
56
|
+
private
|
57
|
+
|
58
|
+
attr_reader :logger
|
59
|
+
|
60
|
+
def parallel_opts
|
61
|
+
@_parallel_opts ||= super.merge(
|
62
|
+
finish: proc do |item, index, _result|
|
63
|
+
logger.debug("parallel_item: #{item.inspect}")
|
64
|
+
logger.debug("parallel_index: #{index}")
|
65
|
+
end
|
66
|
+
)
|
67
|
+
end
|
22
68
|
end
|
69
|
+
|
70
|
+
prepend Logging
|
23
71
|
end
|
data/lib/mysql_import/version.rb
CHANGED
data/lib/mysql_import.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'mysql_import/version'
|
2
|
+
require 'mysql_import/logger'
|
2
3
|
require 'load_data_infile2'
|
3
4
|
require 'connection_pool'
|
4
5
|
require 'parallel'
|
@@ -8,7 +9,7 @@ class MysqlImport
|
|
8
9
|
@stash = []
|
9
10
|
@fileters = []
|
10
11
|
@concurrency = opts.has_key?(:concurrency) ? opts[:concurrency].to_i : 2
|
11
|
-
pool = concurrency
|
12
|
+
pool = concurrency.zero? ? 1 : concurrency
|
12
13
|
|
13
14
|
@client = ConnectionPool.new(size: pool) { LoadDataInfile2::Client.new(config, sql_opts) }
|
14
15
|
@result = Result.new
|
@@ -19,7 +20,7 @@ class MysqlImport
|
|
19
20
|
end
|
20
21
|
|
21
22
|
def import(*filters)
|
22
|
-
Parallel.each(filtered_list(filters),
|
23
|
+
Parallel.each(filtered_list(filters), parallel_opts) do |args|
|
23
24
|
client.with do |cli|
|
24
25
|
run_import(cli, *args)
|
25
26
|
end
|
@@ -37,7 +38,13 @@ class MysqlImport
|
|
37
38
|
stash.map{|row| row if regexps.any?{|r| r.match(row[0]) } }.compact
|
38
39
|
end
|
39
40
|
|
41
|
+
def parallel_opts
|
42
|
+
{ in_threads: concurrency }
|
43
|
+
end
|
44
|
+
|
40
45
|
def run_import(cli, fpath, opts)
|
46
|
+
t = Time.now
|
47
|
+
|
41
48
|
before = opts.delete(:before)
|
42
49
|
after = opts.delete(:after)
|
43
50
|
table = opts[:table] || File.basename(fpath, '.*')
|
@@ -51,29 +58,26 @@ class MysqlImport
|
|
51
58
|
end
|
52
59
|
end
|
53
60
|
|
54
|
-
|
55
|
-
result.add(:imported, table)
|
61
|
+
cli.import(fpath, opts)
|
56
62
|
|
57
63
|
if after
|
58
64
|
begin
|
59
|
-
run_action(after, cli
|
65
|
+
run_action(after, cli)
|
60
66
|
rescue Break
|
61
67
|
end
|
62
68
|
end
|
69
|
+
|
70
|
+
result.add(:imported, [table, (Time.now - t)])
|
63
71
|
end
|
64
72
|
|
65
|
-
def run_action(action, cli
|
73
|
+
def run_action(action, cli)
|
66
74
|
case action
|
67
75
|
when Array
|
68
|
-
action.
|
76
|
+
action.each { |act| run_action(act, cli) }
|
69
77
|
when String
|
70
78
|
cli.query(action)
|
71
79
|
else
|
72
|
-
|
73
|
-
action.call(cli, res)
|
74
|
-
else
|
75
|
-
action.call(cli)
|
76
|
-
end
|
80
|
+
action.call(cli)
|
77
81
|
end
|
78
82
|
end
|
79
83
|
|
@@ -93,6 +97,11 @@ class MysqlImport
|
|
93
97
|
def add(meth, res)
|
94
98
|
mutex.synchronize { __send__(meth).push(res) }
|
95
99
|
end
|
100
|
+
|
101
|
+
def clear
|
102
|
+
imported.clear
|
103
|
+
skipped.clear
|
104
|
+
end
|
96
105
|
end
|
97
106
|
|
98
107
|
class Break < StandardError; end
|
data/mysql_import.gemspec
CHANGED
@@ -8,8 +8,8 @@ Gem::Specification.new do |spec|
|
|
8
8
|
spec.authors = ['nalabjp']
|
9
9
|
spec.email = ['nalabjp@gmail.com']
|
10
10
|
|
11
|
-
spec.summary = '
|
12
|
-
spec.description = '
|
11
|
+
spec.summary = 'Simple concurrent importer for MySQL'
|
12
|
+
spec.description = 'Simple concurrent importer for MySQL'
|
13
13
|
spec.homepage = 'https://github.com/nalabjp/mysql_import'
|
14
14
|
spec.license = 'MIT'
|
15
15
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mysql_import
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- nalabjp
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-07-
|
11
|
+
date: 2016-07-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: load_data_infile2
|
@@ -94,7 +94,7 @@ dependencies:
|
|
94
94
|
- - ">="
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0'
|
97
|
-
description:
|
97
|
+
description: Simple concurrent importer for MySQL
|
98
98
|
email:
|
99
99
|
- nalabjp@gmail.com
|
100
100
|
executables: []
|
@@ -137,6 +137,6 @@ rubyforge_project:
|
|
137
137
|
rubygems_version: 2.5.1
|
138
138
|
signing_key:
|
139
139
|
specification_version: 4
|
140
|
-
summary:
|
140
|
+
summary: Simple concurrent importer for MySQL
|
141
141
|
test_files: []
|
142
142
|
has_rdoc:
|