activerecord-postgis-adapter 0.3.1 → 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,8 @@
1
+ === 0.3.2 / 2011-02-11
2
+
3
+ * You can now specify a separate "database creation" superuser so your normal postgres user doesn't need superuser privileges when running database creation tasks.
4
+ * Database creation tasks automatically create all schemas listed in the schema search path.
5
+
1
6
  === 0.3.1 / 2011-02-01
2
7
 
3
8
  * Fixed a syntax error that prevented the adapter from loading on Ruby 1.8. Whoops. (Reported by miguelperez)
@@ -137,30 +137,38 @@ the above require command should appear after <tt>require 'rails/all'</tt>.
137
137
 
138
138
  Besides the adapter name "postgis", most of the other database connection
139
139
  configuration parameters are the same as for the stock postgresql adapter.
140
- However, there are a couple minor differences:
140
+ However, there are several important differences:
141
141
 
142
142
  The <i>script_dir</i> parameter is specific to the PostGIS adapter, and
143
143
  provides the path to the directory containing the SQL scripts for PostGIS
144
144
  installation. This directory should contain the files <tt>postgis.sql</tt>
145
145
  and <tt>spatial_ref_sys.sql</tt>. (A common setting for this directory
146
- might be <tt>/usr/local/share/contrib/postgis-1.5</tt>.) It is used by the
147
- db:create rake task to add the PostGIS types, functions, and tables to a
148
- newly created database. If you do not provide this parameter, you will
146
+ might be <tt>/usr/local/share/contrib/postgis-1.5</tt>.) It is used by
147
+ <tt>rake db:create</tt> to add the PostGIS types, functions, and tables to
148
+ a newly created database. If you do not provide this parameter, you will
149
149
  need to add these objects to the database manually.
150
150
  Generally, therefore, this parameter is required at least for the test
151
151
  database, which is usually automatically created by the rake tasks.
152
152
 
153
- If the schema name "postgis" is included in the <i>schema_search_path</i>
154
- parameter, the PostGIS adapter treats it as special, in that:
153
+ The <i>su_username</i> and <i>su_password</i> parameters are provided as
154
+ optional parameters. If present, they specify an auxiliary Postgres role
155
+ that will be used for two functions:
156
+
157
+ * Creation of the database. This is so the main database user that you
158
+ specify doesn't need superuser or createdb privileges.
159
+ * Installation of the PostGIS definitions, if requested by the presence
160
+ of <i>script_dir</i>. This process normally requires a Postgres role
161
+ with superuser privileges, so again if you don't want your main database
162
+ user to have superuser, you can perform this one-time procedure using
163
+ this alternate user.
155
164
 
156
- * The db:create rake task will automatically create the "postgis" schema,
157
- and, if <i>script_dir</i> is set, it will create all the PostGIS objects
158
- within that schema.
159
- * Dumping the structure as sql will omit objects in the "postgis" schema.
160
- This is often useful if you don't want all the PostGIS definitions
161
- cluttering up your SQL dump.
165
+ Any schemas listed in the <i>schema_search_path</i> parameter are
166
+ automatically created by <tt>rake db:create</tt>. This is arguably what
167
+ the stock PostgreSQL adapter should be doing anyway.
162
168
 
163
- This can be useful in managing the PostGIS definitions in your database,
169
+ If the schema name "postgis" is included in the <i>schema_search_path</i>
170
+ parameter, the PostGIS adapter omits it from a SQL structure dump. This
171
+ can be useful to prevent PostGIS definitions from appearing in the dump
164
172
  as described below.
165
173
 
166
174
  === Dealing With PostGIS Definitions
@@ -190,6 +198,15 @@ To deal with these issues, we recommend the following technique:
190
198
  The PostGIS Adapter responds to this special name by sandboxing the
191
199
  PostGIS definitions into it when rake db:create is run, and it omits
192
200
  this schema when running SQL structure dumps.
201
+ * Provide a separate <i>su_username</i> and <i>su_password</i> user for
202
+ your database, and make sure that Postgres user has SUPERUSER
203
+ privilege. This will cause the PostGIS Adapter to log in as that user
204
+ when creating the database, since the PostGIS definition installation
205
+ requires SUPERUSER. Alternately, you can give the normal database user
206
+ SUPERUSER privilege, which may be okay for a private development
207
+ database. These are used only by <tt>rake db:create</tt> so you can
208
+ remove them from your database.yml for your staging or production
209
+ databases once you've performed the initial creation.
193
210
 
194
211
  Finally, you generally should _not_ set the \ActiveRecord schema format
195
212
  to <tt>:sql</tt>. You should leave it set to <tt>:ruby</tt>. The reason
@@ -200,10 +217,19 @@ other issues. Instead, the schema.rb output by the Ruby schema format
200
217
  should properly replicate the schema. This is a known issue that we are
201
218
  investigating.
202
219
 
220
+ Of course, the above steps are only really necessary if you are using the
221
+ \ActiveRecord rake tasks that create databases, either directly such as
222
+ <tt>rake db:create</tt>, or indirectly such as <tt>rake test</tt>. They
223
+ should not be necessary for running migrations or normal website execution.
224
+
203
225
  == Additional Information
204
226
 
205
227
  === Known bugs and limitations
206
228
 
229
+ The PostGIS Adapter has not yet been tested in a large variety of
230
+ environments, and we are still fixing bugs. Here is a partial list of
231
+ current known issues.
232
+
207
233
  * Dumping as SQL (i.e. rake db:structure:dump) does not properly emit
208
234
  <tt>AddGeometryColumn</tt> calls, and so does not completely create the
209
235
  spatial schema (e.g. it fails to add the proper row to the
data/Version CHANGED
@@ -1 +1 @@
1
- 0.3.1
1
+ 0.3.2
@@ -47,20 +47,50 @@ def create_database(config_)
47
47
  if config_['adapter'] == 'postgis'
48
48
  @encoding = config_['encoding'] || ::ENV['CHARSET'] || 'utf8'
49
49
  begin
50
- ::ActiveRecord::Base.establish_connection(config_.merge('database' => 'postgres', 'schema_search_path' => 'public'))
51
- ::ActiveRecord::Base.connection.create_database(config_['database'], config_.merge('encoding' => @encoding))
52
- ::ActiveRecord::Base.establish_connection(config_.merge('schema_search_path' => 'public'))
50
+ has_su_ = config_.include?('su_username') # Is there a distinct superuser?
51
+ username_ = config_['username'] # regular user name
52
+ su_username_ = config_['su_username'] || username_ # superuser name
53
+ su_password_ = config_['su_password'] || config_['password'] # superuser password
54
+
55
+ # Create the database. Optionally do so as the given superuser.
56
+ # But make sure the database is owned by the regular user.
57
+ ::ActiveRecord::Base.establish_connection(config_.merge('database' => 'postgres', 'schema_search_path' => 'public', 'username' => su_username_, 'password' => su_password_))
58
+ extra_configs_ = {'encoding' => @encoding}
59
+ extra_configs_['owner'] = username_ if has_su_
60
+ ::ActiveRecord::Base.connection.create_database(config_['database'], config_.merge(extra_configs_))
61
+
62
+ # Initial setup of the database: Add schemas from the search path.
63
+ # If a superuser is given, we log in as the superuser, but we make sure
64
+ # the schemas are owned by the regular user.
65
+ ::ActiveRecord::Base.establish_connection(config_.merge('schema_search_path' => 'public', 'username' => su_username_, 'password' => su_password_))
66
+ conn_ = ::ActiveRecord::Base.connection
67
+ search_path_ = config_["schema_search_path"].to_s.strip
68
+ search_path_ = search_path_.split(",").map{ |sp_| sp_.strip }
69
+ auth_ = has_su_ ? " AUTHORIZATION #{username_}" : ''
70
+ search_path_.each do |schema_|
71
+ conn_.execute("CREATE SCHEMA #{schema_}#{auth_}") unless schema_.downcase == 'public'
72
+ end
73
+
74
+ # Define the postgis stuff, if the script_dir is provided.
75
+ # Note: a superuser is required to run the postgis definitions.
76
+ # If a separate superuser is provided, we need to grant privileges on
77
+ # the postgis definitions over to the regular user afterwards.
78
+ # The schema for the postgis definitions is chosen as follows:
79
+ # If "postgis" is present in the search path, use it.
80
+ # Otherwise, use the last schema in the search path.
81
+ # If no search path is given, use "public".
53
82
  if (script_dir_ = config_['script_dir'])
54
- conn_ = ::ActiveRecord::Base.connection
55
- search_path_ = config_["schema_search_path"].to_s.strip
56
- search_path_ = search_path_.split(",").map{ |sp_| sp_.strip }
57
- if search_path_.include?('postgis')
58
- conn_.execute('CREATE SCHEMA postgis')
59
- conn_.execute('SET search_path TO postgis')
60
- end
83
+ postgis_schema_ = search_path_.include?('postgis') ? 'postgis' : (search_path_.last || 'public')
84
+ conn_.execute("SET search_path TO #{postgis_schema_}")
61
85
  conn_.execute(::File.read(::File.expand_path('postgis.sql', script_dir_)))
62
86
  conn_.execute(::File.read(::File.expand_path('spatial_ref_sys.sql', script_dir_)))
87
+ if has_su_
88
+ conn_.execute("GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA #{postgis_schema_} TO #{username_}")
89
+ conn_.execute("GRANT ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA #{postgis_schema_} TO #{username_}")
90
+ end
63
91
  end
92
+
93
+ # Done
64
94
  ::ActiveRecord::Base.establish_connection(config_)
65
95
  rescue ::Exception => e_
66
96
  $stderr.puts(e_, *(e_.backtrace))
@@ -74,7 +104,7 @@ end
74
104
 
75
105
  def drop_database(config_)
76
106
  if config_['adapter'] == 'postgis'
77
- ::ActiveRecord::Base.establish_connection(config_.merge('database' => 'postgres', 'schema_search_path' => 'public'))
107
+ ::ActiveRecord::Base.establish_connection(config_.merge('database' => 'postgres', 'schema_search_path' => 'public', 'username' => config_['su_username'] || config_['username'], 'password' => config_['su_password'] || config_['password']))
78
108
  ::ActiveRecord::Base.connection.drop_database(config_['database'])
79
109
  else
80
110
  drop_database_without_postgis(config_)
metadata CHANGED
@@ -1,12 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activerecord-postgis-adapter
3
3
  version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 0
7
- - 3
8
- - 1
9
- version: 0.3.1
4
+ prerelease:
5
+ version: 0.3.2
10
6
  platform: ruby
11
7
  authors:
12
8
  - Daniel Azuma
@@ -14,7 +10,7 @@ autorequire:
14
10
  bindir: bin
15
11
  cert_chain: []
16
12
 
17
- date: 2011-02-01 00:00:00 -08:00
13
+ date: 2011-02-10 00:00:00 -08:00
18
14
  default_executable:
19
15
  dependencies:
20
16
  - !ruby/object:Gem::Dependency
@@ -25,10 +21,6 @@ dependencies:
25
21
  requirements:
26
22
  - - ~>
27
23
  - !ruby/object:Gem::Version
28
- segments:
29
- - 0
30
- - 3
31
- - 0
32
24
  version: 0.3.0
33
25
  type: :runtime
34
26
  version_requirements: *id001
@@ -40,10 +32,6 @@ dependencies:
40
32
  requirements:
41
33
  - - ">="
42
34
  - !ruby/object:Gem::Version
43
- segments:
44
- - 0
45
- - 10
46
- - 0
47
35
  version: 0.10.0
48
36
  type: :runtime
49
37
  version_requirements: *id002
@@ -86,23 +74,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
86
74
  requirements:
87
75
  - - ">="
88
76
  - !ruby/object:Gem::Version
89
- segments:
90
- - 1
91
- - 8
92
- - 7
93
77
  version: 1.8.7
94
78
  required_rubygems_version: !ruby/object:Gem::Requirement
95
79
  none: false
96
80
  requirements:
97
81
  - - ">="
98
82
  - !ruby/object:Gem::Version
99
- segments:
100
- - 0
101
83
  version: "0"
102
84
  requirements: []
103
85
 
104
86
  rubyforge_project: virtuoso
105
- rubygems_version: 1.3.7
87
+ rubygems_version: 1.5.2
106
88
  signing_key:
107
89
  specification_version: 3
108
90
  summary: An ActiveRecord adapter for PostGIS, based on RGeo.