tapsoob 0.2.6 → 0.2.7

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a9f89e46ef22f2e9408bd4613bd3da2b9c191ca13f3cf76f571a2932a68e8f25
4
- data.tar.gz: b21fbaf6196cda1dcb6b9452e4be5e693333d09c48f07b608f5700df55a3cdc3
3
+ metadata.gz: 2c6a5d0ed2f7a08b6cb726bc5665c2d5a092e55fa68a6ea746127b210c32958c
4
+ data.tar.gz: cde8aeb717eed72da5b30090ce0d6e3b4771a9a4b01073941560f07d4ddcaa4c
5
5
  SHA512:
6
- metadata.gz: 11accb2c8934253b8ca96c7ca7fd4e014674af03b43675534239e511941fe40c75b6bea07ae64d055c2bd236ad4ce8e6e5eb1fedf171bec4812511e958fb8ccd
7
- data.tar.gz: 66a644912171360147ced4c8f6941cdaff439111f0074d2ea61a59bcabf7c7bb7dc530260e708ed543dd0e007c46059ec30395db292799683696553ebb506f6c
6
+ metadata.gz: 0dd87ff8b5d2e0d28437b2d6bc315ef52dd6aa87406393aa882573848eacb0fee97207fe7a3d8ce8dc716aa1e0f269eb3f43501b4754a3f95a195add4b4fd34c
7
+ data.tar.gz: 0deaf4217e61ce5ca09db15b0314135ae45b57482fdb96adabf2e818c0fb64374a1efeb66395421cc44cf4e61ca76f1d11631ebb85facbf61a3285ef5b7734a4
@@ -1,191 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require 'rubygems'
4
- require 'fileutils'
5
- require 'sequel'
6
- require 'tempfile'
7
- require 'thor'
8
-
9
3
  $:.unshift File.dirname(__FILE__) + '/../lib'
10
- require 'tapsoob/config'
11
- require 'tapsoob/log'
12
- require 'tapsoob/operation'
13
- require 'tapsoob/schema'
14
- require 'tapsoob/version'
15
-
16
- Tapsoob::Config.tapsoob_database_url = ENV['TAPSOOB_DATABASE_URL'] || begin
17
- # this is dirty but it solves a weird problem where the tempfile disappears mid-process
18
- #require ((RUBY_PLATFORM =~ /java/).nil? ? 'sqlite3' : 'jdbc-sqlite3')
19
- $__taps_database = Tempfile.new('tapsoob.db')
20
- $__taps_database.open()
21
- "sqlite://#{$__taps_database.path}"
22
- end
23
-
24
- module TapsoobCLI
25
- class Schema < Thor
26
- desc "console DATABASE_URL", "Create an IRB REPL connected to a database"
27
- def console(database_url)
28
- $db = Sequel.connect(database_url)
29
- require 'irb'
30
- require 'irb/completion'
31
- IRB.start
32
- end
33
-
34
- desc "dump DATABASE_URL", "Dump a database using a database URL"
35
- def dump(database_url)
36
- puts Tapsoob::Schema.dump(database_url)
37
- end
38
-
39
- desc "dump_table DATABASE_URL TABLE", "Dump a table from a database using a database URL"
40
- def dump_table(database_url, table)
41
- puts Tapsoob::Schema.dump_table(database_url, table)
42
- end
43
-
44
- desc "indexes DATABASE_URL", "Dump indexes from a database using a database URL"
45
- def indexes(database_url)
46
- puts Tapsoob::Schema.indexes(database_url)
47
- end
48
-
49
- desc "indexes_individual DATABASE_URL", "Dump indexes per table individually using a database URL"
50
- def indexes_individual(database_url)
51
- puts Tapsoob::Schema.indexes_individual(database_url)
52
- end
53
-
54
- desc "reset_db_sequences DATABASE_URL", "Reset database sequences using a database URL"
55
- def reset_db_sequences(database_url)
56
- Tapsoob::Schema.reset_db_sequences(database_url)
57
- end
58
-
59
- desc "load DATABASE_URL FILENAME", "Load a database schema from a file to a database using a database URL"
60
- def load(database_url, filename)
61
- schema = File.read(filename) rescue help
62
- Tapsoob::Schema.load(database_url, schema)
63
- end
64
-
65
- desc "load_indexes DATABASE_URL FILENAME", "Load indexes from a file to a database using a database URL"
66
- def load_indexes(database_url, filename)
67
- indexes = File.read(filename) rescue help
68
- Tapsoob::Schema.load_indexes(database_url, indexes)
69
- end
70
- end
71
-
72
- class Root < Thor
73
- desc "pull DUMP_PATH DATABASE_URL", "Pull a dump from a database to a folder"
74
- option :"skip-schema", desc: "Don't transfer the schema just data", default: false, type: :boolean, aliases: "-s"
75
- option :"indexes-first", desc: "Transfer indexes first before data", default: false, type: :boolean, aliases: "-i"
76
- option :resume, desc: "Resume a Tapsoob Session from a stored file", type: :string, aliases: "-r"
77
- option :chunksize, desc: "Initial chunksize", default: 1000, type: :numeric, aliases: "-c"
78
- option :"disable-compression", desc: "Disable Compression", default: false, type: :boolean, aliases: "-g"
79
- option :filter, desc: "Regex Filter for tables", type: :string, aliases: "-f"
80
- option :tables, desc: "Shortcut to filter on a list of tables", type: :array, aliases: "-t"
81
- option :"exclude-tables", desc: "Shortcut to exclude a list of tables", type: :array, aliases: "-e"
82
- option :debug, desc: "Enable debug messages", default: false, type: :boolean, aliases: "-d"
83
- def pull(dump_path, database_url)
84
- opts = parse_opts(options)
85
- Tapsoob.log.level = Logger::DEBUG if opts[:debug]
86
- if opts[:resume_filename]
87
- clientresumexfer(:pull, dump_path, database_url, opts)
88
- else
89
- clientxfer(:pull, dump_path, database_url, opts)
90
- end
91
- end
92
-
93
- desc "push DUMP_PATH DATABASE_URL", "Push a previously tapsoob dump to a database"
94
- option :"skip-schema", desc: "Don't transfer the schema just data", default: false, type: :boolean, aliases: "-s"
95
- option :"indexes-first", desc: "Transfer indexes first before data", default: false, type: :boolean, aliases: "-i"
96
- option :resume, desc: "Resume a Tapsoob Session from a stored file", type: :string, aliases: "-r"
97
- option :chunksize, desc: "Initial chunksize", default: 1000, type: :numeric, aliases: "-c"
98
- option :"disable-compression", desc: "Disable Compression", default: false, type: :boolean, aliases: "-g"
99
- option :filter, desc: "Regex Filter for tables", type: :string, aliases: "-f"
100
- option :tables, desc: "Shortcut to filter on a list of tables", type: :array, aliases: "-t"
101
- option :"exclude-tables", desc: "Shortcut to exclude a list of tables", type: :array, aliases: "-e"
102
- option :debug, desc: "Enable debug messages", default: false, type: :boolean, aliases: "-d"
103
- def push(dump_path, database_url)
104
- opts = parse_opts(options)
105
- Tapsoob.log.level = Logger::DEBUG if opts[:debug]
106
- if opts[:resume_filename]
107
- clientresumexfer(:push, dump_path, database_url, opts)
108
- else
109
- clientxfer(:push, dump_path, database_url, opts)
110
- end
111
- end
112
-
113
- desc "version", "Show tapsoob version"
114
- def version
115
- puts Tapsoob::VERSION.dup
116
- end
117
-
118
- desc "schema SUBCOMMAND ...ARGS", "Direct access to Tapsoob::Schema class methods"
119
- subcommand "schema", Schema
120
-
121
- private
122
- def parse_opts(options)
123
- # Default options
124
- opts = {
125
- skip_schema: options[:"skip-schema"],
126
- indexes_first: options[:"indexes_first"],
127
- disable_compression: options[:"disable-compression"],
128
- debug: options[:debug]
129
- }
130
-
131
- # Resume
132
- if options[:resume]
133
- if File.exists?(options[:resume])
134
- opts[:resume_file] = options[:resume]
135
- else
136
- raise "Unable to find resume file."
137
- end
138
- end
139
-
140
- # Default chunksize
141
- if options[:chunksize]
142
- opts[:default_chunksize] = (options[:chunksize] < 10 ? 10 : options[:chunksize])
143
- end
144
-
145
- # Regex filter
146
- opts[:table_filter] = options[:filter] if options[:filter]
147
-
148
- # Table filter
149
- if options[:tables]
150
- r_tables = options[:tables].collect { |t| "^#{t}" }.join("|")
151
- opts[:table_filter] = "#{r_tables}"
152
- end
153
-
154
- # Exclude tables
155
- opts[:exclude_tables] = options[:"exclude-tables"] if options[:"exclude-tables"]
156
-
157
- opts
158
- end
159
-
160
- def clientxfer(method, dump_path, database_url, opts)
161
- Tapsoob::Config.verify_database_url(database_url)
162
-
163
- FileUtils.mkpath "#{dump_path}/schemas"
164
- FileUtils.mkpath "#{dump_path}/data"
165
- FileUtils.mkpath "#{dump_path}/indexes"
166
-
167
- require 'tapsoob/operation'
168
-
169
- Tapsoob::Operation.factory(method, database_url, dump_path, opts).run
170
- end
171
-
172
- def clientresumexfer(method, dump_path, database_url, opts)
173
- session = JSON.parse(File.read(opts.delete(:resume_filename)))
174
- session.symbolize_recursively!
175
-
176
- dump_path = dump_path || session.delete(:dump_path)
177
-
178
- require 'taps/operation'
179
-
180
- newsession = session.merge({
181
- :default_chunksize => opts[:default_chunksize],
182
- :disable_compression => opts[:disable_compression],
183
- :resume => true
184
- })
185
-
186
- Tapsoob::Operation.factory(method, database_url, dump_path, newsession).run
187
- end
188
- end
189
- end
4
+ require 'tapsoob/cli'
190
5
 
191
- TapsoobCLI::Root.start(ARGV)
6
+ Tapsoob::CLI::Root.start(ARGV)
@@ -0,0 +1,192 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rubygems'
4
+ require 'fileutils'
5
+ require 'sequel'
6
+ require 'tempfile'
7
+ require 'thor'
8
+
9
+ # tapsoob deps
10
+ require 'tapsoob/config'
11
+ require 'tapsoob/log'
12
+ require 'tapsoob/operation'
13
+ require 'tapsoob/schema'
14
+ require 'tapsoob/version'
15
+
16
+ Tapsoob::Config.tapsoob_database_url = ENV['TAPSOOB_DATABASE_URL'] || begin
17
+ # this is dirty but it solves a weird problem where the tempfile disappears mid-process
18
+ #require ((RUBY_PLATFORM =~ /java/).nil? ? 'sqlite3' : 'jdbc-sqlite3')
19
+ $__taps_database = Tempfile.new('tapsoob.db')
20
+ $__taps_database.open()
21
+ "sqlite://#{$__taps_database.path}"
22
+ end
23
+
24
+ module Tapsoob
25
+ module CLI
26
+ class Schema < Thor
27
+ desc "console DATABASE_URL", "Create an IRB REPL connected to a database"
28
+ def console(database_url)
29
+ $db = Sequel.connect(database_url)
30
+ require 'irb'
31
+ require 'irb/completion'
32
+ IRB.start
33
+ end
34
+
35
+ desc "dump DATABASE_URL", "Dump a database using a database URL"
36
+ def dump(database_url)
37
+ puts Tapsoob::Schema.dump(database_url)
38
+ end
39
+
40
+ desc "dump_table DATABASE_URL TABLE", "Dump a table from a database using a database URL"
41
+ def dump_table(database_url, table)
42
+ puts Tapsoob::Schema.dump_table(database_url, table)
43
+ end
44
+
45
+ desc "indexes DATABASE_URL", "Dump indexes from a database using a database URL"
46
+ def indexes(database_url)
47
+ puts Tapsoob::Schema.indexes(database_url)
48
+ end
49
+
50
+ desc "indexes_individual DATABASE_URL", "Dump indexes per table individually using a database URL"
51
+ def indexes_individual(database_url)
52
+ puts Tapsoob::Schema.indexes_individual(database_url)
53
+ end
54
+
55
+ desc "reset_db_sequences DATABASE_URL", "Reset database sequences using a database URL"
56
+ def reset_db_sequences(database_url)
57
+ Tapsoob::Schema.reset_db_sequences(database_url)
58
+ end
59
+
60
+ desc "load DATABASE_URL FILENAME", "Load a database schema from a file to a database using a database URL"
61
+ def load(database_url, filename)
62
+ schema = File.read(filename) rescue help
63
+ Tapsoob::Schema.load(database_url, schema)
64
+ end
65
+
66
+ desc "load_indexes DATABASE_URL FILENAME", "Load indexes from a file to a database using a database URL"
67
+ def load_indexes(database_url, filename)
68
+ indexes = File.read(filename) rescue help
69
+ Tapsoob::Schema.load_indexes(database_url, indexes)
70
+ end
71
+ end
72
+
73
+ class Root < Thor
74
+ desc "pull DUMP_PATH DATABASE_URL", "Pull a dump from a database to a folder"
75
+ option :"skip-schema", desc: "Don't transfer the schema just data", default: false, type: :boolean, aliases: "-s"
76
+ option :"indexes-first", desc: "Transfer indexes first before data", default: false, type: :boolean, aliases: "-i"
77
+ option :resume, desc: "Resume a Tapsoob Session from a stored file", type: :string, aliases: "-r"
78
+ option :chunksize, desc: "Initial chunksize", default: 1000, type: :numeric, aliases: "-c"
79
+ option :"disable-compression", desc: "Disable Compression", default: false, type: :boolean, aliases: "-g"
80
+ option :filter, desc: "Regex Filter for tables", type: :string, aliases: "-f"
81
+ option :tables, desc: "Shortcut to filter on a list of tables", type: :array, aliases: "-t"
82
+ option :"exclude-tables", desc: "Shortcut to exclude a list of tables", type: :array, aliases: "-e"
83
+ option :debug, desc: "Enable debug messages", default: false, type: :boolean, aliases: "-d"
84
+ def pull(dump_path, database_url)
85
+ opts = parse_opts(options)
86
+ Tapsoob.log.level = Logger::DEBUG if opts[:debug]
87
+ if opts[:resume_filename]
88
+ clientresumexfer(:pull, dump_path, database_url, opts)
89
+ else
90
+ clientxfer(:pull, dump_path, database_url, opts)
91
+ end
92
+ end
93
+
94
+ desc "push DUMP_PATH DATABASE_URL", "Push a previously tapsoob dump to a database"
95
+ option :"skip-schema", desc: "Don't transfer the schema just data", default: false, type: :boolean, aliases: "-s"
96
+ option :"indexes-first", desc: "Transfer indexes first before data", default: false, type: :boolean, aliases: "-i"
97
+ option :resume, desc: "Resume a Tapsoob Session from a stored file", type: :string, aliases: "-r"
98
+ option :chunksize, desc: "Initial chunksize", default: 1000, type: :numeric, aliases: "-c"
99
+ option :"disable-compression", desc: "Disable Compression", default: false, type: :boolean, aliases: "-g"
100
+ option :filter, desc: "Regex Filter for tables", type: :string, aliases: "-f"
101
+ option :tables, desc: "Shortcut to filter on a list of tables", type: :array, aliases: "-t"
102
+ option :"exclude-tables", desc: "Shortcut to exclude a list of tables", type: :array, aliases: "-e"
103
+ option :debug, desc: "Enable debug messages", default: false, type: :boolean, aliases: "-d"
104
+ def push(dump_path, database_url)
105
+ opts = parse_opts(options)
106
+ Tapsoob.log.level = Logger::DEBUG if opts[:debug]
107
+ if opts[:resume_filename]
108
+ clientresumexfer(:push, dump_path, database_url, opts)
109
+ else
110
+ clientxfer(:push, dump_path, database_url, opts)
111
+ end
112
+ end
113
+
114
+ desc "version", "Show tapsoob version"
115
+ def version
116
+ puts Tapsoob::VERSION.dup
117
+ end
118
+
119
+ desc "schema SUBCOMMAND ...ARGS", "Direct access to Tapsoob::Schema class methods"
120
+ subcommand "schema", Schema
121
+
122
+ private
123
+ def parse_opts(options)
124
+ # Default options
125
+ opts = {
126
+ skip_schema: options[:"skip-schema"],
127
+ indexes_first: options[:"indexes_first"],
128
+ disable_compression: options[:"disable-compression"],
129
+ debug: options[:debug]
130
+ }
131
+
132
+ # Resume
133
+ if options[:resume]
134
+ if File.exists?(options[:resume])
135
+ opts[:resume_file] = options[:resume]
136
+ else
137
+ raise "Unable to find resume file."
138
+ end
139
+ end
140
+
141
+ # Default chunksize
142
+ if options[:chunksize]
143
+ opts[:default_chunksize] = (options[:chunksize] < 10 ? 10 : options[:chunksize])
144
+ end
145
+
146
+ # Regex filter
147
+ opts[:table_filter] = options[:filter] if options[:filter]
148
+
149
+ # Table filter
150
+ if options[:tables]
151
+ r_tables = options[:tables].collect { |t| "^#{t}" }.join("|")
152
+ opts[:table_filter] = "#{r_tables}"
153
+ end
154
+
155
+ # Exclude tables
156
+ opts[:exclude_tables] = options[:"exclude-tables"] if options[:"exclude-tables"]
157
+
158
+ opts
159
+ end
160
+
161
+ def clientxfer(method, dump_path, database_url, opts)
162
+ Tapsoob::Config.verify_database_url(database_url)
163
+
164
+ FileUtils.mkpath "#{dump_path}/schemas"
165
+ FileUtils.mkpath "#{dump_path}/data"
166
+ FileUtils.mkpath "#{dump_path}/indexes"
167
+
168
+ require 'tapsoob/operation'
169
+
170
+ Tapsoob::Operation.factory(method, database_url, dump_path, opts).run
171
+ end
172
+
173
+ def clientresumexfer(method, dump_path, database_url, opts)
174
+ session = JSON.parse(File.read(opts.delete(:resume_filename)))
175
+ session.symbolize_recursively!
176
+
177
+ dump_path = dump_path || session.delete(:dump_path)
178
+
179
+ require 'taps/operation'
180
+
181
+ newsession = session.merge({
182
+ :default_chunksize => opts[:default_chunksize],
183
+ :disable_compression => opts[:disable_compression],
184
+ :resume => true
185
+ })
186
+
187
+ Tapsoob::Operation.factory(method, database_url, dump_path, newsession).run
188
+ end
189
+ end
190
+ end
191
+ end
192
+
@@ -154,10 +154,11 @@ Data : #{data}
154
154
  Tapsoob::Schema.load_indexes(database_url, index)
155
155
  end
156
156
 
157
- def schema_bin(*args)
158
- bin_path = File.expand_path("#{File.dirname(__FILE__)}/../../bin/#{bin('tapsoob')}")
157
+ def schema_bin(command, *args)
158
+ require 'tapsoob/cli'
159
159
  subcommand = "schema"
160
- `#{Gem.ruby} -S "#{bin_path}" "#{subcommand}" #{args.map { |a| "'#{a}'" }.join(' ') }`
160
+ script = Tapsoob::CLI::Schema.new
161
+ script.invoke(command, args.map { |a| "#{a}" })
161
162
  end
162
163
 
163
164
  def primary_key(db, table)
@@ -1,4 +1,4 @@
1
1
  # -*- encoding : utf-8 -*-
2
2
  module Tapsoob
3
- VERSION = "0.2.6".freeze
3
+ VERSION = "0.2.7".freeze
4
4
  end
@@ -30,8 +30,8 @@ Gem::Specification.new do |s|
30
30
  else
31
31
  s.platform = 'java'
32
32
 
33
- s.add_development_dependency "jdbc-mysql", "~> 5.1.44"
34
- s.add_development_dependency "jdbc-postgres", "~> 42.1.4"
35
- s.add_development_dependency "jdbc-sqlite3", "~> 3.20.1"
33
+ s.add_dependency "jdbc-mysql", "~> 5.1.44"
34
+ s.add_dependency "jdbc-postgres", "~> 42.1.4"
35
+ s.add_dependency "jdbc-sqlite3", "~> 3.20.1"
36
36
  end
37
37
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tapsoob
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.6
4
+ version: 0.2.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Félix Bellanger
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2018-01-31 00:00:00.000000000 Z
12
+ date: 2018-02-06 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: sequel
@@ -97,6 +97,7 @@ files:
97
97
  - bin/tapsoob
98
98
  - lib/tapsoob.rb
99
99
  - lib/tapsoob/chunksize.rb
100
+ - lib/tapsoob/cli.rb
100
101
  - lib/tapsoob/config.rb
101
102
  - lib/tapsoob/data_stream.rb
102
103
  - lib/tapsoob/errors.rb