import gdbm
from package import *
import regex

class RPMDatabase:

    def OpenDatabase(self, Prefix):
	self.prefix = Prefix
	self.reopen()

    def containsPackageLabel(self, label):
	return self.packages.has_key(label)

    def packageLabels(self):
	list = self.packages.keys()
	try:
	    list.remove("--version--")
	except:
	    pass
	return list

    def packageNames(self):
	return self.nameidx.keys()

    def reopen(self):
	self.nameidx = gdbm.open(self.prefix + "/nameidx", "r", 0)
	self.pathidx = gdbm.open(self.prefix + "/pathidx", "r", 0)
	self.packages = gdbm.open(self.prefix + "/packages", "r", 0)
	self.groupindex = gdbm.open(self.prefix + "/groupindex", "r", 0)
	self.iconindex = gdbm.open(self.prefix + "/iconidx", "r", 0)

    def getPackageGroup(self, Name, Label):
	if (self.groupindex.has_key(Name)):
	    return self.groupindex[Name]
	elif (self.groupindex.has_key(Label)):
	    return self.groupindex[Label]
	else:
	    return "Unknown"

    def getPackageIcon(self, Label):
	if (self.iconindex.has_key(Label)):
	    return self.iconindex[Label]
	else:
	    return None

    def getPackageString(self, Label):
	if (self.packages.has_key(Label)):
	    return self.packages[Label]
	else:
	    return None

    def close(self):
	del(self.nameidx)
	del(self.pathidx)
	del(self.packages)
	del(self.groupindex)

    def __init__(self, Prefix):
	self.OpenDatabase(Prefix)

class InstalledPackage(Package):

    splitlabel = regex.compile("(.*):(.*):(.*)")

    # this has to match this line from rpm's dbrecord.pl
    # @recfields = ("name", "version", "release", "${SUBPACKAGE}C");

    def getBasicInfo(self, label):
	self.splitlabel.search(label)
	(self.name, self.version, self.release) = self.splitlabel.group(1, 2, 3)
	self.group = self.db.getPackageGroup(self.name, label)
	self.icon = self.db.getPackageIcon(label)

    def getSpeci(self):
	if (not self.spec):
	    dbentry = self.db.getPackageString(self.label)
	    self.spec = SpeciFromStr(dbentry)
	return self.spec

    def __init__(self, label, db):
	Package.__init__(self)
	self.db = db
	self.spec = None
	self.name = label
	self.version = ""
	self.release= ""
	self.label = label

	self.getBasicInfo(label)

