def fetch(self, first=None, last=None, firstID=None): """ Произвести выборку сообщений из лога по указанным критериям выборки. @param first: минимальная дата возвращаемого сообщения @type first: C{int} @param last: максимальная дата возвращаемого сообщения @type last: C{int} @param firstID: минимальный ID элемента лога, который будет возвращен @type firstID: C{int} @return: Deferred с C{list(}L{ILogEntry}C{)} @rtype: C{twisted.internet.defer.Deferred} """ if last is None or last > time(): last = time() if first is None or last < first or (last - first) > self.timeChunk * (self.numChunks - 1): first = time() - self.timeChunk * (self.numChunks - 1) firstKey = first / self.timeChunk % self.numChunks lastKey = last / self.timeChunk % self.numChunks if firstKey < lastKey: keyRange = range(firstKey, lastKey + 1) else: keyRange = range(firstKey, self.numChunks) + range(0, lastKey + 1) def logFetched(data): result = [] for item in data: if item[0] == defer.FAILURE: continue input = StringIO.StringIO(item[1]) while True: try: data = pickle.load(input) if data.when >= first and data.when <= last: if firstID is None or data.id >= firstID: result.append(data) except EOFError: break return result return defer.DeferredList( [self.storage.get(self.keyTemplate % key) for key in keyRange], consumeErrors=1 ).addCallback(logFetched)
def set(self, key, value, expire): """ Записать (перезаписать) значение ключа. @param key: ключ @type key: C{str} @param value: значение @type value: C{str} или C{int} @param expire: время жизни ключа в секундах, 0 - хранить "вечно" @type expire: C{int} @return: Deferred о завершении операции @rtype: C{twisted.internet.Deferred} """ if expire != 0: expire = time() + expire if self.hash.has_key(key): data = self.hash[key] if data[0] != 0: del self.deleteQueue[data[0] / self.deleteInterval][key] self.hash[key] = (expire, value) if expire != 0: if not self.deleteQueue.has_key(expire / self.deleteInterval): self.deleteQueue[expire / self.deleteInterval] = dict() self.deleteQueue[expire / self.deleteInterval][key] = 1 return defer.succeed(None)
def __init__(self): """ Конструктор. """ self.counter = 0 self.increments = 0 self.start = time()
def testConstructor(self): l = LogEntry(when=None, message=self.message1) self.assertEquals([], l.tags) self.assertEquals(time(), l.when) l = LogEntry(when=200, message=self.message2) self.assertEquals(['bad', 'good'], l.tags) self.assertEquals(200, l.when)
def period(self): """ Период времени, за который собирается значение счетчика. @return: период времени, секунды @rtype: C{int} """ period = time() - self.start if period == 0: period = 1 return period
def _exists(self, key): """ Внутренний метод: существует ли указанный ключ в хранилище? @rtype: C{bool} """ if not self.hash.has_key(key): return False data = self.hash[key] if data[0] != 0 and data[0] <= time(): del self.hash[key] del self.deleteQueue[data[0] / self.deleteInterval][key] return False return True
def set(self, key, value, expire): """ Записать (перезаписать) значение ключа. @param key: ключ @type key: C{str} @param value: значение @type value: C{str} или C{int} @param expire: время жизни ключа в секундах, 0 - хранить "вечно" @type expire: C{int} @return: Deferred о завершении операции @rtype: C{twisted.internet.Deferred} """ if expire != 0: expire += time() self.db[key] = pickle.dumps((expire, value), pickle.HIGHEST_PROTOCOL) return defer.succeed(None)
def _fetch(self, key): """ Получить значение ключа. @param key: ключ @type key: C{str} @return: пара (срок_годности, значение), если ключ есть в БД или (None, None), если он отсутствует """ if not self.db.has_key(key): return (None, None) (expire, value) = pickle.loads(self.db[key]) if expire != 0 and expire <= time(): del self.db[key] return (None, None) return (expire, value)
def __init__(self, deleteInterval=10, cleanupInterval=60): """ Конструктор. @param deleteInterval: интервал группировки ключей на удаление в секундах (ключи с временем жизни в данном интервале будут удалены общей пачкой) @type deleteInterval: C{int} @param cleanupInterval: интервал запуска задачи очистки просроченных ключей, если интервал 0, то задача очистки не запускается никогда @type cleanupInterval: C{int} """ self.hash = dict() self.deleteQueue = dict() self.deleteInterval = deleteInterval self.cleanupInterval = cleanupInterval self.lastDeleteTime = time() / self.deleteInterval self.cleanupDelayed = None if self.cleanupInterval != 0: self.cleanupDelayed = reactor.callLater(self.cleanupInterval, self._cleanup)
def _cleanup(self): """ Очистить старые ключи. Метод либо вызывается автоматически через каждые L{cleanupInterval} секунд, либо может вызываться в любой момент времени. """ self.cleanupDelayed = None curDeleteTime = time() / self.deleteInterval todoIntervals = xrange(self.lastDeleteTime, curDeleteTime) for interval in todoIntervals: todo = self.deleteQueue.get(interval, {}) for key in todo.iterkeys(): del self.hash[key] if interval in self.deleteQueue: del self.deleteQueue[interval] self.lastDeleteTime = curDeleteTime if self.cleanupInterval != 0: self.cleanupDelayed = reactor.callLater(self.cleanupInterval, self._cleanup)
def __init__(self, when, message, tags=None, id=None): """ Конструктор. @param when: дата/время записи в логе, UTC @type when: C{int} @param message: само сообщение @type message: L{IMessage} или L{ITaggedMessage} или L{TransitMessage} @param tags: тэги, привзяанные к сообщению @type tags: C{list(str)} """ if when is None: when = time() self.when = when if tags is None: tags = [] self.tags = tags if IMessage.providedBy(message): if ITaggedMessage.providedBy(message): self.tags.extend(message.getTags()) message = TransitMessage(message=message) self.message = message self.id = id
def testTearDown(self): tearDownTestTimer() _inaccurate_timer_tick() self.assert_((int(sys_time.time())-time()) <= 1) startUpTestTimer(10)
def testSet(self): setTestTimer(40) self.assertEquals(40, time())
def testAdvance(self): advanceTestTimer(20) self.assertEquals(30, time())
def testStartUp(self): self.assertEquals(10, time())
def testTime(self): _inaccurate_timer_tick() self.assert_((int(sys_time.time())-time()) <= 1)