vertica 0.7.4 → 0.8.1

Sign up to get free protection for your applications and to get access to all the features.
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