mirror of
https://github.com/discourse/discourse.git
synced 2024-12-02 03:23:43 +08:00
30990006a9
This reduces chances of errors where consumers of strings mutate inputs and reduces memory usage of the app. Test suite passes now, but there may be some stuff left, so we will run a few sites on a branch prior to merging
70 lines
1.5 KiB
Ruby
70 lines
1.5 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module SiteSettings; end
|
|
|
|
class SiteSettings::DbProvider
|
|
|
|
def initialize(model)
|
|
model.after_commit do
|
|
model.notify_changed!
|
|
end
|
|
|
|
@model = model
|
|
end
|
|
|
|
def all
|
|
return [] unless table_exists?
|
|
|
|
# Not leaking out AR records, cause I want all editing to happen via this API
|
|
DB.query("SELECT name, data_type, value FROM #{@model.table_name}")
|
|
end
|
|
|
|
def find(name)
|
|
return nil unless table_exists?
|
|
|
|
# Not leaking out AR records, cause I want all editing to happen via this API
|
|
DB.query("SELECT name, data_type, value FROM #{@model.table_name} WHERE name = ?", name)
|
|
.first
|
|
end
|
|
|
|
def save(name, value, data_type)
|
|
return unless table_exists?
|
|
|
|
model = @model.find_by(name: name)
|
|
model ||= @model.new
|
|
|
|
model.name = name
|
|
model.value = value
|
|
model.data_type = data_type
|
|
|
|
# save! used to ensure after_commit is called
|
|
model.save! if model.changed?
|
|
|
|
true
|
|
end
|
|
|
|
def destroy(name)
|
|
return unless table_exists?
|
|
|
|
@model.where(name: name).destroy_all
|
|
end
|
|
|
|
def current_site
|
|
RailsMultisite::ConnectionManagement.current_db
|
|
end
|
|
|
|
protected
|
|
|
|
# table is not in the db yet, initial migration, etc
|
|
def table_exists?
|
|
@table_exists ||= {}
|
|
begin
|
|
@table_exists[current_site] ||= ActiveRecord::Base.connection.table_exists?(@model.table_name)
|
|
rescue
|
|
STDERR.puts "No connection to db, unable to retrieve site settings! (normal when running db:create)"
|
|
@table_exists[current_site] = false
|
|
end
|
|
end
|
|
|
|
end
|