X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=PLC%2FPostgreSQL.py;h=09132e269ba390fb62b823b94525980b7dfffc4f;hb=fe81b2c91b436b1882f63023413c7f51b29538ed;hp=2c2d0b31debf298b43b07104c6b902cb2d3df301;hpb=0e05b62eeb2159b1a5dcf40739252d2fc9a37fcc;p=plcapi.git diff --git a/PLC/PostgreSQL.py b/PLC/PostgreSQL.py index 2c2d0b3..09132e2 100644 --- a/PLC/PostgreSQL.py +++ b/PLC/PostgreSQL.py @@ -6,6 +6,7 @@ # Copyright (C) 2006 The Trustees of Princeton University # # $Id$ +# $URL$ # import psycopg2 @@ -24,30 +25,6 @@ from pprint import pformat from PLC.Debug import profile, log from PLC.Faults import * -if not psycopg2: - is8bit = re.compile("[\x80-\xff]").search - - def unicast(typecast): - """ - pgdb returns raw UTF-8 strings. This function casts strings that - appear to contain non-ASCII characters to unicode objects. - """ - - def wrapper(*args, **kwds): - value = typecast(*args, **kwds) - - # pgdb always encodes unicode objects as UTF-8 regardless of - # the DB encoding (and gives you no option for overriding - # the encoding), so always decode 8-bit objects as UTF-8. - if isinstance(value, str) and is8bit(value): - value = unicode(value, "utf-8") - - return value - - return wrapper - - pgdb.pgdbTypeCache.typecast = unicast(pgdb.pgdbTypeCache.typecast) - class PostgreSQL: def __init__(self, api): self.api = api @@ -58,25 +35,19 @@ class PostgreSQL: def cursor(self): if self.connection is None: # (Re)initialize database connection - if psycopg2: - try: - # Try UNIX socket first - self.connection = psycopg2.connect(user = self.api.config.PLC_DB_USER, - password = self.api.config.PLC_DB_PASSWORD, - database = self.api.config.PLC_DB_NAME) - except psycopg2.OperationalError: - # Fall back on TCP - self.connection = psycopg2.connect(user = self.api.config.PLC_DB_USER, - password = self.api.config.PLC_DB_PASSWORD, - database = self.api.config.PLC_DB_NAME, - host = self.api.config.PLC_DB_HOST, - port = self.api.config.PLC_DB_PORT) - self.connection.set_client_encoding("UNICODE") - else: - self.connection = pgdb.connect(user = self.api.config.PLC_DB_USER, - password = self.api.config.PLC_DB_PASSWORD, - host = "%s:%d" % (api.config.PLC_DB_HOST, api.config.PLC_DB_PORT), - database = self.api.config.PLC_DB_NAME) + try: + # Try UNIX socket first + self.connection = psycopg2.connect(user = self.api.config.PLC_DB_USER, + password = self.api.config.PLC_DB_PASSWORD, + database = self.api.config.PLC_DB_NAME) + except psycopg2.OperationalError: + # Fall back on TCP + self.connection = psycopg2.connect(user = self.api.config.PLC_DB_USER, + password = self.api.config.PLC_DB_PASSWORD, + database = self.api.config.PLC_DB_NAME, + host = self.api.config.PLC_DB_HOST, + port = self.api.config.PLC_DB_PORT) + self.connection.set_client_encoding("UNICODE") (self.rowcount, self.description, self.lastrowid) = \ (None, None, None) @@ -88,6 +59,12 @@ class PostgreSQL: self.connection.close() self.connection = None + # join insists on getting strings + @classmethod + def quote_string(self, value): + return str(PostgreSQL.quote(value)) + + @classmethod def quote(self, value): """ Returns quoted version of the specified value. @@ -96,12 +73,11 @@ class PostgreSQL: # The pgdb._quote function is good enough for general SQL # quoting, except for array types. if isinstance(value, (list, tuple, set)): - return "ARRAY[%s]" % ", ".join(map, self.quote, value) + return "ARRAY[%s]" % ", ".join(map (PostgreSQL.quote_string, value)) else: return pgdb._quote(value) - quote = classmethod(quote) - + @classmethod def param(self, name, value): # None is converted to the unquoted string NULL if isinstance(value, NoneType): @@ -118,8 +94,6 @@ class PostgreSQL: return '%(' + name + ')' + conversion - param = classmethod(param) - def begin_work(self): # Implicit in pgdb.connect() pass