#!/usr/bin/env python
import shelve, os, fcntl, new
import __builtin__
from fcntl import LOCK_SH, LOCK_EX, LOCK_UN, LOCK_NB
def _close(self):
shelve.Shelf.close(self)
fcntl.flock(self.lckfile.fileno(), LOCK_UN)
self.lckfile.close()
def open(filename, flag='c', protocol=None, writeback=False, block=True, lckfilename=None):
"""Open the sheve file, createing a lockfile at filename.lck. If
block is False then a IOError will be raised if the lock cannot
be acquired"""
if lckfilename == None:
lckfilename = filename + ".lck"
lckfile = __builtin__.open(lckfilename, 'w')
# Accquire the lock
if flag == 'r':
lockflags = LOCK_SH
else:
lockflags = LOCK_EX
if not block:
lockflags = LOCK_NB
fcntl.flock(lckfile.fileno(), lockflags)
# Open the shelf
shelf = shelve.open(filename, flag, protocol, writeback)
# Override close
shelf.close = new.instancemethod(_close, shelf, shelve.Shelf)
shelf.lckfile = lckfile
# And return it
return shelf