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;
}
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(
* 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;
#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 */
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);
/* 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);
/* 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;
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 */