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.
Files changed (63) hide show
  1. data/README.md +85 -0
  2. data/Rakefile +56 -38
  3. data/VERSION +1 -0
  4. data/lib/vertica.rb +59 -11
  5. data/lib/vertica/bit_helper.rb +7 -24
  6. data/lib/vertica/column.rb +34 -53
  7. data/lib/vertica/connection.rb +123 -139
  8. data/lib/vertica/core_ext/numeric.rb +13 -0
  9. data/lib/vertica/core_ext/string.rb +22 -0
  10. data/lib/vertica/messages/{authentication.rb → backend_messages/authentication.rb} +6 -9
  11. data/lib/vertica/messages/{backend_key_data.rb → backend_messages/backend_key_data.rb} +2 -2
  12. data/lib/vertica/messages/{bind_complete.rb → backend_messages/bind_complete.rb} +0 -1
  13. data/lib/vertica/messages/{close_complete.rb → backend_messages/close_complete.rb} +0 -1
  14. data/lib/vertica/messages/{command_complete.rb → backend_messages/command_complete.rb} +3 -3
  15. data/lib/vertica/messages/{data_row.rb → backend_messages/data_row.rb} +3 -6
  16. data/lib/vertica/messages/{empty_query_response.rb → backend_messages/empty_query_response.rb} +0 -1
  17. data/lib/vertica/messages/backend_messages/error_response.rb +35 -0
  18. data/lib/vertica/messages/{no_data.rb → backend_messages/no_data.rb} +0 -1
  19. data/lib/vertica/messages/backend_messages/notice_response.rb +16 -0
  20. data/lib/vertica/messages/{notification_response.rb → backend_messages/notification_response.rb} +0 -0
  21. data/lib/vertica/messages/{parameter_description.rb → backend_messages/parameter_description.rb} +0 -0
  22. data/lib/vertica/messages/{parameter_status.rb → backend_messages/parameter_status.rb} +0 -0
  23. data/lib/vertica/messages/{parse_complete.rb → backend_messages/parse_complete.rb} +0 -1
  24. data/lib/vertica/messages/{portal_suspended.rb → backend_messages/portal_suspended.rb} +0 -1
  25. data/lib/vertica/messages/{ready_for_query.rb → backend_messages/ready_for_query.rb} +2 -2
  26. data/lib/vertica/messages/{row_description.rb → backend_messages/row_description.rb} +3 -3
  27. data/lib/vertica/messages/{unknown.rb → backend_messages/unknown.rb} +2 -2
  28. data/lib/vertica/messages/frontend_messages/bind.rb +28 -0
  29. data/lib/vertica/messages/frontend_messages/cancel_request.rb +21 -0
  30. data/lib/vertica/messages/frontend_messages/close.rb +24 -0
  31. data/lib/vertica/messages/frontend_messages/describe.rb +24 -0
  32. data/lib/vertica/messages/frontend_messages/execute.rb +20 -0
  33. data/lib/vertica/messages/frontend_messages/flush.rb +7 -0
  34. data/lib/vertica/messages/frontend_messages/parse.rb +23 -0
  35. data/lib/vertica/messages/frontend_messages/password.rb +35 -0
  36. data/lib/vertica/messages/frontend_messages/query.rb +17 -0
  37. data/lib/vertica/messages/frontend_messages/ssl_request.rb +12 -0
  38. data/lib/vertica/messages/frontend_messages/startup.rb +25 -0
  39. data/lib/vertica/messages/frontend_messages/sync.rb +7 -0
  40. data/lib/vertica/messages/frontend_messages/terminate.rb +7 -0
  41. data/lib/vertica/messages/message.rb +26 -57
  42. data/lib/vertica/result.rb +28 -20
  43. data/lib/vertica/vertica_socket.rb +14 -3
  44. data/test/test_helper.rb +7 -16
  45. metadata +55 -50
  46. data/README.textile +0 -69
  47. data/lib/vertica/messages/bind.rb +0 -36
  48. data/lib/vertica/messages/cancel_request.rb +0 -25
  49. data/lib/vertica/messages/close.rb +0 -30
  50. data/lib/vertica/messages/describe.rb +0 -30
  51. data/lib/vertica/messages/error_response.rb +0 -59
  52. data/lib/vertica/messages/execute.rb +0 -24
  53. data/lib/vertica/messages/flush.rb +0 -15
  54. data/lib/vertica/messages/notice_response.rb +0 -21
  55. data/lib/vertica/messages/parse.rb +0 -31
  56. data/lib/vertica/messages/password.rb +0 -33
  57. data/lib/vertica/messages/query.rb +0 -20
  58. data/lib/vertica/messages/ssl_request.rb +0 -14
  59. data/lib/vertica/messages/startup.rb +0 -38
  60. data/lib/vertica/messages/sync.rb +0 -15
  61. data/lib/vertica/messages/terminate.rb +0 -14
  62. data/test/create_schema.sql +0 -4
  63. 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,15 +0,0 @@
1
- module Vertica
2
- module Messages
3
- class Flush < FrontendMessage
4
- message_id ?H
5
-
6
- def to_bytes(stream)
7
- size = LENGTH_SIZE
8
-
9
- stream.write_byte(message_id)
10
- stream.write_network_int32(size) # size
11
- end
12
-
13
- end
14
- end
15
- 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