[geos-devel] RE: [postgis-users] Error handling: GEOS throws in
PostGIS.
Martin Davis
mbdavis at VividSolutions.com
Fri Apr 11 20:19:47 EDT 2003
Well, that sounds like a fairly clean solution, if we can make it work. Building a wrapper for the entire Geometry class hierarchy isn't totally trivial - that's why I was wondering if that's really what he meant.
Martin Davis, Senior Technical Architect
Vivid Solutions Inc.
Suite #1A-2328 Government Street Victoria, B.C. V8T 5G5
Phone: (250) 385 6040 Fax: (250) 385 6046
EMail: mbdavis at vividsolutions.com Web: www.vividsolutions.com
> -----Original Message-----
> From: Paul Ramsey [mailto:pramsey at refractions.net]
> Sent: Friday, April 11, 2003 5:17 PM
> To: PostGIS Users Discussion; GEOS Development List
> Subject: Re: [postgis-users] Error handling: GEOS throws in PostGIS.
>
>
> Dave is suggesting your second option, adding a wrapper
> (perhaps as part
> of GEOS) which provides access to the GEOS functionality, but
> with all
> the exceptions kept hidden from the outside world.
>
> It is not pretty, but we appear to have no other option.
>
> P.
>
> Martin Davis wrote:
> > Is what you're suggesting this:
> >
> > Catch all GEOS errors internally and return a status code
> instead. If
> > a method already has a return value, return NULL
> >
> > This seems like a pretty substantial change to GEOS. Does it mean
> > that everyone using GEOS now has to check return codes, instead of
> > using exceptions?
> >
> > Is there any way of providing a yet higher wrapper in between GEOS
> > and PostGIS which converts exceptions into return codes (so
> that GEOS
> > is kept pure and PostGIS can call it safely)?
> >
> > Martin Davis, Senior Technical Architect Vivid Solutions Inc. Suite
> > #1A-2328 Government Street Victoria, B.C. V8T 5G5 Phone: (250)
> > 385 6040 Fax: (250) 385 6046 EMail: mbdavis at vividsolutions.com
> > Web: www.vividsolutions.com
> >
> >
> >
> >> -----Original Message----- From: David Blasby
> >> [mailto:dblasby at refractions.net] Sent: Friday, April 11, 2003 3:26
> >> PM To: postgis-users at postgis.refractions.net; GEOS Development List
> >> Subject: [postgis-users] Error handling: GEOS throws in PostGIS.
> >>
> >>
> >> I'm having troubles trapping exceptions thrown by GEOS in
> >> postgresql. My GEOS wrapper (postgis_geos_wrapper.cpp) looks like
> >> this:
> >>
> >>
> >> // call g1->contains(g2) // returns 0 = false // 1 = true
> >> // 2 = error was trapped char GEOSrelateContains(Geometry
> >> *g1, Geometry*g2) { try { bool result; result = g1->contains(g2);
> >> if (result) return 1; else return 0; } catch (...) { return 2; } }
> >>
> >> And in the .c PostGIS (postgis_geos.c):
> >>
> >> // 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); }
> >>
> >>
> >> This works great in simple examples (like the test.c norman wrote).
> >> But, when you have another layer of indirection - like with
> >> postgresql, problems happen. I think the problem is with
> >> postgresql loading a C .so (postgis), which is linked to a C++ .so
> >> (GEOS). Postgresql is far removed from the GEOS error handling (in
> >> libc++).
> >>
> >> Basically, as soon as "g1->contains(g2);" throws an error that
> >> leaves the GEOS .so, postgresql dies immediately - the exception is
> >> not catch so terminate() is called.
> >>
> >> This doesnt happen if you are using GEOS in a c++ program, or using
> >> a C++ wrapper for a C program. It only has problems with 3 levels
> >> of indirection.
> >>
> >> Others have had this problem - for example people writing PERL
> >> modules that use the perl "C" api to call C++ libraries. People
> >> doing the same with PYTHON have also had problems. The only
> >> technical reference I can find is at:
> >> http://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=37933
> >>
> >> Basically, there's a problem if libc is loaded before libc++.
> >>
> >> The only solution I can find to this (apart from forcing people to
> >> use a very up-to-date gcc/g++ and perhaps statically linking libc++
> >> to postgresql) is actually write the C wrapper as part of GEOS.
> >>
> >> In order to test this, I modified GEOS so that GEOMETRY has a
> >> function:
> >>
> >> void Geometry::throw_exception() { throw "I see dead people!"; }
> >>
> >>
> >> If you call g->throw_exception() in the postgis geos wrapper,
> >> postgresql will immediately die. But, if you re-write it (still in
> >> GEOS) like:
> >>
> >> void Geometry::throw_exception() { try { cout << "in
> >> throw_exception() try block - about to throw an error"<<endl; throw
> >> "I see dead people!"; } catch (...) { cout << "in throw_exception()
> >> - caught an error"<<endl; return; } // never get here }
> >>
> >> You can successfully catch the error!
> >>
> >>
> >> So, unless anyone has any bright ideas, we could think about
> >> putting a C api directly in GEOS. If we use the standard C way of
> >> error handling (return an error code or NULL, like in the above),
> >> PostGIS should have no problems. Unfortunately, this does
> >> "pollute" GEOS.
> >>
> >> What think?
> >>
> >> dave
> >>
> >>
> >> _______________________________________________ postgis-users
> >> mailing list postgis-users at postgis.refractions.net
> >> http://postgis.refractions.net/mailman/listinfo/postgis-users
> >>
> >
> >
> > _______________________________________________
> postgis-users mailing
> > list postgis-users at postgis.refractions.net
> > http://postgis.refractions.net/mailman/listinfo/postgis-users
>
>
> --
> __
> /
> | Paul Ramsey
> | Refractions Research
> | Email: pramsey at refractions.net
> | Phone: (250) 885-0632
> \_
>
>
> _______________________________________________
> postgis-users mailing list
> postgis-users at postgis.refractions.net
> http://postgis.refractions.net/mailman/listinfo/postgis-users
>
More information about the geos-devel
mailing list