Skip to content

Commit

Permalink
grass.pygrass: Improve database exception handling in Info.open (#1559)
Browse files Browse the repository at this point in the history
* 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.
  • Loading branch information
Viech committed Feb 28, 2022
1 parent 94b8ec6 commit d074fbd
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 6 deletions.
23 changes: 21 additions & 2 deletions python/grass/pygrass/vector/abstract.py
Original file line number Diff line number Diff line change
Expand Up @@ -413,14 +413,33 @@ def open(
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 = {
Expand Down
17 changes: 13 additions & 4 deletions python/grass/pygrass/vector/table.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@
test_vector_name = "table_doctest_map"

DRIVERS = ("sqlite", "pg")
UNSUPPORTED_DRIVERS = ("ogr", "dbf")


def get_path(path, vect_name=None):
Expand Down Expand Up @@ -714,10 +715,18 @@ def _get_driver(self):
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,
Expand Down

0 comments on commit d074fbd

Please sign in to comment.