SPATIALITE_DECLARE void spatialite_init (int verbose) { /* used when SQLite initializes as an ordinary lib OBSOLETE - strongly discouraged !!!!! always using spatialite_init_ex() as a replacement is warmly reccomended */ spatialite_initialize (); #ifndef OMIT_GEOS /* initializing GEOS */ initGEOS (geos_warning, geos_error); #endif /* end GEOS */ #ifdef POSTGIS_2_1 /* initializing liblwgeom from PostGIS 2.1.x (or later) */ splite_lwgeom_init (); #endif /* end POSTGIS_2_1 */ sqlite3_auto_extension ((void (*)(void)) init_spatialite_extension); spatialite_splash_screen (verbose); }
SPATIALITE_DECLARE void * spatialite_alloc_connection () { /* allocating and initializing an empty internal cache */ #ifdef GEOS_REENTRANT /* reentrant (thread-safe) initialization */ return spatialite_alloc_reentrant (); #else /* end GEOS_REENTRANT */ gaiaOutBufferPtr out; int i; struct splite_internal_cache *cache = NULL; struct splite_geos_cache_item *p; struct splite_xmlSchema_cache_item *p_xmlSchema; int pool_index; /* attempting to implicitly initialize the library */ spatialite_initialize (); /* locking the semaphore */ splite_cache_semaphore_lock (); pool_index = find_free_connection (); if (pool_index < 0) goto done; cache = malloc (sizeof (struct splite_internal_cache)); if (cache == NULL) { invalidate (pool_index); goto done; } cache->magic1 = SPATIALITE_CACHE_MAGIC1; cache->magic2 = SPATIALITE_CACHE_MAGIC2; cache->gpkg_mode = 0; cache->gpkg_amphibious_mode = 0; cache->decimal_precision = -1; cache->GEOS_handle = NULL; cache->PROJ_handle = NULL; cache->cutterMessage = NULL; cache->pool_index = pool_index; confirm (pool_index, cache); cache->gaia_geos_error_msg = NULL; cache->gaia_geos_warning_msg = NULL; cache->gaia_geosaux_error_msg = NULL; /* initializing an empty linked list of Topologies */ cache->firstTopology = NULL; cache->lastTopology = NULL; cache->next_topo_savepoint = 0; cache->topo_savepoint_name = NULL; cache->firstNetwork = NULL; cache->lastNetwork = NULL; cache->next_network_savepoint = 0; cache->network_savepoint_name = NULL; /* initializing the XML error buffers */ out = malloc (sizeof (gaiaOutBuffer)); gaiaOutBufferInitialize (out); cache->xmlParsingErrors = out; out = malloc (sizeof (gaiaOutBuffer)); gaiaOutBufferInitialize (out); cache->xmlSchemaValidationErrors = out; out = malloc (sizeof (gaiaOutBuffer)); gaiaOutBufferInitialize (out); cache->xmlXPathErrors = out; /* initializing the GEOS cache */ p = &(cache->cacheItem1); memset (p->gaiaBlob, '\0', 64); p->gaiaBlobSize = 0; p->crc32 = 0; p->geosGeom = NULL; p->preparedGeosGeom = NULL; p = &(cache->cacheItem2); memset (p->gaiaBlob, '\0', 64); p->gaiaBlobSize = 0; p->crc32 = 0; p->geosGeom = NULL; p->preparedGeosGeom = NULL; for (i = 0; i < MAX_XMLSCHEMA_CACHE; i++) { /* initializing the XmlSchema cache */ p_xmlSchema = &(cache->xmlSchemaCache[i]); p_xmlSchema->timestamp = 0; p_xmlSchema->schemaURI = NULL; p_xmlSchema->schemaDoc = NULL; p_xmlSchema->parserCtxt = NULL; p_xmlSchema->schema = NULL; } #include "cache_aux_3.h" /* initializing GEOS and PROJ.4 handles */ #ifndef OMIT_GEOS /* initializing GEOS */ cache->GEOS_handle = initGEOS_r (cache->geos_warning, cache->geos_error); #endif /* end GEOS */ #ifndef OMIT_PROJ /* initializing the PROJ.4 context */ cache->PROJ_handle = pj_ctx_alloc (); #endif /* end PROJ.4 */ done: /* unlocking the semaphore */ splite_cache_semaphore_unlock (); return cache; #endif }
/* definitely releasing the slot */ struct splite_connection *p = &(splite_connection_pool[i]); p->conn_ptr = NULL; } #endif /* END obsolete partially thread-safe mode */ #ifdef GEOS_REENTRANT /* reentrant (thread-safe) initialization */ static void * spatialite_alloc_reentrant () { /* * allocating and initializing an empty internal cache * fully reentrant (thread-safe) version requiring GEOS >= 3.5.0 */ struct splite_internal_cache *cache = NULL; gaiaOutBufferPtr out; int i; struct splite_geos_cache_item *p; struct splite_xmlSchema_cache_item *p_xmlSchema; /* attempting to implicitly initialize the library */ spatialite_initialize (); cache = malloc (sizeof (struct splite_internal_cache)); if (cache == NULL) goto done; cache->magic1 = SPATIALITE_CACHE_MAGIC1; cache->magic2 = SPATIALITE_CACHE_MAGIC2; cache->gpkg_mode = 0; cache->gpkg_amphibious_mode = 0; cache->decimal_precision = -1; cache->GEOS_handle = NULL; cache->PROJ_handle = NULL; cache->cutterMessage = NULL; cache->pool_index = -1; cache->gaia_geos_error_msg = NULL; cache->gaia_geos_warning_msg = NULL; cache->gaia_geosaux_error_msg = NULL; /* initializing an empty linked list of Topologies */ cache->firstTopology = NULL; cache->lastTopology = NULL; cache->next_topo_savepoint = 0; cache->topo_savepoint_name = NULL; cache->firstNetwork = NULL; cache->lastNetwork = NULL; cache->next_network_savepoint = 0; cache->network_savepoint_name = NULL; /* initializing the XML error buffers */ out = malloc (sizeof (gaiaOutBuffer)); gaiaOutBufferInitialize (out); cache->xmlParsingErrors = out; out = malloc (sizeof (gaiaOutBuffer)); gaiaOutBufferInitialize (out); cache->xmlSchemaValidationErrors = out; out = malloc (sizeof (gaiaOutBuffer)); gaiaOutBufferInitialize (out); cache->xmlXPathErrors = out; /* initializing the GEOS cache */ p = &(cache->cacheItem1); memset (p->gaiaBlob, '\0', 64); p->gaiaBlobSize = 0; p->crc32 = 0; p->geosGeom = NULL; p->preparedGeosGeom = NULL; p = &(cache->cacheItem2); memset (p->gaiaBlob, '\0', 64); p->gaiaBlobSize = 0; p->crc32 = 0; p->geosGeom = NULL; p->preparedGeosGeom = NULL; for (i = 0; i < MAX_XMLSCHEMA_CACHE; i++) { /* initializing the XmlSchema cache */ p_xmlSchema = &(cache->xmlSchemaCache[i]); p_xmlSchema->timestamp = 0; p_xmlSchema->schemaURI = NULL; p_xmlSchema->schemaDoc = NULL; p_xmlSchema->parserCtxt = NULL; p_xmlSchema->schema = NULL; } /* initializing GEOS and PROJ.4 handles */ #ifndef OMIT_GEOS /* initializing GEOS */ cache->GEOS_handle = initGEOS_r (NULL, NULL); GEOSContext_setNoticeMessageHandler_r (cache->GEOS_handle, conn_geos_warning, cache); GEOSContext_setErrorMessageHandler_r (cache->GEOS_handle, conn_geos_error, cache); #endif /* end GEOS */ #ifndef OMIT_PROJ /* initializing the PROJ.4 context */ cache->PROJ_handle = pj_ctx_alloc (); #endif /* end PROJ.4 */ done: return cache; }