psql-cm 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
data/History.md CHANGED
@@ -1,3 +1,10 @@
1
+ # 0.0.5 - 2012-04-18
2
+
3
+ Added git repository feature to sql-path for dump action, a commit per run of
4
+ the dump action occurs.
5
+
6
+ Bugfix: do not write pgpass line multiple times to the file.
7
+
1
8
  # 0.0.4 - 2012-04-18
2
9
 
3
10
  'restore' action functional.
data/README.md CHANGED
@@ -1,46 +1,134 @@
1
1
  # PostgreSQL Change Management Tool
2
2
 
3
- This project is a tool for schema change management within a PostgreSQL database
4
- cluster.
3
+ ## What psql-cm is
5
4
 
6
- # Prerequisites
5
+ This project is a tool to assist with an ITIL like change management process
6
+ for *database schemas* within a PostgreSQL database cluster.
7
+
8
+ Specifically psql-cm is a tool which encodes *one* change management process
9
+ for a complex multi database, multi schema PostgreSQL system.
10
+
11
+ This means that psql-cm may be much more than you need for a simple
12
+ single database system. Please take the time to understand the process and
13
+ what problems it solves. In order for psql-cm to be effective it must be
14
+ combined with complimentary process and adherence.
15
+
16
+ ## What psql-cm is not
17
+
18
+ psql-cm is not intended on being a solution whatsoever for data backup.
19
+
20
+ For backup of data instead use the
21
+ [pg\_dump](http://www.postgresql.org/docs/current/static/app-pgdump.html)
22
+ command line utility for backing up data in addition to a
23
+ [repliaction](http://www.postgresql.org/docs/current/static/different-replication-solutions.html)
24
+ technique tailored to your needs.
25
+
26
+ ## The process
27
+
28
+ # Using psql-cm
29
+
30
+ ## Prerequisites
7
31
 
8
32
  - [Ruby >= 1.9.3](http://www.ruby-lang.org/en/)
9
33
  - [Postgresql >= 9.1+](http://www.postgresql.org/)
10
34
  - [Git SCM](http://git-scm.com/)
11
35
 
12
- # Installation of psql-cm
36
+ ## Installation
13
37
 
14
38
  Once the prerequisites have been satisfied on your system, using the
15
39
  'gem' command from Ruby 1.9.3 do:
16
40
 
17
- user$ gem install psql-scm
41
+ $ gem install psql-scm
18
42
 
19
- # Setup
43
+ ## Setup
20
44
 
21
45
  Setup the psql\_cm control tables on the target databases, use a comma (',')
22
46
  to separate multiple database names.
23
47
 
24
- user$ psql-cm --databases psqlcm_test --uri "postgres://127.0.0.1:5432" setup
48
+ $ psql-cm --databases psqlcm_test --uri "postgres://127.0.0.1:5432" setup
25
49
 
26
- # Dump
50
+ ## Dump
27
51
 
28
52
  Dump the current database schema to the specified --sql-path directory, if none
29
53
  specified it dumps to $PWD/sql
30
54
 
31
- user$ psql-cm --databases psqlcm_test --uri "postgres://127.0.0.1:5432" dump
55
+ $ psql-cm --databases psqlcm_test --uri "postgres://127.0.0.1:5432" dump
32
56
 
33
- # Restore (Currently being implemented)
57
+ ## Restore
34
58
 
35
59
  Restore a previously psql-cm dumped database schema into a brand new postgresql
36
60
  database cluster.
37
61
 
38
- user$ psql-cm --databases psqlcm_test --uri "postgres://127.0.0.1:5432" restore
62
+ $ psql-cm --databases psqlcm_test --uri "postgres://127.0.0.1:5432" restore
63
+
64
+ ## Command line parameters
65
+
66
+ --databases argument may take multiple database targets, to do this pass them
67
+ in ',' separated format, no spaces. Specifically the format is,
68
+
69
+ $ psql-cm --databases psqlcm_test,psqlcm_test2,... ...
70
+
71
+ --uri has the format,
72
+
73
+ $ psql-cm --uri "postgres://{user}:{password}@{host}:{port}/{database}?{sslmode}={mode}"
74
+
75
+ user, password, port, the ? and everything after it (the query) are all optional.
76
+
77
+ sslmode mode may be one of disable, allow, prefer, require if used.
78
+
79
+ # Walkthrough
80
+
81
+ First let's create a PostgreSQL database for us to work with,
82
+
83
+ $ createdb psqlcm_test
84
+
85
+ Next let's create two schemas in addition to the public schema (which is added
86
+ by default when the database is created) and a table for each schema for our
87
+ database.
88
+
89
+ $ psql psqlcm_test -c '
90
+ SET search_path = public;
91
+ CREATE SCHEMA schema_one;
92
+ CREATE TABLE a_bool(a BOOL);
93
+
94
+ SET search_path = schema_one;
95
+ CREATE TABLE an_integer(an INTEGER);
96
+
97
+ CREATE SCHEMA schema_two;
98
+ SET search_path = schema_two;
99
+ CREATE TABLE a_varchar(a VARCHAR);'
100
+
101
+ Now that we have a base set of database(s) and schemas that we wish to apply
102
+ change management process to we can setup the psql-cm control tables.
103
+
104
+ The setup action adds one table called 'pg\_psql\_cm' to each of the target
105
+ database schemas.
106
+
107
+ $ psql-cm --databases psqlcm_test --uri "postgres://127.0.0.1:5432" setup
108
+
109
+ Use a PostgreSQL client tool (psql/pgAdmin/Navicat/...) and examine the schemas
110
+ for the psqlcm\_test database for which there should be three:
111
+
112
+ public
113
+ schema_one
114
+ schema_two
115
+
116
+ each with two tables, the pg\_psql\_cm control table and one other table.
117
+
118
+ Next we'll dump the schema to sql/ within our working directory
119
+
120
+ $ psql-cm --databases psqlcm_test --uri "postgres://127.0.0.1:5432" dump
121
+
122
+ At this point we have the base schema for the psqlcm\_test database recorded and
123
+ we can test to see that this is true by droping the database and then running
124
+ the psql-cm restore action.
125
+
126
+ $ dropdb psqlcm_test
127
+ $ psql-cm --databases psqlcm_test --uri "postgres://127.0.0.1:5432" restore
39
128
 
40
- # Example
129
+ Once again use yoru favorite client tool and verify that the schema is inded
130
+ what it was after setup was run.
41
131
 
42
- user$ createdb psqlcm_test
43
- user$ psql psqlcm_test -c 'CREATE SCHEMA schema_one; CREATE SCHEMA schema_two'
44
- user$ echo psql-cm --databases psqlcm_test --uri "postgres://127.0.0.1:5432" setup
45
- user$ psql-cm --databases psqlcm_test --uri "postgres://127.0.0.1:5432" dump
132
+ Note that one caveat is that psql-cm does not handle ROLEs and USERs so these
133
+ will have to be accounted for after doing a restore.
46
134
 
data/lib/psql-cm/base.rb CHANGED
@@ -87,6 +87,10 @@ module PSQLCM
87
87
  sh 'dump', command
88
88
  end
89
89
  end
90
+
91
+ sh 'git', "git init; git add ." unless File.exists?('.git') && File.directory?('.git')
92
+
93
+ sh 'git', "git commit -a -m 'PostgreSQL Change Management (psql-cm).\nDatabases: #{databases}\nTree: #{tree}'"
90
94
  end
91
95
  end # def dump!
92
96
 
@@ -148,6 +152,11 @@ module PSQLCM
148
152
  end
149
153
  end
150
154
  end
155
+ end # def restore!
156
+
157
+ def change!
158
+ puts "TODO: allow change string and/or file to be specified and add to the
159
+ specified database scema control table"
151
160
  end
152
161
 
153
162
  def run!(action = config.action, parent_id = config.parent_id)
@@ -162,6 +171,8 @@ module PSQLCM
162
171
  restore!
163
172
  when "setup"
164
173
  setup!
174
+ when "change"
175
+ change!
165
176
  else
166
177
  halt! "Action '#{action}' is not handled."
167
178
  end
@@ -36,18 +36,20 @@ module PSQLCM
36
36
  end
37
37
 
38
38
  def pgpass # Ensure a pgpass entry exists for this connection.
39
- pgpass_line = [
40
- @config[:host], @config[:port], @config[:dbname], @config[:user],
41
- @config[:password]
42
- ].join(':')
39
+ pgpass_line = [ @config[:host], @config[:port], @config[:dbname],
40
+ @config[:user], @config[:password] ].join(':')
43
41
 
44
- content = File.open(File.join(ENV['HOME'], '.pgpass'), 'r') { |file| file.read }
45
- unless content.lines.detect{ |line| line == pgpass_line }
42
+ content = File.open(File.join(ENV['HOME'], '.pgpass'), 'r') do |file|
43
+ file.read
44
+ end.split("\n")
45
+
46
+ unless content.detect{ |line| line == pgpass_line }
46
47
  File.open(File.join(ENV['HOME'], '.pgpass'), 'w') do |file|
47
- file.write(content + pgpass_line + "\n")
48
+ content << pgpass_line
49
+ file.write(content.join("\n") + "\n")
48
50
  end
51
+ File.chmod(0600, File.join(ENV['HOME'], '.pgpass'))
49
52
  end
50
-
51
53
  pgpass_line
52
54
  end # def pgpass
53
55
 
@@ -1,4 +1,4 @@
1
1
  module PSQLCM
2
- Version = '0.0.4'
2
+ Version = '0.0.5'
3
3
  end
4
4
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: psql-cm
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors: