Commit 3b37c815 authored by Malcolm Tredinnick's avatar Malcolm Tredinnick
Browse files

Fixed #7411 -- worked around some possible transaction conflicts in SQLite.


git-svn-id: http://code.djangoproject.com/svn/django/trunk@7926 bcc190cf-cafb-0310-a4f2-bffc1f526a37
parent e867c5a0
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -53,6 +53,7 @@ class BaseDatabaseFeatures(object):
    time_field_needs_date = False
    interprets_empty_strings_as_nulls = False
    date_field_supports_time_value = True
    can_use_chunked_reads = True

class BaseDatabaseOperations(object):
    """
+5 −0
Original line number Diff line number Diff line
@@ -40,6 +40,11 @@ Database.register_adapter(decimal.Decimal, util.rev_typecast_decimal)

class DatabaseFeatures(BaseDatabaseFeatures):
    supports_constraints = False
    # SQLite cannot handle us only partially reading from a cursor's result set
    # and then writing the same rows to the database in another cursor. This
    # setting ensures we always read result sets fully into memory all in one
    # go.
    can_use_chunked_reads = False

class DatabaseOperations(BaseDatabaseOperations):
    def date_extract_sql(self, lookup_type, field_name):
+8 −2
Original line number Diff line number Diff line
@@ -1616,10 +1616,16 @@ class Query(object):

        # The MULTI case.
        if self.ordering_aliases:
            return order_modified_iter(cursor, len(self.ordering_aliases),
            result = order_modified_iter(cursor, len(self.ordering_aliases),
                    self.connection.features.empty_fetchmany_value)
        return iter((lambda: cursor.fetchmany(GET_ITERATOR_CHUNK_SIZE)),
        result = iter((lambda: cursor.fetchmany(GET_ITERATOR_CHUNK_SIZE)),
                self.connection.features.empty_fetchmany_value)
        if not self.connection.features.can_use_chunked_reads:
            # If we are using non-chunked reads, we return the same data
            # structure as normally, but ensure it is all read into memory
            # before going any further.
            return list(result)
        return result

# Use the backend's custom Query class if it defines one. Otherwise, use the
# default.
+12 −2
Original line number Diff line number Diff line
@@ -6,7 +6,7 @@ import datetime
import pickle

from django.db import models
from django.db.models.query import Q
from django.db.models.query import Q, ITER_CHUNK_SIZE

# Python 2.3 doesn't have sorted()
try:
@@ -820,5 +820,15 @@ Bug #7698 -- People like to slice with '0' as the high-water mark.
>>> Item.objects.all()[0:0]
[]

Bug #7411 - saving to db must work even with partially read result set in
another cursor.

>>> for num in range(2 * ITER_CHUNK_SIZE + 1):
...     _ = Number.objects.create(num=num)

>>> for i, obj in enumerate(Number.objects.all()):
...     obj.save()
...     if i > 10: break

"""}