You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
118 lines
2.7 KiB
118 lines
2.7 KiB
require 'fcntl'
|
|
|
|
module RPM
|
|
class DB
|
|
include Enumerable
|
|
|
|
# @visibility private
|
|
# @param ts [Transaction] transaction object
|
|
def initialize(ts, opts = {})
|
|
opts[:writable] ||= false
|
|
|
|
@ts = ts
|
|
RPM::C.rpmtsOpenDB(@ts.ptr, opts[:writable] ? Fcntl::O_RDWR | Fcntl::O_CREAT : Fcntl::O_RDONLY)
|
|
end
|
|
|
|
# @return [RPM::MatchIterator] Creates an iterator for +tag+ and +val+
|
|
def init_iterator(tag, val)
|
|
@ts.init_iterator(tag, val)
|
|
end
|
|
|
|
#
|
|
# @yield [Package] Called for each match
|
|
# @param [Number] key RPM tag key
|
|
# @param [String] val Value to match
|
|
# @example
|
|
# RPM.transaction do |t|
|
|
# t.each_match(RPM::TAG_ARCH, "x86_64") do |pkg|
|
|
# puts pkg.name
|
|
# end
|
|
# end
|
|
#
|
|
def each_match(key, val, &block)
|
|
@ts.each_match(key, val, &block)
|
|
end
|
|
|
|
#
|
|
# @yield [Package] Called for each package in the database
|
|
# @example
|
|
# db.each do |pkg|
|
|
# puts pkg.name
|
|
# end
|
|
#
|
|
def each(&block)
|
|
@ts.each(&block)
|
|
end
|
|
|
|
# @visibility private
|
|
def ptr
|
|
RPM::C.rpmtsGetRdb(@ts.ptr)
|
|
end
|
|
|
|
def close
|
|
RPM::C.rpmtsCloseDB(@ts.ptr)
|
|
end
|
|
|
|
def closed?
|
|
ptr.null?
|
|
end
|
|
|
|
#
|
|
# The package database is opened, but transactional processing
|
|
# (@see RPM::DB#transaction) cannot be done for when +writable+ is false.
|
|
# When +writable+ is +false+ then the generated object gets freezed.
|
|
# @param [Boolean] writable Whether the database is writable. Default is +false+.
|
|
# @param [String] root Root path for the database, default is empty.
|
|
# @return [RPM::DB]
|
|
#
|
|
# @example
|
|
# db = RPM::DB.open
|
|
# db.each do |pkg|
|
|
# puts pkg.name
|
|
# end
|
|
#
|
|
def self.open(_writable = false, root = '/', &block)
|
|
open_for_transaction(Transaction.new(root: root), writable: false, &block)
|
|
end
|
|
|
|
# @visibility private
|
|
def self.open_for_transaction(ts, opts = {})
|
|
db = new(ts, opts)
|
|
return db unless block_given?
|
|
|
|
begin
|
|
yield db
|
|
ensure
|
|
db.close unless db.closed?
|
|
end
|
|
end
|
|
|
|
# @deprecated Not possible to get home value in
|
|
# newer RPM versions
|
|
def home
|
|
raise NotImplementedError
|
|
end
|
|
|
|
# @return [String] The root path of the database
|
|
def root
|
|
RPM::C.rpmtsRootDir(@ts.ptr)
|
|
end
|
|
|
|
# @deprecated Use RPM::Transaction#each
|
|
def self.each
|
|
DB.open do |db|
|
|
it = MatchIterator.from_ptr(RPM::C.rpmdbInitIterator(db.ptr, 0, nil, 0))
|
|
if block_given?
|
|
it.each do |pkg|
|
|
yield pkg
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
# @return number of instances of +name+ in the
|
|
# database
|
|
def count_packages(name); end
|
|
end
|
|
end
|