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 46232 : libgeom_tls_init(void *dummy) 40 : { 41 46232 : (void)dummy; 42 46232 : GEOSContextHandle_t ctx = GEOS_init_r (); 43 46231 : GEOSContext_setNoticeHandler_r(ctx, (GEOSMessageHandler) geomerror); 44 46231 : GEOSContext_setErrorHandler_r(ctx, (GEOSMessageHandler) geomerror); 45 46232 : GEOS_setWKBByteOrder_r(ctx, 1); /* NDR (little endian) */ 46 46241 : MT_tls_set(geom_tls_key, ctx); 47 46222 : } 48 : 49 : static void 50 46231 : libgeom_tls_exit(void *dummy) 51 : { 52 46231 : (void)dummy; 53 46231 : GEOSContextHandle_t ctx = MT_tls_get(geom_tls_key); 54 46243 : GEOS_finish_r(ctx); 55 46248 : } 56 : 57 : GEOSContextHandle_t 58 35246 : libgeom_tls(void) 59 : { 60 35246 : 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 7973 : is_wkb_nil(const wkb *w) 77 : { 78 7973 : if (!w || w->len == ~0) 79 77 : return 1; 80 : return 0; 81 : } 82 : 83 : GEOSGeom 84 3575 : wkb2geos(const wkb *geomWKB) 85 : { 86 3575 : GEOSGeom geosGeometry; 87 : 88 3575 : if (is_wkb_nil(geomWKB)) 89 : return NULL; 90 : 91 3582 : geosGeometry = GEOSGeomFromWKB_buf_r(geoshandle, (unsigned char *) geomWKB->data, geomWKB->len); 92 : 93 3607 : if (geosGeometry != NULL) 94 3607 : GEOSSetSRID_r(geoshandle, geosGeometry, geomWKB->srid); 95 : 96 : return geosGeometry; 97 : } 98 : 99 : const char * 100 177 : geom_type2str(int t, int flag) 101 : { 102 177 : 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 52 : } 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 : }