From 3e18c51695afb2dc8ec0d87eabee41d13899acfd Mon Sep 17 00:00:00 2001 From: Gabriel Ebner Date: Thu, 30 Aug 2007 17:23:34 +0000 Subject: [PATCH] rails_port_0.5: 006_remove_segments: - Don't run the helper if there are no segments. - s/DELETE FROM/TRUNCATE/ --- db/migrate/006_remove_segments.rb | 84 +++++++++++++++++-------------- 1 file changed, 46 insertions(+), 38 deletions(-) diff --git a/db/migrate/006_remove_segments.rb b/db/migrate/006_remove_segments.rb index 76a3161d1..de9557cc9 100644 --- a/db/migrate/006_remove_segments.rb +++ b/db/migrate/006_remove_segments.rb @@ -2,26 +2,30 @@ require 'lib/migrate' class RemoveSegments < ActiveRecord::Migration def self.up - prefix = File.join Dir.tmpdir, "006_remove_segments.#{$$}." - - cmd = "db/migrate/006_remove_segments_helper" - 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 + have_segs = select_value("SELECT count(*) FROM current_segments").to_i != 0 + + if have_segs + prefix = File.join Dir.tmpdir, "006_remove_segments.#{$$}." + + cmd = "db/migrate/006_remove_segments_helper" + 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 - 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 :way_segments create_table :way_nodes, myisam_table do |t| @@ -41,38 +45,42 @@ class RemoveSegments < ActiveRecord::Migration end add_primary_key :current_way_nodes, [:id, :sequence_id] - execute "DELETE FROM way_tags" - execute "DELETE FROM ways" - execute "DELETE FROM current_way_tags" - execute "DELETE FROM current_ways" + execute "TRUNCATE way_tags" + execute "TRUNCATE ways" + execute "TRUNCATE current_way_tags" + execute "TRUNCATE current_ways" # now get the data back 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" - 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" + if have_segs + 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_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_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_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_tags SELECT id, k, v FROM way_tags" + end # and then readd the index 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" - 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" + if have_segs + 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_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 - # migration! - 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_tags SELECT id, k, v FROM relation_tags" + # FIXME: This will only work if there were no relations before the + # migration! + 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_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 def self.down -- 2.43.2