dumpr 1.2 → 1.3

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
- SHA256:
3
- metadata.gz: 1c4e092e069d3b3a1a9ddb44c6e4fae4b405c49510fce4e89ef1577bed0a6016
4
- data.tar.gz: ea58fb39085ea624683a026f3fce5ddabe4cdbf2f1a3c8c5d69621067cc3bb01
2
+ SHA1:
3
+ metadata.gz: 333617934d6bd6652bd3a67d8f5afdea20ab75d7
4
+ data.tar.gz: e738de1c4d150aba044599ac8842a33629df99c8
5
5
  SHA512:
6
- metadata.gz: 53283e55f775af19059ee12c578e05012a5c141409e9484b562884bd80eb1b8ddfb34677753a3e6d37194367c12e3e904c9f712b2d57b5e93a602701a3a9cba5
7
- data.tar.gz: 31d4147d81e4cede85aa7d70fef0707a00491415262487cfc9d9df5403ba56eb1cec02d92340ed458cbcfa4fc47c0627aa32dd9a68a2a13519ea9193c9fcbf92
6
+ metadata.gz: bb48d7a57b4424ebea2cedbf0b0d16995253e5c7d89df6bc555284a39befc58db0cc6ccdae4a9e8b2b7d77183e6a7ded49890448009aca281ef29ef28206d98e
7
+ data.tar.gz: fd08f9a6c8c81fc9d381cee212c3c73d0c04522ed77368ba057f6739d6c85704fce434819918dd1c959daaa8a847a07777d35ae6e0c5fbffcd4accbfa38044cd
data/README.md CHANGED
@@ -10,7 +10,7 @@ Executables installed:
10
10
  * dumpr
11
11
 
12
12
  ### Dependencies
13
- * [Ruby ≥ 1.8.7](http://www.ruby-lang.org/en/downloads/)
13
+ * [Ruby ≥ 2.2.1](http://www.ruby-lang.org/en/downloads/)
14
14
 
15
15
  **SSH access is assumed to be automated with .ssh/config entries**
16
16
 
@@ -39,7 +39,7 @@ Generate yourdb.sql.gz and transfer it to server2
39
39
 
40
40
  Then, over on dbserver2, import your dump file
41
41
  ```sh
42
- dumpr -i --user user --password pw --file /data/dumps/yourdb.sql
42
+ dumpr-import --user user --password pw --file /data/dumps/yourdb.sql
43
43
  ```
44
44
 
45
45
  ## Ruby API
@@ -75,12 +75,21 @@ See *Dumpr::Driver*
75
75
 
76
76
  ## CHANGELOG
77
77
 
78
- * Version 1.0
78
+ ### Version 1.3
79
+ * Split binary, new command `dumpr-import` to replace `dumpr --import`
80
+ * Postgres support (beta)
79
81
 
80
- ## TODO
82
+ ### Version 1.2
83
+ * Changed gem and binary command from `dumper` to `dumpr`
84
+
85
+ ### Version 1.1
86
+ * Tweaks
81
87
 
82
- * Dumpr::Driver::Postgres
83
- * automate importing after an export (socket communication exporter/importer, or just some dumb lockfile checking / polling)
88
+ ### Version 1.0
89
+ * Initial release
90
+
91
+ ## TODO
92
+ * automate importing after an export (socket communication exporter/importer, or just lockfile checking / polling)
84
93
  * security: stop logging passwords
85
- * daemonize
94
+ * daemonize, maybe?
86
95
  * SSH parameters
data/bin/dumpr CHANGED
@@ -1,4 +1,4 @@
1
1
  #!/usr/bin/env ruby
2
2
  require 'rubygems'
3
3
  require 'dumpr/cli'
4
- Dumpr::CLI.execute(ARGV)
4
+ Dumpr::CLI.dump(ARGV)
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+ require 'rubygems'
3
+ require 'dumpr/cli'
4
+ Dumpr::CLI.import(ARGV)
@@ -8,9 +8,9 @@ Gem::Specification.new do |s|
8
8
  s.platform = Gem::Platform::RUBY
9
9
  s.authors = ["James Dickson"]
10
10
  s.email = ["jdickson@bcap.com"]
11
- s.homepage = "http://github.com/sixjameses/dumpr"
12
- s.summary = "Dump and load databases."
13
- s.description = "Dumpr provides an easy way to dump and import databases."
11
+ s.homepage = "http://github.com/jamesdickson6/dumpr"
12
+ s.summary = "Dump and import databases."
13
+ s.description = "Dumpr provides an easy way to dump and import databases. Supported databases include MySQL and Postgres."
14
14
  s.files = `git ls-files -z`.split("\x0")
15
15
  s.executables = s.files.grep(%r{^bin/}) { |f| File.basename(f) }
16
16
  s.test_files = s.files.grep(%r{^(test|spec|features)/})
@@ -7,7 +7,7 @@ module Dumpr
7
7
  PROG_NAME = File.basename($0)
8
8
 
9
9
 
10
- def self.execute(args)
10
+ def self.dump(args)
11
11
  # default options
12
12
  options = {}
13
13
  options[:dumpdir] = Dir.pwd
@@ -20,28 +20,20 @@ module Dumpr
20
20
  opts.banner = <<-ENDSTR
21
21
  Usage: #{PROG_NAME} [options]
22
22
 
23
- Exporting:
23
+ Example:
24
24
 
25
25
  #{PROG_NAME} --user root --password yourpass --db yourdb --file yourdb.sql --destination server2:/data/backups
26
26
 
27
- Importing:
28
-
29
- #{PROG_NAME} -i --user root --password yourpass --db yourdb --file /data/backups/yourdb.sql
30
-
31
- Don't forget to set up your .ssh/config so you won't be prompted for ssh passwords for file transfers
27
+ If using remote server destinations, don't forget to set up your .ssh/config so you won't be prompted for ssh passwords for file transfers.
32
28
 
33
29
  Options:
34
30
 
35
31
  ENDSTR
36
32
 
37
- opts.on("-t", "--type [TYPE]", "Database type. (mysql is the default) ") do |val|
33
+ opts.on("-t", "--type TYPE", "Database type: mysql or postgres. Default is mysql.") do |val|
38
34
  options[:driver] = val
39
35
  end
40
36
 
41
- opts.on("-i", "--import", "Import dump file. Default behavior is to dump and export to --destination") do |val|
42
- options[:import] = val
43
- end
44
-
45
37
  opts.on("--all-databases", "dump/import ALL databases") do |val|
46
38
  options[:all_databases] = val
47
39
  end
@@ -51,11 +43,11 @@ ENDSTR
51
43
  end
52
44
 
53
45
  # TODO: Add support to Driver for this
54
- opts.on("--databases [x,y,z]", Array, "dump/import multiple databases") do |val|
46
+ opts.on("--databases x,y,z", Array, "dump/import multiple databases") do |val|
55
47
  options[:databases] = val
56
48
  end
57
49
 
58
- opts.on("--tables [t1,t2,t3]", Array, "dump certain tables, to be used on conjuction with a single --database") do |val|
50
+ opts.on("--tables z,y,z", Array, "dump certain tables, to be used on conjuction with a single --database") do |val|
59
51
  options[:tables] = val
60
52
  end
61
53
 
@@ -87,7 +79,7 @@ ENDSTR
87
79
  options[:destination] = val
88
80
  end
89
81
 
90
- opts.on("--dumpdir", "Default directory for dumpfiles. Default is working directory") do |val|
82
+ opts.on("--dumpdir DIRECTORY", "Default directory for dumpfiles. Default is working directory") do |val|
91
83
  options[:dumpdir] = val
92
84
  end
93
85
 
@@ -103,7 +95,7 @@ ENDSTR
103
95
  options[:gzip_options] = val
104
96
  end
105
97
 
106
- opts.on("--log-file [LOGFILE]", "Log file. Default is stdout.") do |val|
98
+ opts.on("--log-file LOGFILE", "Log file. Default is stdout.") do |val|
107
99
  options[:log_file] = val
108
100
  end
109
101
 
@@ -133,11 +125,148 @@ ENDSTR
133
125
 
134
126
  # do it
135
127
  begin
136
- if options[:import]
137
- Dumpr.import(options[:driver], options)
138
- else
139
- Dumpr.export(options[:driver], options)
128
+ Dumpr.export(options[:driver], options)
129
+ rescue Dumpr::MissingDriver => e
130
+ puts "#{e.message}."
131
+ exit 1
132
+ rescue Dumpr::BadConfig => e
133
+ puts "bad arguments: #{e.message}.\n See --help"
134
+ exit 1
135
+ rescue Dumpr::DumpFileExists => e
136
+ puts "#{e.message}\nIt looks like this dump exists already. You should move it, or use --force to trash it"
137
+ exit 1
138
+ rescue Dumpr::BusyDumping => e
139
+ puts "#{e.message}\n See --help"
140
+ exit 1
141
+ rescue Dumpr::CommandFailure => e
142
+ puts e.message
143
+ exit 1
144
+ end
145
+
146
+ exit 0
147
+
148
+ end
149
+
150
+
151
+ def self.import(args)
152
+ # default options
153
+ options = {}
154
+ options[:dumpdir] = Dir.pwd
155
+ options[:driver] = :mysql
156
+ options[:gzip] = true
157
+
158
+
159
+ op = OptionParser.new do |opts|
160
+
161
+ opts.banner = <<-ENDSTR
162
+ Usage: #{PROG_NAME} [options]
163
+
164
+ Example:
165
+
166
+ #{PROG_NAME} -i --user root --password yourpass --db yourdb --file /data/backups/yourdb.sql
167
+
168
+ If using remote server destinations, don't forget to set up your .ssh/config so you won't be prompted for ssh passwords for file transfers.
169
+
170
+ Options:
171
+
172
+ ENDSTR
173
+
174
+ opts.on("-t", "--type TYPE", "Database type: mysql or postgres. Default is mysql.") do |val|
175
+ options[:driver] = val
176
+ end
177
+
178
+ opts.on("--all-databases", "dump/import ALL databases") do |val|
179
+ options[:all_databases] = val
180
+ end
181
+
182
+ opts.on("--db DATABASE", "--database DATABASE", "Database to dump/import") do |val|
183
+ options[:database] = val
184
+ end
185
+
186
+ # TODO: Add support to Driver for this
187
+ opts.on("--databases x,y,z", Array, "dump/import multiple databases") do |val|
188
+ options[:databases] = val
189
+ end
190
+
191
+ opts.on("--tables x,y,z", Array, "dump certain tables, to be used on conjuction with a single --database") do |val|
192
+ options[:tables] = val
193
+ end
194
+
195
+ opts.on("-u USER", "--user USER", "Database user") do |val|
196
+ options[:user] = val
140
197
  end
198
+
199
+ opts.on("-p PASS", "--password PASS", "--password=pass", "Database password") do |val|
200
+ options[:password] = val
201
+ end
202
+
203
+ opts.on("-h HOST", "--host HOST", "Database host") do |val|
204
+ options[:host] = val
205
+ end
206
+
207
+ opts.on("-P PORT", "--port PORT", "Database port") do |val|
208
+ options[:port] = val
209
+ end
210
+
211
+ opts.on("--file FILENAME", "Filename of dump to create/import") do |val|
212
+ options[:dumpfile] = val
213
+ end
214
+
215
+ opts.on("--dumpfile FILENAME", "Alias for --file") do |val|
216
+ options[:dumpfile] = val
217
+ end
218
+
219
+ opts.on("--destination DESTINATION", "Destination for dumpfile. This can be a remote host:path.") do |val|
220
+ options[:destination] = val
221
+ end
222
+
223
+ opts.on("--dumpdir DIRECTORY", "Default directory for dumpfiles. Default is working directory") do |val|
224
+ options[:dumpdir] = val
225
+ end
226
+
227
+ opts.on("--import-options=[DUMPOPTIONS]", "Extra options to be included in dump command") do |val|
228
+ options[:import_options] = val.to_s
229
+ end
230
+
231
+ opts.on("--no-gzip", "Don't use gzip") do |val|
232
+ options[:gzip] = false
233
+ end
234
+
235
+ opts.on("--gzip-options=[GZIPOPTIONS]", "gzip compression options. Default is -9 (slowest /max compression)") do |val|
236
+ options[:gzip_options] = val
237
+ end
238
+
239
+ opts.on("--log-file LOGFILE", "Log file. Default is stdout.") do |val|
240
+ options[:log_file] = val
241
+ end
242
+
243
+ opts.on("--force", "Overwrite dumpfile if it exists already.") do |val|
244
+ options[:force] = val
245
+ end
246
+
247
+ opts.on("-h", "--help", "Show this message") do
248
+ puts opts
249
+ exit
250
+ end
251
+
252
+ opts.on("-v", "--version", "Show version") do
253
+ puts Dumpr::Version
254
+ exit
255
+ end
256
+
257
+ end
258
+
259
+ begin
260
+ op.parse!(args)
261
+ rescue OptionParser::MissingArgument => e
262
+ puts "invalid arguments. try #{PROG_NAME} --help"
263
+ exit 1
264
+ end
265
+
266
+
267
+ # do it
268
+ begin
269
+ Dumpr.import(options[:driver], options)
141
270
  rescue Dumpr::MissingDriver => e
142
271
  puts "#{e.message}."
143
272
  exit 1
@@ -43,8 +43,8 @@ module Dumpr
43
43
  # db connection settings
44
44
  @host = opts[:host] || "localhost"
45
45
  @port = opts[:port]
46
- @user = opts[:user] or raise BadConfig.new ":user => <db user> is required"
47
- @password = (opts[:password] || opts[:pass]) or raise BadConfig.new ":pass => <db password> is required"
46
+ @user = opts[:user] or raise BadConfig.new "user is required"
47
+ @password = (opts[:password] || opts[:pass]) # or raise BadConfig.new "password is required"
48
48
 
49
49
  # dump all_databases or specific database(s)
50
50
  @all_databases = nil
@@ -59,14 +59,14 @@ module Dumpr
59
59
  elsif opts[:all_databases]
60
60
  @all_databases = true
61
61
  else
62
- raise BadConfig.new ":database => <db schema name> is required"
62
+ #raise BadConfig.new "database is required"
63
63
  end
64
64
 
65
65
  # dump settings
66
66
  @gzip = opts[:gzip].nil? ? true : opts[:gzip]
67
67
  @gzip_options = opts[:gzip_options] || "-9"
68
- @dumpdir = opts[:dumpdir] || "./"
69
- @dumpfile = (opts[:file] || opts[:dumpfile] || opts[:filename]) or raise BadConfig.new ":dumpfile => <file.sql> is required"
68
+ @dumpdir = opts[:dumpdir] || Dir.pwd #"./"
69
+ @dumpfile = (opts[:file] || opts[:dumpfile] || opts[:filename]) or raise BadConfig.new "dumpfile is required"
70
70
  @dumpfile = @dumpfile[0].chr == "/" ? @dumpfile : File.join(@dumpdir, @dumpfile)
71
71
  @dumpfile.chomp!(".gz")
72
72
  # (optional) :destination is where dumps are exported to, and can be a remote host:path
@@ -19,6 +19,19 @@ module Dumpr
19
19
  system("which mysql") == true
20
20
  end
21
21
 
22
+ def configure(opts)
23
+ super(opts)
24
+ if @all_databases
25
+ # supported
26
+ elsif @databases
27
+ # supported
28
+ elsif @database
29
+ # supported
30
+ else
31
+ raise BadConfig.new "#{self.class} requires option --database or --databases or --all-databases"
32
+ end
33
+ end
34
+
22
35
  def dump_cmd
23
36
  if @all_databases
24
37
  "mysqldump -u #{user} --password=#{password} -h #{host} -P #{port} --all-databases #{dump_options}"
@@ -0,0 +1,58 @@
1
+ require 'dumpr/driver'
2
+ module Dumpr
3
+ module Driver
4
+ class Postgres < Base
5
+
6
+ def port
7
+ @port || 5432
8
+ end
9
+
10
+ def dump_options
11
+ @dump_options || "-Fc" #"-Fc -v"
12
+ end
13
+
14
+ def dump_installed?
15
+ system("which pg_dump") == true
16
+ end
17
+
18
+ def import_installed?
19
+ system("which pg_restore") == true
20
+ end
21
+
22
+ def configure(opts)
23
+ super(opts)
24
+ if @all_databases
25
+ raise BadConfig.new "#{self.class} does not support --all-databases"
26
+ elsif @databases
27
+ raise BadConfig.new "#{self.class} does not support multiple --databases"
28
+ elsif @database
29
+ # supported
30
+ else
31
+ raise BadConfig.new "#{self.class} requires option --database"
32
+ end
33
+ if @tables
34
+ raise BadConfig.new "#{self.class} does not support --tables"
35
+ end
36
+ end
37
+
38
+ def dump_cmd
39
+ if @all_databases
40
+ "pg_dump -h #{host} -p #{port} -U #{user} --password #{password} #{dump_options}"
41
+ elsif @databases
42
+ # not supported
43
+ else
44
+ "pg_dump -h #{host} -p #{port} -U #{user} --password #{password} #{dump_options} #{database}"
45
+ end
46
+ end
47
+
48
+ def import_cmd
49
+ if @database
50
+ "pg_restore -h #{host} -p #{port} -U #{user} --password #{password} --verbose --clean --no-owner --no-acl -d #{database} #{dumpfile}"
51
+ else
52
+ "pg_restore -h #{host} -p #{port} -U #{user} --password #{password} --verbose --clean --no-owner --no-acl #{database} #{dumpfile}"
53
+ end
54
+ end
55
+
56
+ end
57
+ end
58
+ end
@@ -1,3 +1,3 @@
1
1
  module Dumpr
2
- Version = "1.2".freeze
2
+ Version = "1.3".freeze
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dumpr
3
3
  version: !ruby/object:Gem::Version
4
- version: '1.2'
4
+ version: '1.3'
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Dickson
@@ -10,12 +10,14 @@ bindir: bin
10
10
  cert_chain: []
11
11
  date: 2020-04-10 00:00:00.000000000 Z
12
12
  dependencies: []
13
- description: Dumpr provides an easy way to dump and import databases.
13
+ description: Dumpr provides an easy way to dump and import databases. Supported databases
14
+ include MySQL and Postgres.
14
15
  email:
15
16
  - jdickson@bcap.com
16
17
  executables:
17
18
  - csv2sqlinsert
18
19
  - dumpr
20
+ - dumpr-import
19
21
  extensions: []
20
22
  extra_rdoc_files:
21
23
  - README.md
@@ -27,15 +29,17 @@ files:
27
29
  - Rakefile
28
30
  - bin/csv2sqlinsert
29
31
  - bin/dumpr
32
+ - bin/dumpr-import
30
33
  - dumpr.gemspec
31
34
  - lib/dumpr.rb
32
35
  - lib/dumpr/chunkpipe.rb
33
36
  - lib/dumpr/cli.rb
34
37
  - lib/dumpr/driver.rb
35
38
  - lib/dumpr/driver/mysql.rb
39
+ - lib/dumpr/driver/postgres.rb
36
40
  - lib/dumpr/util.rb
37
41
  - lib/dumpr/version.rb
38
- homepage: http://github.com/sixjameses/dumpr
42
+ homepage: http://github.com/jamesdickson6/dumpr
39
43
  licenses:
40
44
  - MIT
41
45
  metadata: {}
@@ -55,8 +59,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
55
59
  version: '0'
56
60
  requirements: []
57
61
  rubyforge_project:
58
- rubygems_version: 2.7.6
62
+ rubygems_version: 2.4.6
59
63
  signing_key:
60
64
  specification_version: 4
61
- summary: Dump and load databases.
65
+ summary: Dump and import databases.
62
66
  test_files: []