class PostgresPR::Message
Base class representing a PostgreSQL protocol message
Constants
- MsgTypeMap
One character message-typecode to class map
Public Class Methods
create(buffer)
click to toggle source
# File lib/postgres-pr/message.rb, line 63 def self.create(buffer) obj = allocate obj.parse(buffer) obj end
dump(*args)
click to toggle source
# File lib/postgres-pr/message.rb, line 69 def self.dump(*args) new(*args).dump end
fields(*attribs)
click to toggle source
# File lib/postgres-pr/message.rb, line 88 def self.fields(*attribs) names = attribs.map {|name, type| name.to_s} arg_list = names.join(", ") ivar_list = names.map {|name| "@" + name }.join(", ") sym_list = names.map {|name| ":" + name }.join(", ") class_eval %[ attr_accessor #{ sym_list } def initialize(#{ arg_list }) #{ ivar_list } = #{ arg_list } end ] end
read(stream, startup=false)
click to toggle source
# File lib/postgres-pr/message.rb, line 48 def self.read(stream, startup=false) type = stream.read_exactly_n_bytes(1) unless startup length = stream.read_exactly_n_bytes(4).unpack('N').first # FIXME: length should be signed, not unsigned raise ParseError unless length >= 4 # initialize buffer buffer = Buffer.of_size(startup ? length : 1+length) buffer.write(type) unless startup buffer.write_int32_network(length) buffer.copy_from_stream(stream, length-4) (startup ? StartupMessage : MsgTypeMap[type]).create(buffer) end
register_message_type(type)
click to toggle source
# File lib/postgres-pr/message.rb, line 39 def self.register_message_type(type) raise(PGError, "duplicate message type registration") if MsgTypeMap.has_key?(type) MsgTypeMap[type] = self self.const_set(:MsgType, type) class_eval "def message_type; MsgType end" end
Public Instance Methods
dump(body_size=0) { |buffer| ... }
click to toggle source
# File lib/postgres-pr/message.rb, line 73 def dump(body_size=0) buffer = Buffer.of_size(5 + body_size) buffer.write(self.message_type) buffer.write_int32_network(4 + body_size) yield buffer if block_given? raise DumpError unless buffer.at_end? return buffer.content end
parse(buffer) { |buffer| ... }
click to toggle source
# File lib/postgres-pr/message.rb, line 82 def parse(buffer) buffer.position = 5 yield buffer if block_given? raise ParseError, buffer.inspect unless buffer.at_end? end