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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
1 # This Source Code Form is subject to the terms of the Mozilla Public
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
2 # License, v. 2.0. If a copy of the MPL was not distributed with this
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
3 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
4 #
10
2ebc526bc7dd Updated copyright.
Sjoerd Mullender <sjoerd@acm.org>
parents: 6
diff changeset
5 # Copyright 1997 - July 2008 CWI, August 2008 - 2017 MonetDB B.V.
0
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
6
aab36be83762 Created a new repository for the Ruby driver for MonetDB.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
7 # 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