rendered paste body# -*- 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 '<PasteIndex {\'snippets\': ' + str(self._snippets) + '}>'
def _load_index():
web.webapi.ctx.index = PasteIndex()
web.webapi.loadhooks['index']=_load_index