class connect(object):
def __init__(self, dsn):
+ options = dsn.copy()
+ if 'cache' in options:
+ del options['cache']
+
+ if 'cache' in dsn:
+ cached = True
+ cache = dsn['cache']
+ else:
+ cached = False
+ cache = {
+ 'hstore': None,
+ }
+
attempt = 0
while True:
try:
- self.driver = psycopg2.connect(**dsn)
+ self.driver = psycopg2.connect(**options)
break
except psycopg2.OperationalError, e:
if attempt == 2:
# self.driver.close()
# raise
- try:
- psycopg2.extras.register_hstore(self.driver, globally=False, unicode=True)
- except psycopg2.ProgrammingError, e:
- pass
+ hstore = cache['hstore']
+ if hstore == None:
+ hstore = psycopg2.extras.HstoreAdapter.get_oids(self.driver)
+ if hstore != None:
+ hstore = hstore[0]
+
+ if hstore != None:
+ try:
+ psycopg2.extras.register_hstore(self.driver, globally=False, unicode=True, oid=hstore)
+ except psycopg2.ProgrammingError, e:
+ pass
+
+ if not cached:
+ dsn['cache'] = cache
def close(self):
self.driver.close()