Django

Code

Changeset 6905

Show
Ignore:
Timestamp:
12/10/07 20:22:40 (9 months ago)
Author:
ikelly
Message:

Fixed ORA-01461 error when trying to store more than 4000 bytes in a TextField? under Oracle

Files:

Legend:

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

    r6799 r6905  
    456456            return tuple([smart_str(p, self.charset, True) for p in params]) 
    457457 
     458    def _guess_input_sizes(self, params_list): 
     459        # Mark any string parameter greater than 4000 characters as an NCLOB. 
     460        if isinstance(params_list[0], dict): 
     461            sizes = {} 
     462            iterators = [params.iteritems() for params in params_list] 
     463        else: 
     464            sizes = [None] * len(params_list[0]) 
     465            iterators = [enumerate(params) for params in params_list] 
     466        for iterator in iterators: 
     467            for key, value in iterator: 
     468                if isinstance(value, basestring) and len(value) > 4000: 
     469                    sizes[key] = Database.NCLOB 
     470        if isinstance(sizes, dict): 
     471            self.setinputsizes(**sizes) 
     472        else: 
     473            self.setinputsizes(*sizes) 
     474 
    458475    def execute(self, query, params=None): 
    459476        if params is None: 
     
    469486            query = query[:-1] 
    470487        query = smart_str(query, self.charset) % tuple(args) 
     488        self._guess_input_sizes([params]) 
    471489        return Database.Cursor.execute(self, query, params) 
    472490 
     
    485503        query = smart_str(query, self.charset) % tuple(args) 
    486504        new_param_list = [self._format_params(i) for i in params] 
     505        self._guess_input_sizes(new_param_list) 
    487506        return Database.Cursor.executemany(self, query, new_param_list) 
    488507 
  • django/trunk/tests/regressiontests/model_regress/models.py

    r6195 r6905  
    1212    status = models.IntegerField(blank=True, null=True, choices=CHOICES) 
    1313    misc_data = models.CharField(max_length=100, blank=True) 
     14    article_text = models.TextField() 
    1415 
    1516    class Meta: 
     
    4344>>> a2.misc_data 
    4445u'' 
     46 
     47# TextFields can hold more than 4000 characters (this was broken in Oracle). 
     48>>> a3 = Article(headline="Really, really big", pub_date=datetime.now()) 
     49>>> a3.article_text = "ABCDE" * 1000 
     50>>> a3.save() 
     51>>> a4 = Article.objects.get(pk=a3.id) 
     52>>> len(a4.article_text) 
     535000 
     54 
    4555""" 
    4656}