Mercurial > hg > monetdb-ruby
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 |
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 | 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 |