#!/usr/bin/env python

DBHOST="localhost"
DBNAME="dbt2"
DBUSER="drkp"
PINFREQ=1                       # seconds to wait between acquiring pins
PINHOLD=10                      # seconds to wait before releasing pins

import sys, os, time, psycopg2, argparse
PINHOLD = int(sys.argv[1])

db=psycopg2.connect("dbname=%s host=%s user=%s" %(DBNAME, DBHOST, DBUSER))

def pin():
    db.rollback()
    a = db.cursor()
    a.execute("PIN")
    n = int(a.statusmessage.split()[1])
    db.rollback()
    print "Pinning", n
    return n
    
def unpin(x):
    db.rollback()
    a = db.cursor()
    print "Unpinning", x
    a.execute("UNPIN %d" % x)
    db.rollback()

def clearInvals():
    db.rollback()
    a = db.cursor()
    a.execute("SELECT * FROM pg_invalidations")
    print "Cleared %d invalidations" % a.rowcount
    db.rollback()
    

pins = []

def unpinStalePins(pins):
    newpins = []
    for x in pins:
        if time.time() - x[1] >= PINHOLD:
            unpin(x[0])
        else:
            newpins.append(x)
    return newpins

parser = argparse.ArgumentParser()

while True:
    pins = unpinStalePins(pins)
    newPin = pin()
    if (newPin not in [x[0] for x in pins]):
        pins.append((newPin, time.time()))
    clearInvals()
    time.sleep(PINFREQ)
