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
@@ -0,0 +1,35 @@
1
+
2
+ module Vertica
3
+ module Messages
4
+ class Password < FrontendMessage
5
+ message_id ?p
6
+
7
+ def initialize(password, auth_method = nil, options = {})
8
+ @password = password
9
+ @auth_method = auth_method || Messages::Authentication::CLEARTEXT_PASSWORD
10
+ @options = options
11
+ end
12
+
13
+ def password
14
+ case @auth_method
15
+ when Authentication::CLEARTEXT_PASSWORD
16
+ @password
17
+ when Authentication::CRYPT_PASSWORD
18
+ @password.crypt(options[:salt])
19
+ when Authentication::MD5_PASSWORD
20
+ require 'digest/md5'
21
+ @password = Digest::MD5.hexdigest(@password + @options[:user])
22
+ @password = Digest::MD5.hexdigest(m + @options[:salt])
23
+ @password = 'md5' + @password
24
+ else
25
+ raise ArgumentError.new("unsupported authentication method: #{@auth_method}")
26
+ end
27
+ end
28
+
29
+ def to_bytes
30
+ message_string password.to_cstring
31
+ end
32
+
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,17 @@
1
+ module Vertica
2
+ module Messages
3
+
4
+ class Query < FrontendMessage
5
+ message_id ?Q
6
+
7
+ def initialize(query_string)
8
+ @query_string = query_string
9
+ end
10
+
11
+ def to_bytes
12
+ message_string @query_string.to_cstring
13
+ end
14
+ end
15
+
16
+ end
17
+ end
@@ -0,0 +1,12 @@
1
+ module Vertica
2
+ module Messages
3
+ class SslRequest < FrontendMessage
4
+ message_id nil
5
+
6
+ def to_bytes
7
+ message_string 80877103.to_network_int32
8
+ end
9
+
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,25 @@
1
+ module Vertica
2
+ module Messages
3
+
4
+ class Startup < FrontendMessage
5
+ message_id nil
6
+
7
+ def initialize(user, database, options = nil)
8
+ @user = user
9
+ @database = database
10
+ @options = options
11
+ end
12
+
13
+ def to_bytes
14
+ bytes = [Vertica::PROTOCOL_VERSION.to_network_int32]
15
+ bytes += ['user'.to_cstring, @user.to_cstring] if @user
16
+ bytes += ['database'.to_cstring, @database.to_cstring] if @database
17
+ bytes += ['options'.to_cstring, @options.to_cstring] if @options
18
+ bytes << 0
19
+
20
+ message_string bytes
21
+ end
22
+
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,7 @@
1
+ module Vertica
2
+ module Messages
3
+ class Sync < FrontendMessage
4
+ message_id ?S
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module Vertica
2
+ module Messages
3
+ class Terminate < FrontendMessage
4
+ message_id ?X
5
+ end
6
+ end
7
+ end
@@ -1,15 +1,19 @@
1
1
  module Vertica
2
2
  module Messages
3
- class Message
4
- LENGTH_SIZE = 4
5
3
 
6
- class << self
4
+ class Message
5
+ def self.message_id(message_id)
6
+ self.send(:define_method, :message_id) { message_id }
7
+ end
7
8
 
8
- def message_id(message_id)
9
- self.const_set(:MESSAGE_ID, message_id)
10
- class_eval "def message_id; MESSAGE_ID end"
9
+ def message_string(msg)
10
+ msg = msg.join if msg.is_a?(Array)
11
+ size = (0.to_network_int32.size + msg.size).to_network_int32
12
+ m_id = ''.to_byte #in 1.9 it seems to write out message ids as numbers, handle this here
13
+ if (message_id)
14
+ m_id = message_id.chr
11
15
  end
12
-
16
+ "#{m_id}#{size}#{msg}"
13
17
  end
14
18
  end
15
19
 
@@ -18,68 +22,33 @@ module Vertica
18
22
 
19
23
  attr_reader :size
20
24
 
21
- class << self
22
- def message_id(message_id)
23
- super
24
- MessageIdMap[message_id.chr] = self
25
+ def self.factory(type, stream, size)
26
+ #puts "factory reading message #{type} #{size} #{type.class}"
27
+ if klass = MessageIdMap[type.chr] #explicitly use the char value, for 1.9 compat
28
+ klass.new stream, size
29
+ else
30
+ Messages::Unknown.new stream, size
25
31
  end
32
+ end
26
33
 
27
- def read(stream)
28
- type = stream.read_byte
29
- size = stream.read_network_int32
30
-
31
- raise Vertica::Error::MessageError.new("Bad message size: #{size}") unless size >= 4
32
-
33
- message_klass = MessageIdMap[type.chr]
34
- if message_klass.nil?
35
- Messages::Unknown.new(type)
36
- else
37
- message_klass.new(stream, size)
38
- end
39
- end
34
+ def self.message_id(message_id)
35
+ super
36
+ MessageIdMap[message_id.chr] = self #explicitly use the char value, for 1.9 compat
37
+ end
40
38
 
39
+ def self.read(stream)
41
40
  end
42
41
 
43
42
  def initialize(stream, size)
44
43
  @size = size
45
44
  end
46
-
47
45
  end
48
46
 
49
47
  class FrontendMessage < Message
48
+ def to_bytes
49
+ message_string ''
50
+ end
50
51
  end
51
52
 
52
53
  end
53
54
  end
54
-
55
- require 'vertica/messages/unknown'
56
- require 'vertica/messages/error_response'
57
- require 'vertica/messages/startup'
58
- require 'vertica/messages/authentication'
59
- require 'vertica/messages/password'
60
- require 'vertica/messages/parameter_status'
61
- require 'vertica/messages/backend_key_data'
62
- require 'vertica/messages/ready_for_query'
63
- require 'vertica/messages/terminate'
64
- require 'vertica/messages/notification_response'
65
- require 'vertica/messages/query'
66
- require 'vertica/messages/notice_response'
67
- require 'vertica/messages/row_description'
68
- require 'vertica/messages/command_complete'
69
- require 'vertica/messages/data_row'
70
- require 'vertica/messages/empty_query_response'
71
- require 'vertica/messages/sync'
72
- require 'vertica/messages/ssl_request'
73
- require 'vertica/messages/parse'
74
- require 'vertica/messages/parse_complete'
75
- require 'vertica/messages/bind'
76
- require 'vertica/messages/bind_complete'
77
- require 'vertica/messages/describe'
78
- require 'vertica/messages/flush'
79
- require 'vertica/messages/parameter_description'
80
- require 'vertica/messages/no_data'
81
- require 'vertica/messages/execute'
82
- require 'vertica/messages/close'
83
- require 'vertica/messages/close_complete'
84
- require 'vertica/messages/portal_suspended'
85
- require 'vertica/messages/cancel_request'
@@ -1,28 +1,36 @@
1
1
  module Vertica
2
2
  class Result
3
-
4
- def initialize(field_descriptions, field_values)
5
- @field_descriptions = field_descriptions
6
- @field_values = field_values
3
+ attr_reader :columns
4
+ attr_reader :rows
5
+
6
+ def initialize
7
+ @rows = []
7
8
  end
8
-
9
- def row_count
10
- @row_count ||= @field_values.length
11
- end
12
-
13
- def columns
14
- @columns ||= @field_descriptions.map { |fd| Column.new(fd[:type_modifier], fd[:format_code], fd[:table_oid], fd[:name], fd[:attribute_number], fd[:data_type_oid], fd[:data_type_size]) }
9
+
10
+ def descriptions=(message)
11
+ @columns = message.fields.map { |fd| Column.new(fd) }
15
12
  end
16
-
17
- def rows
18
- @field_values.map do |fv|
19
- index = 0
20
- fv.map do |f|
21
- index += 1
22
- self.columns[index-1].convert(f[:value])
23
- end
13
+
14
+ def format_row(row_data)
15
+ row = {}
16
+ row_data.fields.each_with_index do |field, idx|
17
+ col = columns[idx]
18
+ row[col.name] = col.convert(field)
24
19
  end
20
+ row
21
+ end
22
+
23
+ def add_row(row_data)
24
+ @rows << format_row(row_data)
25
+ end
26
+
27
+ def each_row(&block)
28
+ @rows.each(&block)
29
+ end
30
+
31
+ def row_count
32
+ @rows.size
25
33
  end
26
-
34
+
27
35
  end
28
36
  end
@@ -1,8 +1,19 @@
1
- require 'socket'
2
- require 'vertica/bit_helper'
3
-
4
1
  module Vertica
5
2
  class VerticaSocket < TCPSocket
6
3
  include BitHelper
4
+
5
+ def read_message
6
+ type = read_byte
7
+ size = read_network_int32
8
+
9
+ raise Vertica::Error::MessageError.new("Bad message size: #{size}") unless size >= 4
10
+ Messages::BackendMessage.factory type, self, size
11
+ end
12
+
13
+ def write_message(message)
14
+ raise ArgumentError, "invalid message: (#{message.inspect})" unless message.respond_to?(:to_bytes)
15
+ write message.to_bytes
16
+ end
17
+
7
18
  end
8
19
  end
data/test/test_helper.rb CHANGED
@@ -1,25 +1,16 @@
1
1
  require "test/unit"
2
+
2
3
  $:.unshift(File.dirname(__FILE__) + '/../lib')
3
4
  require "vertica"
4
-
5
+
5
6
  class Test::Unit::TestCase
6
-
7
- TEST_CONNECTION_USER = 'dbadmin'
8
- TEST_CONNECTION_PASSWORD = 'cl3v3rcstore'
9
- TEST_CONNECTION_HOST = 'ec2-174-129-157-242.compute-1.amazonaws.com'
10
- TEST_CONNECTION_PORT = 5433
11
- TEST_CONNECTION_DATABASE = 'db'
12
7
 
13
8
  TEST_CONNECTION_HASH = {
14
- :user => TEST_CONNECTION_USER,
15
- :password => TEST_CONNECTION_PASSWORD,
16
- :host => TEST_CONNECTION_HOST,
17
- :port => TEST_CONNECTION_PORT,
18
- :database => TEST_CONNECTION_DATABASE
9
+ :user => '',
10
+ :password => '',
11
+ :host => '',
12
+ :port => '',
13
+ :database => ''
19
14
  }
20
15
 
21
16
  end
22
-
23
- class StringIO
24
- include Vertica::BitHelper
25
- end
metadata CHANGED
@@ -1,81 +1,85 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vertica
3
3
  version: !ruby/object:Gem::Version
4
+ hash: 61
4
5
  prerelease: false
5
6
  segments:
6
7
  - 0
7
- - 7
8
- - 4
9
- version: 0.7.4
8
+ - 8
9
+ - 1
10
+ version: 0.8.1
10
11
  platform: ruby
11
12
  authors:
13
+ - Jeff Smick
12
14
  - Matt Bauer
13
15
  autorequire:
14
16
  bindir: bin
15
17
  cert_chain: []
16
18
 
17
- date: 2010-08-17 00:00:00 +02:00
19
+ date: 2011-03-07 00:00:00 -08:00
18
20
  default_executable:
19
21
  dependencies: []
20
22
 
21
- description:
22
- email: bauer@pedalbrain.com
23
+ description: Query Vertica with ruby
24
+ email: sprsquish@gmail.com
23
25
  executables: []
24
26
 
25
27
  extensions: []
26
28
 
27
- extra_rdoc_files: []
28
-
29
+ extra_rdoc_files:
30
+ - LICENSE
31
+ - README.md
29
32
  files:
30
- - vertica.gemspec
31
33
  - LICENSE
32
- - README.textile
34
+ - README.md
33
35
  - Rakefile
36
+ - VERSION
34
37
  - lib/vertica.rb
35
- - lib/vertica/notice.rb
36
38
  - lib/vertica/bit_helper.rb
37
39
  - lib/vertica/column.rb
38
40
  - lib/vertica/connection.rb
41
+ - lib/vertica/core_ext/numeric.rb
42
+ - lib/vertica/core_ext/string.rb
43
+ - lib/vertica/messages/backend_messages/authentication.rb
44
+ - lib/vertica/messages/backend_messages/backend_key_data.rb
45
+ - lib/vertica/messages/backend_messages/bind_complete.rb
46
+ - lib/vertica/messages/backend_messages/close_complete.rb
47
+ - lib/vertica/messages/backend_messages/command_complete.rb
48
+ - lib/vertica/messages/backend_messages/data_row.rb
49
+ - lib/vertica/messages/backend_messages/empty_query_response.rb
50
+ - lib/vertica/messages/backend_messages/error_response.rb
51
+ - lib/vertica/messages/backend_messages/no_data.rb
52
+ - lib/vertica/messages/backend_messages/notice_response.rb
53
+ - lib/vertica/messages/backend_messages/notification_response.rb
54
+ - lib/vertica/messages/backend_messages/parameter_description.rb
55
+ - lib/vertica/messages/backend_messages/parameter_status.rb
56
+ - lib/vertica/messages/backend_messages/parse_complete.rb
57
+ - lib/vertica/messages/backend_messages/portal_suspended.rb
58
+ - lib/vertica/messages/backend_messages/ready_for_query.rb
59
+ - lib/vertica/messages/backend_messages/row_description.rb
60
+ - lib/vertica/messages/backend_messages/unknown.rb
61
+ - lib/vertica/messages/frontend_messages/bind.rb
62
+ - lib/vertica/messages/frontend_messages/cancel_request.rb
63
+ - lib/vertica/messages/frontend_messages/close.rb
64
+ - lib/vertica/messages/frontend_messages/describe.rb
65
+ - lib/vertica/messages/frontend_messages/execute.rb
66
+ - lib/vertica/messages/frontend_messages/flush.rb
67
+ - lib/vertica/messages/frontend_messages/parse.rb
68
+ - lib/vertica/messages/frontend_messages/password.rb
69
+ - lib/vertica/messages/frontend_messages/query.rb
70
+ - lib/vertica/messages/frontend_messages/ssl_request.rb
71
+ - lib/vertica/messages/frontend_messages/startup.rb
72
+ - lib/vertica/messages/frontend_messages/sync.rb
73
+ - lib/vertica/messages/frontend_messages/terminate.rb
74
+ - lib/vertica/messages/message.rb
75
+ - lib/vertica/notice.rb
39
76
  - lib/vertica/notification.rb
40
77
  - lib/vertica/result.rb
41
78
  - lib/vertica/vertica_socket.rb
42
- - lib/vertica/messages/authentication.rb
43
- - lib/vertica/messages/backend_key_data.rb
44
- - lib/vertica/messages/bind.rb
45
- - lib/vertica/messages/bind_complete.rb
46
- - lib/vertica/messages/cancel_request.rb
47
- - lib/vertica/messages/close.rb
48
- - lib/vertica/messages/close_complete.rb
49
- - lib/vertica/messages/command_complete.rb
50
- - lib/vertica/messages/data_row.rb
51
- - lib/vertica/messages/describe.rb
52
- - lib/vertica/messages/empty_query_response.rb
53
- - lib/vertica/messages/error_response.rb
54
- - lib/vertica/messages/execute.rb
55
- - lib/vertica/messages/flush.rb
56
- - lib/vertica/messages/message.rb
57
- - lib/vertica/messages/no_data.rb
58
- - lib/vertica/messages/notice_response.rb
59
- - lib/vertica/messages/notification_response.rb
60
- - lib/vertica/messages/parameter_description.rb
61
- - lib/vertica/messages/parameter_status.rb
62
- - lib/vertica/messages/parse.rb
63
- - lib/vertica/messages/parse_complete.rb
64
- - lib/vertica/messages/password.rb
65
- - lib/vertica/messages/portal_suspended.rb
66
- - lib/vertica/messages/query.rb
67
- - lib/vertica/messages/ready_for_query.rb
68
- - lib/vertica/messages/row_description.rb
69
- - lib/vertica/messages/ssl_request.rb
70
- - lib/vertica/messages/startup.rb
71
- - lib/vertica/messages/sync.rb
72
- - lib/vertica/messages/terminate.rb
73
- - lib/vertica/messages/unknown.rb
74
79
  - test/connection_test.rb
75
- - test/create_schema.sql
76
80
  - test/test_helper.rb
77
81
  has_rdoc: true
78
- homepage: http://github.com/mattbauer/vertica
82
+ homepage: http://github.com/sprsquish/vertica
79
83
  licenses: []
80
84
 
81
85
  post_install_message:
@@ -88,16 +92,16 @@ required_ruby_version: !ruby/object:Gem::Requirement
88
92
  requirements:
89
93
  - - ">="
90
94
  - !ruby/object:Gem::Version
95
+ hash: 3
91
96
  segments:
92
- - 1
93
- - 8
94
- - 4
95
- version: 1.8.4
97
+ - 0
98
+ version: "0"
96
99
  required_rubygems_version: !ruby/object:Gem::Requirement
97
100
  none: false
98
101
  requirements:
99
102
  - - ">="
100
103
  - !ruby/object:Gem::Version
104
+ hash: 3
101
105
  segments:
102
106
  - 0
103
107
  version: "0"
@@ -107,6 +111,7 @@ rubyforge_project:
107
111
  rubygems_version: 1.3.7
108
112
  signing_key:
109
113
  specification_version: 3
110
- summary: A Ruby interface to Vertica
114
+ summary: Pure ruby library for interacting with Vertica
111
115
  test_files:
116
+ - test/connection_test.rb
112
117
  - test/test_helper.rb