Esempio n. 1
0
	def readJobs(self, jobLimit):
		jobMap = {}
		maxJobs = 0
		if os.path.exists(self._dbFile):
			try:
				tar = zipfile.ZipFile(self._dbFile, 'r', zipfile.ZIP_DEFLATED)
			except Exception: # Try to recover job archive
				utils.eprint('=' * 40 + '\nStarting recovery of broken job database')
				utils.eprint(' => Answer "y" if asked "Is this a single-disk archive?"!\n' + '=' * 40)
				os.system('zip -FF %s --out %s.tmp 2> /dev/null' % (self._dbFile, self._dbFile))
				os.rename(self._dbFile, self._dbFile + '.broken')
				os.rename(self._dbFile + '.tmp', self._dbFile)
				tar = zipfile.ZipFile(self._dbFile, 'r', zipfile.ZIP_DEFLATED)
				utils.removeFiles([self._dbFile + '.broken'])
				brokenList = []
				for idx, fnTarInfo in enumerate(tar.namelist()):
					(jobNum, tid) = tuple(imap(lambda s: int(s[1:]), fnTarInfo.split('_', 1)))
					try:
						fp = tar.open(fnTarInfo)
						try:
							fp.read()
						finally:
							fp.close()
					except Exception:
						pass
				for broken in brokenList:
					os.system('zip %s -d %s' % (self._dbFile, broken))
				utils.eprint('Recover completed!')
			activity = utils.ActivityLog('Reading job transactions ...')
			maxJobs = len(tar.namelist())
			tMap = {}
			for idx, fnTarInfo in enumerate(tar.namelist()):
				(jobNum, tid) = tuple(imap(lambda s: int(s[1:]), fnTarInfo.split('_', 1)))
				if tid < tMap.get(jobNum, 0):
					continue
				data = utils.DictFormat(escapeString = True).parse(tar.open(fnTarInfo).read())
				jobMap[jobNum] = Job.loadData(fnTarInfo, data)
				tMap[jobNum] = tid
				if idx % 100 == 0:
					activity.finish()
					activity = utils.ActivityLog('Reading job transactions ... %d [%d%%]' % (idx, (100.0 * idx) / maxJobs))

		self._serial = maxJobs
		return jobMap
Esempio n. 2
0
    def readJobs(self, jobLimit):
        jobMap = {}
        maxJobs = 0
        if os.path.exists(self._dbFile):
            try:
                tar = zipfile.ZipFile(self._dbFile, "r", zipfile.ZIP_DEFLATED)
            except Exception:  # Try to recover job archive
                utils.eprint("=" * 40 + "\nStarting recovery of broken job database")
                utils.eprint(' => Answer "y" if asked "Is this a single-disk archive?"!\n' + "=" * 40)
                os.system("zip -FF %s --out %s.tmp 2> /dev/null" % (self._dbFile, self._dbFile))
                os.rename(self._dbFile, self._dbFile + ".broken")
                os.rename(self._dbFile + ".tmp", self._dbFile)
                tar = zipfile.ZipFile(self._dbFile, "r", zipfile.ZIP_DEFLATED)
                utils.removeFiles([self._dbFile + ".broken"])
                brokenList = []
                for idx, fnTarInfo in enumerate(tar.namelist()):
                    (jobNum, tid) = tuple(map(lambda s: int(s[1:]), fnTarInfo.split("_", 1)))
                    try:
                        rawData = tar.open(fnTarInfo).read()
                    except Exception:
                        pass
                for broken in brokenList:
                    os.system("zip %s -d %s" % (self._dbFile, broken))
                utils.eprint("Recover completed!")
            log = None
            maxJobs = len(tar.namelist())
            tMap = {}
            for idx, fnTarInfo in enumerate(tar.namelist()):
                (jobNum, tid) = tuple(map(lambda s: int(s[1:]), fnTarInfo.split("_", 1)))
                if tid < tMap.get(jobNum, 0):
                    continue
                data = utils.DictFormat(escapeString=True).parse(tar.open(fnTarInfo).read())
                jobMap[jobNum] = Job.loadData(fnTarInfo, data)
                tMap[jobNum] = tid
                if idx % 100 == 0:
                    del log
                    log = utils.ActivityLog("Reading job transactions ... %d [%d%%]" % (idx, (100.0 * idx) / maxJobs))

        self._serial = maxJobs
        return jobMap