diff --git a/TODO b/TODO index 352968a8e..43e309ac8 100644 --- a/TODO +++ b/TODO @@ -1,5 +1,4 @@ TODO list: - - cache world calculation results - migrate server code to ServerInterface - Community repositories - find a way to better handle real smartapps deps (need split PDEPEND?) diff --git a/libraries/databaseTools.py b/libraries/databaseTools.py index 4feff7737..ecdcaa025 100644 --- a/libraries/databaseTools.py +++ b/libraries/databaseTools.py @@ -2313,9 +2313,6 @@ class etpDatabase(TextInterface): def retrieveNeeded(self, idpackage): - cache = self.fetchInfoCache(idpackage,'retrieveNeeded') - if cache != None: return cache - try: self.cursor.execute('SELECT library FROM needed,neededreference WHERE needed.idpackage = (?) and needed.idneeded = neededreference.idneeded', (idpackage,)) except: @@ -2323,7 +2320,6 @@ class etpDatabase(TextInterface): self.cursor.execute('SELECT library FROM needed,neededreference WHERE needed.idpackage = (?) and needed.idneeded = neededreference.idneeded', (idpackage,)) needed = self.fetchall2set(self.cursor.fetchall()) - self.storeInfoCache(idpackage,'retrieveNeeded',needed) return needed def retrieveConflicts(self, idpackage): @@ -3202,6 +3198,17 @@ class etpDatabase(TextInterface): if rslt == None: raise exceptionTools.SystemDatabaseError("SystemDatabaseError: table extrainfo not found. Either does not exist or corrupted.") + def tablesChecksum(self): + import md5 + self.cursor.execute('select * from baseinfo') + m = md5.new() + for row in self.cursor: + m.update(str(row)) + self.cursor.execute('select * from dependenciesreference') + for row in self.cursor: + m.update(str(row)) + return m.hexdigest() + ######################################################## #### diff --git a/libraries/entropy.py b/libraries/entropy.py index 69d383856..adb77eee2 100644 --- a/libraries/entropy.py +++ b/libraries/entropy.py @@ -268,6 +268,9 @@ class EquoInterface(TextInterface): depend ), importance = 0, type = "info", back = True, count = (cnt, maxlen) ) self.atomMatch(depend) + + self.calculate_world_updates() + self.updateProgress(darkred("Dependencies cache filled."), importance = 2, type = "warning") self.save_cache() @@ -1199,13 +1202,28 @@ class EquoInterface(TextInterface): remove = set() fine = set() + if self.xcache: + db_digest = self.clientDbconn.tablesChecksum() + disk_cache = self.dumpTools.loadobj(etpCache['world_update']) + try: + if disk_cache != None: + if disk_cache['db_digest'] == db_digest and \ + disk_cache['empty_deps'] == empty_deps and \ + disk_cache['branch'] == branch: + return disk_cache['update'],disk_cache['remove'],disk_cache['fine'] + except: + try: + self.dumpTools.dumpobj(etpCache['world_update'], {}) + except IOError: + pass + # get all the installed packages packages = self.clientDbconn.listAllPackages() maxlen = len(packages) count = 0 for package in packages: count += 1 - self.updateProgress("", importance = 0, type = "info", back = True, header = "::", count = (count,maxlen), percent = True, footer = "::") + self.updateProgress("Calculating world dependencies", importance = 0, type = "info", back = True, header = "::", count = (count,maxlen), percent = True, footer = "::") tainted = False atom = package[0] idpackage = package[1] @@ -1258,6 +1276,22 @@ class EquoInterface(TextInterface): fine.add(atom) del packages + + if self.xcache: + try: + mycache = {} + mycache['db_digest'] = db_digest + mycache['update'] = update.copy() + mycache['remove'] = remove.copy() + mycache['fine'] = fine.copy() + mycache['empty_deps'] = empty_deps + mycache['branch'] = branch + # save cache + self.dumpTools.dumpobj(etpCache['world_update'], mycache) + mycache.clear() + del mycache + except: + self.dumpTools.dumpobj(etpCache['world_update'], {}) return update, remove, fine # every tbz2 file that would be installed must pass from here diff --git a/libraries/entropyConstants.py b/libraries/entropyConstants.py index 3b3eaf956..5da4e1ba3 100644 --- a/libraries/entropyConstants.py +++ b/libraries/entropyConstants.py @@ -350,6 +350,7 @@ etpCache = { 'install': 'resume_install', # resume cache (install) 'remove': 'resume_remove', # resume cache (remove) 'world': 'resume_world', # resume cache (world) + 'world_update': 'world_cache' } # byte sizes of disk caches