132 #include <postgres.h>
134 #include "utils/guc.h"
135 #include "utils/memutils.h"
137 #include "../../postgis_config.h"
138 #include "lwgeom_pg.h"
144 # define __attribute__ (x)
158 #define RT_MSG_MAXLEN 256
185 result = repalloc(mem, size);
211 ereport(ERROR, (errmsg_internal(
"%s", errmsg)));
225 ereport(NOTICE, (errmsg_internal(
"%s", msg)));
239 ereport(DEBUG1, (errmsg_internal(
"%s", msg)));
272 CPLSetConfigOption(
"GDAL_DATA", newpath);
283 char **enabled_drivers_array = NULL;
284 uint32_t enabled_drivers_count = 0;
285 bool *enabled_drivers_found = NULL;
286 char *gdal_skip = NULL;
295 if (enabled_drivers == NULL)
298 elog(DEBUG4,
"Enabling GDAL drivers: %s", enabled_drivers);
302 GDALDestroyDriverManager();
303 CPLSetConfigOption(
"GDAL_SKIP", NULL);
308 enabled_drivers_array =
rtpg_strsplit(enabled_drivers,
" ", &enabled_drivers_count);
309 enabled_drivers_found = palloc(
sizeof(
bool) * enabled_drivers_count);
310 memset(enabled_drivers_found,
FALSE,
sizeof(
bool) * enabled_drivers_count);
316 for (i = 0; i < enabled_drivers_count; i++) {
318 enabled_drivers_found[i] =
TRUE;
324 for (i = 0; i < enabled_drivers_count; i++) {
326 enabled_drivers_found[i] =
TRUE;
331 else if (strstr(enabled_drivers,
GDAL_VSICURL) != NULL) {
332 for (i = 0; i < enabled_drivers_count; i++) {
333 if (strstr(enabled_drivers_array[i],
GDAL_VSICURL) != NULL) {
334 enabled_drivers_found[i] =
TRUE;
342 uint32_t drv_count = 0;
348 for (i = 0; i < drv_count; i++) {
353 if (strstr(enabled_drivers, drv_set[i].short_name) != NULL) {
355 for (j = 0; j < enabled_drivers_count; j++) {
357 if (strcmp(enabled_drivers_array[j], drv_set[i].short_name) == 0) {
358 enabled_drivers_found[j] =
TRUE;
370 if (gdal_skip == NULL) {
371 gdal_skip = palloc(
sizeof(
char) * (strlen(drv_set[i].short_name) + 1));
375 gdal_skip = repalloc(
378 strlen(gdal_skip) + 1 + strlen(drv_set[i].short_name) + 1
381 strcat(gdal_skip,
" ");
383 strcat(gdal_skip, drv_set[i].short_name);
386 for (i = 0; i < drv_count; i++) {
387 pfree(drv_set[i].short_name);
388 pfree(drv_set[i].long_name);
389 pfree(drv_set[i].create_options);
391 if (drv_count) pfree(drv_set);
395 for (i = 0; i < enabled_drivers_count; i++) {
396 if (enabled_drivers_found[i])
400 elog(WARNING,
"%s set. Ignoring GDAL driver: %s",
GDAL_DISABLE_ALL, enabled_drivers_array[i]);
402 elog(WARNING,
"%s set. Ignoring GDAL driver: %s",
GDAL_ENABLE_ALL, enabled_drivers_array[i]);
404 elog(WARNING,
"Unknown GDAL driver: %s", enabled_drivers_array[i]);
412 GDALDestroyDriverManager();
416 CPLSetConfigOption(
"GDAL_SKIP", gdal_skip);
417 if (gdal_skip != NULL) pfree(gdal_skip);
422 pfree(enabled_drivers_array);
423 pfree(enabled_drivers_found);
437 bool boot_postgis_enable_outdb_rasters =
false;
438 MemoryContext old_context;
444 old_context = MemoryContextSwitchTo(TopMemoryContext);
463 "boot_postgis_gdal_enabled_drivers = %s",
477 elog(ERROR,
"_PG_init: Cannot process environmental variable: POSTGIS_ENABLE_OUTDB_RASTERS");
481 if (strcmp(env,
"1") == 0)
482 boot_postgis_enable_outdb_rasters =
true;
489 "boot_postgis_enable_outdb_rasters = %s",
490 boot_postgis_enable_outdb_rasters ?
"TRUE" :
"FALSE"
494 pg_install_lwgeom_handlers();
500 if ( postgis_guc_find_option(
"postgis.gdal_datapath") )
505 elog(WARNING,
"'%s' is already set and cannot be changed until you reconnect",
"postgis.gdal_datapath");
509 DefineCustomStringVariable(
510 "postgis.gdal_datapath",
511 "Path to GDAL data files.",
512 "Physical path to directory containing GDAL data files (sets the GDAL_DATA config option).",
523 if ( postgis_guc_find_option(
"postgis.gdal_enabled_drivers") )
528 elog(WARNING,
"'%s' is already set and cannot be changed until you reconnect",
"postgis.gdal_enabled_drivers");
532 DefineCustomStringVariable(
533 "postgis.gdal_enabled_drivers",
534 "Enabled GDAL drivers.",
535 "List of enabled GDAL drivers by short name. To enable/disable all drivers, use 'ENABLE_ALL' or 'DISABLE_ALL' (sets the GDAL_SKIP config option).",
546 if ( postgis_guc_find_option(
"postgis.enable_outdb_rasters") )
551 elog(WARNING,
"'%s' is already set and cannot be changed until you reconnect",
"postgis.enable_outdb_rasters");
555 DefineCustomBoolVariable(
556 "postgis.enable_outdb_rasters",
557 "Enable Out-DB raster bands",
558 "If true, rasters can access data located outside the database",
560 boot_postgis_enable_outdb_rasters,
570 MemoryContextSwitchTo(old_context);
577 MemoryContext old_context;
579 old_context = MemoryContextSwitchTo(TopMemoryContext);
591 MemoryContextSwitchTo(old_context);
char result[OUT_DOUBLE_BUFFER_SIZE]
int rt_util_gdal_register_all(int force_register_all)
rt_gdaldriver rt_raster_gdal_drivers(uint32_t *drv_count, uint8_t cancc)
Returns a set of available GDAL drivers.
void rt_set_handlers(rt_allocator allocator, rt_reallocator reallocator, rt_deallocator deallocator, rt_message_handler error_handler, rt_message_handler info_handler, rt_message_handler warning_handler)
This function is called when the PostgreSQL backend is taking care of the memory and we want to use p...
char * rtpg_trim(const char *input)
char ** rtpg_strsplit(const char *str, const char *delimiter, uint32_t *n)
static char * env_postgis_enable_outdb_rasters
static void * rt_pg_alloc(size_t size)
static void rtpg_assignHookGDALDataPath(const char *newpath, void *extra)
static void rt_pg_error(const char *fmt, va_list ap) __attribute__((format(printf
bool enable_outdb_rasters
static void rt_pg_notice(const char *fmt, va_list ap) __attribute__((format(printf
static char * env_postgis_gdal_enabled_drivers
static char * boot_postgis_gdal_enabled_drivers
static void rtpg_assignHookGDALEnabledDrivers(const char *enabled_drivers, void *extra)
static void * rt_pg_realloc(void *mem, size_t size)
static void rt_pg_free(void *ptr)
char * gdal_enabled_drivers
static void rtpg_assignHookEnableOutDBRasters(bool enable, void *extra)
static void rt_pg_debug(const char *fmt, va_list ap) __attribute__((format(printf
static char * gdal_datapath
#define POSTGIS_RT_DEBUG(level, msg)
#define POSTGIS_RT_DEBUGF(level, msg,...)