Changeset 358


Ignore:
Timestamp:
Nov 21, 2008, 8:00:21 AM (11 years ago)
Author:
cito
Message:

Some optimization of pg._quote(). Removed checks for attr types which are never set in get_attnames() anyway.

Location:
trunk/module
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/module/pg.py

    r357 r358  
    66# Improved by Christoph Zwerschke
    77#
    8 # $Id: pg.py,v 1.59 2008-11-21 11:18:32 cito Exp $
     8# $Id: pg.py,v 1.60 2008-11-21 13:00:21 cito Exp $
    99#
    1010
     
    2121from _pg import *
    2222try:
     23    frozenset
     24except NameError: # Python < 2.4
     25    from sets import ImmutableSet as frozenset
     26try:
    2327    from decimal import Decimal
    2428    set_decimal(Decimal)
     
    2933# Auxiliary functions which are independent from a DB connection:
    3034
     35def _quote_text(d):
     36    """Quote text value."""
     37    if not isinstance(d, basestring):
     38        d = str(d)
     39    return "'%s'" % d.replace("\\", "\\\\").replace("'", "''")
     40
     41_bool_true = frozenset('t true 1 y yes on'.split())
     42
     43def _quote_bool(d):
     44    """Quote boolean value."""
     45    if isinstance(d, basestring):
     46        if not d:
     47            return 'NULL'
     48        d = d.lower() in _bool_true
     49    else:
     50        d = bool(d)
     51    return ("'f'", "'t'")[d]
     52
     53_date_literal = frozenset('current_date current_time'
     54    ' current_timestamp localtime localtimestamp'.split())
     55
     56def _quote_date(d):
     57    """Quote date value."""
     58    if not d:
     59        return 'NULL'
     60    if isinstance(d, basestring) and d.lower() in _date_literal:
     61        return d
     62    return _quote_text(d)
     63
     64def _quote_num(d):
     65    """Quote numeric value."""
     66    if not d:
     67        return 'NULL'
     68    return str(d)
     69
     70def _quote_money(d):
     71    """Quote money value."""
     72    if not d:
     73        return 'NULL'
     74    return "'%.2f'" % float(d)
     75
     76_quote_funcs = dict( # quote functions for each type
     77    text=_quote_text, bool=_quote_bool, date=_quote_date,
     78    int=_quote_num, num=_quote_num, float=_quote_num, money=_quote_money)
     79
    3180def _quote(d, t):
    3281    """Return quotes if needed."""
    3382    if d is None:
    3483        return 'NULL'
    35     if t in ('int', 'seq', 'float', 'num'):
    36         if d == '':
    37             return 'NULL'
    38         return str(d)
    39     if t == 'money':
    40         if d == '':
    41             return 'NULL'
    42         return "'%.2f'" % float(d)
    43     if t == 'bool':
    44         if isinstance(d, basestring):
    45             if d == '':
    46                 return 'NULL'
    47             d = d.lower() in ('t', 'true', '1', 'y', 'yes', 'on')
    48         else:
    49             d = bool(d)
    50         return ("'f'", "'t'")[d]
    51     if t in ('date', 'inet', 'cidr'):
    52         if d == '':
    53             return 'NULL'
    54         if d.lower() in ('current_date', 'current_time',
    55             'current_timestamp', 'localtime', 'localtimestamp'):
    56             return d
    57     return "'%s'" % str(d).replace("\\", "\\\\").replace("'", "''")
     84    else:
     85        return _quote_funcs.get(t, _quote_text)(d)
    5886
    5987def _is_quoted(s):
     
    362390            if typ.startswith('bool'):
    363391                t[att] = 'bool'
    364             elif typ.startswith('oid'):
    365                 t[att] = 'int'
    366             elif typ.startswith('float'):
    367                 t[att] = 'float'
    368             elif typ.startswith('numeric'):
    369                 t[att] = 'num'
    370392            elif typ.startswith('abstime'):
    371393                t[att] = 'date'
     
    374396            elif typ.startswith('interval'):
    375397                t[att] = 'date'
     398            elif typ.startswith('timestamp'):
     399                t[att] = 'date'
     400            elif typ.startswith('oid'):
     401                t[att] = 'int'
    376402            elif typ.startswith('int'):
    377403                t[att] = 'int'
    378             elif typ.startswith('timestamp'):
    379                 t[att] = 'date'
     404            elif typ.startswith('float'):
     405                t[att] = 'float'
     406            elif typ.startswith('numeric'):
     407                t[att] = 'num'
    380408            elif typ.startswith('money'):
    381409                t[att] = 'money'
     
    555583            if k == 'oid':
    556584                continue
    557             if t in ['int', 'seq', 'float', 'num', 'money']:
     585            if t in ('int', 'float', 'num', 'money'):
    558586                a[k] = 0
    559587            elif t == 'bool':
  • trunk/module/test_pg.py

    r346 r358  
    55# Written by Christoph Zwerschke
    66#
    7 # $Id: test_pg.py,v 1.14 2008-11-01 18:21:12 cito Exp $
     7# $Id: test_pg.py,v 1.15 2008-11-21 13:00:21 cito Exp $
    88#
    99
     
    7979        self.assertEqual(f(None, 'date'), 'NULL')
    8080        self.assertEqual(f('', 'int'), 'NULL')
    81         self.assertEqual(f('', 'seq'), 'NULL')
    8281        self.assertEqual(f('', 'float'), 'NULL')
    8382        self.assertEqual(f('', 'num'), 'NULL')
     
    8786        self.assertEqual(f('', 'text'), "''")
    8887        self.assertEqual(f(123456789, 'int'), '123456789')
    89         self.assertEqual(f(123654789, 'seq'), '123654789')
    9088        self.assertEqual(f(123456987, 'num'), '123456987')
    9189        self.assertEqual(f(1.23654789, 'num'), '1.23654789')
Note: See TracChangeset for help on using the changeset viewer.