Sha256: 4ae2ba648080f8fa6dbb7f57b322c7a810a1474b9a317733b04632e509969dbd

Contents?: true

Size: 1.29 KB

Versions: 1

Compression:

Stored size: 1.29 KB

Contents

module SQLite3
  class ResultSet
    def initialize(statement, handle)
      @statement = statement
      @handle = handle
    end

    def each(&block)
      until @statement.done?
        yield current_row

        @statement.step
      end
    end

    private

    def columns
      columns = {}

      count = sqlite3_column_count(@handle.value)
      0.upto(count-1) do |i|
        name = sqlite3_column_name(@handle.value, i).to_sym
        type = sqlite3_column_type(@handle.value, i)

        columns[name] = ColumnMetadata.new(i, type)
      end

      columns
    end

    def current_row
      row = {}

      columns.each do |name, metadata|
        case metadata.type
        when SQLITE_NULL
          row[name] = nil
        when SQLITE_TEXT
          row[name] = sqlite3_column_text(@handle.value, metadata.index)
        when SQLITE_BLOB
          row[name] = NSData.dataWithBytes(sqlite3_column_blob(@handle.value, metadata.index), length: sqlite3_column_bytes(@handle.value, metadata.index))
        when SQLITE_INTEGER
          row[name] = sqlite3_column_int(@handle.value, metadata.index)
        when SQLITE_FLOAT
          row[name] = sqlite3_column_double(@handle.value, metadata.index)
        end
      end

      row
    end
  end

  class ColumnMetadata < Struct.new(:index, :type); end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
motion-sqlite3-0.5.1 lib/motion-sqlite3/result_set.rb