kenjij/koromo

View on GitHub
lib/koromo/sql.rb

Summary

Maintainability
B
5 hrs
Test Coverage
require 'sequel'


module Koromo

  def self.sql
    SQL.shared_instance
  end

  class SQL

    def self.shared_instance
      @sql ||= SQL.new
    end

    def setup(conf)
      @config = conf
      # Sequel connection setup
      # Sequel.application_timezone = :local
      # Sequel.database_timezone = :utc
      Sequel::Model.db = Sequel.connect({adapter: 'tinytds'}.merge(config[:mssql]))
    end

    def config
      @config
    end

    def config_for_resource(name)
      name = name.to_sym
      c = config[:resources][name]
      c[:limit] ||= 10
      c
    end

    # Get model classes
    def model_for_resource(name)
      name = name.to_sym
      @models ||= {}
      return nil unless rc = config_for_resource(name)
      if @models[name].nil?
        m = Class.new(Sequel::Model)
        m.set_dataset(rc[:table])
        @models[name] = m
      end
      @models[name]
    end

    def get_resource(name, **args)
      return nil unless model = model_for_resource(name)
      p args[:params]
      conf = config_for_resource(name)
      set = model.select(*conf[:columns])
      if args[:id]
        array = set.where(conf[:key] => args[:id]).all
      else
        if args[:params]
          p_limit = args[:params][:limit]
          p_limit = p_limit.to_i if p_limit.class == String
          p_order = args[:params][:order]
          p_desc = true if args[:params][:desc]
          p_desc = false if args[:params][:asc]
        end
        p_limit ||= conf[:limit]
        p_order ||= conf[:order]
        p_desc ||= conf[:desc]
        set = set.limit(p_limit)
        set = (p_desc ? set.reverse_order(p_order) : set.order(p_order))
        p set.sql
        array = set.all
      end
      return nil if array.empty?
      case conf[:get][:class]
      when 'Hash'
        result = {}
        key = conf[:key]
        val = conf[:get][:value]
        array.each do |r|
          rec = r.values
          result.store(rec.delete(key), val ? rec[val] : rec)
        end
      when 'Array'
        result = array.map{ |r| r.values }
      end
      return result[0] if args[:id] && result.class == Array
      result
    end

  end

end