mirror of
https://github.com/discourse/discourse.git
synced 2025-03-25 06:55:37 +08:00
REFACTOR: move remap out of script into a class
This commit is contained in:
parent
7b089f7af4
commit
ac3b0f0164
43
lib/remap.rb
Normal file
43
lib/remap.rb
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
class Remap
|
||||||
|
def initialize(from, to, regex: false, verbose: false)
|
||||||
|
@from = from
|
||||||
|
@to = to
|
||||||
|
@regex = regex
|
||||||
|
@verbose = verbose
|
||||||
|
end
|
||||||
|
|
||||||
|
def perform
|
||||||
|
sql = "SELECT table_name, column_name
|
||||||
|
FROM information_schema.columns
|
||||||
|
WHERE table_schema='public' and (data_type like 'char%' or data_type like 'text%') and is_updatable = 'YES'"
|
||||||
|
|
||||||
|
cnn = ActiveRecord::Base.connection.raw_connection
|
||||||
|
|
||||||
|
results = cnn.async_exec(sql).to_a
|
||||||
|
|
||||||
|
results.each do |result|
|
||||||
|
table_name = result["table_name"]
|
||||||
|
column_name = result["column_name"]
|
||||||
|
|
||||||
|
log "Remapping #{table_name} #{column_name}"
|
||||||
|
|
||||||
|
result = if @regex
|
||||||
|
cnn.async_exec("UPDATE #{table_name}
|
||||||
|
SET #{column_name} = regexp_replace(#{column_name}, $1, $2, 'g')
|
||||||
|
WHERE NOT #{column_name} IS NULL
|
||||||
|
AND #{column_name} <> regexp_replace(#{column_name}, $1, $2, 'g')", [@from, @to])
|
||||||
|
else
|
||||||
|
cnn.async_exec("UPDATE #{table_name}
|
||||||
|
SET #{column_name} = replace(#{column_name}, $1, $2)
|
||||||
|
WHERE NOT #{column_name} IS NULL
|
||||||
|
AND #{column_name} <> replace(#{column_name}, $1, $2)", [@from, @to])
|
||||||
|
end
|
||||||
|
|
||||||
|
log "#{result.cmd_tuples} rows affected!"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def log(message)
|
||||||
|
puts(message) if @verbose
|
||||||
|
end
|
||||||
|
end
|
@ -30,6 +30,7 @@ class DiscourseCLI < Thor
|
|||||||
option :regex, type: :boolean
|
option :regex, type: :boolean
|
||||||
def remap(from, to)
|
def remap(from, to)
|
||||||
load_rails
|
load_rails
|
||||||
|
require 'remap'
|
||||||
|
|
||||||
if options[:regex]
|
if options[:regex]
|
||||||
puts "Rewriting all occurences of #{from} to #{to} using regexp_replace"
|
puts "Rewriting all occurences of #{from} to #{to} using regexp_replace"
|
||||||
@ -237,36 +238,13 @@ class DiscourseCLI < Thor
|
|||||||
end
|
end
|
||||||
|
|
||||||
def do_remap(from, to, regex = false)
|
def do_remap(from, to, regex = false)
|
||||||
sql = "SELECT table_name, column_name
|
begin
|
||||||
FROM information_schema.columns
|
Remap.new(from, to, regex: regex, verbose: true).perform
|
||||||
WHERE table_schema='public' and (data_type like 'char%' or data_type like 'text%') and is_updatable = 'YES'"
|
puts 'Done', ''
|
||||||
|
rescue => ex
|
||||||
cnn = ActiveRecord::Base.connection.raw_connection
|
puts "Error: #{ex}"
|
||||||
|
puts "The remap has only been partially applied due to the error above. Please re-run the script again."
|
||||||
results = cnn.async_exec(sql).to_a
|
exit(1)
|
||||||
|
|
||||||
results.each do |result|
|
|
||||||
table_name = result["table_name"]
|
|
||||||
column_name = result["column_name"]
|
|
||||||
puts "Remapping #{table_name} #{column_name}"
|
|
||||||
begin
|
|
||||||
result = if regex
|
|
||||||
cnn.async_exec("UPDATE #{table_name}
|
|
||||||
SET #{column_name} = regexp_replace(#{column_name}, $1, $2, 'g')
|
|
||||||
WHERE NOT #{column_name} IS NULL
|
|
||||||
AND #{column_name} <> regexp_replace(#{column_name}, $1, $2, 'g')", [from, to])
|
|
||||||
else
|
|
||||||
cnn.async_exec("UPDATE #{table_name}
|
|
||||||
SET #{column_name} = replace(#{column_name}, $1, $2)
|
|
||||||
WHERE NOT #{column_name} IS NULL
|
|
||||||
AND #{column_name} <> replace(#{column_name}, $1, $2)", [from, to])
|
|
||||||
end
|
|
||||||
puts "#{result.cmd_tuples} rows affected!"
|
|
||||||
rescue => ex
|
|
||||||
puts "Error: #{ex}"
|
|
||||||
puts "The remap has only been partially applied due to the error above. Please re-run the script again."
|
|
||||||
exit(1)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user