class DnsOne::Backend::DB

Public Class Methods

new(conf) click to toggle source
# File lib/dns_one/backend/db.rb, line 3
def initialize conf
    @query = conf.delete :query
    @conf = conf
    setup_db
end

Public Instance Methods

find(dom_name) click to toggle source
# File lib/dns_one/backend/db.rb, line 9
def find dom_name
    query build_query(dom_name)
end
preload_dummy?() click to toggle source

Find a dummy zone to make AR/pg load all dependencies

# File lib/dns_one/backend/db.rb, line 14
def preload_dummy?
    true
end

Private Instance Methods

build_query(dom_name) click to toggle source
# File lib/dns_one/backend/db.rb, line 41
def build_query dom_name
    @query.sub "'$domain'", 
                ActiveRecord::Base.connection.quote(dom_name)
end
query(sql, tries = 1) click to toggle source
# File lib/dns_one/backend/db.rb, line 20
def query sql, tries = 1
    return if tries > 3

    # http://jakeyesbeck.com/2016/02/14/ruby-threads-and-active-record-connections/
    res = ActiveRecord::Base.connection_pool.with_connection do
        ActiveRecord::Base.connection.execute sql
    end

    first_record = res&.first
    record_values = first_record&.values
    record_values&.first

rescue ActiveRecord::StatementInvalid => e
    Global.logger.error "SQL query error. Trying to reconnect #{tries}. Details:\n#{e.desc}"
    # http://geoff.evason.name/2015/01/18/postgres-ssl-connection-has-been-closed-unexpectedly
    ActiveRecord::Base.connection.reconnect! 
    find sql, (tries+1)
rescue => e
    Global.logger.error "SQL query error. Details:\n#{e.desc}"
end
require_deps() click to toggle source
# File lib/dns_one/backend/db.rb, line 52
def require_deps
    gem_name = { 
        'postgresql' => 'pg',
        'mysql'      => 'mysql',
        'mysql2'     => 'mysql2'
    }[ @conf[:adapter] ]
      
    unless gem_name
        Util.die "Database adapter '#{@conf[:adapter]}' not supported. Aborting."
    end

    ['active_record', gem_name].each do |req_name|
        begin
            require req_name
        rescue StandardError, LoadError => e
            Util.die "Error on 'require #{req_name}', install with 'gem install #{req_name}'.\nError Details: #{e.desc}"
        end
    end
end
setup_db() click to toggle source
# File lib/dns_one/backend/db.rb, line 46
def setup_db
    require_deps
    ActiveRecord::Base.logger = Global.logger
    ActiveRecord::Base.establish_connection @conf
end