Changeset 876 for trunk/pgdb.py


Ignore:
Timestamp:
Jul 14, 2016, 8:21:19 AM (3 years ago)
Author:
cito
Message:

Fixed issues when remote server version < 9.0

Though this is not officially supported and tested,
sometimes you just have to access those legacy databases.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/pgdb.py

    r875 r876  
    632632        self._typecasts.get_fields = self.get_fields
    633633        self._typecasts.connection = cnx
     634        if cnx.server_version < 80400:
     635            # older remote databases (not officially supported)
     636            self._query_pg_type = ("SELECT oid, typname,"
     637                " typlen, typtype, null as typcategory, typdelim, typrelid"
     638                " FROM pg_type WHERE oid=%s")
     639        else:
     640            self._query_pg_type = ("SELECT oid, typname,"
     641                " typlen, typtype, typcategory, typdelim, typrelid"
     642                " FROM pg_type WHERE oid=%s")
    634643
    635644    def __missing__(self, key):
     
    639648        else:
    640649            if '.' not in key and '"' not in key:
    641                 key = '"%s"' % key
    642             oid = "'%s'::regtype" % self._escape_string(key)
     650                key = '"%s"' % (key,)
     651            oid = "'%s'::regtype" % (self._escape_string(key),)
    643652        try:
    644             self._src.execute("SELECT oid, typname,"
    645                  " typlen, typtype, typcategory, typdelim, typrelid"
    646                 " FROM pg_type WHERE oid=%s" % oid)
     653            self._src.execute(self._query_pg_type % (oid,))
    647654        except ProgrammingError:
    648655            res = None
     
    650657            res = self._src.fetch(1)
    651658        if not res:
    652             raise KeyError('Type %s could not be found' % key)
     659            raise KeyError('Type %s could not be found' % (key,))
    653660        res = res[0]
    654661        type_code = TypeCode.create(int(res[0]), res[1],
     
    674681        self._src.execute("SELECT attname, atttypid"
    675682            " FROM pg_attribute WHERE attrelid=%s AND attnum>0"
    676             " AND NOT attisdropped ORDER BY attnum" % typ.relid)
     683            " AND NOT attisdropped ORDER BY attnum" % (typ.relid,))
    677684        return [FieldInfo(name, self.get(int(oid)))
    678685            for name, oid in self._src.fetch(-1)]
     
    773780            else:
    774781                value = self._cnx.escape_string(value)
    775             return "'%s'" % value
     782            return "'%s'" % (value,)
    776783        if isinstance(value, float):
    777784            if isinf(value):
     
    784791        if isinstance(value, datetime):
    785792            if value.tzinfo:
    786                 return "'%s'::timestamptz" % value
    787             return "'%s'::timestamp" % value
     793                return "'%s'::timestamptz" % (value,)
     794            return "'%s'::timestamp" % (value,)
    788795        if isinstance(value, date):
    789             return "'%s'::date" % value
     796            return "'%s'::date" % (value,)
    790797        if isinstance(value, time):
    791798            if value.tzinfo:
    792                 return "'%s'::timetz" % value
     799                return "'%s'::timetz" % (value,)
    793800            return "'%s'::time" % value
    794801        if isinstance(value, timedelta):
    795             return "'%s'::interval" % value
     802            return "'%s'::interval" % (value,)
    796803        if isinstance(value, Uuid):
    797             return "'%s'::uuid" % value
     804            return "'%s'::uuid" % (value,)
    798805        if isinstance(value, list):
    799806            # Quote value as an ARRAY constructor. This is better than using
     
    806813            q = self._quote
    807814            try:
    808                 return 'ARRAY[%s]' % ','.join(str(q(v)) for v in value)
     815                return 'ARRAY[%s]' % (','.join(str(q(v)) for v in value),)
    809816            except UnicodeEncodeError:  # Python 2 with non-ascii values
    810                 return u'ARRAY[%s]' % ','.join(unicode(q(v)) for v in value)
     817                return u'ARRAY[%s]' % (','.join(unicode(q(v)) for v in value),)
    811818        if isinstance(value, tuple):
    812819            # Quote as a ROW constructor.  This is better than using a record
     
    817824            q = self._quote
    818825            try:
    819                 return '(%s)' % ','.join(str(q(v)) for v in value)
     826                return '(%s)' % (','.join(str(q(v)) for v in value),)
    820827            except UnicodeEncodeError:  # Python 2 with non-ascii values
    821                 return u'(%s)' % ','.join(unicode(q(v)) for v in value)
     828                return u'(%s)' % (','.join(unicode(q(v)) for v in value),)
    822829        try:
    823830            value = value.__pg_repr__()
    824831        except AttributeError:
    825832            raise InterfaceError(
    826                 'Do not know how to adapt type %s' % type(value))
     833                'Do not know how to adapt type %s' % (type(value),))
    827834        if isinstance(value, (tuple, list)):
    828835            value = self._quote(value)
     
    10371044            if isinstance(stream, basestring):
    10381045                if not isinstance(stream, input_type):
    1039                     raise ValueError("The input must be %s" % type_name)
     1046                    raise ValueError("The input must be %s" % (type_name,))
    10401047                if not binary_format:
    10411048                    if isinstance(stream, str):
     
    10551062                        if not isinstance(chunk, input_type):
    10561063                            raise ValueError(
    1057                                 "Input stream must consist of %s" % type_name)
     1064                                "Input stream must consist of %s"
     1065                                % (type_name,))
    10581066                        if isinstance(chunk, str):
    10591067                            if not chunk.endswith('\n'):
     
    11221130        operation.append("from stdin")
    11231131        if options:
    1124             operation.append('(%s)' % ','.join(options))
     1132            operation.append('(%s)' % (','.join(options),))
    11251133        operation = ' '.join(operation)
    11261134
     
    12171225        operation.append("to stdout")
    12181226        if options:
    1219             operation.append('(%s)' % ','.join(options))
     1227            operation.append('(%s)' % (','.join(options),))
    12201228        operation = ' '.join(operation)
    12211229
     
    13051313                    return namedtuple('Row', colnames, rename=True)._make
    13061314                except TypeError:  # Python 2.6 and 3.0 do not support rename
    1307                     colnames = [v if v.isalnum() else 'column_%d' % n
     1315                    colnames = [v if v.isalnum() else 'column_%d' % (n,)
    13081316                             for n, v in enumerate(colnames)]
    13091317                    return namedtuple('Row', colnames)._make
    13101318            except ValueError:  # there is still a problem with the field names
    1311                 colnames = ['column_%d' % n for n in range(len(colnames))]
     1319                colnames = ['column_%d' % (n,) for n in range(len(colnames))]
    13121320                return namedtuple('Row', colnames)._make
    13131321
     
    14941502            value = str(value)
    14951503            if not value or ' ' in value:
    1496                 value = "'%s'" % value.replace(
    1497                     "'", "\\'").replace('\\', '\\\\')
     1504                value = "'%s'" % (value.replace(
     1505                    "'", "\\'").replace('\\', '\\\\'),)
    14981506            dbname.append('%s=%s' % (kw, value))
    14991507        dbname = ' '.join(dbname)
     
    16701678        s = cls._re_escape.sub(r'\\\1', s)
    16711679        if quote:
    1672             s = '"%s"' % s
     1680            s = '"%s"' % (s,)
    16731681        return s
    16741682
Note: See TracChangeset for help on using the changeset viewer.