]> granicus.if.org Git - postgis/commitdiff
add two columns for Read/Write flags for ST_GDALDrivers()
authorBborie Park <dustymugs at gmail.com>
Thu, 28 Dec 2017 16:43:15 +0000 (16:43 +0000)
committerBborie Park <dustymugs at gmail.com>
Thu, 28 Dec 2017 16:43:15 +0000 (16:43 +0000)
git-svn-id: http://svn.osgeo.org/postgis/trunk@16193 b70326c6-7e19-0410-871a-916f4a2858ee

raster/rt_core/librtcore.h
raster/rt_core/rt_raster.c
raster/rt_pg/rtpg_gdal.c
raster/rt_pg/rtpostgis.sql.in
raster/test/cunit/cu_gdal.c

index e27d0ce508fa5fade3678055824bcaf9de1d0c3d..1a08d1de7ee48b2f9fc2cbaef78c9cf7387e6597 100644 (file)
@@ -2424,6 +2424,8 @@ struct rt_gdaldriver_t {
        char *short_name;
        char *long_name;
        char *create_options;
+       uint8_t can_read;
+       uint8_t can_write;
 };
 
 /* raster colormap entry */
index 7ea265284af07ee08ab3a9d306fc73653258e5f5..3ce6821d523cf61f339385faf0d7d96a4a559bab 100644 (file)
@@ -1603,6 +1603,9 @@ rt_raster_to_gdal(
        rt_raster raster, const char *srs,
        char *format, char **options, uint64_t *gdalsize
 ) {
+       const char *cc;
+       const char *vio;
+
        GDALDriverH src_drv = NULL;
        int destroy_src_drv = 0;
        GDALDatasetH src_ds = NULL;
@@ -1643,6 +1646,18 @@ rt_raster_to_gdal(
        }
        RASTER_DEBUG(3, "Output driver loaded");
 
+       /* CreateCopy support */
+       cc = GDALGetMetadataItem(rtn_drv, GDAL_DCAP_CREATECOPY, NULL);
+       /* VirtualIO support */
+       vio = GDALGetMetadataItem(rtn_drv, GDAL_DCAP_VIRTUALIO, NULL);
+
+       if (cc == NULL || vio == NULL) {
+               rterror("rt_raster_to_gdal: Output GDAL driver does not support CreateCopy and/or VirtualIO");
+               GDALClose(src_ds);
+               if (destroy_src_drv) GDALDestroyDriver(src_drv);
+               return 0;
+       }
+
        /* convert GDAL MEM raster to output format */
        RASTER_DEBUG(3, "Copying GDAL MEM raster to memory file in output format");
        rtn_ds = GDALCreateCopy(
@@ -1696,14 +1711,16 @@ rt_raster_to_gdal(
  * Returns a set of available GDAL drivers
  *
  * @param drv_count : number of GDAL drivers available
- * @param cancc : if non-zero, filter drivers to only those
+ * @param can_write : if non-zero, filter drivers to only those
  *   with support for CreateCopy and VirtualIO
  *
  * @return set of "gdaldriver" values of available GDAL drivers
  */
 rt_gdaldriver
-rt_raster_gdal_drivers(uint32_t *drv_count, uint8_t cancc) {
-       const char *state;
+rt_raster_gdal_drivers(uint32_t *drv_count, uint8_t can_write) {
+       const char *is_raster;
+       const char *cc;
+       const char *vio;
        const char *txt;
        int txt_len;
        GDALDriverH *drv = NULL;
@@ -1730,19 +1747,27 @@ rt_raster_gdal_drivers(uint32_t *drv_count, uint8_t cancc) {
 #ifdef GDAL_DCAP_RASTER
                /* Starting with GDAL 2.0, vector drivers can also be returned */
                /* Only keep raster drivers */
-               state = GDALGetMetadataItem(drv, GDAL_DCAP_RASTER, NULL);
-               if (state == NULL || !EQUAL(state, "YES"))
+               is_raster = GDALGetMetadataItem(drv, GDAL_DCAP_RASTER, NULL);
+               if (is_raster == NULL || !EQUAL(is_raster, "YES"))
                        continue;
 #endif
 
-               if (cancc) {
-                       /* CreateCopy support */
-                       state = GDALGetMetadataItem(drv, GDAL_DCAP_CREATECOPY, NULL);
-                       if (state == NULL) continue;
+               /* CreateCopy support */
+               cc = GDALGetMetadataItem(drv, GDAL_DCAP_CREATECOPY, NULL);
+
+               /* VirtualIO support */
+               vio = GDALGetMetadataItem(drv, GDAL_DCAP_VIRTUALIO, NULL);
 
-                       /* VirtualIO support */
-                       state = GDALGetMetadataItem(drv, GDAL_DCAP_VIRTUALIO, NULL);
-                       if (state == NULL) continue;
+               if (can_write && (cc == NULL || vio == NULL))
+                       continue;
+
+               /* we can always read what GDAL can load */
+               rtn[j].can_read = 1;
+               /* we require CreateCopy and VirtualIO support to write to GDAL */
+               rtn[j].can_write = (cc != NULL && vio != NULL);
+
+               if (rtn[j].can_write) {
+                       RASTER_DEBUGF(3, "driver %s (%d) supports CreateCopy() and VirtualIO()", txt, i);
                }
 
                /* index of driver */
@@ -1752,10 +1777,6 @@ rt_raster_gdal_drivers(uint32_t *drv_count, uint8_t cancc) {
                txt = GDALGetDriverShortName(drv);
                txt_len = strlen(txt);
 
-               if (cancc) {
-                       RASTER_DEBUGF(3, "driver %s (%d) supports CreateCopy() and VirtualIO()", txt, i);
-               }
-
                txt_len = (txt_len + 1) * sizeof(char);
                rtn[j].short_name = (char *) rtalloc(txt_len);
                memcpy(rtn[j].short_name, txt, txt_len);
index bcf8f7a99445d2433557064e4126696f7f7d1bc1..aaaa80a03360c8b71fe98480d699887963b648ab 100644 (file)
@@ -362,7 +362,7 @@ Datum RASTER_getGDALDrivers(PG_FUNCTION_ARGS)
                /* switch to memory context appropriate for multiple function calls */
                oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
 
-               drv_set = rt_raster_gdal_drivers(&drv_count, 1);
+               drv_set = rt_raster_gdal_drivers(&drv_count, 0);
                if (NULL == drv_set || !drv_count) {
                        elog(NOTICE, "No GDAL drivers found");
                        MemoryContextSwitchTo(oldcontext);
@@ -403,7 +403,7 @@ Datum RASTER_getGDALDrivers(PG_FUNCTION_ARGS)
 
        /* do when there is more left to send */
        if (call_cntr < max_calls) {
-               int values_length = 4;
+               int values_length = 6;
                Datum values[values_length];
                bool nulls[values_length];
                HeapTuple tuple;
@@ -416,11 +416,15 @@ Datum RASTER_getGDALDrivers(PG_FUNCTION_ARGS)
                values[0] = Int32GetDatum(drv_set2[call_cntr].idx);
                values[1] = CStringGetTextDatum(drv_set2[call_cntr].short_name);
                values[2] = CStringGetTextDatum(drv_set2[call_cntr].long_name);
-               values[3] = CStringGetTextDatum(drv_set2[call_cntr].create_options);
+               values[3] = BoolGetDatum(drv_set2[call_cntr].can_read);
+               values[4] = BoolGetDatum(drv_set2[call_cntr].can_write);
+               values[5] = CStringGetTextDatum(drv_set2[call_cntr].create_options);
 
                POSTGIS_RT_DEBUGF(4, "Result %d, Index %d", call_cntr, drv_set2[call_cntr].idx);
                POSTGIS_RT_DEBUGF(4, "Result %d, Short Name %s", call_cntr, drv_set2[call_cntr].short_name);
                POSTGIS_RT_DEBUGF(4, "Result %d, Full Name %s", call_cntr, drv_set2[call_cntr].long_name);
+               POSTGIS_RT_DEBUGF(4, "Result %d, Can Read %s", call_cntr, drv_set2[call_cntr].can_read);
+               POSTGIS_RT_DEBUGF(4, "Result %d, Can Write %s", call_cntr, drv_set2[call_cntr].can_write);
                POSTGIS_RT_DEBUGF(5, "Result %d, Create Options %s", call_cntr, drv_set2[call_cntr].create_options);
 
                /* build a tuple */
index f2304852c23fe7a2447ae5a45fe191a34d6ec092..6ad188d95af197fba1b91c47109a65953daa4131 100644 (file)
@@ -1932,7 +1932,14 @@ CREATE OR REPLACE FUNCTION st_fromgdalraster(gdaldata bytea, srid integer DEFAUL
 -- ST_AsGDALRaster and supporting functions
 -----------------------------------------------------------------------
 -- returns set of available and usable GDAL drivers
-CREATE OR REPLACE FUNCTION st_gdaldrivers(OUT idx int, OUT short_name text, OUT long_name text, OUT create_options text)
+CREATE OR REPLACE FUNCTION st_gdaldrivers(
+       OUT idx int,
+       OUT short_name text,
+       OUT long_name text,
+       OUT can_read boolean,
+       OUT can_write boolean,
+       OUT create_options text
+)
   RETURNS SETOF record
        AS 'MODULE_PATHNAME', 'RASTER_getGDALDrivers'
        LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
index c4ebbe227599c7c0aa32686cb472abc6736dfcf2..397939dccdf648b2c72211c9b9c3c2c7494ca6e5 100644 (file)
@@ -471,6 +471,9 @@ static void test_raster_to_gdal() {
 
        if (gdal) CPLFree(gdal);
 
+       gdal = rt_raster_to_gdal(raster, srs, "PCIDSK", NULL, &gdalSize);
+       CU_ASSERT(gdal == NULL);
+
        cu_free_raster(raster);
 }