LCOV - code coverage report
Current view: top level - geom/lib - libgeom.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 71 76 93.4 %
Date: 2024-12-20 21:24:02 Functions: 8 8 100.0 %

          Line data    Source code
       1             : /*
       2             :  * SPDX-License-Identifier: MPL-2.0
       3             :  *
       4             :  * This Source Code Form is subject to the terms of the Mozilla Public
       5             :  * License, v. 2.0.  If a copy of the MPL was not distributed with this
       6             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       7             :  *
       8             :  * Copyright 2024 MonetDB Foundation;
       9             :  * Copyright August 2008 - 2023 MonetDB B.V.;
      10             :  * Copyright 1997 - July 2008 CWI.
      11             :  */
      12             : 
      13             : /*
      14             :  * @f libgeom
      15             :  * @a Niels Nes
      16             :  *
      17             :  * @* The simple geom library
      18             :  */
      19             : 
      20             : #include "monetdb_config.h"
      21             : #include "libgeom.h"
      22             : 
      23             : __attribute__((__format__(__printf__, 1, 2)))
      24             : static void
      25          57 : geomerror(_In_z_ _Printf_format_string_ const char *fmt, ...)
      26             : {
      27          57 :         va_list va;
      28          57 :         char err[256];
      29          57 :         va_start(va, fmt);
      30          57 :         vsnprintf(err, sizeof(err), fmt, va);
      31          57 :         GDKtracer_log(__FILE__, __func__, __LINE__, M_ERROR,
      32             :                       GDK, NULL, "%s", err);
      33          57 :         va_end(va);
      34          57 : }
      35             : 
      36             : static MT_TLS_t geom_tls_key;
      37             : 
      38             : static void
      39       46152 : libgeom_tls_init(void *dummy)
      40             : {
      41       46152 :         (void)dummy;
      42       46152 :         GEOSContextHandle_t ctx = GEOS_init_r ();
      43       46150 :         GEOSContext_setNoticeHandler_r(ctx, (GEOSMessageHandler) geomerror);
      44       46151 :         GEOSContext_setErrorHandler_r(ctx, (GEOSMessageHandler) geomerror);
      45       46157 :         GEOS_setWKBByteOrder_r(ctx, 1); /* NDR (little endian) */
      46       46169 :         MT_tls_set(geom_tls_key, ctx);
      47       46152 : }
      48             : 
      49             : static void
      50       46153 : libgeom_tls_exit(void *dummy)
      51             : {
      52       46153 :         (void)dummy;
      53       46153 :         GEOSContextHandle_t ctx = MT_tls_get(geom_tls_key);
      54       46173 :         GEOS_finish_r(ctx);
      55       46171 : }
      56             : 
      57             : GEOSContextHandle_t
      58       35007 : libgeom_tls(void)
      59             : {
      60       35007 :         return MT_tls_get(geom_tls_key);
      61             : }
      62             : 
      63             : gdk_return
      64         340 : libgeom_init(void)
      65             : {
      66         680 :         if (MT_alloc_tls(&geom_tls_key) != GDK_SUCCEED ||
      67         340 :                 MT_thread_init_add_callback(libgeom_tls_init, libgeom_tls_exit, NULL) != GDK_SUCCEED)
      68           0 :                 return GDK_FAIL;
      69             : 
      70         340 :         printf("# MonetDB/GIS module loaded\n");
      71         340 :         fflush(stdout);         /* make merovingian see this *now* */
      72         340 :         return GDK_SUCCEED;
      73             : }
      74             : 
      75             : bool
      76        7924 : is_wkb_nil(const wkb *w)
      77             : {
      78        7924 :         if (!w || w->len == ~0)
      79          77 :                 return 1;
      80             :         return 0;
      81             : }
      82             : 
      83             : GEOSGeom
      84        3565 : wkb2geos(const wkb *geomWKB)
      85             : {
      86        3565 :         GEOSGeom geosGeometry;
      87             : 
      88        3565 :         if (is_wkb_nil(geomWKB))
      89             :                 return NULL;
      90             : 
      91        3572 :         geosGeometry = GEOSGeomFromWKB_buf_r(geoshandle, (unsigned char *) geomWKB->data, geomWKB->len);
      92             : 
      93        3597 :         if (geosGeometry != NULL)
      94        3597 :                 GEOSSetSRID_r(geoshandle, geosGeometry, geomWKB->srid);
      95             : 
      96             :         return geosGeometry;
      97             : }
      98             : 
      99             : const char *
     100         178 : geom_type2str(int t, int flag)
     101             : {
     102         178 :         if (flag == 0) {
     103         125 :                 switch (t) {
     104             :                 //case wkbGeometry:
     105             :                 //      return "GEOMETRY";
     106          23 :                 case wkbPoint_mdb:
     107          23 :                         return "POINT";
     108          21 :                 case wkbLineString_mdb:
     109          21 :                         return "LINESTRING";
     110           0 :                 case wkbLinearRing_mdb:
     111           0 :                         return "LINEARRING";
     112          15 :                 case wkbPolygon_mdb:
     113          15 :                         return "POLYGON";
     114          15 :                 case wkbMultiPoint_mdb:
     115          15 :                         return "MULTIPOINT";
     116          22 :                 case wkbMultiLineString_mdb:
     117          22 :                         return "MULTILINESTRING";
     118          19 :                 case wkbMultiPolygon_mdb:
     119          19 :                         return "MULTIPOLYGON";
     120          10 :                 case wkbGeometryCollection_mdb:
     121          10 :                         return "GEOMETRYCOLLECTION";
     122             :                 }
     123          53 :         } else if (flag == 1) {
     124          53 :                 switch (t) {
     125             :                 //case wkbGeometry:
     126             :                 //      return "ST_Geometry";
     127           5 :                 case wkbPoint_mdb:
     128           5 :                         return "ST_Point";
     129          11 :                 case wkbLineString_mdb:
     130          11 :                         return "ST_LineString";
     131           0 :                 case wkbLinearRing_mdb:
     132           0 :                         return "ST_LinearRing";
     133           6 :                 case wkbPolygon_mdb:
     134           6 :                         return "ST_Polygon";
     135           5 :                 case wkbMultiPoint_mdb:
     136           5 :                         return "ST_MultiPoint";
     137          11 :                 case wkbMultiLineString_mdb:
     138          11 :                         return "ST_MultiLinestring";
     139           7 :                 case wkbMultiPolygon_mdb:
     140           7 :                         return "ST_MultiPolygon";
     141           8 :                 case wkbGeometryCollection_mdb:
     142           8 :                         return "ST_GeometryCollection";
     143             :                 }
     144             :         }
     145             :         return "UNKNOWN";
     146             : }

Generated by: LCOV version 1.14