summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Wiesmann <daniel.wiesmann@gmail.com>2014-12-01 17:34:50 +0000
committerClaude Paroz <claude@2xlibre.net>2014-12-02 19:56:50 +0100
commitac51496ceb07888c034d42deee864d3e32a8152f (patch)
treec8bba92cb762950ffdd08fb100425af1451eab52
parent4df3a3e0e9bfcd64a3e2eb85e0d4449d7b8f4f6e (diff)
Added cpl error codes to errcheck functions
GDAL raster methods return different error codes from the vector API.
-rw-r--r--django/contrib/gis/gdal/error.py32
-rw-r--r--django/contrib/gis/gdal/prototypes/errcheck.py12
-rw-r--r--django/contrib/gis/gdal/prototypes/generation.py14
-rw-r--r--django/contrib/gis/gdal/prototypes/raster.py7
4 files changed, 46 insertions, 19 deletions
diff --git a/django/contrib/gis/gdal/error.py b/django/contrib/gis/gdal/error.py
index 528b9b5607..57c946943b 100644
--- a/django/contrib/gis/gdal/error.py
+++ b/django/contrib/gis/gdal/error.py
@@ -42,14 +42,34 @@ OGRERR_DICT = {
}
OGRERR_NONE = 0
+# CPL Error Codes
+# http://www.gdal.org/cpl__error_8h.html
+CPLERR_DICT = {
+ 1: (GDALException, 'AppDefined'),
+ 2: (GDALException, 'OutOfMemory'),
+ 3: (GDALException, 'FileIO'),
+ 4: (GDALException, 'OpenFailed'),
+ 5: (GDALException, 'IllegalArg'),
+ 6: (GDALException, 'NotSupported'),
+ 7: (GDALException, 'AssertionFailed'),
+ 8: (GDALException, 'NoWriteAccess'),
+ 9: (GDALException, 'UserInterrupt'),
+ 10: (GDALException, 'ObjectNull'),
+}
+CPLERR_NONE = 0
+
-def check_err(code):
- "Checks the given OGRERR, and raises an exception where appropriate."
+def check_err(code, cpl=False):
+ """
+ Checks the given CPL/OGRERR, and raises an exception where appropriate.
+ """
+ err_none = CPLERR_NONE if cpl else OGRERR_NONE
+ err_dict = CPLERR_DICT if cpl else OGRERR_DICT
- if code == OGRERR_NONE:
+ if code == err_none:
return
- elif code in OGRERR_DICT:
- e, msg = OGRERR_DICT[code]
+ elif code in err_dict:
+ e, msg = err_dict[code]
raise e(msg)
else:
- raise OGRException('Unknown error code: "%s"' % code)
+ raise GDALException('Unknown error code: "%s"' % code)
diff --git a/django/contrib/gis/gdal/prototypes/errcheck.py b/django/contrib/gis/gdal/prototypes/errcheck.py
index 72231188c8..caed26686f 100644
--- a/django/contrib/gis/gdal/prototypes/errcheck.py
+++ b/django/contrib/gis/gdal/prototypes/errcheck.py
@@ -22,12 +22,12 @@ def ptr_byref(args, offset=-1):
### String checking Routines ###
-def check_const_string(result, func, cargs, offset=None):
+def check_const_string(result, func, cargs, offset=None, cpl=False):
"""
Similar functionality to `check_string`, but does not free the pointer.
"""
if offset:
- check_err(result)
+ check_err(result, cpl=cpl)
ptr = ptr_byref(cargs, offset)
return ptr.value
else:
@@ -101,20 +101,20 @@ def check_srs(result, func, cargs):
### Other error-checking routines ###
-def check_arg_errcode(result, func, cargs):
+def check_arg_errcode(result, func, cargs, cpl=False):
"""
The error code is returned in the last argument, by reference.
Check its value with `check_err` before returning the result.
"""
- check_err(arg_byref(cargs))
+ check_err(arg_byref(cargs), cpl=cpl)
return result
-def check_errcode(result, func, cargs):
+def check_errcode(result, func, cargs, cpl=False):
"""
Check the error code returned (c_int).
"""
- check_err(result)
+ check_err(result, cpl=cpl)
def check_pointer(result, func, cargs):
diff --git a/django/contrib/gis/gdal/prototypes/generation.py b/django/contrib/gis/gdal/prototypes/generation.py
index 69477ba044..79b7b47825 100644
--- a/django/contrib/gis/gdal/prototypes/generation.py
+++ b/django/contrib/gis/gdal/prototypes/generation.py
@@ -2,8 +2,8 @@
This module contains functions that generate ctypes prototypes for the
GDAL routines.
"""
-
from ctypes import c_char_p, c_double, c_int, c_void_p
+from functools import partial
from django.contrib.gis.gdal.prototypes.errcheck import (
check_arg_errcode, check_errcode, check_geom, check_geom_offset,
check_pointer, check_srs, check_str_arg, check_string, check_const_string)
@@ -13,12 +13,12 @@ class gdal_char_p(c_char_p):
pass
-def double_output(func, argtypes, errcheck=False, strarg=False):
+def double_output(func, argtypes, errcheck=False, strarg=False, cpl=False):
"Generates a ctypes function that returns a double value."
func.argtypes = argtypes
func.restype = c_double
if errcheck:
- func.errcheck = check_arg_errcode
+ func.errcheck = partial(check_arg_errcode, cpl=cpl)
if strarg:
func.errcheck = check_str_arg
return func
@@ -66,7 +66,7 @@ def srs_output(func, argtypes):
return func
-def const_string_output(func, argtypes, offset=None, decoding=None):
+def const_string_output(func, argtypes, offset=None, decoding=None, cpl=False):
func.argtypes = argtypes
if offset:
func.restype = c_int
@@ -74,7 +74,7 @@ def const_string_output(func, argtypes, offset=None, decoding=None):
func.restype = c_char_p
def _check_const(result, func, cargs):
- res = check_const_string(result, func, cargs, offset=offset)
+ res = check_const_string(result, func, cargs, offset=offset, cpl=cpl)
if res and decoding:
res = res.decode(decoding)
return res
@@ -112,7 +112,7 @@ def string_output(func, argtypes, offset=-1, str_result=False, decoding=None):
return func
-def void_output(func, argtypes, errcheck=True):
+def void_output(func, argtypes, errcheck=True, cpl=False):
"""
For functions that don't only return an error code that needs to
be examined.
@@ -123,7 +123,7 @@ def void_output(func, argtypes, errcheck=True):
# `errcheck` keyword may be set to False for routines that
# return void, rather than a status code.
func.restype = c_int
- func.errcheck = check_errcode
+ func.errcheck = partial(check_errcode, cpl=cpl)
else:
func.restype = None
diff --git a/django/contrib/gis/gdal/prototypes/raster.py b/django/contrib/gis/gdal/prototypes/raster.py
index 991e3c6ef0..180952276f 100644
--- a/django/contrib/gis/gdal/prototypes/raster.py
+++ b/django/contrib/gis/gdal/prototypes/raster.py
@@ -3,6 +3,8 @@ This module houses the ctypes function prototypes for GDAL DataSource (raster)
related data structures.
"""
from ctypes import c_char_p, c_double, c_int, c_void_p, POINTER
+from functools import partial
+
from django.contrib.gis.gdal.libgdal import lgdal
from django.contrib.gis.gdal.prototypes.generation import (const_string_output,
double_output, int_output, void_output, voidptr_output)
@@ -11,6 +13,11 @@ from django.contrib.gis.gdal.prototypes.generation import (const_string_output,
# http://gdal.org/gdal_8h.html
# http://gdal.org/gdalwarper_8h.html
+# Prepare partial functions that use cpl error codes
+void_output = partial(void_output, cpl=True)
+const_string_output = partial(const_string_output, cpl=True)
+double_output = partial(double_output, cpl=True)
+
### Raster Driver Routines ###
register_all = void_output(lgdal.GDALAllRegister, [])
get_driver = voidptr_output(lgdal.GDALGetDriver, [c_int])