# -*- coding: utf-8 -*- import friendpaste import Queue import threading from datetime import date import web import struct _pack = struct.pack _unpack = struct.unpack nullid = "\0" * 20 indexformatv0 = "i20s" class logio(object): def __init__(self): self.size = struct.calcsize(indexformatv0) def packentry(self, timestamp, snippetid): e = (timestamp, snippetid) return _pack(indexformatv0, *e) class IndexWorker(threading.Thread): def __init__(self, queue): super(IndexWorker, self).__init__() self.setDaemon(1) self.f = open('%s/changelog.i' % friendpaste.config.DATA_PATH, mode='a') self.q = queue self._io = logio() self.last=[] def index(self, snippet): entry = self._io.packentry(snippet.created, snippet.id) self.f.write(entry) self.f.flush() self.last.append(snippet) self.q.task_done() def run(self): while True: snippet = self.q.get() self.index(snippet) class PasteIndex(web.utils.Storage): def __init__(self): web.utils.Storage.__init__(self) self._snippets = {} self.queue = Queue.Queue() self.worker = IndexWorker(self.queue) self.worker.start() def __getattr__(self, key): if key in ('_snippets'): return object.__getattribute__(self, key) try: return self._snippets[key] except KeyError, k: raise AttributeError, k def __setattr__(self, key, value): if key in ('_snippets'): object.__setattr__(self, key, value) else: self._snippets[key] = value self.queue.put(value) def __delattr__(self, key): if key in ('_snippets'): return try: del self._snippets[key] except KeyError, k: raise AttributeError, k def __getitem__(self, key): return self._snippets[key] def __setitem__(self, key, value): self._snippets[key] = value self.queue.put(value) def __delitem__(self, key): del self._snippets[key] def __repr__(self): return '' def _load_index(): web.webapi.ctx.index = PasteIndex() web.webapi.loadhooks['index']=_load_index