]> git.openstreetmap.org Git - rails.git/blob - db/migrate/020_populate_node_tags_and_remove.rb
Update to rails 6.0.3.7
[rails.git] / db / migrate / 020_populate_node_tags_and_remove.rb
1 class PopulateNodeTagsAndRemove < ActiveRecord::Migration[4.2]
2   def self.up
3     have_nodes = select_value("SELECT count(*) FROM current_nodes").to_i.nonzero?
4
5     if have_nodes
6       prefix = File.join Dir.tmpdir, "020_populate_node_tags_and_remove.#{$PROCESS_ID}."
7
8       cmd = "db/migrate/020_populate_node_tags_and_remove_helper"
9       src = "#{cmd}.c"
10       if !File.exist?(cmd) || File.mtime(cmd) < File.mtime(src)
11         system("cc -O3 -Wall `mysql_config --cflags --libs` " \
12           "#{src} -o #{cmd}") || raise
13       end
14
15       conn_opts = ApplicationRecord.connection.instance_eval { @connection_options }
16       args = conn_opts.map(&:to_s) + [prefix]
17       raise "#{cmd} failed" unless system cmd, *args
18
19       tempfiles = %w[nodes node_tags current_nodes current_node_tags]
20                   .map { |base| prefix + base }
21       nodes, node_tags, current_nodes, current_node_tags = tempfiles
22     end
23
24     execute "TRUNCATE nodes"
25     remove_column :nodes, :tags
26     remove_column :current_nodes, :tags
27
28     add_column :nodes, :version, :bigint, :null => false
29
30     create_table :current_node_tags, :id => false do |t|
31       t.column :id,          :bigint, :null => false
32       t.column :k,           :string, :default => "", :null => false
33       t.column :v,           :string, :default => "", :null => false
34     end
35
36     create_table :node_tags, :id => false do |t|
37       t.column :id,          :bigint, :null => false
38       t.column :version,     :bigint, :null => false
39       t.column :k,           :string, :default => "", :null => false
40       t.column :v,           :string, :default => "", :null => false
41     end
42
43     # now get the data back
44     csvopts = "FIELDS TERMINATED BY ',' ENCLOSED BY '\"' ESCAPED BY '\"' LINES TERMINATED BY '\\n'"
45
46     if have_nodes
47       execute "LOAD DATA INFILE '#{nodes}' INTO TABLE nodes #{csvopts} (id, latitude, longitude, user_id, visible, timestamp, tile, version)"
48       execute "LOAD DATA INFILE '#{node_tags}' INTO TABLE node_tags #{csvopts} (id, version, k, v)"
49       execute "LOAD DATA INFILE '#{current_nodes}' INTO TABLE current_nodes #{csvopts} (id, latitude, longitude, user_id, visible, timestamp, tile)"
50       execute "LOAD DATA INFILE '#{current_node_tags}' INTO TABLE current_node_tags #{csvopts} (id, k, v)"
51     end
52
53     tempfiles.each { |fn| File.unlink fn } if have_nodes
54   end
55
56   def self.down
57     raise ActiveRecord::IrreversibleMigration
58     #    add_column :nodes, "tags", :text, :default => "", :null => false
59     #    add_column :current_nodes, "tags", :text, :default => "", :null => false
60   end
61 end