discourse/lib/site_settings/db_provider.rb
Sam Saffron 30990006a9 DEV: enable frozen string literal on all files
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
2019-05-13 09:31:32 +08:00

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