Django

Code

Changeset 7637

Show
Ignore:
Timestamp:
06/15/08 12:28:21 (5 months ago)
Author:
jbronn
Message:

gis: Modified the Oracle database backend so that the input size of parameters may be customized (this was preventing the gis branch from working because Oracle's WKT stored procedures require CLOB rather than NCLOB as input). Ian Kelly has approved this patch; notwithstanding any further concerns, its functionality should appear in trunk sometime in the future.

Files:

Legend:

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

    r7482 r7637  
    245245        return cursor 
    246246 
     247class OracleParam(object): 
     248    """ 
     249    Wrapper object for formatting parameters for Oracle. If the string  
     250    representation of the value is large enough (greater than 4000 characters)  
     251    the input size needs to be set as NCLOB. Alternatively, if the parameter has 
     252    an `input_size` attribute, then the value of the `input_size` attribute will  
     253    be used instead. Otherwise, no input size will be set for the parameter when 
     254    executing the query. 
     255    """ 
     256    def __init__(self, param, charset, strings_only=False): 
     257        self.smart_str = smart_str(param, charset, strings_only) 
     258        if hasattr(param, 'input_size'): 
     259            # If parameter has `input_size` attribute, use that. 
     260            self.input_size = param.input_size 
     261        elif isinstance(param, basestring) and len(param) > 4000: 
     262            # Mark any string parameter greater than 4000 characters as an NCLOB. 
     263            self.input_size = Database.NCLOB 
     264        else: 
     265            self.input_size = None 
     266 
    247267class FormatStylePlaceholderCursor(Database.Cursor): 
    248268    """ 
     
    259279        if isinstance(params, dict): 
    260280            result = {} 
    261             charset = self.charset 
    262281            for key, value in params.items(): 
    263                 result[smart_str(key, charset)] = smart_str(value, charset) 
     282                result[smart_str(key, self.charset)] = OracleParam(param, self.charset) 
    264283            return result 
    265284        else: 
    266             return tuple([smart_str(p, self.charset, True) for p in params]) 
    267  
     285            return tuple([OracleParam(p, self.charset, True) for p in params]) 
     286     
    268287    def _guess_input_sizes(self, params_list): 
    269         # Mark any string parameter greater than 4000 characters as an NCLOB. 
    270288        if isinstance(params_list[0], dict): 
    271289            sizes = {} 
     
    276294        for iterator in iterators: 
    277295            for key, value in iterator: 
    278                 if isinstance(value, basestring) and len(value) > 4000: 
    279                     sizes[key] = Database.NCLOB 
     296                if value.input_size: sizes[key] = value.input_size 
    280297        if isinstance(sizes, dict): 
    281298            self.setinputsizes(**sizes) 
     
    283300            self.setinputsizes(*sizes) 
    284301 
     302    def _param_generator(self, params): 
     303        if isinstance(params, dict): 
     304            return dict([(k, p.smart_str) for k, p in params.iteritems()]) 
     305        else: 
     306            return [p.smart_str for p in params] 
     307         
    285308    def execute(self, query, params=None): 
    286309        if params is None: 
     
    297320        query = smart_str(query, self.charset) % tuple(args) 
    298321        self._guess_input_sizes([params]) 
    299         return Database.Cursor.execute(self, query, params
     322        return Database.Cursor.execute(self, query, self._param_generator(params)
    300323 
    301324    def executemany(self, query, params=None): 
     
    312335            query = query[:-1] 
    313336        query = smart_str(query, self.charset) % tuple(args) 
    314         new_param_list = [self._format_params(i) for i in params] 
    315         self._guess_input_sizes(new_param_list
    316         return Database.Cursor.executemany(self, query, new_param_list
     337        formatted = [self._format_params(i) for i in params] 
     338        self._guess_input_sizes(formatted
     339        return Database.Cursor.executemany(self, query, [self._param_generator(p) for p in formatted]
    317340 
    318341    def fetchone(self):