pgtoolkit/delayedquery.py
author Radek Brich <brich.radek@ifortuna.cz>
Tue, 06 May 2014 18:37:43 +0200
changeset 101 2a2d0d5df03b
parent 18 a9e12b7cc207
permissions -rw-r--r--
Refactor ToolBase to allow tool composition. Add TableSync tool (composited). Move more tools under pgtool.

import threading
import time


class DelayedQueryThread(threading.Thread):
    def __init__(self, targetdbm, targetname, delay, query, args):
        threading.Thread.__init__(self)
        self.targetdbm = targetdbm
        self.targetname = targetname
        self.delay = delay
        self.query = query
        self.args = args
        
    def run(self):
        time.sleep(self.delay)
        with self.targetdbm.cursor(self.targetname) as curs:
            curs.execute(self.query, self.args)


class DelayedQuery:
    def __init__(self, targetdbm):
        '''Initialize DelayedQuery.
        
        targetdbm -- PgManager-like object
        
        '''
        self.targetdbm = targetdbm
        self.queryids = set()

    def add(self, delay, query, args, targetname='default', queryid=None):
        '''Add query to schedule.
        
        delay -- how long to wait, in seconds
        query, args -- query to be run after delay
        targetname -- name of connection in PgManager
        queryid -- discard if query with same id is already scheduled
        
        '''
        if queryid is not None:
            if queryid in self.queryids:
                return
            self.queryids.add(queryid)
        
        t = DelayedQueryThread(self.targetdbm, targetname, delay, query, args)
        t.start()