[geos-devel] Design of exception-trapping wrapper

David Blasby dblasby at refractions.net
Fri Apr 11 20:40:17 EDT 2003


> No - I think it would be pretty easy.  We could add another class to 
> GEOS.  It wouldnt even have to be compiled unless you're using postgis... 

I forgot to more detail in this.  This would keep the wrapper down to 
its own little class in GEOS:


// GeometryWrapper  -- passes off execution to the appropriate function.
//   any exception are caught.
// for GEOS functions that return a bool, these return 0 (false), 1 
(true), 2 (error)
//  for GEOS functions that return an object, these return the object or 
NULL (error)
class GeometryWrapper
{
    char   contains(Geometry *g1, Geometry *g2);
    ....
   // perhaps put a GeometryFactory in here too
}

and in the postgis_wrapper.cpp:

GeometryWrapper *wrapper  = new GeometryWrapper();

char GEOScontains(Geometry *g1, Geometry *g2)
{
    return   wrapper->contains(g1,g2);
}

postgis_geos.c would look like this:

// overlaps(GEOMETRY g1,GEOMETRY g2)
// returns  if GEOS::g1->overlaps(g2) returns true
// throws an error (elog(ERROR,...)) if GEOS throws an error
PG_FUNCTION_INFO_V1(overlaps);
Datum overlaps(PG_FUNCTION_ARGS)
{
   GEOMETRY        *geom1 = (GEOMETRY *)  
PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
   GEOMETRY        *geom2 = (GEOMETRY *)  
PG_DETOAST_DATUM(PG_GETARG_DATUM(1));


   Geometry *g1,*g2;
   bool result;

   errorIfGeometryCollection(geom1,geom2);
   initGEOS(MAXIMUM_ALIGNOF);

   g1 =     POSTGIS2GEOS(geom1 );
   g2 =     POSTGIS2GEOS(geom2 );

   GEOSdeleteGeometry(g1);
   GEOSdeleteGeometry(g2);

   result = GEOSrelateOverlaps(g1,g2);
   if (result == 2)
   {
       elog(ERROR,"GEOS overlaps() threw an error!");
       PG_RETURN_NULL(); //never get here
   }

   PG_RETURN_BOOL(result);
}












More information about the geos-devel mailing list