Method: SQLite3::ResultSet#next
- Defined in:
- lib/sqlite3/resultset.rb
#next ⇒ Object
Obtain the next row from the cursor. If there are no more rows to be had, this will return nil. If type translation is active on the corresponding database, the values in the row will be translated according to their types.
The returned value will be an array, unless Database#results_as_hash has been set to true, in which case the returned value will be a hash.
For arrays, the column names are accessible via the fields property, and the column types are accessible via the types property.
For hashes, the column names are the keys of the hash, and the column types are accessible via the types property.
89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 |
# File 'lib/sqlite3/resultset.rb', line 89 def next return nil if @eof @stmt.must_be_open! unless @first_row result = @driver.step( @stmt.handle ) check result end @first_row = false unless @eof row = [] @driver.data_count( @stmt.handle ).times do |column| type = @driver.column_type( @stmt.handle, column ) if type == Constants::ColumnType::TEXT row << @driver.column_text( @stmt.handle, column ) elsif type == Constants::ColumnType::NULL row << nil elsif type == Constants::ColumnType::BLOB row << @driver.column_blob( @stmt.handle, column ) else row << @driver.column_text( @stmt.handle, column ) end end if @db.type_translation row = @stmt.types.zip( row ).map do |type, value| @db.translator.translate( type, value ) end end if @db.results_as_hash new_row = HashWithTypes[ *( @stmt.columns.zip( row ).to_a.flatten ) ] row.each_with_index { |value,idx| new_row[idx] = value } row = new_row else if row.respond_to?(:fields) row = ArrayWithTypes.new(row) else row = ArrayWithTypesAndFields.new(row) end row.fields = @stmt.columns end row.types = @stmt.types return row end nil end |