cap_db_dump 1.2.2 → 1.3.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.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/cap_db_dump/recipes.rb +72 -14
  3. metadata +39 -14
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 9b17670872f50b5f6e4ced82d27850b86d69f5f544c16ffd2255f9be0550d0f5
4
+ data.tar.gz: 95a520425a6edf34da30890fb9cc898fac58b20c9ba5c152b6ca0e7dd7fe89ec
5
+ SHA512:
6
+ metadata.gz: 4e9a93f1adcbbf42ceeff9f4da05913f2df61ca31be12afa6c42fb44dd0334258f633cc0ce3f7cf91ad5938668b0031ea27df22962f8f9bafc4874983e7208ba
7
+ data.tar.gz: a990d7fc1d50cf589c1d0b0af8be81aa238f6c1e75a7f55855d28170213a3f9357aebcd63fbd248a2988fa5ba5afe8e038aa5d2edfcaa362adb2270fec6cddd9
@@ -1,9 +1,17 @@
1
1
  Capistrano::Configuration.instance(:must_exist).load do
2
2
  namespace :database do
3
+ DATABASE_ENGINES = [
4
+ MYSQL = :mysql,
5
+ POSTGRES = :psql,
6
+ ]
7
+
3
8
  # a list of tables for which only the schema, but no data should be dumped.
4
9
  set :schema_only_tables, []
5
10
  set :dump_root_path, "/tmp"
6
11
  set :formatted_time, Time.now.utc.strftime("%Y-%m-%d-%H:%M:%S")
12
+ set :database_engine, :mysql # specify :mysql | :psql
13
+ # https://www.postgresql.org/docs/12/app-pgdump.html
14
+ set :pg_dump_format, :c # specify c: 'compressed' (aka -Fc), :d 'directory', or set to nil for plain text
7
15
 
8
16
  module CapDbDumpHelpers
9
17
  def dump_path
@@ -30,6 +38,10 @@ Capistrano::Configuration.instance(:must_exist).load do
30
38
  database_yml_in_env["password"]
31
39
  end
32
40
 
41
+ def database_port
42
+ database_yml_in_env["port"]
43
+ end
44
+
33
45
  def database_yml_in_env
34
46
  database_yml[rails_env]
35
47
  end
@@ -47,25 +59,59 @@ Capistrano::Configuration.instance(:must_exist).load do
47
59
 
48
60
  task :read_db_yml, tasks_matching_for_db_dump do
49
61
  @database_yml ||= begin
50
- yaml = capture("cat #{shared_path}/config/database.yml")
51
- YAML.load(yaml)
62
+ if dry_run
63
+ raise "Cannot be run in dry_run mode!"
64
+ end
65
+
66
+ yaml = capture("cat #{current_path}/config/database.yml")
67
+ YAML.safe_load(yaml, aliases: true)
52
68
  end
53
69
  end
54
70
 
55
- def password_field
71
+ def mysql_password_field
56
72
  database_password && database_password.length > 0 ? "-p#{database_password}" : ""
57
73
  end
58
74
 
59
- task :create_dump, tasks_matching_for_db_dump do
60
- ignored_tables = schema_only_tables.map { |table_name|
61
- "--ignore-table=#{database_name}.#{table_name}"
62
- }
75
+ def postgres_port
76
+ database_port ? "-p #{database_port}" : ""
77
+ end
63
78
 
64
- ignored_tables = ignored_tables.join(" ")
79
+ def pg_password
80
+ database_password && !database_password.empty? ?
81
+ "PGPASSWORD=#{database_password}" :
82
+ ""
83
+ end
84
+
85
+ def pg_port
86
+ database_port && !database_port.empty? ? "-p #{database_port}" : ""
87
+ end
65
88
 
66
- command = "mysqldump -u #{database_username} -h #{database_host} #{password_field} -Q "
67
- command << "--add-drop-table -O add-locks=FALSE --lock-tables=FALSE --single-transaction "
68
- command << "#{ignored_tables} #{database_name} > #{dump_path}"
89
+ task :create_dump, tasks_matching_for_db_dump do
90
+ if database_engine == MYSQL
91
+ ignored_tables = schema_only_tables.map { |table_name|
92
+ "--ignore-table=#{database_name}.#{table_name}"
93
+ }
94
+
95
+ ignored_tables = ignored_tables.join(" ")
96
+
97
+ command = "mysqldump -u #{database_username} -h #{database_host} #{mysql_password_field} -Q "
98
+ command << "--add-drop-table -O add-locks=FALSE --lock-tables=FALSE --single-transaction "
99
+ command << "#{ignored_tables} #{database_name} > #{dump_path}"
100
+ elsif database_engine == POSTGRES
101
+ ignored_tables = schema_only_tables.map { |table_name|
102
+ "--exclude-table=#{database_name}.#{table_name}"
103
+ }
104
+
105
+ ignored_tables = ignored_tables.join(" ")
106
+
107
+ command = "#{pg_password} pg_dump -U #{database_username} -h #{database_host} #{postgres_port} "
108
+ if pg_dump_format
109
+ command << "-F#{pg_dump_format} "
110
+ end
111
+ command << "#{ignored_tables} #{database_name} > #{dump_path}"
112
+ else
113
+ raise "Unknown database engine. use one of: #{DATABASE_ENGINES.inspect}"
114
+ end
69
115
 
70
116
  give_description "About to dump production DB"
71
117
 
@@ -77,8 +123,14 @@ Capistrano::Configuration.instance(:must_exist).load do
77
123
  if schema_only_tables.any?
78
124
  table_names = schema_only_tables.join(" ")
79
125
 
80
- command = "mysqldump -u #{database_username} -h #{database_host} #{password_field} "
81
- command << "-Q --add-drop-table --single-transaction --no-data #{database_name} #{table_names} >> #{dump_path}"
126
+ if database_engine == MYSQL
127
+ command = "mysqldump -u #{database_username} -h #{database_host} #{mysql_password_field} "
128
+ command << "-Q --add-drop-table --single-transaction --no-data #{database_name} #{table_names} >> #{dump_path}"
129
+ elsif database_engine == POSTGRES
130
+ raise "not yet supported. PR's welcome! (https://github.com/smtlaissezfaire/cap_db_dump)"
131
+ else
132
+ raise "Unknown database engine. use one of: #{DATABASE_ENGINES.inspect}"
133
+ end
82
134
 
83
135
  give_description "Dumping schema for tables: #{schema_only_tables.join(", ")}"
84
136
  run command
@@ -102,8 +154,14 @@ Capistrano::Configuration.instance(:must_exist).load do
102
154
  end
103
155
 
104
156
  task :transfer, tasks_matching_for_db_dump do
157
+ # TODO: should look in /tmp for latest file
105
158
  give_description "Grabbing the dump"
106
- download("#{dump_path}.gz", ".", :via => :scp)
159
+ gzip_file = "#{dump_path}.gz"
160
+ download(gzip_file, ".", :via => :scp)
161
+
162
+ give_description "Symlinking locally"
163
+ base_name = File.basename(gzip_file)
164
+ `ln -sf #{base_name} current.sql.gz`
107
165
  end
108
166
  end
109
167
  end
metadata CHANGED
@@ -1,16 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cap_db_dump
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.2
5
- prerelease:
4
+ version: 1.3.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Scott Taylor
9
- autorequire:
8
+ autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2012-09-06 00:00:00.000000000 Z
13
- dependencies: []
11
+ date: 2024-05-24 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: capistrano
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 2.15.10
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 2.15.10
27
+ - !ruby/object:Gem::Dependency
28
+ name: net-ssh
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 7.2.3
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 7.2.3
14
41
  description: Capistrano tasks for dumping your mysql database + transfering to your
15
42
  local machine
16
43
  email: scott@railsnewbie.com
@@ -21,26 +48,24 @@ files:
21
48
  - lib/cap_db_dump/recipes.rb
22
49
  homepage: https://github.com/smtlaissezfaire/cap_db_dump
23
50
  licenses: []
24
- post_install_message:
51
+ metadata: {}
52
+ post_install_message:
25
53
  rdoc_options: []
26
54
  require_paths:
27
55
  - lib
28
56
  required_ruby_version: !ruby/object:Gem::Requirement
29
- none: false
30
57
  requirements:
31
- - - ! '>='
58
+ - - ">="
32
59
  - !ruby/object:Gem::Version
33
60
  version: '0'
34
61
  required_rubygems_version: !ruby/object:Gem::Requirement
35
- none: false
36
62
  requirements:
37
- - - ! '>='
63
+ - - ">="
38
64
  - !ruby/object:Gem::Version
39
65
  version: '0'
40
66
  requirements: []
41
- rubyforge_project:
42
- rubygems_version: 1.8.24
43
- signing_key:
44
- specification_version: 3
67
+ rubygems_version: 3.5.9
68
+ signing_key:
69
+ specification_version: 4
45
70
  summary: cap_db_dump
46
71
  test_files: []