Base class representing a PostgreSQL protocol message
One character message-typecode to class map
# File lib/postgres-pr/message.rb, line 61 def self.create(buffer) obj = allocate obj.parse(buffer) obj end
# File lib/postgres-pr/message.rb, line 67 def self.dump(*args) new(*args).dump end
# File lib/postgres-pr/message.rb, line 86 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
# File lib/postgres-pr/message.rb, line 46 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
# File lib/postgres-pr/message.rb, line 37 def self.register_message_type(type) raise "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
# File lib/postgres-pr/message.rb, line 71 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
Generated with the Darkfish Rdoc Generator 2.