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
@@ -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