mirror of
https://github.com/discourse/discourse.git
synced 2025-03-09 14:34:35 +00: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
|
||||
def remap(from, to)
|
||||
load_rails
|
||||
require 'remap'
|
||||
|
||||
if options[:regex]
|
||||
puts "Rewriting all occurences of #{from} to #{to} using regexp_replace"
|
||||
@ -237,36 +238,13 @@ class DiscourseCLI < Thor
|
||||
end
|
||||
|
||||
def do_remap(from, to, regex = false)
|
||||
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"]
|
||||
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
|
||||
begin
|
||||
Remap.new(from, to, regex: regex, verbose: true).perform
|
||||
puts 'Done', ''
|
||||
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
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user