annotate lib/MonetDBData.rb @ 10:2ebc526bc7dd

Updated copyright.
author Sjoerd Mullender <sjoerd@acm.org>
date Fri, 06 Jan 2017 13:16:10 +0100 (2017-01-06)
parents aab36be83762
children 83db5acbd01a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
1 # This Source Code Form is subject to the terms of the Mozilla Public
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
2 # License, v. 2.0. If a copy of the MPL was not distributed with this
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
3 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
4 #
10
2ebc526bc7dd Updated copyright.
Sjoerd Mullender <sjoerd@acm.org>
parents: 0
diff changeset
5 # Copyright 1997 - July 2008 CWI, August 2008 - 2017 MonetDB B.V.
0
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
6
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
7 # Models a MonetDB RecordSet
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
8 require 'time'
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
9 require 'date'
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
10 require 'ostruct'
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
11
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
12 require "bigdecimal"
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
13
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
14 require_relative 'MonetDBConnection'
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
15
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
16 require 'logger'
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
17
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
18 class MonetDBData
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
19 @@DEBUG = false
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
20
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
21 def initialize(connection)
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
22 @connection = connection
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
23 @lang = @connection.lang
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
24
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
25 # Structure containing the header+results set for a fired Q_TABLE query
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
26 @header = []
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
27 @query = {}
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
28
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
29 @record_set = []
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
30 @index = 0 # Position of the last returned record
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
31
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
32
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
33 @row_count = 0
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
34 @row_offset = 10
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
35 @row_index = Integer(MonetDBConnection::REPLY_SIZE)
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
36 end
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
37
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
38 # Fire a query and return the server response
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
39 def execute(q)
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
40 # fire a query and get ready to receive the data
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
41 @connection.send(format_query(q))
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
42 data = @connection.receive
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
43
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
44 return if data == nil
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
45
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
46 record_set = "" # temporarly store retrieved rows
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
47 record_set = receive_record_set(data)
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
48
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
49 if (@lang == MonetDBConnection::LANG_SQL)
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
50 rows = receive_record_set(data)
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
51 # the fired query is a SELECT; store and return the whole record set
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
52 if @action == MonetDBConnection::Q_TABLE
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
53 @header = parse_header_table(@header)
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
54 @header.freeze
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
55
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
56 if @row_index.to_i < @row_count.to_i
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
57 block_rows = ""
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
58 while next_block
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
59 data = @connection.receive
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
60 block_rows += receive_record_set(data)
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
61 end
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
62 record_set += block_rows
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
63 end
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
64 end
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
65
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
66 # ruby string management seems to not properly understand the MSG_PROMPT escape character.
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
67 # In order to avoid data loss the @record_set array is built once that all tuples have been retrieved
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
68 @record_set = record_set.split("\t]\n")
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
69
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
70 if @record_set.length != @query['rows'].to_i
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
71 raise MonetDBQueryError, "Warning: Query #{@query['id']} declared to result in #{@query['rows']} but #{@record_set.length} returned instead"
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
72 end
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
73 end
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
74 @record_set.freeze
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
75 end
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
76
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
77 # Returns the record set entries hashed by column name orderd by column position
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
78 def fetch_all_as_column_hash
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
79 columns = {}
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
80 @header["columns_name"].each do |col_name|
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
81 columns[col_name] = fetch_by_column_name(col_name)
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
82 end
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
83
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
84 return columns
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
85 end
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
86
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
87 # returns a record hash (i.e: { id: 1, name: "John Doe", age: 42 } )
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
88 def fetch_hash
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
89 return false if @index >= @query['rows'].to_i
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
90
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
91 record_hash = record_hash(parse_tuple(@record_set[@index]))
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
92 @index += 1
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
93 return record_hash
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
94 end
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
95
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
96 # loops through all the hashes of the records and yields them to a given block
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
97 def each_record_as_hash
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
98 @record_set.each do |record|
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
99 parsed_record = parse_tuple(record)
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
100 yield(record_hash(parsed_record))
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
101 end
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
102 end
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
103
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
104 # Returns the values for the column 'field'
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
105 def fetch_by_column_name(column_name="")
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
106 position = @header["columns_order"].fetch(column_name)
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
107
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
108 column_values = []
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
109 @record_set.each do |row|
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
110 column_values << parse_tuple(row)[position]
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
111 end
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
112
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
113 return column_values
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
114 end
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
115
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
116 # fetches a single record, updates the iterator index
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
117 def fetch
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
118 return false if @index >= @query['rows'].to_i
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
119
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
120 result = parse_tuple(@record_set[@index])
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
121 @index += 1
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
122
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
123 return result
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
124 end
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
125
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
126 # resets the internal iterator index used by fetch and fetch_hash
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
127 def reset_index
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
128 @index = 0
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
129 end
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
130
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
131 # loops through all records and yields to a given block paramter
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
132 def each_record
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
133 raise MonetDBDataError, "There is no record set currently available" unless @query['type'] == MonetDBConnection::Q_TABLE
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
134 @record_set.each { |record| yield(parse_tuple(record)) }
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
135 end
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
136
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
137 # Cursor method that returns all the records
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
138 def fetch_all
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
139 result = []
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
140 each_record do |record|
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
141 result.push(record)
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
142 end
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
143 return result
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
144 end
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
145
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
146 # Returns the number of rows in the record set
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
147 def num_rows
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
148 return @query['rows'].to_i
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
149 end
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
150
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
151 # Returns the number of fields in the record set
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
152 def num_fields
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
153 return @query['columns'].to_i
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
154 end
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
155
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
156 # Returns the (ordered) name of the columns in the record set
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
157 def name_fields
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
158 return @header['columns_name']
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
159 end
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
160
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
161 # Returns the (ordered) name of the columns in the record set
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
162 def type_fields
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
163 return @header['columns_type']
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
164 end
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
165
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
166 # ===================
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
167 private
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
168 # ===================
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
169
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
170 # store block of data, parse it and store it.
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
171 def receive_record_set(response)
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
172 rows = ""
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
173 response.each_line do |row|
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
174 case row[0]
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
175 when MonetDBConnection::MSG_QUERY then parse_query(row)
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
176 when MonetDBConnection::MSG_INFO then raise MonetDBQueryError, row
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
177 when MonetDBConnection::MSG_SCHEMA_HEADER then @header << row
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
178 when MonetDBConnection::MSG_TUPLE then rows += row
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
179 when MonetDBConnection::MSG_PROMPT then return rows
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
180 end
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
181 end
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
182 return rows # return an array of unparsed tuples
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
183 end
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
184
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
185 def parse_query(row)
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
186 case row[1]
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
187 when MonetDBConnection::Q_TABLE
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
188 @action = MonetDBConnection::Q_TABLE
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
189 @query = parse_header_query(row)
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
190 @query.freeze
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
191 @row_count = @query['rows'].to_i #total number of rows in table
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
192 when MonetDBConnection::Q_BLOCK
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
193 @action = MonetDBConnection::Q_BLOCK # strip the block header from data
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
194 @block = parse_header_query(row)
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
195 when MonetDBConnection::Q_TRANSACTION
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
196 @action = MonetDBConnection::Q_TRANSACTION
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
197 when MonetDBConnection::Q_CREATE
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
198 @action = MonetDBConnection::Q_CREATE
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
199 end
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
200 end
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
201
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
202 def record_hash(record)
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
203 result = {}
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
204
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
205 @header["columns_name"].each do |column_name|
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
206 position = @header["columns_order"].fetch(column_name)
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
207 result[column_name] = record[position]
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
208 end
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
209
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
210 return result
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
211 end
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
212
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
213 def next_block
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
214 if @row_index == @row_count
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
215 return false
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
216 else
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
217 # The increment step is small to better deal with ruby socket's performance.
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
218 # For larger values of the step performance drop;
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
219 #
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
220 @row_offset = [@row_offset, (@row_count - @row_index)].min
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
221
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
222 # export offset amount
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
223 @connection.set_export(@query['id'], @row_index.to_s, @row_offset.to_s)
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
224 @row_index += @row_offset
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
225 @row_offset += 1
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
226 end
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
227 return true
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
228
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
229 end
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
230
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
231 # Formats a query <i>string</i> so that it can be parsed by the server
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
232 def format_query(q)
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
233 if @lang == MonetDBConnection::LANG_SQL
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
234 return "s" + q + "\n;"
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
235 else
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
236 raise LanguageNotSupported, @lang
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
237 end
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
238 end
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
239
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
240 # parse one tuple as returned from the server
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
241 def parse_tuple(tuple)
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
242 fields = []
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
243 # remove trailing "["
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
244 tuple = tuple.gsub(/^\[\s+/,'')
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
245 tuple.split(/,\t/).each_with_index do |field, index|
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
246 field_value = convert_type(field, index)
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
247 fields << field_value
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
248 end
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
249
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
250 return fields.freeze
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
251 end
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
252
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
253 # converts the given value the correct type
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
254 def convert_type(value, index)
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
255 return nil if "NULL" == value.upcase
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
256 return case type_fields.values[index]
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
257 when "int", "tinyint", "smallint", "bigint", "hugeint" then value.to_i
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
258 when "double", "real", "decimal" then value.to_f
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
259 when "boolean" then value.downcase == true
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
260 when "date" then Date.parse(value)
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
261 when "time" then Time.parse(value, Time.new("2000-01-01"))
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
262 when "timestamp" then DateTime.parse(value)
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
263 when "timestamptz" then DateTime.parse(value)
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
264 else value.gsub(/\\/, '').gsub(/^"/,'').gsub(/"$/,'').gsub(/\"/, '')
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
265 end
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
266 end
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
267
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
268 # Parses a query header and returns information about the query.
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
269 def parse_header_query(row)
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
270 type = row[1].chr
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
271 if type == MonetDBConnection::Q_TABLE
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
272 # Performing a SELECT: store informations about the table size, query id, total number of records and returned.
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
273 id = row.split(' ')[1]
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
274 rows = row.split(' ')[2]
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
275 columns = row.split(' ')[3]
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
276 returned = row.split(' ')[4]
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
277
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
278 header = { "id" => id, "type" => type, "rows" => rows, "columns" => columns, "returned" => returned }
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
279 elsif type == MonetDBConnection::Q_BLOCK
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
280 # processing block header
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
281
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
282 id = row.split(' ')[1]
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
283 columns = row.split(' ')[2]
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
284 remains = row.split(' ')[3]
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
285 offset = row.split(' ')[4]
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
286
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
287 header = { "id" => id, "type" => type, "remains" => remains, "columns" => columns, "offset" => offset }
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
288 else
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
289 header = {"type" => type}
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
290 end
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
291
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
292 return header.freeze
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
293 end
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
294
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
295 # Parses a Q_TABLE header and returns information about the schema.
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
296 def parse_header_table(header_t)
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
297 if @query["type"] == MonetDBConnection::Q_TABLE
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
298 if header_t != nil
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
299 name_t = header_t[0].split(' ')[1].gsub(/,$/, '')
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
300 name_cols = Array.new
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
301
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
302 header_t[1].split('%')[1].gsub(/'^\%'/, '').split('#')[0].split(' ').each do |col|
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
303 name_cols << col.gsub(/,$/, '')
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
304 end
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
305
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
306 type_cols = { }
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
307 header_t[2].split('%')[1].gsub(/'^\%'/, '').split('#')[0].split(' ').each_with_index do |col, i|
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
308 if col.gsub(/,$/, '') != nil
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
309 type_cols[ name_cols[i] ] = col.gsub(/,$/, '')
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
310 end
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
311 end
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
312
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
313 length_cols = { }
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
314 header_t[3].split('%')[1].gsub(/'^\%'/, '').split('#')[0].split(' ').each_with_index do |col, i|
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
315 length_cols[ name_cols[i] ] = col.gsub(/,$/, '')
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
316 end
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
317
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
318 columns_order = {}
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
319 name_cols.each_with_index do |col, i|
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
320 columns_order[col] = i
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
321 end
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
322
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
323 return {"table_name" => name_t, "columns_name" => name_cols, "columns_type" => type_cols,
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
324 "columns_length" => length_cols, "columns_order" => columns_order}.freeze
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
325 end
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
326 end
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
327 end
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
328 end