more work on the SQLite integration

git-svn-id: http://svn.sabayonlinux.org/projects/entropy/trunk@212 cd1c1023-2f26-0410-ae45-c471fc1f0318
This commit is contained in:
lxnay
2007-03-29 16:54:38 +00:00
parent dfda10a22a
commit aaf3d1fc13
7 changed files with 209 additions and 181 deletions
+122 -16
View File
@@ -51,14 +51,35 @@ def database(options):
# fill the database
dbconn = etpDatabase()
dbconn.initializeDatabase()
print_info(green(" * ")+red("Reinitializing Entropy database using Portage database..."))
# now run quickpkg for all the packages and then extract data
installedAtoms, atomsnumber = getInstalledPackages()
currCounter = 0
import reagentTools
for atom in installedAtoms:
currCounter += 1
print_info(green(" (")+ blue(str(currCounter))+"/"+red(str(atomsnumber))+green(") ")+red("Analyzing ")+bold(atom)+red(" ..."))
quickpkg(atom,etpConst['packagestmpdir'])
# file is etpConst['packagestmpdir']+"/atomscan/"+pkgnamever.tbz2
etpData = reagentTools.extractPkgData(etpConst['packagestmpdir']+"/"+atom.split("/")[1]+".tbz2")
# fill the db entry
dbconn.addPackage(etpData)
os.system("rm -rf "+etpConst['packagestmpdir']+"/"+atom.split("/")[1]+"*")
dbconn.commitChanges()
dbconn.commitChanges()
dbconn.closeDB()
print_info(green(" * ")+red("Entropy database initialized."))
print_info(green(" * ")+red("Entropy database has been reinitialized using Portage database entries"))
elif (options[0] == "search"):
mykeywords = options[1:]
if (len(mykeywords) == 0):
print_error(yellow(" * ")+red("Not enough parameters"))
sys.exit(302)
if (not os.path.isfile(etpConst['etpdatabasefile'])):
print_error(yellow(" * ")+red("Entropy Datbase does not exist"))
sys.exit(303)
# search tool
print_info(green(" * ")+red("Searching inside the Entropy database..."))
dbconn = etpDatabase()
@@ -91,33 +112,56 @@ def database(options):
if (result[17]):
print_info(red("\t Slot: ")+yellow(result[17]))
#print_info(red("\t Blah: ")+result[18]) # I don't need to print mirrorlinks
if (result[19]):
deps = result[19].split()
if (result[20]):
deps = result[20].split()
print_info(red("\t Dependencies"))
for dep in deps:
print_info(darkred("\t # Depends on: ")+dep)
#print_info(red("\t Blah: ")+result[20]) --> it's a dup of [21]
if (result[21]):
rundeps = result[21].split()
if (result[22]):
rundeps = result[22].split()
print_info(red("\t Built with runtime dependencies"))
for rundep in rundeps:
print_info(darkred("\t # Dependency: ")+rundep)
if (result[22]):
if (result[23]):
print_info(red("\t Conflicts with"))
conflicts = result[22].split()
conflicts = result[23].split()
for conflict in conflicts:
print_info(darkred("\t # Conflict: ")+conflict)
print_info(red("\t Entry API: ")+green(result[23]))
print_info(red("\t Entry revision: ")+str(result[24]))
print_info(red("\t Entry API: ")+green(result[24]))
print_info(red("\t Entry revision: ")+str(result[25]))
#print result
print
dbconn.closeDB()
elif (options[0] == "dump-package-info"):
mypackages = options[1:]
if (len(mypackages) == 0):
print_error(yellow(" * ")+red("Not enough parameters"))
sys.exit(302)
for package in mypackages:
print_info(green(" * ")+red("Searching package ")+bold(package)+red(" ..."))
if isjustname(package) or (package.find("/") == -1):
print_warning(yellow(" * ")+red("Package ")+bold(package)+red(" is not a complete atom."))
continue
# open db connection
dbconn = etpDatabase()
if (not dbconn.isPackageAvailable(package)):
# package does not exist in the Entropy database
print_warning(yellow(" * ")+red("Package ")+bold(package)+red(" does not exist in Entropy database."))
dbconn.closeDB()
continue
etpData = dbconn.retrievePackageInfo(package)
print etpData
dbconn.closeDB()
############
# Functions
#####################################################################################
class etpDatabase:
def __init__(self):
@@ -130,8 +174,20 @@ class etpDatabase:
self.connection.close()
def commitChanges(self):
self.taintDatabase()
self.connection.commit()
def taintDatabase(self):
# taint the database status
f = open(etpConst['etpdatabasedir']+"/"+etpConst['etpdatabasetaintfile'],"w")
f.write(etpConst['currentarch']+" database tainted\n")
f.flush()
f.close()
def untaintDatabase(self):
# untaint the database status
os.system("rm -f "+etpConst['etpdatabasedir']+"/"+etpConst['etpdatabasetaintfile'])
def discardChanges(self):
self.connection.rollback()
@@ -143,16 +199,16 @@ class etpDatabase:
# this function manages the submitted package
# if it does not exist, it fires up addPackage
# otherwise it fires up updatePackage
def handlePackage(self,etpData):
def handlePackage(self,etpData,forceBump = False):
if (not isPackageAvailable(etpData['category']+"/"+etpData['name']+"-"+etpData['version'])):
self.addPackage(etpData)
else:
self.updatePackage(etpData)
self.updatePackage(etpData,forceBump)
def addPackage(self,etpData, revision = 0):
self.cursor.execute(
'INSERT into etpData VALUES '
'(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)'
'(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)'
, ( etpData['category']+"/"+etpData['name']+"-"+etpData['version'],
etpData['name'],
etpData['version'],
@@ -171,6 +227,7 @@ class etpDatabase:
etpData['digest'],
etpData['sources'],
etpData['slot'],
etpData['content'],
etpData['mirrorlinks'],
etpData['dependencies'],
etpData['rundependencies'],
@@ -181,16 +238,19 @@ class etpDatabase:
)
)
self.commitChanges()
return True,revision
# Update already available atom in db
# returns True,revision if the package has been updated
# returns False,revision if not
def updatePackage(self,etpData):
def updatePackage(self,etpData,forceBump = False):
# check if the data correspond
# if not, update, else drop
curRevision = dbconn.retrievePackageVar(etpData['category']+"/"+etpData['name']+"-"+etpData['version'],"revision")
oldPkgInfo = retrievePackageInfo(etpData['category']+"/"+etpData['name']+"-"+etpData['version'])
if etpData != oldPkgInfo:
curRevision = self.retrievePackageVar(etpData['category']+"/"+etpData['name']+"-"+etpData['version'],"revision")
# FIXME: I don't know if this works
oldPkgInfo = self.retrievePackageInfo(etpData['category']+"/"+etpData['name']+"-"+etpData['version'])
rc = self.comparePackagesData(etpData,oldPkgInfo)
if (not rc) or (forceBump):
# update !
curRevision += 1
# remove the table
@@ -209,6 +269,52 @@ class etpDatabase:
self.commitChanges()
return result
# WARNING: this function must be kept in sync with Entropy database schema
# returns True if equal
# returns False if not
def comparePackagesData(self,etpData,dbPkgInfo):
# reset before using the tmpEtpData dictionary
for i in tmpEtpData:
tmpEtpData[i] = ""
# fill content
for i in tmpEtpData:
tmpEtpData[i] = self.retrievePackageVar(dbPkgInfo,i)
"""
oldEtpData['name'] = self.retrievePackageVar(dbPkgInfo,"name")
oldEtpData['version'] = self.retrievePackageVar(dbPkgInfo,"version")
oldEtpData['description'] = self.retrievePackageVar(dbPkgInfo,"description")
oldEtpData['category'] = self.retrievePackageVar(dbPkgInfo,"category")
oldEtpData['chost'] = self.retrievePackageVar(dbPkgInfo,"chost")
oldEtpData['cflags'] = self.retrievePackageVar(dbPkgInfo,"cflags")
oldEtpData['cxxflags'] = self.retrievePackageVar(dbPkgInfo,"cxxflags")
oldEtpData['homepage'] = self.retrievePackageVar(dbPkgInfo,"homepage")
oldEtpData['useflags'] = self.retrievePackageVar(dbPkgInfo,"useflags")
oldEtpData['license'] = self.retrievePackageVar(dbPkgInfo,"license")
oldEtpData['keywords'] = self.retrievePackageVar(dbPkgInfo,"keywords")
oldEtpData['binkeywords'] = self.retrievePackageVar(dbPkgInfo,"binkeywords")
oldEtpData['packagepath'] = self.retrievePackageVar(dbPkgInfo,"packagepath")
oldEtpData['download'] = self.retrievePackageVar(dbPkgInfo,"download")
oldEtpData['digest'] = self.retrievePackageVar(dbPkgInfo,"digest")
oldEtpData['sources'] = self.retrievePackageVar(dbPkgInfo,"sources")
oldEtpData['slot'] = self.retrievePackageVar(dbPkgInfo,"slot")
oldEtpData['content'] = self.retrievePackageVar(dbPkgInfo,"content")
oldEtpData['mirrorlinks'] = self.retrievePackageVar(dbPkgInfo,"mirrorlinks")
oldEtpData['dependencies'] = self.retrievePackageVar(dbPkgInfo,"dependencies")
oldEtpData['rundependencies'] = self.retrievePackageVar(dbPkgInfo,"rundependencies")
oldEtpData['rundependenciesXT'] = self.retrievePackageVar(dbPkgInfo,"rundependenciesXT")
oldEtpData['conflicts'] = self.retrievePackageVar(dbPkgInfo,"conflicts")
oldEtpData['etpapi'] = self.retrievePackageVar(dbPkgInfo,"etpapi")
"""
for i in etpData:
if etpData[i] != tmpEtpData[i]:
return False
return True
# You must provide the full atom to this function
def retrievePackageInfo(self,pkgkey):
pkgkey = removePackageOperators(pkgkey)