class MiniSql::Serializer

Constants

MAX_CACHE_SIZE

Public Class Methods

marshallable(result) click to toggle source
# File lib/mini_sql/serializer.rb, line 11
def self.marshallable(result)
  new(result)
end
new(result) click to toggle source
# File lib/mini_sql/serializer.rb, line 7
def initialize(result)
  replace(result)
end

Private Class Methods

cached_materializer(fields, decorator_module = nil) click to toggle source
# File lib/mini_sql/serializer.rb, line 48
def self.cached_materializer(fields, decorator_module = nil)
  @cache ||= {}
  key = fields
  m = @cache.delete(key)
  if m
    @cache[key] = m
  else
    m = @cache[key] = materializer(fields)
    @cache.shift if @cache.length > MAX_CACHE_SIZE
  end

  if decorator_module && decorator_module.length > 0
    decorator = Kernel.const_get(decorator_module)
    m = m.decorated(decorator)
  end

  m
end
materialize(wrapper) click to toggle source
# File lib/mini_sql/serializer.rb, line 37
def self.materialize(wrapper)
  if !wrapper["data"]
    []
  else
    materializer = cached_materializer(wrapper['fields'], wrapper['decorator'])
    wrapper["data"].map do |row|
      materializer.materialize(row)
    end
  end
end
materializer(fields) click to toggle source
# File lib/mini_sql/serializer.rb, line 67
    def self.materializer(fields)
      Class.new do
        extend MiniSql::Decoratable
        include MiniSql::Result

        attr_accessor(*fields)

        instance_eval <<~RUBY
          def materialize(values)
            r = self.new
            #{col = -1; fields.map { |f| "r.#{f} = values[#{col += 1}]" }.join("; ")}
            r
          end
        RUBY
      end
    end

Public Instance Methods

marshal_dump() click to toggle source
# File lib/mini_sql/serializer.rb, line 15
def marshal_dump
  serialize
end
marshal_load(wrapper) click to toggle source
# File lib/mini_sql/serializer.rb, line 19
def marshal_load(wrapper)
  replace self.class.materialize(wrapper)
end

Private Instance Methods

serialize() click to toggle source
# File lib/mini_sql/serializer.rb, line 25
def serialize
  if length == 0
    {}
  else
    {
      "decorator" => first.class.decorator.to_s,
      "fields" => first.to_h.keys,
      "data" => map(&:values),
    }
  end
end