diff --git a/adapter/lib/active_record/connection_adapters/monetdb_adapter.rb b/adapter/lib/active_record/connection_adapters/monetdb_adapter.rb index 8ee6148c80671b840eb8da0cce56c9fa51bc7d5d..b565fa4ee0482c205803663f72b1ce6887c46598 100644 --- a/adapter/lib/active_record/connection_adapters/monetdb_adapter.rb +++ b/adapter/lib/active_record/connection_adapters/monetdb_adapter.rb @@ -503,38 +503,12 @@ module ActiveRecord #"INSERT INTO #{quote_table_name(table_name)}" end #=======END=OF=DATABASE=STATEMENTS=========# - - - - # restructure result returned by execute - def process_hdl(hdl) - result = [] - - if (num_rows = hdl.num_rows) > 0 - fields = hdl.name_fields - - num_rows.times do - result << {} - end - - fields.each do |f| - cols = hdl.fetch_column_name(f) - cols.each_with_index do |val, i| - val = nil if val == 'NULL' - result[i][f] = val - end - end - end - - result - end # Returns an array of record hashes with the column names as keys and # column values as values. def select(sql, name = nil, binds = []) hdl = execute(sql,name) - - process_hdl(hdl) + hdl.result_hashes end # Executes the update statement and returns the number of rows affected. diff --git a/lib/MonetDBData.rb b/lib/MonetDBData.rb index e2ee34166fb7f9b9a071f6e41e62099e652c5de1..93c4917c0d961ccd884d0e8312b75b58ceb24f01 100644 --- a/lib/MonetDBData.rb +++ b/lib/MonetDBData.rb @@ -53,11 +53,10 @@ class MonetDBData return if data == nil - record_set = "" # temporarly store retrieved rows + # temporarly store retrieved rows record_set = receive_record_set(data) if (@lang == LANG_SQL) - rows = receive_record_set(data) # the fired query is a SELECT; store and return the whole record set if @action == Q_TABLE @header = parse_header_table(@header) @@ -139,6 +138,20 @@ class MonetDBData return col end + # returns result as an array of hashes + def result_hashes + result = [] + @record_set.each do |row| + rec = parse_tuple(row) + hash = {} + @header['columns_name'].each_with_index do |item, i| + hash[item] = rec[i] + hash[item] = nil if hash[item] == 'NULL' + end + result << hash + end + result + end def fetch() @index @@ -190,6 +203,7 @@ class MonetDBData # store block of data, parse it and store it. def receive_record_set(response) rows = "" + lines = response.lines.to_a response.each_line do |row| if row[0].chr == MSG_QUERY if row[1].chr == Q_TABLE @@ -217,16 +231,21 @@ class MonetDBData # process header data @header << row elsif row[0].chr == MSG_TUPLE + if REPLY_SIZE.to_i == -1 + # if all results are returned in this response, we don't have to look ahead further + return lines.join + end rows += row elsif row[0] == MSG_PROMPT return rows end + lines.shift end - return rows # return an array of unparsed tuples + rows # return an array of unparsed tuples end def next_block - if @row_index == @row_count + if REPLY_SIZE.to_i == -1 or @row_index == @row_count return false else # The increment step is small to better deal with ruby socket's performance. @@ -240,7 +259,6 @@ class MonetDBData @row_offset += 1 end return true - end # Formats a query <i>string</i> so that it can be parsed by the server