beh_spatial_adapter 1.1.2
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.
- data/MIT-LICENSE +20 -0
- data/README.rdoc +201 -0
- data/VERSION +1 -0
- data/lib/spatial_adapter.rb +41 -0
- data/lib/spatial_adapter/common/raw_geom_info.rb +23 -0
- data/lib/spatial_adapter/common/schema_definitions.rb +10 -0
- data/lib/spatial_adapter/common/schema_dumper.rb +144 -0
- data/lib/spatial_adapter/common/spatial_column.rb +70 -0
- data/lib/spatial_adapter/common/table_definition.rb +14 -0
- data/lib/spatial_adapter/mysql.rb +102 -0
- data/lib/spatial_adapter/oracle_enhanced.rb +651 -0
- data/lib/spatial_adapter/postgresql.rb +395 -0
- data/lib/spatial_adapter/railtie.rb +13 -0
- data/rails/init.rb +16 -0
- data/spec/README.txt +16 -0
- data/spec/db/mysql_raw.rb +70 -0
- data/spec/db/postgis_raw.rb +190 -0
- data/spec/models/common.rb +65 -0
- data/spec/mysql/connection_adapter_spec.rb +106 -0
- data/spec/mysql/migration_spec.rb +64 -0
- data/spec/mysql/models_spec.rb +66 -0
- data/spec/mysql/schema_dumper_spec.rb +56 -0
- data/spec/postgresql/connection_adapter_spec.rb +227 -0
- data/spec/postgresql/migration_spec.rb +365 -0
- data/spec/postgresql/models_spec.rb +222 -0
- data/spec/postgresql/schema_dumper_spec.rb +79 -0
- data/spec/spec_helper.rb +97 -0
- metadata +120 -0
@@ -0,0 +1,395 @@
|
|
1
|
+
require 'spatial_adapter'
|
2
|
+
require 'active_record/connection_adapters/postgresql_adapter'
|
3
|
+
|
4
|
+
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.class_eval do
|
5
|
+
include SpatialAdapter
|
6
|
+
|
7
|
+
def postgis_version
|
8
|
+
begin
|
9
|
+
select_value("SELECT postgis_full_version()").scan(/POSTGIS="([\d\.]*)"/)[0][0]
|
10
|
+
rescue ActiveRecord::StatementInvalid
|
11
|
+
nil
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def postgis_major_version
|
16
|
+
version = postgis_version
|
17
|
+
version ? version.scan(/^(\d)\.\d\.\d$/)[0][0].to_i : nil
|
18
|
+
end
|
19
|
+
|
20
|
+
def postgis_minor_version
|
21
|
+
version = postgis_version
|
22
|
+
version ? version.scan(/^\d\.(\d)\.\d$/)[0][0].to_i : nil
|
23
|
+
end
|
24
|
+
|
25
|
+
def spatial?
|
26
|
+
!postgis_version.nil?
|
27
|
+
end
|
28
|
+
|
29
|
+
def supports_geographic?
|
30
|
+
postgis_major_version > 1 || (postgis_major_version == 1 && postgis_minor_version >= 5)
|
31
|
+
end
|
32
|
+
|
33
|
+
def default_srid
|
34
|
+
4326
|
35
|
+
end
|
36
|
+
|
37
|
+
alias :original_native_database_types :native_database_types
|
38
|
+
def native_database_types
|
39
|
+
original_native_database_types.merge!(geometry_data_types)
|
40
|
+
end
|
41
|
+
|
42
|
+
alias :original_quote :quote
|
43
|
+
#Redefines the quote method to add behaviour for when a Geometry is encountered
|
44
|
+
def quote(value, column = nil)
|
45
|
+
if value.kind_of?(GeoRuby::SimpleFeatures::Geometry)
|
46
|
+
"'#{value.as_hex_ewkb}'"
|
47
|
+
else
|
48
|
+
original_quote(value,column)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def columns(table_name, name = nil) #:nodoc:
|
53
|
+
raw_geom_infos = column_spatial_info(table_name)
|
54
|
+
|
55
|
+
column_definitions(table_name).collect do |name, type, default, notnull|
|
56
|
+
case type
|
57
|
+
when /geography/i
|
58
|
+
ActiveRecord::ConnectionAdapters::SpatialPostgreSQLColumn.create_from_geography(name, default, type, notnull == 'f')
|
59
|
+
when /geometry/i
|
60
|
+
raw_geom_info = raw_geom_infos[name]
|
61
|
+
if raw_geom_info.nil?
|
62
|
+
# This column isn't in the geometry_columns table, so we don't know anything else about it
|
63
|
+
ActiveRecord::ConnectionAdapters::SpatialPostgreSQLColumn.create_simplified(name, default, notnull == "f")
|
64
|
+
else
|
65
|
+
ActiveRecord::ConnectionAdapters::SpatialPostgreSQLColumn.new(name, default, raw_geom_info.type, notnull == "f", raw_geom_info.srid, raw_geom_info.with_z, raw_geom_info.with_m)
|
66
|
+
end
|
67
|
+
else
|
68
|
+
ActiveRecord::ConnectionAdapters::PostgreSQLColumn.new(name, default, type, notnull == "f")
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def create_table(table_name, options = {})
|
74
|
+
# Using the subclassed table definition
|
75
|
+
table_definition = ActiveRecord::ConnectionAdapters::PostgreSQLTableDefinition.new(self)
|
76
|
+
table_definition.primary_key(options[:primary_key] || ActiveRecord::Base.get_primary_key(table_name.to_s.singularize)) unless options[:id] == false
|
77
|
+
|
78
|
+
yield table_definition if block_given?
|
79
|
+
|
80
|
+
if options[:force] && table_exists?(table_name)
|
81
|
+
drop_table(table_name, options)
|
82
|
+
end
|
83
|
+
|
84
|
+
create_sql = "CREATE#{' TEMPORARY' if options[:temporary]} TABLE "
|
85
|
+
create_sql << "#{quote_table_name(table_name)} ("
|
86
|
+
create_sql << table_definition.to_sql
|
87
|
+
create_sql << ") #{options[:options]}"
|
88
|
+
|
89
|
+
# This is the additional portion for PostGIS
|
90
|
+
unless table_definition.geom_columns.nil?
|
91
|
+
table_definition.geom_columns.each do |geom_column|
|
92
|
+
geom_column.table_name = table_name
|
93
|
+
create_sql << "; " + geom_column.to_sql
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
execute create_sql
|
98
|
+
end
|
99
|
+
|
100
|
+
alias :original_remove_column :remove_column
|
101
|
+
def remove_column(table_name, *column_names)
|
102
|
+
column_names = column_names.flatten.map {|c| c.to_sym}
|
103
|
+
columns(table_name).each do |col|
|
104
|
+
if column_names.include?(col.name.to_sym)
|
105
|
+
# Geometry columns have to be removed using DropGeometryColumn
|
106
|
+
if col.is_a?(SpatialColumn) && col.spatial? && !col.geographic?
|
107
|
+
execute "SELECT DropGeometryColumn('#{table_name}','#{col.name}')"
|
108
|
+
else
|
109
|
+
original_remove_column(table_name, col.name)
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
alias :original_add_column :add_column
|
116
|
+
def add_column(table_name, column_name, type, options = {})
|
117
|
+
unless geometry_data_types[type].nil?
|
118
|
+
geom_column = ActiveRecord::ConnectionAdapters::PostgreSQLColumnDefinition.new(self, column_name, type, nil, nil, options[:null], options[:srid] || -1 , options[:with_z] || false , options[:with_m] || false, options[:geographic] || false)
|
119
|
+
if geom_column.geographic
|
120
|
+
default = options[:default]
|
121
|
+
notnull = options[:null] == false
|
122
|
+
|
123
|
+
execute("ALTER TABLE #{quote_table_name(table_name)} ADD COLUMN #{geom_column.to_sql}")
|
124
|
+
|
125
|
+
change_column_default(table_name, column_name, default) if options_include_default?(options)
|
126
|
+
change_column_null(table_name, column_name, false, default) if notnull
|
127
|
+
else
|
128
|
+
geom_column.table_name = table_name
|
129
|
+
execute geom_column.to_sql
|
130
|
+
end
|
131
|
+
else
|
132
|
+
original_add_column(table_name, column_name, type, options)
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
# Adds an index to a column.
|
137
|
+
def add_index(table_name, column_name, options = {})
|
138
|
+
column_names = Array(column_name)
|
139
|
+
index_name = index_name(table_name, :column => column_names)
|
140
|
+
|
141
|
+
if Hash === options # legacy support, since this param was a string
|
142
|
+
index_type = options[:unique] ? "UNIQUE" : ""
|
143
|
+
index_name = options[:name] || index_name
|
144
|
+
index_method = options[:spatial] ? 'USING GIST' : ""
|
145
|
+
else
|
146
|
+
index_type = options
|
147
|
+
end
|
148
|
+
quoted_column_names = column_names.map { |e| quote_column_name(e) }.join(", ")
|
149
|
+
execute "CREATE #{index_type} INDEX #{quote_column_name(index_name)} ON #{quote_table_name(table_name)} #{index_method} (#{quoted_column_names})"
|
150
|
+
end
|
151
|
+
|
152
|
+
# Returns the list of all indexes for a table.
|
153
|
+
#
|
154
|
+
# This is a full replacement for the ActiveRecord method and as a result
|
155
|
+
# has a higher probability of breaking in future releases.
|
156
|
+
def indexes(table_name, name = nil)
|
157
|
+
schemas = schema_search_path.split(/,/).map { |p| quote(p) }.join(',')
|
158
|
+
|
159
|
+
# Changed from upstread: link to pg_am to grab the index type (e.g. "gist")
|
160
|
+
result = query(<<-SQL, name)
|
161
|
+
SELECT distinct i.relname, d.indisunique, d.indkey, t.oid, am.amname
|
162
|
+
FROM pg_class t, pg_class i, pg_index d, pg_attribute a, pg_am am
|
163
|
+
WHERE i.relkind = 'i'
|
164
|
+
AND d.indexrelid = i.oid
|
165
|
+
AND d.indisprimary = 'f'
|
166
|
+
AND t.oid = d.indrelid
|
167
|
+
AND t.relname = '#{table_name}'
|
168
|
+
AND i.relnamespace IN (SELECT oid FROM pg_namespace WHERE nspname IN (#{schemas}) )
|
169
|
+
AND i.relam = am.oid
|
170
|
+
AND a.attrelid = t.oid
|
171
|
+
ORDER BY i.relname
|
172
|
+
SQL
|
173
|
+
|
174
|
+
|
175
|
+
indexes = []
|
176
|
+
|
177
|
+
indexes = result.map do |row|
|
178
|
+
index_name = row[0]
|
179
|
+
unique = row[1] == 't'
|
180
|
+
indkey = row[2].split(" ")
|
181
|
+
oid = row[3]
|
182
|
+
indtype = row[4]
|
183
|
+
|
184
|
+
# Changed from upstream: need to get the column types to test for spatial indexes
|
185
|
+
columns = query(<<-SQL, "Columns for index #{row[0]} on #{table_name}").inject({}) {|attlist, r| attlist[r[1]] = [r[0], r[2]]; attlist}
|
186
|
+
SELECT a.attname, a.attnum, t.typname
|
187
|
+
FROM pg_attribute a, pg_type t
|
188
|
+
WHERE a.attrelid = #{oid}
|
189
|
+
AND a.attnum IN (#{indkey.join(",")})
|
190
|
+
AND a.atttypid = t.oid
|
191
|
+
SQL
|
192
|
+
|
193
|
+
# Only GiST indexes on spatial columns denote a spatial index
|
194
|
+
spatial = indtype == 'gist' && columns.size == 1 && (columns.values.first[1] == 'geometry' || columns.values.first[1] == 'geography')
|
195
|
+
|
196
|
+
column_names = indkey.map {|attnum| columns[attnum] ? columns[attnum][0] : nil }
|
197
|
+
ActiveRecord::ConnectionAdapters::IndexDefinition.new(table_name, index_name, unique, column_names, spatial)
|
198
|
+
end
|
199
|
+
|
200
|
+
indexes
|
201
|
+
end
|
202
|
+
|
203
|
+
def disable_referential_integrity(&block) #:nodoc:
|
204
|
+
if supports_disable_referential_integrity?() then
|
205
|
+
execute(tables_without_postgis.collect { |name| "ALTER TABLE #{quote_table_name(name)} DISABLE TRIGGER ALL" }.join(";"))
|
206
|
+
end
|
207
|
+
yield
|
208
|
+
ensure
|
209
|
+
if supports_disable_referential_integrity?() then
|
210
|
+
execute(tables_without_postgis.collect { |name| "ALTER TABLE #{quote_table_name(name)} ENABLE TRIGGER ALL" }.join(";"))
|
211
|
+
end
|
212
|
+
end
|
213
|
+
|
214
|
+
private
|
215
|
+
|
216
|
+
def tables_without_postgis
|
217
|
+
tables - %w{ geometry_columns spatial_ref_sys }
|
218
|
+
end
|
219
|
+
|
220
|
+
def column_spatial_info(table_name)
|
221
|
+
constr = query("SELECT * FROM geometry_columns WHERE f_table_name = '#{table_name}'")
|
222
|
+
|
223
|
+
raw_geom_infos = {}
|
224
|
+
constr.each do |constr_def_a|
|
225
|
+
raw_geom_infos[constr_def_a[3]] ||= SpatialAdapter::RawGeomInfo.new
|
226
|
+
raw_geom_infos[constr_def_a[3]].type = constr_def_a[6]
|
227
|
+
raw_geom_infos[constr_def_a[3]].dimension = constr_def_a[4].to_i
|
228
|
+
raw_geom_infos[constr_def_a[3]].srid = constr_def_a[5].to_i
|
229
|
+
|
230
|
+
if raw_geom_infos[constr_def_a[3]].type[-1] == ?M
|
231
|
+
raw_geom_infos[constr_def_a[3]].with_m = true
|
232
|
+
raw_geom_infos[constr_def_a[3]].type.chop!
|
233
|
+
else
|
234
|
+
raw_geom_infos[constr_def_a[3]].with_m = false
|
235
|
+
end
|
236
|
+
end
|
237
|
+
|
238
|
+
raw_geom_infos.each_value do |raw_geom_info|
|
239
|
+
#check the presence of z and m
|
240
|
+
raw_geom_info.convert!
|
241
|
+
end
|
242
|
+
|
243
|
+
raw_geom_infos
|
244
|
+
|
245
|
+
end
|
246
|
+
|
247
|
+
end
|
248
|
+
|
249
|
+
module ActiveRecord
|
250
|
+
module ConnectionAdapters
|
251
|
+
class PostgreSQLTableDefinition < TableDefinition
|
252
|
+
attr_reader :geom_columns
|
253
|
+
|
254
|
+
def column(name, type, options = {})
|
255
|
+
unless (@base.geometry_data_types[type.to_sym].nil? or
|
256
|
+
(options[:create_using_addgeometrycolumn] == false))
|
257
|
+
|
258
|
+
column = self[name] || PostgreSQLColumnDefinition.new(@base, name, type)
|
259
|
+
column.null = options[:null]
|
260
|
+
srid = options[:srid] || -1
|
261
|
+
srid = @base.default_srid if srid == :default_srid
|
262
|
+
column.srid = srid
|
263
|
+
column.with_z = options[:with_z] || false
|
264
|
+
column.with_m = options[:with_m] || false
|
265
|
+
column.geographic = options[:geographic] || false
|
266
|
+
|
267
|
+
if column.geographic
|
268
|
+
@columns << column unless @columns.include? column
|
269
|
+
else
|
270
|
+
# Hold this column for later
|
271
|
+
@geom_columns ||= []
|
272
|
+
@geom_columns << column
|
273
|
+
end
|
274
|
+
self
|
275
|
+
else
|
276
|
+
super(name, type, options)
|
277
|
+
end
|
278
|
+
end
|
279
|
+
end
|
280
|
+
|
281
|
+
class PostgreSQLColumnDefinition < ColumnDefinition
|
282
|
+
attr_accessor :table_name
|
283
|
+
attr_accessor :srid, :with_z, :with_m, :geographic
|
284
|
+
attr_reader :spatial
|
285
|
+
|
286
|
+
def initialize(base = nil, name = nil, type=nil, limit=nil, default=nil, null=nil, srid=-1, with_z=false, with_m=false, geographic=false)
|
287
|
+
super(base, name, type, limit, default, null)
|
288
|
+
@table_name = nil
|
289
|
+
@spatial = true
|
290
|
+
@srid = srid
|
291
|
+
@with_z = with_z
|
292
|
+
@with_m = with_m
|
293
|
+
@geographic = geographic
|
294
|
+
end
|
295
|
+
|
296
|
+
def sql_type
|
297
|
+
if geographic
|
298
|
+
type_sql = base.geometry_data_types[type.to_sym][:name]
|
299
|
+
type_sql += "Z" if with_z
|
300
|
+
type_sql += "M" if with_m
|
301
|
+
# SRID is not yet supported (defaults to 4326)
|
302
|
+
#type_sql += ", #{srid}" if (srid && srid != -1)
|
303
|
+
type_sql = "geography(#{type_sql})"
|
304
|
+
type_sql
|
305
|
+
else
|
306
|
+
super
|
307
|
+
end
|
308
|
+
end
|
309
|
+
|
310
|
+
def to_sql
|
311
|
+
if spatial && !geographic
|
312
|
+
type_sql = base.geometry_data_types[type.to_sym][:name]
|
313
|
+
type_sql += "M" if with_m and !with_z
|
314
|
+
if with_m and with_z
|
315
|
+
dimension = 4
|
316
|
+
elsif with_m or with_z
|
317
|
+
dimension = 3
|
318
|
+
else
|
319
|
+
dimension = 2
|
320
|
+
end
|
321
|
+
|
322
|
+
column_sql = "SELECT AddGeometryColumn('#{table_name}','#{name}',#{srid},'#{type_sql}',#{dimension})"
|
323
|
+
column_sql += ";ALTER TABLE #{table_name} ALTER #{name} SET NOT NULL" if null == false
|
324
|
+
column_sql
|
325
|
+
else
|
326
|
+
super
|
327
|
+
end
|
328
|
+
end
|
329
|
+
end
|
330
|
+
end
|
331
|
+
end
|
332
|
+
|
333
|
+
module ActiveRecord
|
334
|
+
module ConnectionAdapters
|
335
|
+
class SpatialPostgreSQLColumn < PostgreSQLColumn
|
336
|
+
include SpatialAdapter::SpatialColumn
|
337
|
+
|
338
|
+
def initialize(name, default, sql_type = nil, null = true, srid=-1, with_z=false, with_m=false, geographic = false)
|
339
|
+
super(name, default, sql_type, null, srid, with_z, with_m)
|
340
|
+
@geographic = geographic
|
341
|
+
end
|
342
|
+
|
343
|
+
def geographic?
|
344
|
+
@geographic
|
345
|
+
end
|
346
|
+
|
347
|
+
#Transforms a string to a geometry. PostGIS returns a HewEWKB string.
|
348
|
+
def self.string_to_geometry(string)
|
349
|
+
return string unless string.is_a?(String)
|
350
|
+
GeoRuby::SimpleFeatures::Geometry.from_hex_ewkb(string) rescue nil
|
351
|
+
end
|
352
|
+
|
353
|
+
def self.create_simplified(name, default, null = true)
|
354
|
+
new(name, default, "geometry", null)
|
355
|
+
end
|
356
|
+
|
357
|
+
def self.create_from_geography(name, default, sql_type, null = true)
|
358
|
+
params = extract_geography_params(sql_type)
|
359
|
+
new(name, default, sql_type, null, params[:srid], params[:with_z], params[:with_m], true)
|
360
|
+
end
|
361
|
+
|
362
|
+
private
|
363
|
+
|
364
|
+
# Add detection of PostGIS-specific geography columns
|
365
|
+
def geometry_simplified_type(sql_type)
|
366
|
+
case sql_type
|
367
|
+
when /geography\(point/i then :point
|
368
|
+
when /geography\(linestring/i then :line_string
|
369
|
+
when /geography\(polygon/i then :polygon
|
370
|
+
when /geography\(multipoint/i then :multi_point
|
371
|
+
when /geography\(multilinestring/i then :multi_line_string
|
372
|
+
when /geography\(multipolygon/i then :multi_polygon
|
373
|
+
when /geography\(geometrycollection/i then :geometry_collection
|
374
|
+
when /geography/i then :geometry
|
375
|
+
else
|
376
|
+
super
|
377
|
+
end
|
378
|
+
end
|
379
|
+
|
380
|
+
def self.extract_geography_params(sql_type)
|
381
|
+
params = {
|
382
|
+
:srid => 0,
|
383
|
+
:with_z => false,
|
384
|
+
:with_m => false
|
385
|
+
}
|
386
|
+
if sql_type =~ /geography(?:\((?:\w+?)(Z)?(M)?(?:,(\d+))?\))?/i
|
387
|
+
params[:with_z] = $1 == 'Z'
|
388
|
+
params[:with_m] = $2 == 'M'
|
389
|
+
params[:srid] = $3.to_i
|
390
|
+
end
|
391
|
+
params
|
392
|
+
end
|
393
|
+
end
|
394
|
+
end
|
395
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module SpatialAdapter
|
2
|
+
class Railtie < Rails::Railtie
|
3
|
+
initializer "spatial_adapter.load_current_database_adapter" do
|
4
|
+
adapter = ActiveRecord::Base.configurations[Rails.env]['adapter']
|
5
|
+
begin
|
6
|
+
require "spatial_adapter/#{adapter}"
|
7
|
+
rescue LoadError => e
|
8
|
+
raise SpatialAdapter::NotCompatibleError.new("spatial_adapter does not currently support the #{adapter} database.")
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
data/rails/init.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
# Rails initialization (for Rails 2.x)
|
2
|
+
#
|
3
|
+
# This will load the adapter for the currently used database configuration, if
|
4
|
+
# it exists.
|
5
|
+
|
6
|
+
begin
|
7
|
+
adapter = ActiveRecord::Base.configurations[RAILS_ENV]['adapter']
|
8
|
+
require "spatial_adapter/#{adapter}"
|
9
|
+
# Also load the adapter for the test environment. In 2.2, at least, when running db:test:prepare, the first
|
10
|
+
# connection instantiated is the RAILS_ENV one, not 'test'.
|
11
|
+
test_adapter = ActiveRecord::Base.configurations['test']['adapter']
|
12
|
+
require "spatial_adapter/#{test_adapter}"
|
13
|
+
rescue LoadError => e
|
14
|
+
puts "Caught #{e} #{e.message} #{e.backtrace.join("\n")}"
|
15
|
+
raise SpatialAdapter::NotCompatibleError.new("spatial_adapter does not currently support the #{adapter} database.")
|
16
|
+
end
|
data/spec/README.txt
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
= Running Tests
|
2
|
+
|
3
|
+
You will need to set up empty databases for each adapter you want to test.
|
4
|
+
|
5
|
+
== PostgreSQL
|
6
|
+
|
7
|
+
Create an empty database "spatial_adapter" and ensure that the PostGIS extensions are loaded.
|
8
|
+
|
9
|
+
run "rake spec:postgresql" to run the specs
|
10
|
+
|
11
|
+
== MySQL
|
12
|
+
|
13
|
+
Create an empty database "spatial_adapter" - the spatial extensions are already available.
|
14
|
+
|
15
|
+
run "rake spec:mysql" to run the specs
|
16
|
+
|
@@ -0,0 +1,70 @@
|
|
1
|
+
mysql_connection
|
2
|
+
|
3
|
+
ActiveRecord::Schema.define() do
|
4
|
+
execute "drop table if exists point_models"
|
5
|
+
execute "create table point_models
|
6
|
+
(
|
7
|
+
id int(11) DEFAULT NULL auto_increment PRIMARY KEY,
|
8
|
+
extra varchar(255),
|
9
|
+
more_extra varchar(255),
|
10
|
+
geom point not null
|
11
|
+
) ENGINE=MyISAM"
|
12
|
+
execute "create spatial index index_point_models_on_geom on point_models (geom)"
|
13
|
+
execute "create index index_point_models_on_extra on point_models (extra, more_extra)"
|
14
|
+
|
15
|
+
execute "drop table if exists line_string_models"
|
16
|
+
execute "create table line_string_models
|
17
|
+
(
|
18
|
+
id int(11) DEFAULT NULL auto_increment PRIMARY KEY,
|
19
|
+
extra varchar(255),
|
20
|
+
geom linestring
|
21
|
+
) ENGINE=MyISAM"
|
22
|
+
|
23
|
+
execute "drop table if exists polygon_models"
|
24
|
+
execute "create table polygon_models
|
25
|
+
(
|
26
|
+
id int(11) DEFAULT NULL auto_increment PRIMARY KEY,
|
27
|
+
extra varchar(255),
|
28
|
+
geom polygon
|
29
|
+
) ENGINE=MyISAM"
|
30
|
+
|
31
|
+
execute "drop table if exists multi_point_models"
|
32
|
+
execute "create table multi_point_models
|
33
|
+
(
|
34
|
+
id int(11) DEFAULT NULL auto_increment PRIMARY KEY,
|
35
|
+
extra varchar(255),
|
36
|
+
geom multipoint
|
37
|
+
) ENGINE=MyISAM"
|
38
|
+
|
39
|
+
execute "drop table if exists multi_line_string_models"
|
40
|
+
execute "create table multi_line_string_models
|
41
|
+
(
|
42
|
+
id int(11) DEFAULT NULL auto_increment PRIMARY KEY,
|
43
|
+
extra varchar(255),
|
44
|
+
geom multilinestring
|
45
|
+
) ENGINE=MyISAM"
|
46
|
+
|
47
|
+
execute "drop table if exists multi_polygon_models"
|
48
|
+
execute "create table multi_polygon_models
|
49
|
+
(
|
50
|
+
id int(11) DEFAULT NULL auto_increment PRIMARY KEY,
|
51
|
+
extra varchar(255),
|
52
|
+
geom multipolygon
|
53
|
+
) ENGINE=MyISAM"
|
54
|
+
|
55
|
+
execute "drop table if exists geometry_collection_models"
|
56
|
+
execute "create table geometry_collection_models
|
57
|
+
(
|
58
|
+
id int(11) DEFAULT NULL auto_increment PRIMARY KEY,
|
59
|
+
extra varchar(255),
|
60
|
+
geom geometrycollection
|
61
|
+
) ENGINE=MyISAM"
|
62
|
+
|
63
|
+
execute "drop table if exists geometry_models"
|
64
|
+
execute "create table geometry_models
|
65
|
+
(
|
66
|
+
id int(11) DEFAULT NULL auto_increment PRIMARY KEY,
|
67
|
+
extra varchar(255),
|
68
|
+
geom geometry
|
69
|
+
) ENGINE=MyISAM"
|
70
|
+
end
|