metasploit-framework/lib/postgres/postgres-pr/postgres-compat.rb

163 lines
2.5 KiB
Ruby
Raw Normal View History

# -*- coding: binary -*-
# This is a compatibility layer for using the pure Ruby postgres-pr instead of
# the C interface of postgres.
require 'postgres_msf'
require 'postgres/postgres-pr/connection'
# Namespace for Metasploit branch.
module Msf
module Db
class PGconn
class << self
alias connect new
end
def initialize(host, port, options, tty, database, user, auth)
uri =
if host.nil?
nil
elsif host[0] != ?/
"tcp://#{ host }:#{ port }"
else
"unix:#{ host }/.s.PGSQL.#{ port }"
end
@host = host
@db = database
@user = user
@conn = PostgresPR::Connection.new(database, user, auth, uri)
end
def close
@conn.close
end
attr_reader :host, :db, :user
def query(sql)
PGresult.new(@conn.query(sql))
end
alias exec query
def transaction_status
@conn.transaction_status
end
def self.escape(str)
str.gsub("'","''").gsub("\\", "\\\\\\\\")
end
def notice_processor
@conn.notice_processor
end
def notice_processor=(np)
@conn.notice_processor = np
end
def self.quote_ident(name)
%("#{name}")
end
end
class PGresult
include Enumerable
EMPTY_QUERY = 0
COMMAND_OK = 1
TUPLES_OK = 2
COPY_OUT = 3
COPY_IN = 4
BAD_RESPONSE = 5
NONFATAL_ERROR = 6
FATAL_ERROR = 7
def each(&block)
@result.each(&block)
end
def [](index)
@result[index]
end
def initialize(res)
@res = res
@fields = @res.fields.map {|f| f.name}
@result = @res.rows
end
# TODO: status, getlength, cmdstatus
attr_reader :result, :fields
def num_tuples
@result.size
end
def num_fields
@fields.size
end
def fieldname(index)
@fields[index]
end
def fieldnum(name)
@fields.index(name)
end
def type(index)
# TODO: correct?
@res.fields[index].type_oid
end
def size(index)
raise
# TODO: correct?
@res.fields[index].typlen
end
def getvalue(tup_num, field_num)
@result[tup_num][field_num]
end
def status
if num_tuples > 0
TUPLES_OK
else
COMMAND_OK
end
end
def cmdstatus
@res.cmd_tag || ''
end
# free the result set
def clear
@res = @fields = @result = nil
end
# Returns the number of rows affected by the SQL command
def cmdtuples
case @res.cmd_tag
when nil
return nil
when /^INSERT\s+(\d+)\s+(\d+)$/, /^(DELETE|UPDATE|MOVE|FETCH)\s+(\d+)$/
$2.to_i
else
nil
end
end
end
class PGError < ::Exception
end
end
end