mysql_dumper 0.0.1

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 2f9f14de100bde7364e2ccf399e9bf84338dba40
4
+ data.tar.gz: 5238aa528a8f86ba2bf5b8f0a1986bb63558e01c
5
+ SHA512:
6
+ metadata.gz: 2b710df22ed383236b7f599744bf88d9c291667cbf577d83e8a90f6280fead5e6e6bc8f1b094c3f61fdf7191407ca5015f2aab3e4529470801c03e5daa1f8d84
7
+ data.tar.gz: 437a8c5437bb08e442090aec0dd300218020cb0a809c61ba1f12ce28058ce7e102bfab74b85173eedd8a45cc9a0546787797f99a6e1efd9dd5694dc2b2f425b7
data/.gitignore ADDED
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ *.swp
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in mysql_dumper.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Yang-Hsing Lin
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,45 @@
1
+ # MysqlDumper
2
+
3
+ MysqlDumper is a ruby wrapper of `mysqldump`.
4
+ It provides both ruby and command line interface.
5
+
6
+ ## Usage
7
+
8
+ ### Ruby interface:
9
+
10
+ require 'mysql_dumper'
11
+ config = {
12
+ "database" => "the_db_name",
13
+ "username" => "db_user_name"
14
+ "password" => "xxxx"
15
+ }
16
+
17
+ dumper = MysqlDumper.new config
18
+
19
+ # dump whole db, including stored procedure
20
+ dumper.dump_to("path/to/db.sql")
21
+
22
+ # dump only schema and certain tables
23
+ dumper.dump_schema_to("path/to/db.sql", { :preserve => ["table1", "table2"] })
24
+
25
+ # load a sql file to a database
26
+ dumper.load_from("path/to/db.sql")
27
+
28
+ ### command-line interface: (more expressive than native mysqldump interface)
29
+
30
+ 1. dump whole db:
31
+ `$ mysql_dumper dump DBNAME --to path/to/db.sql -u USERNAME [-p PASSWORD]`
32
+
33
+ 2. dump schema only:
34
+ `$ mysql_dumper dump_schema DBNAME --to path/to/schema.sql -u USERNAME [--perserve table1,table2...] [-p PASSWORD]`
35
+
36
+ 3. load from schema:
37
+ `$ mysql_dumper load DBNAME --from path/to/db.sql -u USERNAME [-p PASSWORD]`
38
+
39
+ ## Contributing
40
+
41
+ 1. Fork it
42
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
43
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
44
+ 4. Push to the branch (`git push origin my-new-feature`)
45
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
data/bin/mysql_dumper ADDED
@@ -0,0 +1,94 @@
1
+ #! /usr/bin/env ruby
2
+ # command line interface
3
+ # usage:
4
+ # 1. dump whole db:
5
+ # $ mysql_dumper dump DBNAME --to SQL_FILE_PATH -u USERNAME
6
+ #
7
+ # 2. dump schema:
8
+ # $ mysql_dumper dump_schema DBNAME --to SQL_FILE_PATH -u USERNAME [--perserve t1,t2...]
9
+ #
10
+ # 3. load schema to db:
11
+ # $ mysql_dumper load DBNAME --from SQL_FILE_PATH -u USERNAME
12
+
13
+ require 'optparse'
14
+ require "mysql_dumper"
15
+
16
+ class ArgumentSet
17
+ attr_accessor :config, :action, :file, :preserve, :username, :error
18
+ VALID_ACTIONS = [ "dump", "dump_schema", "load" ]
19
+ def initialize
20
+ @config = {}
21
+ parser.parse! ARGV
22
+ @action = ARGV[0]
23
+ @config["database"] = ARGV[1]
24
+ @error = ""
25
+ end
26
+
27
+ def parser
28
+ @parser ||= OptionParser.new do |opts|
29
+ opts.banner = "Usage: mysql_dumper ACTION [options]"
30
+ opts.on("-u", "--username USERNAME", "username to connect") do |username|
31
+ @config["username"] = username
32
+ end
33
+ opts.on("-f", "--to FILENAME", "file path of sql") do |filename|
34
+ @file = filename
35
+ end
36
+ opts.on("-f", "--from FILENAME", "file path of sql") do |filename|
37
+ @file = filename
38
+ end
39
+ opts.on("-p", "--password PASSWORD", "password of db") do |pwd|
40
+ @config["password"] = pwd
41
+ end
42
+ opts.on("-t", "--preserve DBNAME1,DBNAME2...", Array, "tables to preserve") do |tables|
43
+ @preserve = tables
44
+ end
45
+ opts.on("-h", "--help") do
46
+ puts opts
47
+ exit
48
+ end
49
+ end
50
+ end
51
+
52
+ def valid?
53
+ ensure_exists @config["username"], "username"
54
+ ensure_exists @config["database"], "database"
55
+ ensure_exists @file, "sql_file"
56
+ validate_action
57
+
58
+ @error == ""
59
+ end
60
+
61
+ def ensure_exists param, attr_name
62
+ if ! param
63
+ @error += "missing argument #{attr_name}\n"
64
+ end
65
+ end
66
+
67
+ def validate_action
68
+ if ! VALID_ACTIONS.include? @action
69
+ @error += "invalid action: #{@action}"
70
+ end
71
+ end
72
+
73
+ def show_help
74
+ puts parser
75
+ end
76
+
77
+ end
78
+
79
+ arguments = ArgumentSet.new
80
+
81
+ if arguments.valid?
82
+ dumper = MysqlDumper.new(arguments.config)
83
+ case arguments.action
84
+ when "dump"
85
+ dumper.dump_to(arguments.file)
86
+ when "dump_schema"
87
+ dumper.dump_schema_to(arguments.file, { :preserve => arguments.preserve })
88
+ when "load"
89
+ dumper.load_from(arguments.file)
90
+ end
91
+ else
92
+ puts arguments.error
93
+ arguments.show_help
94
+ end
@@ -0,0 +1,3 @@
1
+ class MysqlDumper
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,31 @@
1
+ require "mysql_dumper/version"
2
+
3
+ class MysqlDumper
4
+ class InitFailedException < Exception; end;
5
+ def initialize config
6
+ @password = config["password"]
7
+ @username = config["username"]
8
+ @database = config["database"]
9
+ raise InitFailedException, "username is required to init a dumper" unless @username
10
+ raise InitFailedException, "database is required to init a dumper" unless @database
11
+ end
12
+
13
+ def dump_schema_to path, options = {}
14
+ preserved_tables = options[:preserve] || []
15
+ table_string = preserved_tables.join(" ")
16
+
17
+ system "mysqldump -u #{@username} -p#{@password} -R -d --skip-comments #{@database} > #{path}"
18
+ if ! table_string.strip.empty?
19
+ system "mysqldump -u #{@username} -p#{@password} --skip-comments #{@database} #{table_string} >> #{path}"
20
+ end
21
+ end
22
+
23
+ def dump_to path
24
+ system "mysqldump -u #{@username} -p#{@password} -R --skip-comments #{@database} > #{path}"
25
+ end
26
+
27
+ def load_from path
28
+ system "cat #{path} | mysql -u #{@username} -p#{@password} #{@database}"
29
+ end
30
+
31
+ end
@@ -0,0 +1,24 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'mysql_dumper/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "mysql_dumper"
8
+ spec.version = MysqlDumper::VERSION
9
+ spec.authors = ["Yang-Hsing Lin"]
10
+ spec.email = ["yanghsing.lin@gmail.com"]
11
+ spec.description = %q{mysqldump wrapper}
12
+ spec.summary = %q{provides both command line and ruby interface}
13
+ spec.homepage = ""
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.3"
22
+ spec.add_development_dependency "rspec"
23
+ spec.add_development_dependency "rake"
24
+ end
@@ -0,0 +1,89 @@
1
+ require "mysql_dumper"
2
+
3
+ describe MysqlDumper do
4
+ let(:database) { "db_name" }
5
+ let(:username) { "the_username" }
6
+ let(:password) { "the_pwd" }
7
+ before(:each) do
8
+ @config = {
9
+ "database" => database,
10
+ "username" => username,
11
+ "password" => password
12
+ }
13
+ end
14
+
15
+ it "takes a config to init" do
16
+ dumper = MysqlDumper.new @config
17
+ end
18
+
19
+ def self.ensure_in_config attr_name
20
+ it "raises MysqlDumper::InitFailedException if no #{attr_name}" do
21
+ @config.delete attr_name
22
+
23
+ expect {
24
+ MysqlDumper.new @config
25
+ }.to raise_error(MysqlDumper::InitFailedException,
26
+ "#{attr_name} is required to init a dumper")
27
+ end
28
+ end
29
+
30
+ ensure_in_config "username"
31
+ ensure_in_config "database"
32
+
33
+ context "dumping methods" do
34
+ let(:file_path) { "/tmp/dummy.sql" }
35
+ before(:each) do
36
+ @dumper = MysqlDumper.new @config
37
+ @dumper.stub(:system)
38
+ end
39
+ describe "#dump_schema_to(destination_file[, options])" do
40
+ it "dump schema to destination_file" do
41
+ executed = false
42
+ @dumper.stub(:system) do |command|
43
+ sql = <<-SQL
44
+ mysqldump -u #{username} -p#{password} -R -d --skip-comments #{database} > #{file_path}
45
+ SQL
46
+ command.should == sql.strip
47
+ executed = true
48
+ end
49
+
50
+ @dumper.dump_schema_to(file_path)
51
+ executed.should be_true
52
+ end
53
+
54
+ it "preserves tables data if specified" do
55
+ table1 = "table1"
56
+ table2 = "table2"
57
+ sql_schema_only =
58
+ "mysqldump -u #{username} -p#{password} -R -d --skip-comments #{database} > #{file_path}"
59
+ sql_with_tables =
60
+ "mysqldump -u #{username} -p#{password} --skip-comments #{database} #{table1} #{table2} >> #{file_path}"
61
+
62
+ @dumper.should_receive(:system).with(sql_schema_only)
63
+ @dumper.should_receive(:system).with(sql_with_tables)
64
+
65
+ @dumper.dump_schema_to(file_path, { :preserve => [ table1, table2 ] })
66
+ end
67
+ end
68
+
69
+ describe "#dump_to(destination_file)" do
70
+ it "dumps whole db to destination_file" do
71
+ @dumper.should_receive(:system).
72
+ with("mysqldump -u #{username} -p#{password} -R --skip-comments #{database} > #{file_path}")
73
+ @dumper.dump_to(file_path)
74
+ end
75
+ end
76
+
77
+ describe "#load_from(sql_file)" do
78
+ it "loads sql_file to specific db" do
79
+ @dumper.should_receive(:system).
80
+ with("cat #{file_path} | mysql -u #{username} -p#{password} #{database}")
81
+ @dumper.load_from(file_path)
82
+ end
83
+ end
84
+
85
+ end
86
+
87
+
88
+
89
+ end
metadata ADDED
@@ -0,0 +1,99 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mysql_dumper
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Yang-Hsing Lin
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-09-20 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '1.3'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rspec
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description: mysqldump wrapper
56
+ email:
57
+ - yanghsing.lin@gmail.com
58
+ executables:
59
+ - mysql_dumper
60
+ extensions: []
61
+ extra_rdoc_files: []
62
+ files:
63
+ - .gitignore
64
+ - .rspec
65
+ - Gemfile
66
+ - LICENSE.txt
67
+ - README.md
68
+ - Rakefile
69
+ - bin/mysql_dumper
70
+ - lib/mysql_dumper.rb
71
+ - lib/mysql_dumper/version.rb
72
+ - mysql_dumper.gemspec
73
+ - spec/mysql_dumper_spec.rb
74
+ homepage: ''
75
+ licenses:
76
+ - MIT
77
+ metadata: {}
78
+ post_install_message:
79
+ rdoc_options: []
80
+ require_paths:
81
+ - lib
82
+ required_ruby_version: !ruby/object:Gem::Requirement
83
+ requirements:
84
+ - - '>='
85
+ - !ruby/object:Gem::Version
86
+ version: '0'
87
+ required_rubygems_version: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - '>='
90
+ - !ruby/object:Gem::Version
91
+ version: '0'
92
+ requirements: []
93
+ rubyforge_project:
94
+ rubygems_version: 2.0.7
95
+ signing_key:
96
+ specification_version: 4
97
+ summary: provides both command line and ruby interface
98
+ test_files:
99
+ - spec/mysql_dumper_spec.rb