discourse/lib/site_settings/db_provider.rb
Sam Saffron 3af00a65e6 FIX: site settings loading default values when no db
This fixes a condition where an intermittent db connection could cause
invalid site settings to be stored

It also removes a catch all we had.

Somewhere around Rails 5 `db:create` started wanting full environment
this is a problem for Discourse since it needs to boot up data from the
db.

This removes the catch all and surgically adds a db / redis bypass to
db:create task.
2019-06-14 14:21:07 +10:00

65 lines
1.3 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 ||= {}
@table_exists[current_site] ||= ActiveRecord::Base.connection.table_exists?(@model.table_name)
end
end