rails_port_0.5: 006_remove_segments:

- Don't run the helper if there are no segments.
- s/DELETE FROM/TRUNCATE/
This commit is contained in:
Gabriel Ebner 2007-08-30 17:23:34 +00:00
parent 8947ff2181
commit 3e18c51695

View file

@ -2,26 +2,30 @@ require 'lib/migrate'
class RemoveSegments < ActiveRecord::Migration class RemoveSegments < ActiveRecord::Migration
def self.up def self.up
prefix = File.join Dir.tmpdir, "006_remove_segments.#{$$}." have_segs = select_value("SELECT count(*) FROM current_segments").to_i != 0
cmd = "db/migrate/006_remove_segments_helper" if have_segs
src = "#{cmd}.cc" prefix = File.join Dir.tmpdir, "006_remove_segments.#{$$}."
if not File.exists? cmd or File.mtime(cmd) < File.mtime(src) then
system 'c++ -O3 -Wall `mysql_config --cflags --libs` ' + cmd = "db/migrate/006_remove_segments_helper"
"#{src} -o #{cmd}" or fail src = "#{cmd}.cc"
if not File.exists? cmd or File.mtime(cmd) < File.mtime(src) then
system 'c++ -O3 -Wall `mysql_config --cflags --libs` ' +
"#{src} -o #{cmd}" or fail
end
conn_opts = ActiveRecord::Base.connection.
instance_eval { @connection_options }
args = conn_opts.map { |arg| arg.to_s } + [prefix]
fail "#{cmd} failed" unless system cmd, *args
tempfiles = ['ways', 'way_nodes', 'way_tags',
'relations', 'relation_members', 'relation_tags'].
map { |base| prefix + base }
ways, way_nodes, way_tags,
relations, relation_members, relation_tags = tempfiles
end end
conn_opts = ActiveRecord::Base.connection.
instance_eval { @connection_options }
args = conn_opts.map { |arg| arg.to_s } + [prefix]
fail "#{cmd} failed" unless system cmd, *args
tempfiles = ['ways', 'way_nodes', 'way_tags',
'relations', 'relation_members', 'relation_tags'].
map { |base| prefix + base }
ways, way_nodes, way_tags,
relations, relation_members, relation_tags = tempfiles
drop_table :segments drop_table :segments
drop_table :way_segments drop_table :way_segments
create_table :way_nodes, myisam_table do |t| create_table :way_nodes, myisam_table do |t|
@ -41,38 +45,42 @@ class RemoveSegments < ActiveRecord::Migration
end end
add_primary_key :current_way_nodes, [:id, :sequence_id] add_primary_key :current_way_nodes, [:id, :sequence_id]
execute "DELETE FROM way_tags" execute "TRUNCATE way_tags"
execute "DELETE FROM ways" execute "TRUNCATE ways"
execute "DELETE FROM current_way_tags" execute "TRUNCATE current_way_tags"
execute "DELETE FROM current_ways" execute "TRUNCATE current_ways"
# now get the data back # now get the data back
csvopts = "FIELDS TERMINATED BY ',' ENCLOSED BY '\"' ESCAPED BY '\"' LINES TERMINATED BY '\\n'" csvopts = "FIELDS TERMINATED BY ',' ENCLOSED BY '\"' ESCAPED BY '\"' LINES TERMINATED BY '\\n'"
tempfiles.each { |fn| File.chmod 0644, fn } tempfiles.each { |fn| File.chmod 0644, fn } if have_segs
execute "LOAD DATA LOCAL INFILE '#{ways}' INTO TABLE ways #{csvopts} (id, user_id, timestamp) SET visible = 1, version = 1" if have_segs
execute "LOAD DATA LOCAL INFILE '#{way_nodes}' INTO TABLE way_nodes #{csvopts} (id, node_id, sequence_id) SET version = 1" execute "LOAD DATA LOCAL INFILE '#{ways}' INTO TABLE ways #{csvopts} (id, user_id, timestamp) SET visible = 1, version = 1"
execute "LOAD DATA LOCAL INFILE '#{way_tags}' INTO TABLE way_tags #{csvopts} (id, k, v) SET version = 1" execute "LOAD DATA LOCAL INFILE '#{way_nodes}' INTO TABLE way_nodes #{csvopts} (id, node_id, sequence_id) SET version = 1"
execute "LOAD DATA LOCAL INFILE '#{way_tags}' INTO TABLE way_tags #{csvopts} (id, k, v) SET version = 1"
execute "INSERT INTO current_ways SELECT id, user_id, timestamp, visible FROM ways" execute "INSERT INTO current_ways SELECT id, user_id, timestamp, visible FROM ways"
execute "INSERT INTO current_way_nodes SELECT id, node_id, sequence_id FROM way_nodes" execute "INSERT INTO current_way_nodes SELECT id, node_id, sequence_id FROM way_nodes"
execute "INSERT INTO current_way_tags SELECT id, k, v FROM way_tags" execute "INSERT INTO current_way_tags SELECT id, k, v FROM way_tags"
end
# and then readd the index # and then readd the index
add_index :current_way_nodes, [:node_id], :name => "current_way_nodes_node_idx" add_index :current_way_nodes, [:node_id], :name => "current_way_nodes_node_idx"
execute "LOAD DATA LOCAL INFILE '#{relations}' INTO TABLE relations #{csvopts} (id, user_id, timestamp) SET visible = 1, version = 1" if have_segs
execute "LOAD DATA LOCAL INFILE '#{relation_members}' INTO TABLE relation_members #{csvopts} (id, member_type, member_id, member_role) SET version = 1" execute "LOAD DATA LOCAL INFILE '#{relations}' INTO TABLE relations #{csvopts} (id, user_id, timestamp) SET visible = 1, version = 1"
execute "LOAD DATA LOCAL INFILE '#{relation_tags}' INTO TABLE relation_tags #{csvopts} (id, k, v) SET version = 1" execute "LOAD DATA LOCAL INFILE '#{relation_members}' INTO TABLE relation_members #{csvopts} (id, member_type, member_id, member_role) SET version = 1"
execute "LOAD DATA LOCAL INFILE '#{relation_tags}' INTO TABLE relation_tags #{csvopts} (id, k, v) SET version = 1"
# FIXME: This will only work if there were no relations before the # FIXME: This will only work if there were no relations before the
# migration! # migration!
execute "INSERT INTO current_relations SELECT id, user_id, timestamp, visible FROM relations" execute "INSERT INTO current_relations SELECT id, user_id, timestamp, visible FROM relations"
execute "INSERT INTO current_relation_members SELECT id, member_type, member_id, member_role FROM relation_members" execute "INSERT INTO current_relation_members SELECT id, member_type, member_id, member_role FROM relation_members"
execute "INSERT INTO current_relation_tags SELECT id, k, v FROM relation_tags" execute "INSERT INTO current_relation_tags SELECT id, k, v FROM relation_tags"
end
tempfiles.each { |fn| File.unlink fn } tempfiles.each { |fn| File.unlink fn } if have_segs
end end
def self.down def self.down