Ver código fonte

grass.pygrass: Improve database exception handling in Info.open (#1559)

* Add missing exception handling in Info.open to replace lower level and wrong exceptions.
* Add additional checks.
* Distinguish unsupported and unknown database drivers.

Fixes #1555.
Maximilian Stahlberg 3 anos atrás
pai
commit
d074fbd5f2

+ 21 - 2
python/grass/pygrass/vector/abstract.py

@@ -413,14 +413,33 @@ class Info(object):
             str_err = "Not able to open the map, C function return %d."
             raise OpenError(str_err % openvect)
 
+        # Load attribute table for selected layer.
         if len(self.dblinks) == 0:
             self.layer = layer
             self.table = None
             self.n_lines = 0
         else:
-            self.layer = self.dblinks.by_layer(layer).layer
-            self.table = self.dblinks.by_layer(layer).table()
+            layer_db_link = self.dblinks.by_layer(layer)
+            if not layer_db_link:
+                raise LookupError(
+                    "There appears to be no database link for layer %d of <%s>."
+                    % (layer, self.name)
+                )
+            if layer_db_link.layer != layer:
+                raise RuntimeError(
+                    "The databse link for layer %d of <%s> references layer %d."
+                    % (layer, self.name, layer_db_link.layer)
+                )
+            self.layer = layer
+            try:
+                self.table = layer_db_link.table()
+            except Exception as error:
+                raise RuntimeError(
+                    "Loading the attribute table for layer %d of <%s> failed."
+                    % (layer, self.name)
+                ) from error
             self.n_lines = self.table.n_rows()
+
         self.writeable = self.mapset == utils.getenv("MAPSET")
         # Initialize the finder
         self.find = {

+ 13 - 4
python/grass/pygrass/vector/table.py

@@ -45,6 +45,7 @@ if sys.version_info.major >= 3:
 test_vector_name = "table_doctest_map"
 
 DRIVERS = ("sqlite", "pg")
+UNSUPPORTED_DRIVERS = ("ogr", "dbf")
 
 
 def get_path(path, vect_name=None):
@@ -714,10 +715,18 @@ class Link(object):
         return decode(self.c_fieldinfo.contents.driver)
 
     def _set_driver(self, driver):
-        if driver not in ("sqlite", "pg"):
-            str_err = "Driver not supported, use: %s." % ", ".join(DRIVERS)
-            raise TypeError(str_err)
-        self.c_fieldinfo.contents.driver = ReturnString(driver)
+        if driver in DRIVERS:
+            self.c_fieldinfo.contents.driver = ReturnString(driver)
+        elif driver in UNSUPPORTED_DRIVERS:
+            raise NotImplementedError(
+                "The database driver %s is not supported by PyGRASS, "
+                "use: %s." % (driver, ", ".join(DRIVERS))
+            )
+        else:
+            raise ValueError(
+                "The database driver %s is not known to PyGRASS, "
+                "use: %s." % (driver, ", ".join(DRIVERS))
+            )
 
     driver = property(
         fget=_get_driver,