// Test that GDALWarp() detects error in flush cache template<> template<> void object::test<9>() { GDALDriver* poDriver = new GDALDriver(); poDriver->SetDescription("DatasetWithErrorInFlushCache"); poDriver->pfnCreate = DatasetWithErrorInFlushCache::Create; GetGDALDriverManager()->RegisterDriver( poDriver ); const char* args[] = { "-of", "DatasetWithErrorInFlushCache", NULL }; GDALWarpAppOptions* psOptions = GDALWarpAppOptionsNew((char**)args, NULL); GDALDatasetH hSrcDS = GDALOpen("../gcore/data/byte.tif", GA_ReadOnly); CPLErrorReset(); CPLPushErrorHandler(CPLQuietErrorHandler); GDALDatasetH hOutDS = GDALWarp("/", NULL, 1, &hSrcDS, psOptions, NULL); CPLPopErrorHandler(); GDALClose(hSrcDS); GDALWarpAppOptionsFree(psOptions); ensure(hOutDS == NULL); ensure(CPLGetLastErrorType() != CE_None); GetGDALDriverManager()->DeregisterDriver( poDriver ); delete poDriver; }
int main( int argc, char ** argv ) { GDALDatasetH *pahSrcDS = NULL; int nSrcCount = 0; int i; /* Check that we are running against at least GDAL 1.6 */ /* Note to developers : if we use newer API, please change the requirement */ if (atoi(GDALVersionInfo("VERSION_NUM")) < 1600) { fprintf(stderr, "At least, GDAL >= 1.6.0 is required for this version of %s, " "which was compiled against GDAL %s\n", argv[0], GDAL_RELEASE_NAME); GDALExit(1); } EarlySetConfigOptions(argc, argv); /* -------------------------------------------------------------------- */ /* Register standard GDAL drivers, and process generic GDAL */ /* command options. */ /* -------------------------------------------------------------------- */ GDALAllRegister(); argc = GDALGeneralCmdLineProcessor( argc, &argv, 0 ); if( argc < 1 ) GDALExit( -argc ); for( int i = 0; argv != NULL && argv[i] != NULL; i++ ) { if( EQUAL(argv[i], "--utility_version") ) { printf("%s was compiled against GDAL %s and is running against GDAL %s\n", argv[0], GDAL_RELEASE_NAME, GDALVersionInfo("RELEASE_NAME")); CSLDestroy( argv ); return 0; } else if( EQUAL(argv[i],"--help") ) { Usage(NULL); } } /* -------------------------------------------------------------------- */ /* Set optimal setting for best performance with huge input VRT. */ /* The rationale for 450 is that typical Linux process allow */ /* only 1024 file descriptors per process and we need to keep some */ /* spare for shared libraries, etc. so let's go down to 900. */ /* And some datasets may need 2 file descriptors, so divide by 2 */ /* for security. */ /* -------------------------------------------------------------------- */ if( CPLGetConfigOption("GDAL_MAX_DATASET_POOL_SIZE", NULL) == NULL ) { CPLSetConfigOption("GDAL_MAX_DATASET_POOL_SIZE", "450"); } GDALWarpAppOptionsForBinary* psOptionsForBinary = GDALWarpAppOptionsForBinaryNew(); GDALWarpAppOptions *psOptions = GDALWarpAppOptionsNew(argv + 1, psOptionsForBinary); CSLDestroy( argv ); if( psOptions == NULL ) { Usage(NULL); } if( psOptionsForBinary->pszDstFilename == NULL ) { Usage("No target filename specified."); } if ( CSLCount(psOptionsForBinary->papszSrcFiles) == 1 && strcmp(psOptionsForBinary->papszSrcFiles[0], psOptionsForBinary->pszDstFilename) == 0 && psOptionsForBinary->bOverwrite) { CPLError(CE_Failure, CPLE_IllegalArg, "Source and destination datasets must be different.\n"); GDALExit(1); } /* -------------------------------------------------------------------- */ /* Open Source files. */ /* -------------------------------------------------------------------- */ for(i = 0; psOptionsForBinary->papszSrcFiles[i] != NULL; i++) { nSrcCount++; pahSrcDS = (GDALDatasetH *) CPLRealloc(pahSrcDS, sizeof(GDALDatasetH) * nSrcCount); pahSrcDS[nSrcCount-1] = GDALOpenEx( psOptionsForBinary->papszSrcFiles[i], GDAL_OF_RASTER | GDAL_OF_VERBOSE_ERROR, NULL, (const char* const* )psOptionsForBinary->papszOpenOptions, NULL ); if( pahSrcDS[nSrcCount-1] == NULL ) GDALExit(2); } /* -------------------------------------------------------------------- */ /* Does the output dataset already exist? */ /* -------------------------------------------------------------------- */ /* FIXME ? source filename=target filename and -overwrite is definitely */ /* an error. But I can't imagine of a valid case (without -overwrite), */ /* where it would make sense. In doubt, let's keep that dubious possibility... */ int bOutStreaming = FALSE; if( strcmp(psOptionsForBinary->pszDstFilename, "/vsistdout/") == 0 ) { psOptionsForBinary->bQuiet = TRUE; bOutStreaming = TRUE; } #ifdef S_ISFIFO else { VSIStatBufL sStat; if( VSIStatExL(psOptionsForBinary->pszDstFilename, &sStat, VSI_STAT_EXISTS_FLAG | VSI_STAT_NATURE_FLAG) == 0 && S_ISFIFO(sStat.st_mode) ) { bOutStreaming = TRUE; } } #endif GDALDatasetH hDstDS = NULL; if( bOutStreaming ) { GDALWarpAppOptionsSetWarpOption(psOptions, "STREAMABLE_OUTPUT", "YES"); } else { CPLPushErrorHandler( CPLQuietErrorHandler ); hDstDS = GDALOpenEx( psOptionsForBinary->pszDstFilename, GDAL_OF_RASTER | GDAL_OF_VERBOSE_ERROR | GDAL_OF_UPDATE, NULL, psOptionsForBinary->papszDestOpenOptions, NULL ); CPLPopErrorHandler(); } if( hDstDS != NULL && psOptionsForBinary->bOverwrite ) { GDALClose(hDstDS); hDstDS = NULL; } if( hDstDS != NULL && psOptionsForBinary->bCreateOutput ) { CPLError( CE_Failure, CPLE_AppDefined, "Output dataset %s exists,\n" "but some commandline options were provided indicating a new dataset\n" "should be created. Please delete existing dataset and run again.\n", psOptionsForBinary->pszDstFilename ); GDALExit(1); } /* Avoid overwriting an existing destination file that cannot be opened in */ /* update mode with a new GTiff file */ if ( !bOutStreaming && hDstDS == NULL && !psOptionsForBinary->bOverwrite ) { CPLPushErrorHandler( CPLQuietErrorHandler ); hDstDS = GDALOpen( psOptionsForBinary->pszDstFilename, GA_ReadOnly ); CPLPopErrorHandler(); if (hDstDS) { CPLError( CE_Failure, CPLE_AppDefined, "Output dataset %s exists, but cannot be opened in update mode\n", psOptionsForBinary->pszDstFilename ); GDALClose(hDstDS); GDALExit(1); } } if( !(psOptionsForBinary->bQuiet) ) { GDALWarpAppOptionsSetProgress(psOptions, GDALTermProgress, NULL); } if (hDstDS == NULL && !psOptionsForBinary->bQuiet && !psOptionsForBinary->bFormatExplicitlySet) CheckExtensionConsistency(psOptionsForBinary->pszDstFilename, psOptionsForBinary->pszFormat); int bUsageError = FALSE; GDALDatasetH hOutDS = GDALWarp(psOptionsForBinary->pszDstFilename, hDstDS, nSrcCount, pahSrcDS, psOptions, &bUsageError); if( bUsageError ) Usage(); int nRetCode = (hOutDS) ? 0 : 1; GDALWarpAppOptionsFree(psOptions); GDALWarpAppOptionsForBinaryFree(psOptionsForBinary); for(i = 0; i < nSrcCount; i++) { GDALClose(pahSrcDS[i]); } CPLFree(pahSrcDS); GDALClose( hOutDS ? hOutDS : hDstDS ); GDALDumpOpenDatasets( stderr ); GDALDestroyDriverManager(); #ifdef OGR_ENABLED OGRCleanupAll(); #endif return nRetCode; }