Author: jbronn
Date: 2011-03-30 11:49:42 -0700 (Wed, 30 Mar 2011)
New Revision: 15960

Added:
   django/branches/releases/1.3.X/django/contrib/gis/tests/data/texas.dbf
Modified:
   django/branches/releases/1.3.X/django/contrib/gis/gdal/field.py
   django/branches/releases/1.3.X/django/contrib/gis/gdal/tests/test_ds.py
Log:
[1.3.X] Fixed integer overflows that occurred when `OFTReal` fields were 
treated as `OFTInteger`.

Backport of 15946 from trunk.

Modified: django/branches/releases/1.3.X/django/contrib/gis/gdal/field.py
===================================================================
--- django/branches/releases/1.3.X/django/contrib/gis/gdal/field.py     
2011-03-30 17:59:44 UTC (rev 15959)
+++ django/branches/releases/1.3.X/django/contrib/gis/gdal/field.py     
2011-03-30 18:49:42 UTC (rev 15960)
@@ -20,7 +20,7 @@
         # Setting the feature pointer and index.
         self._feat = feat
         self._index = index
-        
+
         # Getting the pointer for this field.
         fld_ptr = capi.get_feat_field_defn(feat, index)
         if not fld_ptr:
@@ -33,6 +33,7 @@
         # OFTReal with no precision should be an OFTInteger.
         if isinstance(self, OFTReal) and self.precision == 0:
             self.__class__ = OFTInteger
+            self._double = True
 
     def __str__(self):
         "Returns the string representation of the Field."
@@ -95,10 +96,17 @@
 
 ### The Field sub-classes for each OGR Field type. ###
 class OFTInteger(Field):
+    _double = False
+
     @property
     def value(self):
         "Returns an integer contained in this field."
-        return self.as_int()
+        if self._double:
+            # If this is really from an OFTReal field with no precision,
+            # read as a double and cast as Python int (to prevent overflow).
+            return int(self.as_double())
+        else:
+            return self.as_int()
 
     @property
     def type(self):
@@ -137,7 +145,7 @@
         "Returns a Python `datetime` object for this OFTDateTime field."
         # TODO: Adapt timezone information.
         #  See 
http://lists.maptools.org/pipermail/gdal-dev/2006-February/007990.html
-        #  The `tz` variable has values of: 0=unknown, 1=localtime 
(ambiguous), 
+        #  The `tz` variable has values of: 0=unknown, 1=localtime (ambiguous),
         #  100=GMT, 104=GMT+1, 80=GMT-5, etc.
         try:
             yy, mm, dd, hh, mn, ss, tz = self.as_datetime()

Modified: 
django/branches/releases/1.3.X/django/contrib/gis/gdal/tests/test_ds.py
===================================================================
--- django/branches/releases/1.3.X/django/contrib/gis/gdal/tests/test_ds.py     
2011-03-30 17:59:44 UTC (rev 15959)
+++ django/branches/releases/1.3.X/django/contrib/gis/gdal/tests/test_ds.py     
2011-03-30 18:49:42 UTC (rev 15960)
@@ -1,7 +1,8 @@
-import os, os.path, unittest
+import os
+import unittest
 from django.contrib.gis.gdal import DataSource, Envelope, OGRGeometry, 
OGRException, OGRIndexError, GDAL_VERSION
 from django.contrib.gis.gdal.field import OFTReal, OFTInteger, OFTString
-from django.contrib.gis.geometry.test_data import get_ds_file, TestDS
+from django.contrib.gis.geometry.test_data import get_ds_file, TestDS, 
TEST_DATA
 
 # List of acceptable data sources.
 ds_list = (TestDS('test_point', nfeat=5, nfld=3, geom='POINT', gtype=1, 
driver='ESRI Shapefile',
@@ -72,7 +73,7 @@
                 self.assertEqual(source.nfld, len(layer.fields))
 
                 # Testing the layer's extent (an Envelope), and it's properties
-                if source.driver == 'VRT' and (GDAL_VERSION > (1, 7, 0) and 
GDAL_VERSION < (1, 7, 3)):
+                if source.driver == 'VRT' and (GDAL_VERSION >= (1, 7, 0) and 
GDAL_VERSION < (1, 7, 3)):
                     # There's a known GDAL regression with retrieving the 
extent
                     # of a VRT layer in versions 1.7.0-1.7.2:
                     #  http://trac.osgeo.org/gdal/ticket/3783
@@ -217,6 +218,16 @@
         lyr.spatial_filter = None
         self.assertEqual(3, len(lyr))
 
+    def test07_integer_overflow(self):
+        "Testing that OFTReal fields, treated as OFTInteger, do not overflow."
+        # Using *.dbf from Census 2010 TIGER Shapefile for Texas,
+        # which has land area ('ALAND10') stored in a Real field
+        # with no precision.
+        ds = DataSource(os.path.join(TEST_DATA, 'texas.dbf'))
+        feat = ds[0][0]
+        # Reference value obtained using `ogrinfo`.
+        self.assertEqual(676586997978, feat.get('ALAND10'))
+
 def suite():
     s = unittest.TestSuite()
     s.addTest(unittest.makeSuite(DataSourceTest))

Added: django/branches/releases/1.3.X/django/contrib/gis/tests/data/texas.dbf
===================================================================
(Binary files differ)


Property changes on: 
django/branches/releases/1.3.X/django/contrib/gis/tests/data/texas.dbf
___________________________________________________________________
Added: svn:executable
   + *
Added: svn:mime-type
   + application/octet-stream

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/django-updates?hl=en.

Reply via email to