vertica 0.7.4 → 0.8.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +85 -0
- data/Rakefile +56 -38
- data/VERSION +1 -0
- data/lib/vertica.rb +59 -11
- data/lib/vertica/bit_helper.rb +7 -24
- data/lib/vertica/column.rb +34 -53
- data/lib/vertica/connection.rb +123 -139
- data/lib/vertica/core_ext/numeric.rb +13 -0
- data/lib/vertica/core_ext/string.rb +22 -0
- data/lib/vertica/messages/{authentication.rb → backend_messages/authentication.rb} +6 -9
- data/lib/vertica/messages/{backend_key_data.rb → backend_messages/backend_key_data.rb} +2 -2
- data/lib/vertica/messages/{bind_complete.rb → backend_messages/bind_complete.rb} +0 -1
- data/lib/vertica/messages/{close_complete.rb → backend_messages/close_complete.rb} +0 -1
- data/lib/vertica/messages/{command_complete.rb → backend_messages/command_complete.rb} +3 -3
- data/lib/vertica/messages/{data_row.rb → backend_messages/data_row.rb} +3 -6
- data/lib/vertica/messages/{empty_query_response.rb → backend_messages/empty_query_response.rb} +0 -1
- data/lib/vertica/messages/backend_messages/error_response.rb +35 -0
- data/lib/vertica/messages/{no_data.rb → backend_messages/no_data.rb} +0 -1
- data/lib/vertica/messages/backend_messages/notice_response.rb +16 -0
- data/lib/vertica/messages/{notification_response.rb → backend_messages/notification_response.rb} +0 -0
- data/lib/vertica/messages/{parameter_description.rb → backend_messages/parameter_description.rb} +0 -0
- data/lib/vertica/messages/{parameter_status.rb → backend_messages/parameter_status.rb} +0 -0
- data/lib/vertica/messages/{parse_complete.rb → backend_messages/parse_complete.rb} +0 -1
- data/lib/vertica/messages/{portal_suspended.rb → backend_messages/portal_suspended.rb} +0 -1
- data/lib/vertica/messages/{ready_for_query.rb → backend_messages/ready_for_query.rb} +2 -2
- data/lib/vertica/messages/{row_description.rb → backend_messages/row_description.rb} +3 -3
- data/lib/vertica/messages/{unknown.rb → backend_messages/unknown.rb} +2 -2
- data/lib/vertica/messages/frontend_messages/bind.rb +28 -0
- data/lib/vertica/messages/frontend_messages/cancel_request.rb +21 -0
- data/lib/vertica/messages/frontend_messages/close.rb +24 -0
- data/lib/vertica/messages/frontend_messages/describe.rb +24 -0
- data/lib/vertica/messages/frontend_messages/execute.rb +20 -0
- data/lib/vertica/messages/frontend_messages/flush.rb +7 -0
- data/lib/vertica/messages/frontend_messages/parse.rb +23 -0
- data/lib/vertica/messages/frontend_messages/password.rb +35 -0
- data/lib/vertica/messages/frontend_messages/query.rb +17 -0
- data/lib/vertica/messages/frontend_messages/ssl_request.rb +12 -0
- data/lib/vertica/messages/frontend_messages/startup.rb +25 -0
- data/lib/vertica/messages/frontend_messages/sync.rb +7 -0
- data/lib/vertica/messages/frontend_messages/terminate.rb +7 -0
- data/lib/vertica/messages/message.rb +26 -57
- data/lib/vertica/result.rb +28 -20
- data/lib/vertica/vertica_socket.rb +14 -3
- data/test/test_helper.rb +7 -16
- metadata +55 -50
- data/README.textile +0 -69
- data/lib/vertica/messages/bind.rb +0 -36
- data/lib/vertica/messages/cancel_request.rb +0 -25
- data/lib/vertica/messages/close.rb +0 -30
- data/lib/vertica/messages/describe.rb +0 -30
- data/lib/vertica/messages/error_response.rb +0 -59
- data/lib/vertica/messages/execute.rb +0 -24
- data/lib/vertica/messages/flush.rb +0 -15
- data/lib/vertica/messages/notice_response.rb +0 -21
- data/lib/vertica/messages/parse.rb +0 -31
- data/lib/vertica/messages/password.rb +0 -33
- data/lib/vertica/messages/query.rb +0 -20
- data/lib/vertica/messages/ssl_request.rb +0 -14
- data/lib/vertica/messages/startup.rb +0 -38
- data/lib/vertica/messages/sync.rb +0 -15
- data/lib/vertica/messages/terminate.rb +0 -14
- data/test/create_schema.sql +0 -4
- data/vertica.gemspec +0 -64
data/README.textile
DELETED
@@ -1,69 +0,0 @@
|
|
1
|
-
h1. Vertica
|
2
|
-
|
3
|
-
by Matt Bauer
|
4
|
-
|
5
|
-
h2. Description
|
6
|
-
|
7
|
-
Vertica is a pure Ruby library for connecting to Vertica databases. You can learn more
|
8
|
-
about Vertica at http://www.vertica.com. This library currently supports queries and
|
9
|
-
prepared statements.
|
10
|
-
|
11
|
-
h2. Install
|
12
|
-
|
13
|
-
$ gem install mattbauer-vertica --source http://gems.github.com
|
14
|
-
|
15
|
-
h2. Source
|
16
|
-
|
17
|
-
Vertica's git repo is available on GitHub, which can be browsed at:
|
18
|
-
|
19
|
-
http://github.com/mattbauer/vertica
|
20
|
-
|
21
|
-
and cloned from:
|
22
|
-
|
23
|
-
git://github.com/mattbauer/vertica.git
|
24
|
-
|
25
|
-
h2. Usage
|
26
|
-
|
27
|
-
h4. Example Query
|
28
|
-
|
29
|
-
<pre>
|
30
|
-
<code>
|
31
|
-
c = Vertica::Connection.new(
|
32
|
-
:user => 'user',
|
33
|
-
:password => 'password',
|
34
|
-
:host => 'db_server',
|
35
|
-
:port => '5433',
|
36
|
-
:database => 'db
|
37
|
-
)
|
38
|
-
r = c.query("SELECT * FROM my_table")
|
39
|
-
puts r.row_count
|
40
|
-
puts r.columns[0].name
|
41
|
-
puts r.rows
|
42
|
-
c.close
|
43
|
-
</code>
|
44
|
-
</pre>
|
45
|
-
|
46
|
-
h4. Example Prepared Statement
|
47
|
-
|
48
|
-
<pre>
|
49
|
-
<code>
|
50
|
-
c = Vertica::Connection.new(
|
51
|
-
:user => 'user',
|
52
|
-
:password => 'password',
|
53
|
-
:host => 'db_server',
|
54
|
-
:port => '5433',
|
55
|
-
:database => 'db
|
56
|
-
)
|
57
|
-
c.prepare("my_prepared_statement", "SELECT * FROM my_table WHERE id = ?", 1)
|
58
|
-
r = c.execute_prepared("my_prepared_statement", 13)
|
59
|
-
puts r.row_count
|
60
|
-
puts r.columns[0].name
|
61
|
-
puts r.rows
|
62
|
-
c.close
|
63
|
-
</code>
|
64
|
-
</pre>
|
65
|
-
|
66
|
-
h2. Running The Tests
|
67
|
-
|
68
|
-
To run the tests, change the values in test_helper.rb to match your db configuration. Then
|
69
|
-
execute the create_schema.sql on the database. Then you may run the tests.
|
@@ -1,36 +0,0 @@
|
|
1
|
-
module Vertica
|
2
|
-
module Messages
|
3
|
-
class Bind < FrontendMessage
|
4
|
-
message_id ?B
|
5
|
-
|
6
|
-
def initialize(portal_name, prepared_statement_name, parameter_values)
|
7
|
-
@portal_name = portal_name
|
8
|
-
@prepared_statement_name = prepared_statement_name
|
9
|
-
@parameter_values = parameter_values.map { |pv| pv.to_s }
|
10
|
-
end
|
11
|
-
|
12
|
-
def to_bytes(stream)
|
13
|
-
size = LENGTH_SIZE
|
14
|
-
size += @portal_name.length + 1
|
15
|
-
size += @prepared_statement_name.length + 1
|
16
|
-
size += 2 # parameter format code (0)
|
17
|
-
size += 2 # number of parameter values
|
18
|
-
size += @parameter_values.inject(0) { |sum, e| sum += (e.length + 4) }
|
19
|
-
size += 2
|
20
|
-
|
21
|
-
stream.write_byte(message_id)
|
22
|
-
stream.write_network_int32(size) # size
|
23
|
-
stream.write_cstring(@portal_name) # portal name ("")
|
24
|
-
stream.write_cstring(@prepared_statement_name) # prep
|
25
|
-
stream.write_network_int16(0) # format codes (0 - default text format)
|
26
|
-
stream.write_network_int16(@parameter_values.length) # number of parameters
|
27
|
-
@parameter_values.each do |parameter_value|
|
28
|
-
stream.write_network_int32(parameter_value.length) # parameter value (which is represented as a string) length
|
29
|
-
stream.write(parameter_value) # parameter value written out in text representation
|
30
|
-
end
|
31
|
-
stream.write_network_int16(0)
|
32
|
-
end
|
33
|
-
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
@@ -1,25 +0,0 @@
|
|
1
|
-
module Vertica
|
2
|
-
module Messages
|
3
|
-
class CancelRequest < FrontendMessage
|
4
|
-
message_id nil
|
5
|
-
|
6
|
-
def initialize(backend_pid, backend_key)
|
7
|
-
@backend_pid = backend_pid
|
8
|
-
@backend_key = backend_key
|
9
|
-
end
|
10
|
-
|
11
|
-
def to_bytes(stream)
|
12
|
-
size = LENGTH_SIZE
|
13
|
-
size += 4
|
14
|
-
size += 4
|
15
|
-
size += 4
|
16
|
-
|
17
|
-
stream.write_network_int32(size) # size
|
18
|
-
stream.write_network_int32(80877102)
|
19
|
-
stream.write_network_int32(@backend_pid)
|
20
|
-
stream.write_network_int32(@backend_key)
|
21
|
-
end
|
22
|
-
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
@@ -1,30 +0,0 @@
|
|
1
|
-
module Vertica
|
2
|
-
module Messages
|
3
|
-
class Close < FrontendMessage
|
4
|
-
message_id ?C
|
5
|
-
|
6
|
-
def initialize(close_type, close_name)
|
7
|
-
if close_type == :portal
|
8
|
-
@close_type = ?P
|
9
|
-
elsif close_type == :prepared_statement
|
10
|
-
@close_type = ?S
|
11
|
-
else
|
12
|
-
raise ArgumentError.new("#{close_type} is not a valid close_type. Must be either :portal or :prepared_statement.")
|
13
|
-
end
|
14
|
-
@close_name = close_name
|
15
|
-
end
|
16
|
-
|
17
|
-
def to_bytes(stream)
|
18
|
-
size = LENGTH_SIZE
|
19
|
-
size += 1
|
20
|
-
size += @close_name.length + 1
|
21
|
-
|
22
|
-
stream.write_byte(message_id)
|
23
|
-
stream.write_network_int32(size) # size
|
24
|
-
stream.write_byte(@close_type)
|
25
|
-
stream.write_cstring(@close_name)
|
26
|
-
end
|
27
|
-
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
@@ -1,30 +0,0 @@
|
|
1
|
-
module Vertica
|
2
|
-
module Messages
|
3
|
-
class Describe < FrontendMessage
|
4
|
-
message_id ?D
|
5
|
-
|
6
|
-
def initialize(describe_type, describe_name)
|
7
|
-
if describe_type == :portal
|
8
|
-
@describe_type = ?P
|
9
|
-
elsif describe_type == :prepared_statement
|
10
|
-
@describe_type = ?S
|
11
|
-
else
|
12
|
-
raise ArgumentError.new("#{describe_type} is not a valid describe_type. Must be either :portal or :prepared_statement.")
|
13
|
-
end
|
14
|
-
@describe_name = describe_name
|
15
|
-
end
|
16
|
-
|
17
|
-
def to_bytes(stream)
|
18
|
-
size = LENGTH_SIZE
|
19
|
-
size += 1
|
20
|
-
size += @describe_name.length + 1
|
21
|
-
|
22
|
-
stream.write_byte(message_id)
|
23
|
-
stream.write_network_int32(size) # size
|
24
|
-
stream.write_byte(@describe_type)
|
25
|
-
stream.write_cstring(@describe_name)
|
26
|
-
end
|
27
|
-
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
@@ -1,59 +0,0 @@
|
|
1
|
-
module Vertica
|
2
|
-
module Messages
|
3
|
-
class ErrorResponse < BackendMessage
|
4
|
-
message_id ?E
|
5
|
-
|
6
|
-
def initialize(stream, size)
|
7
|
-
super
|
8
|
-
@errors = {}
|
9
|
-
|
10
|
-
field_type = stream.read_byte
|
11
|
-
while field_type != 0
|
12
|
-
@errors[field_type] = stream.read_cstring
|
13
|
-
field_type = stream.read_byte
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
def error
|
18
|
-
s = []
|
19
|
-
@errors.each do |field_type, message|
|
20
|
-
s << [convert_field_type_to_string(field_type), message].flatten
|
21
|
-
end
|
22
|
-
s.sort_by { |e| e.first }.map { |e| "#{e[1]}: #{e[2]}" }.join(', ')
|
23
|
-
end
|
24
|
-
|
25
|
-
protected
|
26
|
-
|
27
|
-
def convert_field_type_to_string(field_type)
|
28
|
-
case field_type
|
29
|
-
when ?S
|
30
|
-
[1, "Severity"]
|
31
|
-
when ?C
|
32
|
-
[3, "Sqlstate"]
|
33
|
-
when ?M
|
34
|
-
[2, "Message"]
|
35
|
-
when ?D
|
36
|
-
[4, "Detail"]
|
37
|
-
when ?H
|
38
|
-
[5, "Hint"]
|
39
|
-
when ?P
|
40
|
-
[6, "Position"]
|
41
|
-
when ?p
|
42
|
-
[8, "Internal Position"]
|
43
|
-
when ?q
|
44
|
-
[0, "Internal Query"]
|
45
|
-
when ?W
|
46
|
-
[7, "Where"]
|
47
|
-
when ?F
|
48
|
-
[11, "File"]
|
49
|
-
when ?L
|
50
|
-
[12, "Line"]
|
51
|
-
when ?R
|
52
|
-
[10, "Routine"]
|
53
|
-
else
|
54
|
-
[13, field_type.to_s]
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
@@ -1,24 +0,0 @@
|
|
1
|
-
module Vertica
|
2
|
-
module Messages
|
3
|
-
class Execute < FrontendMessage
|
4
|
-
message_id ?E
|
5
|
-
|
6
|
-
def initialize(portal_name, max_rows)
|
7
|
-
@portal_name = portal_name
|
8
|
-
@max_rows = max_rows
|
9
|
-
end
|
10
|
-
|
11
|
-
def to_bytes(stream)
|
12
|
-
size = LENGTH_SIZE
|
13
|
-
size += @portal_name.length + 1
|
14
|
-
size += 4
|
15
|
-
|
16
|
-
stream.write_byte(message_id)
|
17
|
-
stream.write_network_int32(size) # size
|
18
|
-
stream.write_cstring(@portal_name)
|
19
|
-
stream.write_network_int32(@max_rows)
|
20
|
-
end
|
21
|
-
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
@@ -1,21 +0,0 @@
|
|
1
|
-
module Vertica
|
2
|
-
module Messages
|
3
|
-
class NoticeResponse < BackendMessage
|
4
|
-
message_id ?N
|
5
|
-
|
6
|
-
attr_reader :notices
|
7
|
-
|
8
|
-
def initialize(stream, size)
|
9
|
-
super
|
10
|
-
@notices = []
|
11
|
-
|
12
|
-
field_type = stream.read_byte
|
13
|
-
while field_type != 0
|
14
|
-
@notices << [field_type, stream.read_cstring]
|
15
|
-
field_type = stream.read_byte
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
@@ -1,31 +0,0 @@
|
|
1
|
-
module Vertica
|
2
|
-
module Messages
|
3
|
-
class Parse < FrontendMessage
|
4
|
-
message_id ?P
|
5
|
-
|
6
|
-
def initialize(name, query, param_types)
|
7
|
-
@name = name
|
8
|
-
@query = query
|
9
|
-
@param_types = param_types
|
10
|
-
end
|
11
|
-
|
12
|
-
def to_bytes(stream)
|
13
|
-
size = LENGTH_SIZE
|
14
|
-
size += @name.length + 1
|
15
|
-
size += @query.length + 1
|
16
|
-
size += 2
|
17
|
-
size += (@param_types.length * 4)
|
18
|
-
|
19
|
-
stream.write_byte(message_id)
|
20
|
-
stream.write_network_int32(size) # size
|
21
|
-
stream.write_cstring(@name)
|
22
|
-
stream.write_cstring(@query)
|
23
|
-
stream.write_network_int16(@param_types.length)
|
24
|
-
@param_types.each do |param_type|
|
25
|
-
stream.write_network_int32(param_type)
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
@@ -1,33 +0,0 @@
|
|
1
|
-
require 'digest/md5'
|
2
|
-
|
3
|
-
module Vertica
|
4
|
-
module Messages
|
5
|
-
class Password < FrontendMessage
|
6
|
-
message_id ?p
|
7
|
-
|
8
|
-
def initialize(password, authentication_method = Messages::Authentication::CLEARTEXT_PASSWORD, options = {})
|
9
|
-
case authentication_method
|
10
|
-
when Messages::Authentication::CLEARTEXT_PASSWORD
|
11
|
-
@password = password
|
12
|
-
when Messages::Authentication::CRYPT_PASSWORD
|
13
|
-
@password = password.crypt(options[:salt])
|
14
|
-
when Messages::Authentication::MD5_PASSWORD
|
15
|
-
@password = Digest::MD5.hexdigest(password + options[:user])
|
16
|
-
@password = Digest::MD5.hexdigest(m + options[:salt])
|
17
|
-
@password = 'md5' + @password
|
18
|
-
else
|
19
|
-
raise ArgumentError.new("unsupported authentication method: #{authentication_method}")
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
def to_bytes(stream)
|
24
|
-
size = LENGTH_SIZE
|
25
|
-
size += @password.length + 1
|
26
|
-
stream.write_byte(message_id)
|
27
|
-
stream.write_network_int32(size) # size
|
28
|
-
stream.write_cstring(@password)
|
29
|
-
end
|
30
|
-
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
@@ -1,20 +0,0 @@
|
|
1
|
-
module Vertica
|
2
|
-
module Messages
|
3
|
-
class Query < FrontendMessage
|
4
|
-
message_id ?Q
|
5
|
-
|
6
|
-
def initialize(query_string)
|
7
|
-
@query_string = query_string
|
8
|
-
end
|
9
|
-
|
10
|
-
def to_bytes(stream)
|
11
|
-
size = LENGTH_SIZE
|
12
|
-
size += @query_string.length + 1
|
13
|
-
stream.write_byte(message_id.bytes.first)
|
14
|
-
stream.write_network_int32(size) # size
|
15
|
-
stream.write_cstring(@query_string)
|
16
|
-
end
|
17
|
-
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
@@ -1,14 +0,0 @@
|
|
1
|
-
module Vertica
|
2
|
-
module Messages
|
3
|
-
class SslRequest < FrontendMessage
|
4
|
-
message_id nil
|
5
|
-
|
6
|
-
def to_bytes(stream)
|
7
|
-
size = LENGTH_SIZE + 4
|
8
|
-
stream.write_network_int32(size) # size
|
9
|
-
stream.write_network_int32(80877103) # size
|
10
|
-
end
|
11
|
-
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
@@ -1,38 +0,0 @@
|
|
1
|
-
module Vertica
|
2
|
-
module Messages
|
3
|
-
class Startup < FrontendMessage
|
4
|
-
message_id nil
|
5
|
-
|
6
|
-
def initialize(user, database, options = nil)
|
7
|
-
@user = user
|
8
|
-
@database = database
|
9
|
-
@options = options
|
10
|
-
end
|
11
|
-
|
12
|
-
def to_bytes(stream)
|
13
|
-
size = LENGTH_SIZE + 4 # length + protocol
|
14
|
-
size += @user.length + 4 + 2 if @user
|
15
|
-
size += @database.length + 8 + 2 if @database
|
16
|
-
size += @options.length + 7 + 2 if @options
|
17
|
-
size += 1 # ending zero
|
18
|
-
|
19
|
-
stream.write_network_int32(size) # size
|
20
|
-
stream.write_network_int32(Vertica::PROTOCOL_VERSION) # proto version
|
21
|
-
if @user
|
22
|
-
stream.write_cstring('user')
|
23
|
-
stream.write_cstring(@user)
|
24
|
-
end
|
25
|
-
if @database
|
26
|
-
stream.write_cstring('database')
|
27
|
-
stream.write_cstring(@database)
|
28
|
-
end
|
29
|
-
if @options
|
30
|
-
stream.write_cstring('options')
|
31
|
-
stream.write_cstring(@options)
|
32
|
-
end
|
33
|
-
stream.write_byte(0)
|
34
|
-
end
|
35
|
-
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|