- Added missing variants of ST_TPI(), ST_TRI() and ST_Roughness()
- Added GUC postgis.gdal_enabled_drivers to specify GDAL config
variable GDAL_SKIP
+ - Added GUC postgis.enable_outdb_rasters to enable access to
+ rasters with out-db bands
- #1678, Added GUC postgis.gdal_datapath to specify GDAL config
variable GDAL_DATA
- #2341, New mask parameter for ST_MapAlgebra
\r
<note>\r
<para>\r
- There are two special codes available to enable or disable all GDAL drivers: ENABLE_ALL and DISABLE_ALL. The codes are case-sensitive.\r
+ There are three special codes available for <varname>postgis.gdal_enabled_drivers</varname>. The codes are case-sensitive.\r
+\r
+ <itemizedlist>\r
+ <listitem>\r
+ <para><varname>DISABLE_ALL</varname> disables all GDAL drivers. If present, <varname>DISABLE_ALL</varname> overrides all other values in <varname>postgis.gdal_enabled_drivers</varname>.</para>\r
+ </listitem>\r
+ <listitem>\r
+ <para><varname>ENABLE_ALL</varname> enables all GDAL drivers.</para>\r
+ </listitem>\r
+ <listitem>\r
+ <para><varname>VSICURL</varname> enables GDAL's <varname>/vsicurl/</varname> virtual file system.</para>\r
+ </listitem>\r
+ </itemizedlist>\r
</para>\r
<para>\r
When <varname>postgis.gdal_enabled_drivers</varname> is set to DISABLE_ALL, attempts to use out-db rasters, ST_FromGDALRaster(), ST_AsGDALRaster(), ST_AsTIFF(), ST_AsJPEG() and ST_AsPNG() will result in error messages.\r
<xref linkend="RT_ST_AsGDALRaster" />, \r
<xref linkend="RT_ST_AsTIFF" />, \r
<xref linkend="RT_ST_AsPNG" />, \r
- <xref linkend="RT_ST_AsJPEG" />\r
+ <xref linkend="RT_ST_AsJPEG" />, \r
+ <xref linkend="postgis_enable_outdb_rasters" />\r
</para>\r
</refsection>\r
</refentry>\r
\r
+ <refentry id="postgis_enable_outdb_rasters">\r
+ <refnamediv>\r
+ <refname>postgis.enable_outdb_rasters</refname>\r
+ <refpurpose>\r
+ A boolean configuration option to enable access to out-db raster bands.\r
+ </refpurpose>\r
+ </refnamediv>\r
+\r
+ <refsection>\r
+ <title>Description</title>\r
+ <para>\r
+ A boolean configuration option to enable access to out-db raster bands.\r
+ </para>\r
+\r
+ <note>\r
+ <para>\r
+ This option can be set in PostgreSQL's configuration file: postgresql.conf. It can also be set by connection or transaction.\r
+ </para>\r
+ </note>\r
+\r
+ <note>\r
+ <para>\r
+ Even if <varname>postgis.enable_outdb_rasters</varname> is True, the GUC <varname>postgis.enable_outdb_rasters</varname> determines the accessible raster formats.\r
+ </para>\r
+ </note>\r
+\r
+ <note>\r
+ <para>\r
+ In the standard PostGIS installation, <varname>postgis.enable_outdb_rasters</varname> is set to False.\r
+ </para>\r
+ </note>\r
+\r
+ <para>Availability: 2.2.0</para>\r
+\r
+ </refsection>\r
+\r
+ <refsection>\r
+ <title>Examples</title>\r
+ <para>Set and reset <varname>postgis.enable_outdb_rasters</varname></para>\r
+\r
+ <programlisting>\r
+SET postgis.enable_outdb_rasters TO True;\r
+SET postgis.enable_outdb_rasters = default;\r
+SET postgis.enable_outdb_rasters = True;\r
+SET postgis.enable_outdb_rasters = False;\r
+ </programlisting>\r
+ </refsection>\r
+\r
+ <refsection>\r
+ <title>See Also</title>\r
+ <para>\r
+ <xref linkend="postgis_gdal_enabled_drivers" />\r
+ </para>\r
+ </refsection>\r
+ </refentry>\r
</sect1>\r
#define GDAL_ENABLE_ALL "ENABLE_ALL"
#define GDAL_DISABLE_ALL "DISABLE_ALL"
+#define GDAL_VSICURL "VSICURL"
/*
* Set of functions to clamp double to int of different size
return band->data.mem;
}
+/* variable for PostgreSQL GUC: postgis.enable_outdb_rasters */
+char enable_outdb_rasters = 1;
+
/**
* Load offline band's data. Loaded data is internally owned
* and should not be released by the caller. Data will be
return ES_ERROR;
}
+ /* offline_data is disabled */
+ if (!enable_outdb_rasters) {
+ rterror("rt_band_load_offline_data: Access to offline bands disabled");
+ return ES_ERROR;
+ }
+
rt_util_gdal_register_all(0);
/*
hdsSrc = rt_util_gdal_open(band->data.offline.path, GA_ReadOnly, 1);
return 1;
}
-char *gdal_enabled_drivers = NULL;
-
/*
register all GDAL drivers
*/
return 0;
}
+/* variable for PostgreSQL GUC: postgis.gdal_enabled_drivers */
+char *gdal_enabled_drivers = NULL;
+
/*
wrapper for GDALOpen and GDALOpenShared
*/
rt_util_gdal_open(const char *fn, GDALAccess fn_access, int shared) {
assert(NULL != fn);
- if (
- gdal_enabled_drivers != NULL &&
- strstr(gdal_enabled_drivers, GDAL_DISABLE_ALL) != NULL
- ) {
- rterror("rt_util_gdal_open: Cannot open file. All GDAL drivers disabled");
- return NULL;
+ if (gdal_enabled_drivers != NULL) {
+ if (strstr(gdal_enabled_drivers, GDAL_DISABLE_ALL) != NULL) {
+ rterror("rt_util_gdal_open: Cannot open file. All GDAL drivers disabled");
+ return NULL;
+ }
+ else if (strstr(gdal_enabled_drivers, GDAL_ENABLE_ALL) != NULL) {
+ /* do nothing */
+ }
+ else if (
+ (strstr(fn, "/vsicurl") != NULL) &&
+ (strstr(gdal_enabled_drivers, GDAL_VSICURL) == NULL)
+ ) {
+ rterror("rt_util_gdal_open: Cannot open VSICURL file. VSICURL disabled");
+ return NULL;
+ }
}
if (shared)
static char *gdal_datapath = NULL;
extern char *gdal_enabled_drivers;
+extern char enable_outdb_rasters;
/* postgis.gdal_datapath */
static void
POSTGIS_RT_DEBUGF(4, "GDAL_SKIP = %s", CPLGetConfigOption("GDAL_SKIP", NULL));
}
+/* postgis.eanble_outdb_rasters */
+static void
+rtpg_assignHookEnableOutDBRasters(bool enable, void *extra) {
+ /* do nothing for now */
+}
+
/* Module load callback */
void
_PG_init(void) {
NULL /* GucShowHook show_hook */
);
- /*
- * GucContext is set to PGC_BACKEND. As per PostgreSQL's guc.h...
- *
- * BACKEND options can only be set at postmaster startup, from the
- * configuration file, or by client request in the connection startup
- * packet (e.g., from libpq's PGOPTIONS variable). Furthermore, an
- * already-started backend will ignore changes to such an option in the
- * configuration file. The idea is that these options are fixed for a
- * given backend once it's started, but they can vary across backends.
- */
DefineCustomStringVariable(
"postgis.gdal_enabled_drivers", /* name */
"Enabled GDAL drivers.", /* short_desc */
&gdal_enabled_drivers, /* valueAddr */
GDAL_DISABLE_ALL, /* bootValue */
PGC_SUSET, /* GucContext context */
- GUC_LIST_INPUT, /* int flags */
+ 0, /* int flags */
#if POSTGIS_PGSQL_VERSION >= 91
NULL, /* GucStringCheckHook check_hook */
#endif
rtpg_assignHookGDALEnabledDrivers, /* GucStringAssignHook assign_hook */
NULL /* GucShowHook show_hook */
);
+
+ DefineCustomBoolVariable(
+ "postgis.enable_outdb_rasters", /* name */
+ "Enable Out-DB raster bands", /* short_desc */
+ "If true, rasters can access data located outside the database", /* long_desc */
+ &enable_outdb_rasters, /* valueAddr */
+ false, /* bootValue */
+ PGC_SUSET, /* GucContext context */
+ 0, /* int flags */
+#if POSTGIS_PGSQL_VERSION >= 91
+ NULL, /* GucStringCheckHook check_hook */
+#endif
+ rtpg_assignHookEnableOutDBRasters, /* GucBoolAssignHook assign_hook */
+ NULL /* GucShowHook show_hook */
+ );
}
/* ---------------------------------------------------------------- */
CU_ASSERT_DOUBLE_EQUAL(rgb[2], 0.4, DBL_EPSILON);
}
+static void test_util_gdal_open() {
+ extern char *gdal_enabled_drivers;
+
+ GDALDatasetH ds;
+
+ char *disable_all = GDAL_DISABLE_ALL;
+ char *enabled = "GTiff JPEG PNG";
+ char *enabled_vsi = "GTiff JPEG PNG VSICURL";
+
+ rt_util_gdal_register_all(1);
+
+ /* all drivers disabled */
+ gdal_enabled_drivers = disable_all;
+ ds = rt_util_gdal_open("/tmp/foo", GA_ReadOnly, 0);
+ CU_ASSERT(ds == NULL);
+
+ /* can't test VSICURL if HTTP driver not found */
+ if (!rt_util_gdal_driver_registered("HTTP"))
+ return;
+
+ /* enabled drivers, no VSICURL */
+ gdal_enabled_drivers = enabled;
+ ds = rt_util_gdal_open("/vsicurl/http://download.osgeo.org/gdal/data/gtiff/small_world.tif", GA_ReadOnly, 0);
+ CU_ASSERT(ds == NULL);
+
+ /* enabled drivers with VSICURL */
+ gdal_enabled_drivers = enabled_vsi;
+ ds = rt_util_gdal_open("/vsicurl/http://download.osgeo.org/gdal/data/gtiff/small_world.tif", GA_ReadOnly, 0);
+ CU_ASSERT(ds != NULL);
+ GDALClose(ds);
+}
+
/* register tests */
CU_TestInfo misc_tests[] = {
PG_TEST(test_rgb_to_hsv),
PG_TEST(test_hsv_to_rgb),
+ PG_TEST(test_util_gdal_open),
CU_TEST_INFO_NULL
};
CU_SuiteInfo misc_suite = {"misc", NULL, NULL, misc_tests};
SELECT postgis_raster_lib_version()
)
SELECT NULL FROM foo;
+SET postgis.enable_outdb_rasters = true;
SET postgis.gdal_enabled_drivers = 'GTiff';
DELETE FROM loadedrast WHERE filename != 'testraster.tif';
SELECT srid, scale_x::numeric(16, 10), scale_y::numeric(16, 10), blocksize_x, blocksize_y, same_alignment, regular_blocking, num_bands, pixel_types, nodata_values::numeric(16,10)[], out_db, ST_AsEWKT(extent) FROM raster_columns WHERE r_table_name = 'loadedrast' AND r_raster_column = 'rast';
SELECT postgis_raster_lib_version()
)
SELECT NULL FROM foo;
+SET postgis.enable_outdb_rasters = True;
SET postgis.gdal_enabled_drivers = 'GTiff PNG JPEG';
DO $$
--- Test out-db as in-db
-----------------------------------------------------------------------
SET postgis.gdal_enabled_drivers = 'GTiff';
+SET postgis.enable_outdb_rasters = TRUE;
WITH foo AS (
SELECT
rid,