static GDALDataset *OGRSQLiteDriverOpen( GDALOpenInfo* poOpenInfo ) { if( OGRSQLiteDriverIdentify(poOpenInfo) == FALSE ) return NULL; /* -------------------------------------------------------------------- */ /* Check VirtualShape:xxx.shp syntax */ /* -------------------------------------------------------------------- */ int nLen = (int) strlen(poOpenInfo->pszFilename); if (EQUALN(poOpenInfo->pszFilename, "VirtualShape:", strlen( "VirtualShape:" )) && nLen > 4 && EQUAL(poOpenInfo->pszFilename + nLen - 4, ".SHP")) { OGRSQLiteDataSource *poDS; poDS = new OGRSQLiteDataSource(); char** papszOptions = CSLAddString(NULL, "SPATIALITE=YES"); int nRet = poDS->Create( ":memory:", papszOptions ); poDS->SetDescription(poOpenInfo->pszFilename); CSLDestroy(papszOptions); if (!nRet) { delete poDS; return NULL; } char* pszSQLiteFilename = CPLStrdup(poOpenInfo->pszFilename + strlen( "VirtualShape:" )); GDALDataset* poSQLiteDS = (GDALDataset*) GDALOpenEx(pszSQLiteFilename, GDAL_OF_VECTOR, NULL, NULL, NULL); if (poSQLiteDS == NULL) { CPLFree(pszSQLiteFilename); delete poDS; return NULL; } delete poSQLiteDS; char* pszLastDot = strrchr(pszSQLiteFilename, '.'); if (pszLastDot) *pszLastDot = '\0'; const char* pszTableName = CPLGetBasename(pszSQLiteFilename); char* pszSQL = CPLStrdup(CPLSPrintf("CREATE VIRTUAL TABLE %s USING VirtualShape(%s, CP1252, -1)", pszTableName, pszSQLiteFilename)); poDS->ExecuteSQL(pszSQL, NULL, NULL); CPLFree(pszSQL); CPLFree(pszSQLiteFilename); poDS->SetUpdate(FALSE); return poDS; } /* -------------------------------------------------------------------- */ /* We think this is really an SQLite database, go ahead and try */ /* and open it. */ /* -------------------------------------------------------------------- */ OGRSQLiteDataSource *poDS; poDS = new OGRSQLiteDataSource(); if( !poDS->Open( poOpenInfo->pszFilename, poOpenInfo->eAccess == GA_Update, poOpenInfo->papszOpenOptions ) ) { delete poDS; return NULL; } else return poDS; }
OGRDataSource *OGRSQLiteDriver::Open( const char * pszFilename, int bUpdate ) { /* -------------------------------------------------------------------- */ /* Check VirtualShape:xxx.shp syntax */ /* -------------------------------------------------------------------- */ int nLen = (int) strlen(pszFilename); if (EQUALN(pszFilename, "VirtualShape:", strlen( "VirtualShape:" )) && nLen > 4 && EQUAL(pszFilename + nLen - 4, ".SHP")) { OGRSQLiteDataSource *poDS; poDS = new OGRSQLiteDataSource(); char** papszOptions = CSLAddString(NULL, "SPATIALITE=YES"); int nRet = poDS->Create( ":memory:", papszOptions ); poDS->SetName(pszFilename); CSLDestroy(papszOptions); if (!nRet) { delete poDS; return NULL; } char* pszShapeFilename = CPLStrdup(pszFilename + strlen( "VirtualShape:" )); OGRDataSource* poShapeDS = OGRSFDriverRegistrar::Open(pszShapeFilename); if (poShapeDS == NULL) { CPLFree(pszShapeFilename); delete poDS; return NULL; } delete poShapeDS; char* pszLastDot = strrchr(pszShapeFilename, '.'); if (pszLastDot) *pszLastDot = '\0'; const char* pszTableName = CPLGetBasename(pszShapeFilename); char* pszSQL = CPLStrdup(CPLSPrintf("CREATE VIRTUAL TABLE %s USING VirtualShape(%s, CP1252, -1)", pszTableName, pszShapeFilename)); poDS->ExecuteSQL(pszSQL, NULL, NULL); CPLFree(pszSQL); CPLFree(pszShapeFilename); return poDS; } /* -------------------------------------------------------------------- */ /* Verify that the target is a real file, and has an */ /* appropriate magic string at the beginning. */ /* -------------------------------------------------------------------- */ if( !EQUAL(pszFilename, ":memory:") ) { char szHeader[16]; #ifdef HAVE_SQLITE_VFS VSILFILE *fpDB; fpDB = VSIFOpenL( pszFilename, "rb" ); if( fpDB == NULL ) return NULL; if( VSIFReadL( szHeader, 1, 16, fpDB ) != 16 ) memset( szHeader, 0, 16 ); VSIFCloseL( fpDB ); #else FILE *fpDB; fpDB = VSIFOpen( pszFilename, "rb" ); if( fpDB == NULL ) return NULL; if( VSIFRead( szHeader, 1, 16, fpDB ) != 16 ) memset( szHeader, 0, 16 ); VSIFClose( fpDB ); #endif if( strncmp( szHeader, "SQLite format 3", 15 ) != 0 ) return NULL; } /* -------------------------------------------------------------------- */ /* We think this is really an SQLite database, go ahead and try */ /* and open it. */ /* -------------------------------------------------------------------- */ OGRSQLiteDataSource *poDS; poDS = new OGRSQLiteDataSource(); if( !poDS->Open( pszFilename, bUpdate ) ) { delete poDS; return NULL; } else return poDS; }