コード例 #1
0
ファイル: cache.py プロジェクト: leonelcamara/web2py
        def safe_apply(self, key, function, default_value=None):
            """
            Safely apply a function to the value of a key in storage and set
            the return value of the function to it.

            Return the result of applying the function.
            """
            key = self.key_filter_in(key)
            exists = True
            try:
                val_file = recfile.open(key, mode='r+b', path=self.folder)
            except IOError:
                exists = False
                val_file = recfile.open(key, mode='wb', path=self.folder)
            self.wait_portalock(val_file)
            if exists:
                timestamp, value = pickle.load(val_file)
            else:
                value = default_value
            new_value = function(value)
            val_file.seek(0)
            pickle.dump((time.time(), new_value), val_file, pickle.HIGHEST_PROTOCOL)
            val_file.truncate()
            val_file.close()
            return new_value
コード例 #2
0
        def safe_apply(self, key, function, default_value=None):
            """
            Safely apply a function to the value of a key in storage and set
            the return value of the function to it.

            Return the result of applying the function.
            """
            key = self.key_filter_in(key)
            exists = True
            try:
                val_file = recfile.open(key, mode='r+b', path=self.folder)
            except IOError:
                exists = False
                val_file = recfile.open(key, mode='wb', path=self.folder)
            self.wait_portalock(val_file)
            if exists:
                timestamp, value = pickle.load(val_file)
            else:
                value = default_value
            new_value = function(value)
            val_file.seek(0)
            pickle.dump((time.time(), new_value), val_file,
                        pickle.HIGHEST_PROTOCOL)
            val_file.truncate()
            val_file.close()
            return new_value
コード例 #3
0
ファイル: storage.py プロジェクト: BuhtigithuB/web2py
def save_storage(storage, filename):
    fp = None
    try:
        fp = portalocker.LockedFile(filename, 'wb')
        pickle.dump(dict(storage), fp)
    finally:
        if fp:
            fp.close()
コード例 #4
0
ファイル: storage.py プロジェクト: guadaltech/web2py-ruben
def save_storage(storage, filename):
    fp = None
    try:
        fp = portalocker.LockedFile(filename, 'wb')
        pickle.dump(dict(storage), fp)
    finally:
        if fp:
            fp.close()
コード例 #5
0
ファイル: newcron.py プロジェクト: mbelletti/web2py
 def release(self):
     """
     Writes into cron.master the time when cron job was completed
     """
     ret = self.master.closed
     if not self.master.closed:
         portalocker.lock(self.master, portalocker.LOCK_EX)
         logger.debug('releasing cron lock')
         self.master.seek(0)
         (start, stop) = pickle.load(self.master)
         if start == self.now:  # if this is my lock
             self.master.seek(0)
             pickle.dump((self.now, time.time()), self.master)
         portalocker.unlock(self.master)
         self.master.close()
     return ret
コード例 #6
0
 def release(self):
     """
     Writes into cron.master the time when cron job was completed
     """
     ret = self.master.closed
     if not self.master.closed:
         portalocker.lock(self.master, portalocker.LOCK_EX)
         self.logger.debug('releasing cron lock')
         self.master.seek(0)
         (start, stop) = pickle.load(self.master)
         if start == self.now:  # if this is my lock
             self.master.seek(0)
             pickle.dump((self.now, time.time()), self.master)
         portalocker.unlock(self.master)
         self.master.close()
     return ret
コード例 #7
0
ファイル: newcron.py プロジェクト: mbelletti/web2py
    def acquire(self, startup=False):
        """
        Returns the time when the lock is acquired or
        None if cron already running

        lock is implemented by writing a pickle (start, stop) in cron.master
        start is time when cron job starts and stop is time when cron completed
        stop == 0 if job started but did not yet complete
        if a cron job started within less than 60 seconds, acquire returns None
        if a cron job started before 60 seconds and did not stop,
        a warning is issue "Stale cron.master detected"
        """
        if sys.platform == 'win32':
            locktime = 59.5
        else:
            locktime = 59.99
        if portalocker.LOCK_EX is None:
            logger.warning('cron disabled because no file locking')
            return None
        self.master = fileutils.open_file(self.path, 'rb+')
        try:
            ret = None
            portalocker.lock(self.master, portalocker.LOCK_EX)
            try:
                (start, stop) = pickle.load(self.master)
            except:
                start = 0
                stop = 1
            if startup or self.now - start > locktime:
                ret = self.now
                if not stop:
                    # this happens if previous cron job longer than 1 minute
                    logger.warning('stale cron.master detected')
                logger.debug('acquiring lock')
                self.master.seek(0)
                pickle.dump((self.now, 0), self.master)
                self.master.flush()
        finally:
            portalocker.unlock(self.master)
        if not ret:
            # do this so no need to release
            self.master.close()
        return ret
コード例 #8
0
    def acquire(self, startup=False):
        """
        Returns the time when the lock is acquired or
        None if cron already running

        lock is implemented by writing a pickle (start, stop) in cron.master
        start is time when cron job starts and stop is time when cron completed
        stop == 0 if job started but did not yet complete
        if a cron job started within less than 60 seconds, acquire returns None
        if a cron job started before 60 seconds and did not stop,
        a warning is issued ("Stale cron.master detected")
        """
        if sys.platform == 'win32':
            locktime = 59.5
        else:
            locktime = 59.99
        if portalocker.LOCK_EX is None:
            self.logger.warning('cron disabled because no file locking')
            return None
        self.master = fileutils.open_file(self.path, 'rb+')
        ret = None
        try:
            portalocker.lock(self.master, portalocker.LOCK_EX)
            try:
                (start, stop) = pickle.load(self.master)
            except:
                start = 0
                stop = 1
            if startup or self.now - start > locktime:
                ret = self.now
                if not stop:
                    # this happens if previous cron job longer than 1 minute
                    self.logger.warning('stale cron.master detected')
                self.logger.debug('acquiring lock')
                self.master.seek(0)
                pickle.dump((self.now, 0), self.master)
                self.master.flush()
        finally:
            portalocker.unlock(self.master)
        if not ret:
            # do this so no need to release
            self.master.close()
        return ret
コード例 #9
0
 def _store_on_disk(self, request, ticket_id, ticket_data):
     ef = self._error_file(request, ticket_id, 'wb')
     try:
         pickle.dump(ticket_data, ef)
     finally:
         ef.close()
コード例 #10
0
ファイル: restricted.py プロジェクト: laminko/web2py
 def _store_on_disk(self, request, ticket_id, ticket_data):
     ef = self._error_file(request, ticket_id, 'wb')
     try:
         pickle.dump(ticket_data, ef)
     finally:
         ef.close()
コード例 #11
0
ファイル: cache.py プロジェクト: leonelcamara/web2py
 def __setitem__(self, key, value):
     key = self.key_filter_in(key)
     val_file = recfile.open(key, mode='wb', path=self.folder)
     self.wait_portalock(val_file)
     pickle.dump(value, val_file, pickle.HIGHEST_PROTOCOL)
     val_file.close()
コード例 #12
0
 def __setitem__(self, key, value):
     key = self.key_filter_in(key)
     val_file = recfile.open(key, mode='wb', path=self.folder)
     self.wait_portalock(val_file)
     pickle.dump(value, val_file, pickle.HIGHEST_PROTOCOL)
     val_file.close()