vertica 0.7.4 → 0.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|