All pastes #822033 Raw Edit

Miscellany

public text v1 · immutable
·published 2007-12-18 14:04 UTC
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