postgres-pr 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -14,7 +14,7 @@ class Connection
14
14
 
15
15
  # sync
16
16
 
17
- def initialize(database, user, auth=nil, uri = nil)
17
+ def initialize(database, user, password=nil, uri = nil)
18
18
  uri ||= "unix:/tmp/.s.PGSQL.5432"
19
19
 
20
20
  raise unless @mutex.nil?
@@ -29,10 +29,31 @@ class Connection
29
29
 
30
30
  loop do
31
31
  msg = Message.read(@conn)
32
+
32
33
  case msg
34
+ when AuthentificationClearTextPassword
35
+ raise ArgumentError, "no password specified" if password.nil?
36
+ @conn << PasswordMessage.new(password).dump
37
+
38
+ when AuthentificationCryptPassword
39
+ raise ArgumentError, "no password specified" if password.nil?
40
+ @conn << PasswordMessage.new(password.crypt(msg.salt)).dump
41
+
42
+ when AuthentificationMD5Password
43
+ raise ArgumentError, "no password specified" if password.nil?
44
+ require 'digest/md5'
45
+
46
+ m = Digest::MD5.hexdigest(password + user)
47
+ m = Digest::MD5.hexdigest(m + msg.salt)
48
+ m = 'md5' + m
49
+ @conn << PasswordMessage.new(m).dump
50
+
51
+ when AuthentificationKerberosV4, AuthentificationKerberosV5, AuthentificationSCMCredential
52
+ raise "unsupported authentification"
53
+
33
54
  when AuthentificationOk
34
55
  when ErrorResponse
35
- raise
56
+ raise "authentification failed"
36
57
  when NoticeResponse
37
58
  # TODO
38
59
  when ParameterStatus
@@ -62,6 +83,7 @@ class Connection
62
83
  @conn << Query.dump(sql)
63
84
 
64
85
  result = Result.new
86
+ errors = []
65
87
 
66
88
  loop do
67
89
  msg = Message.read(@conn)
@@ -78,13 +100,16 @@ class Connection
78
100
  when EmptyQueryResponse
79
101
  when ErrorResponse
80
102
  # TODO
81
- raise msg.inspect
103
+ errors << msg
82
104
  when NoticeResponse
83
105
  p msg
84
106
  else
85
107
  # TODO
86
108
  end
87
109
  end
110
+
111
+ raise errors.map{|e| e.inspect}.join(" ") unless errors.empty?
112
+
88
113
  result
89
114
  }
90
115
  end
@@ -183,6 +183,23 @@ class AuthentificationSCMCredential < Authentification
183
183
  register_auth_type 6
184
184
  end
185
185
 
186
+ class PasswordMessage < Message
187
+ register_message_type ?p
188
+ fields :password
189
+
190
+ def dump
191
+ super(@password.size + 1) do |buffer|
192
+ buffer.write_cstring(@password)
193
+ end
194
+ end
195
+
196
+ def parse(buffer)
197
+ super do
198
+ @password = buffer.read_cstring
199
+ end
200
+ end
201
+ end
202
+
186
203
  class ParameterStatus < Message
187
204
  register_message_type ?S
188
205
  fields :key, :value
@@ -473,3 +490,33 @@ class StartupMessage < Message
473
490
  raise ParseError unless buffer.at_end?
474
491
  end
475
492
  end
493
+
494
+ class SSLRequest < Message
495
+ fields :ssl_request_code
496
+
497
+ def dump
498
+ sz = 4 + 4
499
+ buffer = Buffer.new(sz)
500
+ buffer.write_int32_network(sz)
501
+ buffer.write_int32_network(@ssl_request_code)
502
+ raise DumpError unless buffer.at_end?
503
+ return buffer.content
504
+ end
505
+
506
+ def parse(buffer)
507
+ buffer.position = 4
508
+ @ssl_request_code = buffer.read_int32_network
509
+ raise ParseError unless buffer.at_end?
510
+ end
511
+ end
512
+
513
+ =begin
514
+ # TODO: duplicate message-type, split into client/server messages
515
+ class Sync < Message
516
+ register_message_type ?S
517
+ end
518
+ =end
519
+
520
+ class Terminate < Message
521
+ register_message_type ?X
522
+ end
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.1
3
3
  specification_version: 1
4
4
  name: postgres-pr
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.1.1
7
- date: 2004-11-18
6
+ version: 0.2.0
7
+ date: 2004-11-19
8
8
  summary: A pure Ruby interface to the PostgreSQL database
9
9
  require_paths:
10
10
  - lib