From d9c6f1aba9bece9d5a5d0c2c2dc3646b49e02ea3 Mon Sep 17 00:00:00 2001 From: lxnay Date: Sun, 22 Jul 2007 21:09:34 +0000 Subject: [PATCH] more work on the new database interface, addPackage completed git-svn-id: http://svn.sabayonlinux.org/projects/entropy/trunk@324 cd1c1023-2f26-0410-ae45-c471fc1f0318 --- libraries/databaseTools.py | 283 ++++++++++++++++++++++++++++++---- libraries/entropyConstants.py | 7 +- libraries/reagentTools.py | 3 +- 3 files changed, 256 insertions(+), 37 deletions(-) diff --git a/libraries/databaseTools.py b/libraries/databaseTools.py index eb483b626..aea6f40f9 100644 --- a/libraries/databaseTools.py +++ b/libraries/databaseTools.py @@ -950,10 +950,11 @@ class etpDatabase: removelist = [] for oldpkg in searchsimilar: # get the package slot - slot = self.retrievePackageVar(oldpkg, "slot", branch = wantedBranch) + idpackage = oldpkg[1] + slot = self.retrieveSlot(idpackage) if (etpData['slot'] == slot): # remove! - removelist.append(oldpkg) + removelist.append(idpackage) for pkg in removelist: self.removePackage(pkg) @@ -961,40 +962,168 @@ class etpDatabase: dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"addPackage: inserting: ") for ln in etpData: dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"\t "+ln+": "+str(etpData[ln])) - # wantedBranch = etpData['branch'] + + # create new category if it doesn't exist + catid = self.isCategoryAvailable(etpData['category']) + if (catid == -1): + # create category + catid = self.addCategory(etpData['category']) + + # create new license if it doesn't exist + licid = self.isLicenseAvailable(etpData['license']) + if (licid == -1): + # create category + licid = self.addLicense(etpData['license']) + + + # baseinfo self.cursor.execute( - 'INSERT into etpData VALUES ' - '(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)' + 'INSERT into baseinfo VALUES ' + '(NULL,?,?,?,?,?,?,?,?,?)' , ( etpData['category']+"/"+etpData['name']+"-"+etpData['version'], + catid, etpData['name'], etpData['version'], - etpData['description'], - etpData['category'], - etpData['chost'], - etpData['cflags'], - etpData['cxxflags'], - etpData['homepage'], - etpData['useflags'], - etpData['license'], - etpData['keywords'], - etpData['binkeywords'], - wantedBranch, - etpData['download'], - etpData['digest'], - etpData['sources'], - etpData['slot'], - etpData['content'], - etpData['mirrorlinks'], - etpData['dependencies'], - etpData['rundependencies'], - etpData['rundependenciesXT'], - etpData['conflicts'], - etpData['etpapi'], - etpData['datecreation'], - etpData['neededlibs'], revision, + wantedBranch, + etpData['slot'], + licid, + etpData['etpapi'], ) ) + + # I don't use lastrowid because the db must be multiuser aware + idpackage = self.getIDPackage(etpData['category']+"/"+etpData['name']+"-"+etpData['version'],wantedBranch) + + # create new idflag if it doesn't exist + idflags = self.areCompileFlagsAvailable(etpData['chost'],etpData['cflags'],etpData['cxxflags']) + if (idflags == -1): + # create category + idflags = self.addCompileFlags(etpData['chost'],etpData['cflags'],etpData['cxxflags']) + + # extrainfo + self.cursor.execute( + 'INSERT into extrainfo VALUES ' + '(?,?,?,?,?,?,?)' + , ( idpackage, + etpData['description'], + etpData['homepage'], + etpData['download'], + etpData['size'], + idflags, + etpData['digest'], + ) + ) + + # content, a list + for file in etpData['content']: + self.cursor.execute( + 'INSERT into content VALUES ' + '(?,?)' + , ( idpackage, + file, + ) + ) + + # dependencies, a list + for dep in etpData['dependencies']: + self.cursor.execute( + 'INSERT into dependencies VALUES ' + '(?,?)' + , ( idpackage, + dep, + ) + ) + + # rundependencies, a list + for rdep in etpData['rundependencies']: + self.cursor.execute( + 'INSERT into rundependencies VALUES ' + '(?,?)' + , ( idpackage, + rdep, + ) + ) + + # rundependenciesxt, a list + for rdepxt in etpData['rundependenciesxt']: + self.cursor.execute( + 'INSERT into rundependenciesxt VALUES ' + '(?,?)' + , ( idpackage, + rdepxt, + ) + ) + + # conflicts, a list + for conflict in etpData['conflicts']: + self.cursor.execute( + 'INSERT into conflicts VALUES ' + '(?,?)' + , ( idpackage, + conflict, + ) + ) + + # neededlibs, a list + for lib in etpData['neededlibs']: + self.cursor.execute( + 'INSERT into neededlibs VALUES ' + '(?,?)' + , ( idpackage, + lib, + ) + ) + + # mirrorlinks, always update the table + for mirrordata in etpData['mirrorlinks']: + mirrorname = mirrordata[0] + mirrorlist = mirrordata[1] + # remove old + self.removeMirrorEntries(mirrorname) + # add new + self.addMirrors(mirrorname,mirrorlist) + + # sources, a list + for source in etpData['sources']: + self.cursor.execute( + 'INSERT into sources VALUES ' + '(?,?)' + , ( idpackage, + source, + ) + ) + + # useflags, a list + for flag in etpData['useflags']: + self.cursor.execute( + 'INSERT into useflags VALUES ' + '(?,?)' + , ( idpackage, + flag, + ) + ) + + # keywords, a list + for keyword in etpData['keywords']: + self.cursor.execute( + 'INSERT into keywords VALUES ' + '(?,?)' + , ( idpackage, + keyword, + ) + ) + + # binkeywords, a list + for binkeyword in etpData['binkeywords']: + self.cursor.execute( + 'INSERT into binkeywords VALUES ' + '(?,?)' + , ( idpackage, + binkeyword, + ) + ) + self.commitChanges() return True, revision, etpData @@ -1094,6 +1223,60 @@ class etpDatabase: self.cursor.execute('DELETE FROM binkeywords WHERE idpackage = '+idpackage) self.commitChanges() + def removeMirrorEntries(self,mirrorname): + dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"removeMirrors: removing entries for mirror -> "+str(mirrorname)) + self.cursor.execute('DELETE FROM mirrorlinks WHERE mirrorname = "'+mirrorname+'"') + self.commitChanges() + + def addMirrors(self,mirrorname,mirrorlist): + dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"addMirrors: adding Mirror list for "+str(mirrorname)+" -> "+str(mirrorlist)) + for x in mirrorlist: + self.cursor.execute( + 'INSERT into mirrorlinks VALUES ' + '(?,?)', (mirrorname,x,) + ) + self.commitChanges() + + def addCategory(self,category): + dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"addCategory: adding Package Category -> "+str(category)) + self.cursor.execute( + 'INSERT into categories VALUES ' + '(NULL,?)', (category,) + ) + # get info about inserted value and return + cat = self.isCategoryAvailable(category) + if cat != -1: + self.commitChanges() + return cat + raise Exception, "I tried to insert a category but then, fetching it returned -1. There's something broken." + + def addLicense(self,license): + dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"addLicense: adding License -> "+str(license)) + self.cursor.execute( + 'INSERT into licenses VALUES ' + '(NULL,?)', (license,) + ) + # get info about inserted value and return + lic = self.isLicenseAvailable(license) + if lic != -1: + self.commitChanges() + return lic + raise Exception, "I tried to insert a license but then, fetching it returned -1. There's something broken." + + #addCompileFlags(etpData['chost'],etpData['cflags'],etpData['cxxflags']) + def addCompileFlags(self,chost,cflags,cxxflags): + dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"addCompileFlags: adding Flags -> "+chost+"|"+cflags+"|"+cxxflags) + self.cursor.execute( + 'INSERT into flags VALUES ' + '(NULL,?,?,?)', (chost,cflags,cxxflags,) + ) + # get info about inserted value and return + idflag = self.areCompileFlagsAvailable(chost,cflags,cxxflags) + if idflag != -1: + self.commitChanges() + return idflag + raise Exception, "I tried to insert a flag tuple but then, fetching it returned -1. There's something broken." + # WARNING: this function must be kept in sync with Entropy database schema # returns True if equal # returns False if not @@ -1137,7 +1320,7 @@ class etpDatabase: break return idpackage - def retrieveAtom(self, idpackage): + def retrieveAtom(self, idpackage): dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"retrieveAtom: retrieving Atom for package ID for "+str(idpackage)) self.cursor.execute('SELECT "atom" FROM baseinfo WHERE idpackage = "'+str(idpackage)+'"') atom = '' @@ -1146,7 +1329,7 @@ class etpDatabase: break return atom - def retrieveBranch(self, idpackage): + def retrieveBranch(self, idpackage): dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"retrieveBranch: retrieving Branch for package ID for "+str(idpackage)) self.cursor.execute('SELECT "branch" FROM baseinfo WHERE idpackage = "'+str(idpackage)+'"') atom = '' @@ -1236,7 +1419,7 @@ class etpDatabase: cat = row[0] break # now get the category name - self.cursor.execute('SELECT "category" FROM categories WHERE idcategory = "'+str(cat)+'"') + self.cursor.execute('SELECT "category" FROM categories WHERE idcategory = '+str(cat)) cat = '' for row in self.cursor: cat = row[0] @@ -1301,6 +1484,42 @@ class etpDatabase: dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"isSpecificPackageAvailable: "+pkgkey+" | branch: "+branch+" -> found !") return True + def isCategoryAvailable(self,category): + dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"isCategoryAvailable: called.") + result = -1 + self.cursor.execute('SELECT idcategory FROM categories WHERE category = "'+category+'"') + for row in self.cursor: + result = row[0] + if result == -1: + dbLog.log(ETP_LOGPRI_WARNING,ETP_LOGLEVEL_NORMAL,"isCategoryAvailable: "+category+" not available.") + return result + dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"isCategoryAvailable: "+category+" available.") + return result + + def isLicenseAvailable(self,license): + dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"isLicenseAvailable: called.") + result = -1 + self.cursor.execute('SELECT idlicense FROM licenses WHERE license = "'+license+'"') + for row in self.cursor: + result = row[0] + if result == -1: + dbLog.log(ETP_LOGPRI_WARNING,ETP_LOGLEVEL_NORMAL,"isLicenseAvailable: "+license+" not available.") + return result + dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"isLicenseAvailable: "+license+" available.") + return result + + def areCompileFlagsAvailable(self,chost,cflags,cxxflags): + dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"areCompileFlagsAvailable: called.") + result = -1 + self.cursor.execute('SELECT idflags FROM flags WHERE chost = "'+chost+'" AND cflags = "'+cflags+'" AND cxxflags = "'+cxxflags+'"') + for row in self.cursor: + result = row[0] + if result == -1: + dbLog.log(ETP_LOGPRI_WARNING,ETP_LOGLEVEL_NORMAL,"areCompileFlagsAvailable: flags tuple "+chost+"|"+cflags+"|"+cxxflags+" not available.") + return result + dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"areCompileFlagsAvailable: flags tuple "+chost+"|"+cflags+"|"+cxxflags+" available.") + return result + def searchPackages(self, keyword): dbLog.log(ETP_LOGPRI_INFO,ETP_LOGLEVEL_VERBOSE,"searchPackages: called for "+keyword) result = [] diff --git a/libraries/entropyConstants.py b/libraries/entropyConstants.py index 5faef47ce..efedcf52b 100644 --- a/libraries/entropyConstants.py +++ b/libraries/entropyConstants.py @@ -67,6 +67,7 @@ DROP TABLE IF EXISTS extrainfo; DROP TABLE IF EXISTS content; DROP TABLE IF EXISTS dependencies; DROP TABLE IF EXISTS rundependencies; +DROP TABLE IF EXISTS rundependenciesxt; DROP TABLE IF EXISTS conflicts; DROP TABLE IF EXISTS neededlibs; DROP TABLE IF EXISTS mirrorlinks; @@ -135,13 +136,13 @@ CREATE TABLE neededlibs ( ); CREATE TABLE mirrorlinks ( - mirrorname VARCHAR PRIMARY KEY, + mirrorname VARCHAR, mirrorlink VARCHAR ); CREATE TABLE sources ( idpackage INTEGER, - mirrorlink VARCHAR + source VARCHAR ); CREATE TABLE useflags ( @@ -166,7 +167,7 @@ CREATE TABLE categories ( CREATE TABLE licenses ( idlicense INTEGER PRIMARY KEY, - category VARCHAR + license VARCHAR ); CREATE TABLE flags ( diff --git a/libraries/reagentTools.py b/libraries/reagentTools.py index bfee9fdd2..abd4f2f71 100644 --- a/libraries/reagentTools.py +++ b/libraries/reagentTools.py @@ -400,8 +400,7 @@ def extractPkgData(package): # parse what mirror I need mirrorURI = i.split("/")[2] mirrorlist = getThirdPartyMirrors(x) - out = [mirrorURI,mirrorlist] - etpData['mirrorlinks'].append(out) + etpData['mirrorlinks'].append([mirrorURI,mirrorlist]) # mirrorURI = openoffice and mirrorlist = [link1, link2, link3] print_info(yellow(" * ")+red("Getting source package supported ARCHs..."),back = True) # fill KEYWORDS