add VSICURL keyword for GUC postgis.gdal_enabled_drivers. add GUC posgis.enable_outdb_rasters

git-svn-id: http://svn.osgeo.org/postgis/trunk@12492 b70326c6-7e19-0410-871a-916f4a2858ee
This commit is contained in:
Bborie Park 2014-04-26 14:01:02 +00:00
parent 344943cd2b
commit 7d58fb71bd
10 changed files with 159 additions and 21 deletions

2
NEWS
View file

@ -19,6 +19,8 @@ PostGIS 2.2.0
- Added missing variants of ST_TPI(), ST_TRI() and ST_Roughness() - Added missing variants of ST_TPI(), ST_TRI() and ST_Roughness()
- Added GUC postgis.gdal_enabled_drivers to specify GDAL config - Added GUC postgis.gdal_enabled_drivers to specify GDAL config
variable GDAL_SKIP 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 - #1678, Added GUC postgis.gdal_datapath to specify GDAL config
variable GDAL_DATA variable GDAL_DATA
- #2341, New mask parameter for ST_MapAlgebra - #2341, New mask parameter for ST_MapAlgebra

View file

@ -103,7 +103,19 @@ SET postgis.gdal_datapath = 'C:/Program Files/PostgreSQL/9.3/gdal-data';</progra
<note> <note>
<para> <para>
There are two special codes available to enable or disable all GDAL drivers: ENABLE_ALL and DISABLE_ALL. The codes are case-sensitive. There are three special codes available for <varname>postgis.gdal_enabled_drivers</varname>. The codes are case-sensitive.
<itemizedlist>
<listitem>
<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>
</listitem>
<listitem>
<para><varname>ENABLE_ALL</varname> enables all GDAL drivers.</para>
</listitem>
<listitem>
<para><varname>VSICURL</varname> enables GDAL's <varname>/vsicurl/</varname> virtual file system.</para>
</listitem>
</itemizedlist>
</para> </para>
<para> <para>
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. 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.
@ -153,9 +165,65 @@ SET postgis.gdal_enabled_drivers = 'DISABLE_ALL';
<xref linkend="RT_ST_AsGDALRaster" />, <xref linkend="RT_ST_AsGDALRaster" />,
<xref linkend="RT_ST_AsTIFF" />, <xref linkend="RT_ST_AsTIFF" />,
<xref linkend="RT_ST_AsPNG" />, <xref linkend="RT_ST_AsPNG" />,
<xref linkend="RT_ST_AsJPEG" /> <xref linkend="RT_ST_AsJPEG" />,
<xref linkend="postgis_enable_outdb_rasters" />
</para> </para>
</refsection> </refsection>
</refentry> </refentry>
<refentry id="postgis_enable_outdb_rasters">
<refnamediv>
<refname>postgis.enable_outdb_rasters</refname>
<refpurpose>
A boolean configuration option to enable access to out-db raster bands.
</refpurpose>
</refnamediv>
<refsection>
<title>Description</title>
<para>
A boolean configuration option to enable access to out-db raster bands.
</para>
<note>
<para>
This option can be set in PostgreSQL's configuration file: postgresql.conf. It can also be set by connection or transaction.
</para>
</note>
<note>
<para>
Even if <varname>postgis.enable_outdb_rasters</varname> is True, the GUC <varname>postgis.enable_outdb_rasters</varname> determines the accessible raster formats.
</para>
</note>
<note>
<para>
In the standard PostGIS installation, <varname>postgis.enable_outdb_rasters</varname> is set to False.
</para>
</note>
<para>Availability: 2.2.0</para>
</refsection>
<refsection>
<title>Examples</title>
<para>Set and reset <varname>postgis.enable_outdb_rasters</varname></para>
<programlisting>
SET postgis.enable_outdb_rasters TO True;
SET postgis.enable_outdb_rasters = default;
SET postgis.enable_outdb_rasters = True;
SET postgis.enable_outdb_rasters = False;
</programlisting>
</refsection>
<refsection>
<title>See Also</title>
<para>
<xref linkend="postgis_gdal_enabled_drivers" />
</para>
</refsection>
</refentry>
</sect1> </sect1>

View file

@ -2006,6 +2006,7 @@ extern void rtdealloc(void *mem);
#define GDAL_ENABLE_ALL "ENABLE_ALL" #define GDAL_ENABLE_ALL "ENABLE_ALL"
#define GDAL_DISABLE_ALL "DISABLE_ALL" #define GDAL_DISABLE_ALL "DISABLE_ALL"
#define GDAL_VSICURL "VSICURL"
/* /*
* Set of functions to clamp double to int of different size * Set of functions to clamp double to int of different size

View file

@ -316,6 +316,9 @@ rt_band_get_data(rt_band band) {
return band->data.mem; 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 * Load offline band's data. Loaded data is internally owned
* and should not be released by the caller. Data will be * and should not be released by the caller. Data will be
@ -352,6 +355,12 @@ rt_band_load_offline_data(rt_band band) {
return ES_ERROR; 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); rt_util_gdal_register_all(0);
/* /*
hdsSrc = rt_util_gdal_open(band->data.offline.path, GA_ReadOnly, 1); hdsSrc = rt_util_gdal_open(band->data.offline.path, GA_ReadOnly, 1);

View file

@ -328,8 +328,6 @@ int rt_util_gdal_configured(void) {
return 1; return 1;
} }
char *gdal_enabled_drivers = NULL;
/* /*
register all GDAL drivers register all GDAL drivers
*/ */
@ -372,6 +370,9 @@ rt_util_gdal_driver_registered(const char *drv) {
return 0; return 0;
} }
/* variable for PostgreSQL GUC: postgis.gdal_enabled_drivers */
char *gdal_enabled_drivers = NULL;
/* /*
wrapper for GDALOpen and GDALOpenShared wrapper for GDALOpen and GDALOpenShared
*/ */
@ -379,12 +380,21 @@ GDALDatasetH
rt_util_gdal_open(const char *fn, GDALAccess fn_access, int shared) { rt_util_gdal_open(const char *fn, GDALAccess fn_access, int shared) {
assert(NULL != fn); assert(NULL != fn);
if ( if (gdal_enabled_drivers != NULL) {
gdal_enabled_drivers != NULL && if (strstr(gdal_enabled_drivers, GDAL_DISABLE_ALL) != NULL) {
strstr(gdal_enabled_drivers, GDAL_DISABLE_ALL) != NULL rterror("rt_util_gdal_open: Cannot open file. All GDAL drivers disabled");
) { return 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) if (shared)

View file

@ -154,6 +154,7 @@ void _PG_init(void);
static char *gdal_datapath = NULL; static char *gdal_datapath = NULL;
extern char *gdal_enabled_drivers; extern char *gdal_enabled_drivers;
extern char enable_outdb_rasters;
/* postgis.gdal_datapath */ /* postgis.gdal_datapath */
static void static void
@ -291,6 +292,12 @@ rtpg_assignHookGDALEnabledDrivers(const char *enabled_drivers, void *extra) {
POSTGIS_RT_DEBUGF(4, "GDAL_SKIP = %s", CPLGetConfigOption("GDAL_SKIP", NULL)); 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 */ /* Module load callback */
void void
_PG_init(void) { _PG_init(void) {
@ -317,16 +324,6 @@ _PG_init(void) {
NULL /* GucShowHook show_hook */ 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( DefineCustomStringVariable(
"postgis.gdal_enabled_drivers", /* name */ "postgis.gdal_enabled_drivers", /* name */
"Enabled GDAL drivers.", /* short_desc */ "Enabled GDAL drivers.", /* short_desc */
@ -334,13 +331,28 @@ _PG_init(void) {
&gdal_enabled_drivers, /* valueAddr */ &gdal_enabled_drivers, /* valueAddr */
GDAL_DISABLE_ALL, /* bootValue */ GDAL_DISABLE_ALL, /* bootValue */
PGC_SUSET, /* GucContext context */ PGC_SUSET, /* GucContext context */
GUC_LIST_INPUT, /* int flags */ 0, /* int flags */
#if POSTGIS_PGSQL_VERSION >= 91 #if POSTGIS_PGSQL_VERSION >= 91
NULL, /* GucStringCheckHook check_hook */ NULL, /* GucStringCheckHook check_hook */
#endif #endif
rtpg_assignHookGDALEnabledDrivers, /* GucStringAssignHook assign_hook */ rtpg_assignHookGDALEnabledDrivers, /* GucStringAssignHook assign_hook */
NULL /* GucShowHook show_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 */
);
} }
/* ---------------------------------------------------------------- */ /* ---------------------------------------------------------------- */

View file

@ -108,10 +108,43 @@ static void test_hsv_to_rgb() {
CU_ASSERT_DOUBLE_EQUAL(rgb[2], 0.4, DBL_EPSILON); 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 */ /* register tests */
CU_TestInfo misc_tests[] = { CU_TestInfo misc_tests[] = {
PG_TEST(test_rgb_to_hsv), PG_TEST(test_rgb_to_hsv),
PG_TEST(test_hsv_to_rgb), PG_TEST(test_hsv_to_rgb),
PG_TEST(test_util_gdal_open),
CU_TEST_INFO_NULL CU_TEST_INFO_NULL
}; };
CU_SuiteInfo misc_suite = {"misc", NULL, NULL, misc_tests}; CU_SuiteInfo misc_suite = {"misc", NULL, NULL, misc_tests};

View file

@ -2,6 +2,7 @@ WITH foo AS (
SELECT postgis_raster_lib_version() SELECT postgis_raster_lib_version()
) )
SELECT NULL FROM foo; SELECT NULL FROM foo;
SET postgis.enable_outdb_rasters = true;
SET postgis.gdal_enabled_drivers = 'GTiff'; SET postgis.gdal_enabled_drivers = 'GTiff';
DELETE FROM loadedrast WHERE filename != 'testraster.tif'; 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 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';

View file

@ -2,6 +2,7 @@ WITH foo AS (
SELECT postgis_raster_lib_version() SELECT postgis_raster_lib_version()
) )
SELECT NULL FROM foo; SELECT NULL FROM foo;
SET postgis.enable_outdb_rasters = True;
SET postgis.gdal_enabled_drivers = 'GTiff PNG JPEG'; SET postgis.gdal_enabled_drivers = 'GTiff PNG JPEG';
DO $$ DO $$

View file

@ -183,6 +183,7 @@ DROP TABLE rt_bytea_test;
--- Test out-db as in-db --- Test out-db as in-db
----------------------------------------------------------------------- -----------------------------------------------------------------------
SET postgis.gdal_enabled_drivers = 'GTiff'; SET postgis.gdal_enabled_drivers = 'GTiff';
SET postgis.enable_outdb_rasters = TRUE;
WITH foo AS ( WITH foo AS (
SELECT SELECT
rid, rid,