vertica 0.9.4 → 0.9.5
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/lib/vertica/connection.rb +37 -33
- data/lib/vertica/error.rb +9 -1
- data/lib/vertica/query.rb +5 -2
- data/test/functional/query_test.rb +7 -0
- metadata +6 -6
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.9.
|
1
|
+
0.9.5
|
data/lib/vertica/connection.rb
CHANGED
@@ -2,9 +2,9 @@ require 'socket'
|
|
2
2
|
|
3
3
|
class Vertica::Connection
|
4
4
|
|
5
|
-
attr_reader :
|
5
|
+
attr_reader :notices, :transaction_status, :backend_pid, :backend_key, :parameters, :notice_handler, :session_id
|
6
6
|
|
7
|
-
attr_accessor :row_style, :debug
|
7
|
+
attr_accessor :row_style, :debug, :options
|
8
8
|
|
9
9
|
def self.cancel(existing_conn)
|
10
10
|
existing_conn.cancel
|
@@ -16,8 +16,11 @@ class Vertica::Connection
|
|
16
16
|
reset_values
|
17
17
|
|
18
18
|
@options = {}
|
19
|
-
|
19
|
+
|
20
|
+
options.each { |key, value| @options[key.to_s.to_sym] = value if value}
|
21
|
+
|
20
22
|
@options[:port] ||= 5433
|
23
|
+
@options[:read_timeout] ||= 30
|
21
24
|
|
22
25
|
@row_style = @options[:row_style] ? @options[:row_style] : :hash
|
23
26
|
unless options[:skip_startup]
|
@@ -66,7 +69,7 @@ class Vertica::Connection
|
|
66
69
|
end
|
67
70
|
|
68
71
|
def ready_for_query?
|
69
|
-
@
|
72
|
+
@current_job.nil?
|
70
73
|
end
|
71
74
|
|
72
75
|
def write(message)
|
@@ -111,12 +114,17 @@ class Vertica::Connection
|
|
111
114
|
end
|
112
115
|
|
113
116
|
def read_message
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
117
|
+
ready = IO.select([socket], nil, nil, @options[:read_timeout])
|
118
|
+
if ready
|
119
|
+
type = read_bytes(1)
|
120
|
+
size = read_bytes(4).unpack('N').first
|
121
|
+
raise Vertica::Error::MessageError.new("Bad message size: #{size}.") unless size >= 4
|
122
|
+
message = Vertica::Messages::BackendMessage.factory type, read_bytes(size - 4)
|
123
|
+
puts "<= #{message.inspect}" if @debug
|
124
|
+
return message
|
125
|
+
else
|
126
|
+
raise Errno::ETIMEDOUT
|
127
|
+
end
|
120
128
|
end
|
121
129
|
|
122
130
|
def process_message(message)
|
@@ -132,38 +140,28 @@ class Vertica::Connection
|
|
132
140
|
@parameters[message.name] = message.value
|
133
141
|
when Vertica::Messages::ReadyForQuery
|
134
142
|
@transaction_status = message.transaction_status
|
135
|
-
@
|
143
|
+
@current_job = nil
|
136
144
|
else
|
137
145
|
raise Vertica::Error::MessageError, "Unhandled message: #{message.inspect}"
|
138
146
|
end
|
139
147
|
end
|
140
148
|
|
141
|
-
def with_lock(&block)
|
142
|
-
raise Vertica::Error::SynchronizeError, "The connection is in use!" if busy?
|
143
|
-
@ready_for_query = false
|
144
|
-
yield
|
145
|
-
end
|
146
|
-
|
147
149
|
def query(sql, options = {}, &block)
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
job.run
|
152
|
-
end
|
150
|
+
job = Vertica::Query.new(self, sql, { :row_style => @row_style }.merge(options))
|
151
|
+
job.row_handler = block if block_given?
|
152
|
+
run_with_job_lock(job)
|
153
153
|
end
|
154
154
|
|
155
155
|
def copy(sql, source = nil, &block)
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
job.copy_handler = lambda { |data| io_copy_handler(source, data) }
|
164
|
-
end
|
165
|
-
job.run
|
156
|
+
job = Vertica::Query.new(self, sql, :row_style => @row_style)
|
157
|
+
if block_given?
|
158
|
+
job.copy_handler = block
|
159
|
+
elsif source && File.exists?(source.to_s)
|
160
|
+
job.copy_handler = lambda { |data| file_copy_handler(source, data) }
|
161
|
+
elsif source.respond_to?(:read) && source.respond_to?(:eof?)
|
162
|
+
job.copy_handler = lambda { |data| io_copy_handler(source, data) }
|
166
163
|
end
|
164
|
+
run_with_job_lock(job)
|
167
165
|
end
|
168
166
|
|
169
167
|
def inspect
|
@@ -173,6 +171,12 @@ class Vertica::Connection
|
|
173
171
|
|
174
172
|
protected
|
175
173
|
|
174
|
+
def run_with_job_lock(job)
|
175
|
+
raise Vertica::Error::SynchronizeError.new(@current_job, job) if busy?
|
176
|
+
@current_job = job
|
177
|
+
job.run
|
178
|
+
end
|
179
|
+
|
176
180
|
COPY_FROM_IO_BLOCK_SIZE = 1024 * 4096
|
177
181
|
|
178
182
|
def file_copy_handler(input_file, output)
|
@@ -223,7 +227,7 @@ class Vertica::Connection
|
|
223
227
|
@backend_key = nil
|
224
228
|
@transaction_status = nil
|
225
229
|
@socket = nil
|
226
|
-
@
|
230
|
+
@current_job = '<initialization>'
|
227
231
|
end
|
228
232
|
end
|
229
233
|
|
data/lib/vertica/error.rb
CHANGED
@@ -5,9 +5,17 @@ class Vertica::Error < StandardError
|
|
5
5
|
class SSLNotSupported < ConnectionError; end
|
6
6
|
class InterruptImpossible < Vertica::Error; end
|
7
7
|
class MessageError < Vertica::Error; end
|
8
|
-
class SynchronizeError < Vertica::Error; end
|
9
8
|
class EmptyQueryError < Vertica::Error; end
|
10
9
|
|
10
|
+
class SynchronizeError < Vertica::Error
|
11
|
+
attr_reader :running_job, :requested_job
|
12
|
+
|
13
|
+
def initialize(running_job, requested_job)
|
14
|
+
@running_job, @requested_job = running_job, requested_job
|
15
|
+
super("Cannot execute #{running_job}, connection is in use for #{requested_job}!")
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
11
19
|
class QueryError < Vertica::Error
|
12
20
|
|
13
21
|
attr_reader :error_response, :sql
|
data/lib/vertica/query.rb
CHANGED
@@ -13,8 +13,7 @@ class Vertica::Query
|
|
13
13
|
@error = nil
|
14
14
|
@result = Vertica::Result.new(row_style)
|
15
15
|
end
|
16
|
-
|
17
|
-
|
16
|
+
|
18
17
|
def run
|
19
18
|
@connection.write Vertica::Messages::Query.new(sql)
|
20
19
|
|
@@ -32,6 +31,10 @@ class Vertica::Query
|
|
32
31
|
end
|
33
32
|
|
34
33
|
alias_method :<<, :write
|
34
|
+
|
35
|
+
def to_s
|
36
|
+
@sql
|
37
|
+
end
|
35
38
|
|
36
39
|
protected
|
37
40
|
|
@@ -109,6 +109,13 @@ class QueryTest < Test::Unit::TestCase
|
|
109
109
|
end
|
110
110
|
end
|
111
111
|
|
112
|
+
def test_read_timeout
|
113
|
+
assert_raises(Errno::ETIMEDOUT) do
|
114
|
+
@connection.options[:read_timeout] = 0.0001
|
115
|
+
@connection.query("SELECT * FROM test_ruby_vertica_table")
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
112
119
|
def test_sql_error
|
113
120
|
assert_raises Vertica::Error::MissingColumn do
|
114
121
|
@connection.query("SELECT asad FROM test_ruby_vertica_table")
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vertica
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -11,11 +11,11 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2013-
|
14
|
+
date: 2013-03-25 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: rake
|
18
|
-
requirement: &
|
18
|
+
requirement: &70173422199940 !ruby/object:Gem::Requirement
|
19
19
|
none: false
|
20
20
|
requirements:
|
21
21
|
- - ! '>='
|
@@ -23,10 +23,10 @@ dependencies:
|
|
23
23
|
version: '0'
|
24
24
|
type: :runtime
|
25
25
|
prerelease: false
|
26
|
-
version_requirements: *
|
26
|
+
version_requirements: *70173422199940
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: jeweler
|
29
|
-
requirement: &
|
29
|
+
requirement: &70173422199440 !ruby/object:Gem::Requirement
|
30
30
|
none: false
|
31
31
|
requirements:
|
32
32
|
- - ! '>='
|
@@ -34,7 +34,7 @@ dependencies:
|
|
34
34
|
version: '0'
|
35
35
|
type: :runtime
|
36
36
|
prerelease: false
|
37
|
-
version_requirements: *
|
37
|
+
version_requirements: *70173422199440
|
38
38
|
description: Query Vertica with ruby
|
39
39
|
email: sprsquish@gmail.com
|
40
40
|
executables: []
|