Django

Code

Changeset 8145

Show
Ignore:
Timestamp:
07/29/08 20:29:31 (5 months ago)
Author:
mtredinnick
Message:

Fixed #7637 -- Added an extra parameterisation hook to the Oracle backend.
Required for some extension modules (in particular, geo-django). Patch from
Justin Bronn.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • django/trunk/django/db/backends/oracle/base.py

    r8131 r8145  
    258258        return cursor 
    259259 
     260class OracleParam(object): 
     261    """ 
     262    Wrapper object for formatting parameters for Oracle. If the string 
     263    representation of the value is large enough (greater than 4000 characters) 
     264    the input size needs to be set as NCLOB. Alternatively, if the parameter has 
     265    an `input_size` attribute, then the value of the `input_size` attribute will 
     266    be used instead. Otherwise, no input size will be set for the parameter when 
     267    executing the query. 
     268    """ 
     269    def __init__(self, param, charset, strings_only=False): 
     270        self.smart_str = smart_str(param, charset, strings_only) 
     271        if hasattr(param, 'input_size'): 
     272            # If parameter has `input_size` attribute, use that. 
     273            self.input_size = param.input_size 
     274        elif isinstance(param, basestring) and len(param) > 4000: 
     275            # Mark any string parameter greater than 4000 characters as an NCLOB. 
     276            self.input_size = Database.NCLOB 
     277        else: 
     278            self.input_size = None 
     279 
    260280class FormatStylePlaceholderCursor(Database.Cursor): 
    261281    """ 
     
    272292        if isinstance(params, dict): 
    273293            result = {} 
    274             charset = self.charset 
    275294            for key, value in params.items(): 
    276                 result[smart_str(key, charset)] = smart_str(value, charset) 
     295                result[smart_str(key, self.charset)] = OracleParam(param, self.charset) 
    277296            return result 
    278297        else: 
    279             return tuple([smart_str(p, self.charset, True) for p in params]) 
     298            return tuple([OracleParam(p, self.charset, True) for p in params]) 
    280299 
    281300    def _guess_input_sizes(self, params_list): 
    282         # Mark any string parameter greater than 4000 characters as an NCLOB. 
    283301        if isinstance(params_list[0], dict): 
    284302            sizes = {} 
     
    289307        for iterator in iterators: 
    290308            for key, value in iterator: 
    291                 if isinstance(value, basestring) and len(value) > 4000: 
    292                     sizes[key] = Database.NCLOB 
     309                if value.input_size: sizes[key] = value.input_size 
    293310        if isinstance(sizes, dict): 
    294311            self.setinputsizes(**sizes) 
    295312        else: 
    296313            self.setinputsizes(*sizes) 
     314 
     315    def _param_generator(self, params): 
     316        if isinstance(params, dict): 
     317            return dict([(k, p.smart_str) for k, p in params.iteritems()]) 
     318        else: 
     319            return [p.smart_str for p in params] 
    297320 
    298321    def execute(self, query, params=None): 
     
    310333        query = smart_str(query, self.charset) % tuple(args) 
    311334        self._guess_input_sizes([params]) 
    312         return Database.Cursor.execute(self, query, params
     335        return Database.Cursor.execute(self, query, self._param_generator(params)
    313336 
    314337    def executemany(self, query, params=None): 
     
    325348            query = query[:-1] 
    326349        query = smart_str(query, self.charset) % tuple(args) 
    327         new_param_list = [self._format_params(i) for i in params] 
    328         self._guess_input_sizes(new_param_list
    329         return Database.Cursor.executemany(self, query, new_param_list
     350        formatted = [self._format_params(i) for i in params] 
     351        self._guess_input_sizes(formatted
     352        return Database.Cursor.executemany(self, query, [self._param_generator(p) for p in formatted]
    330353 
    331354    def fetchone(self):