Author: jbronn Date: 2008-12-08 08:29:06 -0600 (Mon, 08 Dec 2008) New Revision: 9605
Modified: django/trunk/django/contrib/gis/geos/prototypes/geom.py Log: Fixed #9747 -- now explicitly set response type on C functions that return WKB and WKT. Modified: django/trunk/django/contrib/gis/geos/prototypes/geom.py =================================================================== --- django/trunk/django/contrib/gis/geos/prototypes/geom.py 2008-12-08 08:24:32 UTC (rev 9604) +++ django/trunk/django/contrib/gis/geos/prototypes/geom.py 2008-12-08 14:29:06 UTC (rev 9605) @@ -1,8 +1,21 @@ -from ctypes import c_char_p, c_int, c_size_t, c_uint, POINTER +from ctypes import c_char_p, c_int, c_size_t, c_ubyte, c_uint, POINTER from django.contrib.gis.geos.libgeos import lgeos, CS_PTR, GEOM_PTR from django.contrib.gis.geos.prototypes.errcheck import \ check_geom, check_minus_one, check_sized_string, check_string, check_zero +# This is the return type used by binary output (WKB, HEX) routines. +c_uchar_p = POINTER(c_ubyte) + +# We create a simple subclass of c_char_p here because when the response +# type is set to c_char_p, you get a _Python_ string and there's no way +# to access the string's address inside the error checking function. +# In other words, you can't free the memory allocated inside GEOS. Previously, +# the return type would just be omitted and the integer address would be +# used -- but this allows us to be specific in the function definition and +# keeps the reference so it may be free'd. +class geos_char_p(c_char_p): + pass + ### ctypes generation functions ### def bin_constructor(func): "Generates a prototype for binary construction (HEX, WKB) GEOS routines." @@ -16,6 +29,7 @@ "Generates a prototype for the routines that return a a sized string." func.argtypes = [GEOM_PTR, POINTER(c_size_t)] func.errcheck = check_sized_string + func.restype = c_uchar_p return func def geom_output(func, argtypes): @@ -44,6 +58,7 @@ # We do _not_ specify an argument type because we want just an # address returned from the function. func.argtypes = [GEOM_PTR] + func.restype = geos_char_p func.errcheck = check_string return func --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Django updates" group. To post to this group, send email to django-updates@googlegroups.com 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 -~----------~----~----~----~------~----~------~--~---