Mercurial > hg > monetdb-ruby
annotate lib/MonetDBConnection.rb @ 10:2ebc526bc7dd
Updated copyright.
author | Sjoerd Mullender <sjoerd@acm.org> |
---|---|
date | Fri, 06 Jan 2017 13:16:10 +0100 (2017-01-06) |
parents | b4cf00b05ef1 |
children | 53aae47a9483 |
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 # Implements the MAPI communication protocol |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
8 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
9 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
10 require 'socket' |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
11 require 'time' |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
12 require_relative 'hasher' |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
13 require_relative 'MonetDBExceptions' |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
14 require 'uri' # parse merovingian redirects |
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 class MonetDBConnection |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
17 Q_TABLE = "1" # SELECT operation |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
18 Q_UPDATE = "2" # INSERT/UPDATE operations |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
19 Q_CREATE = "3" # CREATE/DROP TABLE operations |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
20 Q_TRANSACTION = "4" # TRANSACTION |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
21 Q_PREPARE = "5" |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
22 Q_BLOCK = "6" # QBLOCK message |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
23 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
24 MSG_REDIRECT = '^' # auth redirection through merovingian |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
25 MSG_QUERY = '&' |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
26 MSG_SCHEMA_HEADER = '%' |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
27 MSG_INFO = '!' # info response from mserver |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
28 MSG_TUPLE = '[' |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
29 MSG_PROMPT = "" |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
30 |
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 REPLY_SIZE = '-1' |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
33 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
34 MAX_AUTH_ITERATION = 10 # maximum number of atuh iterations (thorough merovingian) allowed |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
35 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
36 MONET_ERROR = -1 |
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 LANG_SQL = "sql" |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
39 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
40 # Protocols |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
41 MAPIv9 = 9 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
42 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
43 MONETDB_MEROVINGIAN = "merovingian" |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
44 MONETDB_MSERVER = "monetdb" |
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 MEROVINGIAN_MAX_ITERATIONS = 10 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
47 |
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 # enable debug output |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
50 @@DEBUG = false |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
51 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
52 # hour in seconds, used for timezone calculation |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
53 @@HOUR = 3600 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
54 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
55 # maximum size (in bytes) for a monetdb message to be sent |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
56 @@MAX_MESSAGE_SIZE = 32766 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
57 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
58 # endianness of a message sent to the server |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
59 @@CLIENT_ENDIANNESS = "BIG" |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
60 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
61 # MAPI protocols supported by the driver |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
62 @@SUPPORTED_PROTOCOLS = [ MonetDBConnection::MAPIv9 ] |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
63 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
64 attr_reader :socket, :auto_commit, :transactions, :lang |
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 # Instantiates a new MonetDBConnection object |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
67 # * user: username (default is monetdb) |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
68 # * passwd: password (default is monetdb) |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
69 # * lang: language (default is sql) |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
70 # * host: server hostanme or ip (default is localhost) |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
71 # * port: server port (default is 50000) |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
72 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
73 def initialize(user = "monetdb", passwd = "monetdb", lang = "sql", host="127.0.0.1", port = "50000") |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
74 @user = user |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
75 @passwd = passwd |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
76 @lang = lang.downcase |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
77 @host = host |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
78 @port = port |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
79 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
80 @client_endianness = @@CLIENT_ENDIANNESS |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
81 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
82 @auth_iteration = 0 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
83 @connection_established = false |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
84 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
85 @transactions = MonetDBTransaction.new # handles a pool of transactions (generates and keeps track of savepoints) |
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 if @@DEBUG == true |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
88 require 'logger' |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
89 end |
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 if @lang[0, 3] == 'sql' |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
92 @lang = "sql" |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
93 end |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
94 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
95 end |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
96 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
97 # Connect to the database, creates a new socket |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
98 def connect(db_name = 'demo', auth_type = 'SHA1') |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
99 @database = db_name |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
100 @auth_type = auth_type |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
101 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
102 @socket = TCPSocket.new(@host, @port.to_i) |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
103 if real_connect |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
104 if @lang == MonetDBConnection::LANG_SQL |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
105 set_timezone |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
106 set_reply_size |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
107 end |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
108 true |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
109 end |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
110 false |
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 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
114 # perform a real connection; retrieve challenge, proxy through merovinginan, build challenge and set the timezone |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
115 def real_connect |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
116 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
117 server_challenge = retrieve_server_challenge() |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
118 if server_challenge != nil |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
119 salt = server_challenge.split(':')[0] |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
120 @server_name = server_challenge.split(':')[1] |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
121 @protocol = server_challenge.split(':')[2].to_i |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
122 @supported_auth_types = server_challenge.split(':')[3].split(',') |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
123 @server_endianness = server_challenge.split(':')[4] |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
124 if @@SUPPORTED_PROTOCOLS.include?(@protocol) == false |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
125 raise MonetDBProtocolError, "Protocol not supported. The current implementation of ruby-monetdb works with MAPI protocols #{@@SUPPORTED_PROTOCOLS} only." |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
126 end |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
127 @pwhash = server_challenge.split(':')[5] |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
128 else |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
129 raise MonetDBConnectionError, "Error: server returned an empty challenge string." |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
130 end |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
131 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
132 # The server supports only RIPMED160 or crypt as an authentication hash function, but the driver does not. |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
133 if @supported_auth_types.length == 1 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
134 auth = @supported_auth_types[0] |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
135 if auth.upcase == "RIPEMD160" |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
136 raise MonetDBConnectionError, auth.upcase + " " + ": algorithm not supported by ruby-monetdb." |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
137 end |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
138 end |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
139 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
140 reply = build_auth_string_v9(@auth_type, salt, @database) |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
141 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
142 if @socket != nil |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
143 @connection_established = true |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
144 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
145 send(reply) |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
146 monetdb_auth = receive |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
147 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
148 if monetdb_auth.length == 0 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
149 # auth succedeed |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
150 true |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
151 else |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
152 if monetdb_auth[0].chr == MonetDBConnection::MSG_REDIRECT |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
153 #redirection |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
154 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
155 redirects = [] # store a list of possible redirects |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
156 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
157 monetdb_auth.split('\n').each do |m| |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
158 # strip the trailing ^mapi: |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
159 # if the redirect string start with something != "^mapi:" or is empty, the redirect is invalid and shall not be included. |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
160 if m[0..5] == "^mapi:" |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
161 redir = m[6..m.length] |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
162 # url parse redir |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
163 redirects.push(redir) |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
164 else |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
165 $stderr.print "Warning: Invalid Redirect #{m}" |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
166 end |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
167 end |
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 if redirects.size == 0 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
170 raise MonetDBConnectionError, "No valid redirect received" |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
171 else |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
172 begin |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
173 uri = URI.split(redirects[0]) |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
174 # Splits the string on following parts and returns array with result: |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
175 # |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
176 # * Scheme |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
177 # * Userinfo |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
178 # * Host |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
179 # * Port |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
180 # * Registry |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
181 # * Path |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
182 # * Opaque |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
183 # * Query |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
184 # * Fragment |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
185 server_name = uri[0] |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
186 host = uri[2] |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
187 port = uri[3] |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
188 database = uri[5].gsub(/^\//, '') if uri[5] != nil |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
189 rescue URI::InvalidURIError |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
190 raise MonetDBConnectionError, "Invalid redirect: #{redirects[0]}" |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
191 end |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
192 end |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
193 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
194 if server_name == MonetDBConnection::MONETDB_MEROVINGIAN |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
195 if @auth_iteration <= MonetDBConnection::MEROVINGIAN_MAX_ITERATIONS |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
196 @auth_iteration += 1 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
197 real_connect |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
198 else |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
199 raise MonetDBConnectionError, "Merovingian: too many iterations while proxying." |
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 elsif server_name == MonetDBConnection::MONETDB_MSERVER |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
202 begin |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
203 @socket.close |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
204 rescue |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
205 raise MonetDBConnectionError, "I/O error while closing connection to #{@socket}" |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
206 end |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
207 # reinitialize a connection |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
208 @host = host |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
209 @port = port |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
210 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
211 connect(database, @auth_type) |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
212 else |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
213 @connection_established = false |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
214 raise MonetDBConnectionError, monetdb_auth |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
215 end |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
216 elsif monetdb_auth[0].chr == MonetDBConnection::MSG_INFO |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
217 raise MonetDBConnectionError, monetdb_auth |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
218 end |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
219 end |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
220 end |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
221 end |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
222 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
223 def savepoint |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
224 @transactions.savepoint |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
225 end |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
226 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
227 # Formats a <i>command</i> string 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
|
228 def format_command(x) |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
229 return "X" + x + "\n" |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
230 end |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
231 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
232 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
233 # send an 'export' command to the server |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
234 def set_export(id, idx, offset) |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
235 send(format_command("export " + id.to_s + " " + idx.to_s + " " + offset.to_s )) |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
236 end |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
237 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
238 # send a 'reply_size' command to the server |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
239 def set_reply_size |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
240 send(format_command(("reply_size " + MonetDBConnection::REPLY_SIZE))) |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
241 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
242 response = receive |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
243 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
244 if response == MonetDBConnection::MSG_PROMPT |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
245 true |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
246 elsif response[0] == MonetDBConnection::MSG_INFO |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
247 raise MonetDBCommandError, "Unable to set reply_size: #{response}" |
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 end |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
251 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
252 def set_output_seq |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
253 send(format_command("output seq")) |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
254 end |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
255 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
256 # Disconnect from server |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
257 def disconnect() |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
258 if @connection_established |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
259 begin |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
260 @socket.close |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
261 rescue => e |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
262 $stderr.print e |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
263 end |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
264 else |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
265 raise MonetDBConnectionError, "No connection established." |
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 end |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
268 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
269 # send data to a monetdb5 server instance and returns server's response |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
270 def send(data) |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
271 encode_message(data).each do |m| |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
272 @socket.write(m) |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
273 end |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
274 end |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
275 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
276 # receive data from a monetdb5 server instance |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
277 def receive |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
278 is_final, chunk_size = recv_decode_hdr |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
279 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
280 if chunk_size == 0 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
281 return "" # needed on ruby-1.8.6 linux/64bit; recv(0) hangs on this configuration. |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
282 end |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
283 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
284 data = @socket.recv(chunk_size) |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
285 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
286 if is_final == false |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
287 while is_final == false |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
288 is_final, chunk_size = recv_decode_hdr |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
289 data += @socket.recv(chunk_size) |
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 end |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
292 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
293 return data |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
294 end |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
295 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
296 # |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
297 # Builds and authentication string given the parameters submitted by the user (MAPI protocol v9). |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
298 # |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
299 def build_auth_string_v9(auth_type, salt, db_name) |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
300 if (auth_type.upcase == "MD5" or auth_type.upcase == "SHA1") and @supported_auth_types.include?(auth_type.upcase) |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
301 auth_type = auth_type.upcase |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
302 # Hash the password |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
303 pwhash = Hasher.new(@pwhash, @passwd) |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
304 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
305 digest = Hasher.new(auth_type, pwhash.hashsum + salt) |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
306 hashsum = digest.hashsum |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
307 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
308 elsif auth_type.downcase == "plain" # or not @supported_auth_types.include?(auth_type.upcase) |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
309 # Keep it for compatibility with merovingian |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
310 auth_type = 'plain' |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
311 hashsum = @passwd + salt |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
312 elsif @supported_auth_types.include?(auth_type.upcase) |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
313 if auth_type.upcase == "RIPEMD160" |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
314 auth_type = @supported_auth_types[@supported_auth_types.index(auth_type)+1] |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
315 $stderr.print "The selected hashing algorithm is not supported by the Ruby driver. #{auth_type} will be used instead." |
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 # Hash the password |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
318 pwhash = Hasher.new(@pwhash, @passwd) |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
319 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
320 digest = Hasher.new(auth_type, pwhash.hashsum + salt) |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
321 hashsum = digest.hashsum |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
322 else |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
323 # The user selected an auth type not supported by the server. |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
324 raise MonetDBConnectionError, "#{auth_type} not supported by the server. Please choose one from #{@supported_auth_types}" |
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 # Build the reply message with header |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
327 reply = @client_endianness + ":" + @user + ":{" + auth_type + "}" + hashsum + ":" + @lang + ":" + db_name + ":" |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
328 end |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
329 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
330 # builds a message to be sent to the server |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
331 def encode_message(msg = "") |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
332 message = Array.new |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
333 data = "" |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
334 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
335 hdr = 0 # package header |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
336 pos = 0 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
337 is_final = false # last package in the stream |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
338 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
339 while (! is_final) |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
340 data = msg[pos..pos+[@@MAX_MESSAGE_SIZE.to_i, (msg.length - pos).to_i].min] |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
341 pos += data.length |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
342 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
343 if (msg.length - pos) == 0 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
344 last_bit = 1 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
345 is_final = true |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
346 else |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
347 last_bit = 0 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
348 end |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
349 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
350 hdr = [(data.length << 1) | last_bit].pack('v') |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
351 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
352 message << hdr + data.to_s # Short Little Endian Encoding |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
353 end |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
354 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
355 message.freeze # freeze and return the encode message |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
356 end |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
357 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
358 # Used as the first step in the authentication phase; retrives a challenge string from the server. |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
359 def retrieve_server_challenge() |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
360 server_challenge = receive |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
361 end |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
362 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
363 # reads and decodes the header of a server message |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
364 def recv_decode_hdr() |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
365 if @socket != nil |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
366 fb = @socket.recv(1) |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
367 sb = @socket.recv(1) |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
368 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
369 # Use execeptions handling to keep compatibility between different ruby |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
370 # versions. |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
371 # |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
372 # Chars are treated differently in ruby 1.8 and 1.9 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
373 # try do to ascii to int conversion using ord (ruby 1.9) |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
374 # and if it fail fallback to character.to_i (ruby 1.8) |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
375 begin |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
376 fb = fb[0].ord |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
377 sb = sb[0].ord |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
378 rescue NoMethodError => one_eight |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
379 fb = fb[0].to_i |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
380 sb = sb[0].to_i |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
381 end |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
382 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
383 chunk_size = (sb << 7) | (fb >> 1) |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
384 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
385 is_final = false |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
386 if ( (fb & 1) == 1 ) |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
387 is_final = true |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
388 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
389 end |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
390 # return the size of the chunk (in bytes) |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
391 return is_final, chunk_size |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
392 else |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
393 raise MonetDBSocketError, "Error while receiving data\n" |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
394 end |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
395 end |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
396 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
397 # Sets the time zone according to the Operating System settings |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
398 def set_timezone() |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
399 tz = Time.new |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
400 tz_offset = tz.gmt_offset / @@HOUR |
6
b4cf00b05ef1
Fix setting time zone for negative offsets.
Sjoerd Mullender <sjoerd@acm.org>
parents:
0
diff
changeset
|
401 |
b4cf00b05ef1
Fix setting time zone for negative offsets.
Sjoerd Mullender <sjoerd@acm.org>
parents:
0
diff
changeset
|
402 # verify minute count! |
b4cf00b05ef1
Fix setting time zone for negative offsets.
Sjoerd Mullender <sjoerd@acm.org>
parents:
0
diff
changeset
|
403 if tz_offset <= -10 |
b4cf00b05ef1
Fix setting time zone for negative offsets.
Sjoerd Mullender <sjoerd@acm.org>
parents:
0
diff
changeset
|
404 tz_offset = "'" + tz_offset.to_s + ":00'" |
b4cf00b05ef1
Fix setting time zone for negative offsets.
Sjoerd Mullender <sjoerd@acm.org>
parents:
0
diff
changeset
|
405 elsif tz_offset < 0 |
b4cf00b05ef1
Fix setting time zone for negative offsets.
Sjoerd Mullender <sjoerd@acm.org>
parents:
0
diff
changeset
|
406 tz_offset = -tz_offset |
b4cf00b05ef1
Fix setting time zone for negative offsets.
Sjoerd Mullender <sjoerd@acm.org>
parents:
0
diff
changeset
|
407 tz_offset = "'-0" + tz_offset.to_s + ":00'" |
b4cf00b05ef1
Fix setting time zone for negative offsets.
Sjoerd Mullender <sjoerd@acm.org>
parents:
0
diff
changeset
|
408 elsif tz_offset <= 9 |
0
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
409 tz_offset = "'+0" + tz_offset.to_s + ":00'" |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
410 else |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
411 tz_offset = "'+" + tz_offset.to_s + ":00'" |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
412 end |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
413 query_tz = "sSET TIME ZONE INTERVAL " + tz_offset + " HOUR TO MINUTE;" |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
414 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
415 # Perform the query directly within the method |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
416 send(query_tz) |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
417 response = receive |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
418 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
419 if response == MonetDBConnection::MSG_PROMPT |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
420 true |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
421 elsif response[0].chr == MonetDBConnection::MSG_INFO |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
422 raise MonetDBQueryError, response |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
423 end |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
424 end |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
425 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
426 # Turns auto commit on/off |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
427 def set_auto_commit(flag=true) |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
428 if flag == false |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
429 ac = " 0" |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
430 else |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
431 ac = " 1" |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
432 end |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
433 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
434 send(format_command("auto_commit " + ac)) |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
435 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
436 response = receive |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
437 if response == MonetDBConnection::MSG_PROMPT |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
438 @auto_commit = flag |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
439 elsif response[0].chr == MonetDBConnection::MSG_INFO |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
440 raise MonetDBCommandError, response |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
441 return |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
442 end |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
443 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
444 end |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
445 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
446 # Check the auto commit status (on/off) |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
447 def auto_commit? |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
448 @auto_commit |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
449 end |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
450 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
451 # Check if monetdb is running behind the merovingian proxy and forward the connection in case |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
452 def merovingian? |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
453 if @server_name.downcase == MonetDBConnection::MONETDB_MEROVINGIAN |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
454 true |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
455 else |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
456 false |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
457 end |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
458 end |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
459 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
460 def mserver? |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
461 if @server_name.downcase == MonetDBConnection::MONETDB_MSERVER |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
462 true |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
463 else |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
464 false |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
465 end |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
466 end |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
467 end |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
468 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
469 # handles transactions and savepoints. Can be used to simulate nested transactions. |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
470 class MonetDBTransaction |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
471 SAVEPOINT_STRING = "monetdbsp" |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
472 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
473 def initialize |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
474 @id = 0 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
475 @savepoint = "" |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
476 end |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
477 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
478 def savepoint |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
479 @savepoint = SAVEPOINT_STRING + @id.to_s |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
480 end |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
481 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
482 def release |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
483 prev_id |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
484 end |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
485 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
486 def save |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
487 next_id |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
488 end |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
489 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
490 private |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
491 def next_id |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
492 @id += 1 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
493 end |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
494 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
495 def prev_id |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
496 @id -= 1 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
497 end |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
498 |
aab36be83762
Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff
changeset
|
499 end |