本文整理汇总了C++中CPLString::c_str方法的典型用法代码示例。如果您正苦于以下问题:C++ CPLString::c_str方法的具体用法?C++ CPLString::c_str怎么用?C++ CPLString::c_str使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类CPLString
的用法示例。
在下文中一共展示了CPLString::c_str方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: OpenFile
/*!
\brief Load data records (&D)
Call VFKReader::OpenFile() before this function.
\param poDataBlock limit to selected data block or NULL for all
\return number of data records or -1 on error
*/
int VFKReaderSQLite::ReadDataRecords(IVFKDataBlock *poDataBlock)
{
int nDataRecords;
int iDataBlock;
const char *pszName;
CPLString osSQL;
IVFKDataBlock *poDataBlockCurrent;
sqlite3_stmt *hStmt;
pszName = NULL;
if (poDataBlock) { /* read records only for selected data block */
/* table name */
pszName = poDataBlock->GetName();
/* check for existing records (re-use already inserted data) */
osSQL.Printf("SELECT num_records FROM %s WHERE "
"table_name = '%s'",
VFK_DB_TABLE, pszName);
hStmt = PrepareStatement(osSQL.c_str());
nDataRecords = -1;
if (ExecuteSQL(hStmt) == OGRERR_NONE) {
nDataRecords = sqlite3_column_int(hStmt, 0);
}
sqlite3_finalize(hStmt);
}
else {
/* read all data blocks */
/* check for existing records (re-use already inserted data) */
osSQL.Printf("SELECT COUNT(*) FROM %s WHERE num_records = -1", VFK_DB_TABLE);
hStmt = PrepareStatement(osSQL.c_str());
if (ExecuteSQL(hStmt) == OGRERR_NONE &&
sqlite3_column_int(hStmt, 0) == 0)
nDataRecords = 0; /* -> read from DB */
else
nDataRecords = -1; /* -> read from VFK file */
sqlite3_finalize(hStmt);
}
if (nDataRecords > -1) { /* read records from DB */
/* read from DB */
long iFID;
int iRowId;
VFKFeatureSQLite *poNewFeature = NULL;
poDataBlockCurrent = NULL;
for (iDataBlock = 0; iDataBlock < GetDataBlockCount(); iDataBlock++) {
poDataBlockCurrent = GetDataBlock(iDataBlock);
if (poDataBlock && poDataBlock != poDataBlockCurrent)
continue;
poDataBlockCurrent->SetFeatureCount(0); /* avoid recursive call */
pszName = poDataBlockCurrent->GetName();
CPLAssert(NULL != pszName);
osSQL.Printf("SELECT %s,_rowid_ FROM %s ",
FID_COLUMN, pszName);
if (EQUAL(pszName, "SBP"))
osSQL += "WHERE PORADOVE_CISLO_BODU = 1 ";
osSQL += "ORDER BY ";
osSQL += FID_COLUMN;
hStmt = PrepareStatement(osSQL.c_str());
nDataRecords = 0;
while (ExecuteSQL(hStmt) == OGRERR_NONE) {
iFID = sqlite3_column_int(hStmt, 0);
iRowId = sqlite3_column_int(hStmt, 1);
poNewFeature = new VFKFeatureSQLite(poDataBlockCurrent, iRowId, iFID);
poDataBlockCurrent->AddFeature(poNewFeature);
nDataRecords++;
}
/* check DB consistency */
osSQL.Printf("SELECT num_features FROM %s WHERE table_name = '%s'",
VFK_DB_TABLE, pszName);
hStmt = PrepareStatement(osSQL.c_str());
if (ExecuteSQL(hStmt) == OGRERR_NONE) {
int nFeatDB;
nFeatDB = sqlite3_column_int(hStmt, 0);
if (nFeatDB > 0 && nFeatDB != poDataBlockCurrent->GetFeatureCount())
CPLError(CE_Failure, CPLE_AppDefined,
"%s: Invalid number of features " CPL_FRMT_GIB " (should be %d)",
pszName, poDataBlockCurrent->GetFeatureCount(), nFeatDB);
}
sqlite3_finalize(hStmt);
//.........这里部分代码省略.........
示例2: if
//.........这里部分代码省略.........
// Set the type
json_object_object_add(poJSONObject, "type", json_object_new_string("arg"));
// Set the datatype
json_object_object_add(poJSONObject, "datatype", json_object_new_string(pszDataType));
const int nXSize = poSrcDS->GetRasterXSize();
const int nYSize = poSrcDS->GetRasterYSize();
// Set the number of rows
json_object_object_add(poJSONObject, "rows", json_object_new_int(nYSize));
// Set the number of columns
json_object_object_add(poJSONObject, "cols", json_object_new_int(nXSize));
// Set the xmin
json_object_object_add(poJSONObject, "xmin", json_object_new_double(adfTransform[0]));
// Set the ymax
json_object_object_add(poJSONObject, "ymax", json_object_new_double(adfTransform[3]));
// Set the cellwidth
json_object_object_add(poJSONObject, "cellwidth", json_object_new_double(adfTransform[1]));
// Set the cellheight
json_object_object_add(poJSONObject, "cellheight", json_object_new_double(-adfTransform[5]));
// Set the xmax
json_object_object_add(poJSONObject, "xmax", json_object_new_double(adfTransform[0] + nXSize * adfTransform[1]));
// Set the ymin
json_object_object_add(poJSONObject, "ymin", json_object_new_double(adfTransform[3] + nYSize * adfTransform[5]));
// Set the xskew
json_object_object_add(poJSONObject, "xskew", json_object_new_double(adfTransform[2]));
// Set the yskew
json_object_object_add(poJSONObject, "yskew", json_object_new_double(adfTransform[4]));
if (nSrs > 0) {
// Set the epsg
json_object_object_add(poJSONObject, "epsg", json_object_new_int(nSrs));
}
if (json_object_to_file(const_cast<char *>(osJSONFilename.c_str()), poJSONObject) < 0) {
CPLError( CE_Failure, CPLE_NotSupported,
"ARG driver can't write companion file.");
json_object_put(poJSONObject);
poJSONObject = NULL;
return NULL;
}
json_object_put(poJSONObject);
poJSONObject = NULL;
VSILFILE *fpImage = VSIFOpenL(pszFilename, "wb");
if (fpImage == NULL)
{
CPLError( CE_Failure, CPLE_NotSupported,
"ARG driver can't create data file %s.", pszFilename);
// remove JSON file
VSIUnlink( osJSONFilename.c_str() );
return NULL;
}
// only 1 raster band
GDALRasterBand *poSrcBand = poSrcDS->GetRasterBand( 1 );
#ifdef CPL_LSB
int bNative = FALSE;
#else
int bNative = TRUE;
#endif
示例3: Open
//.........这里部分代码省略.........
else
{
CPLError( CE_Failure, CPLE_AppDefined,
"Wrong value for 'features' options");
bErr = true;
}
papszIter++;
}
CSLDestroy(papszTokens);
CPLFree(pszFeatures);
if (bErr)
return FALSE;
pszSep = pszNextSep;
}
if( pszFilename == NULL )
pszFilename = CPLStrdup(pszSep+1);
}
const char* pszOptionUseTempFile = CPLGetConfigOption("USE_TEMPFILE", NULL);
if (pszOptionUseTempFile && CPLTestBool(pszOptionUseTempFile))
osTmpFileName = CPLGenerateTempFilename(NULL);
else
osTmpFileName.Printf("/vsimem/ogrgpsbabeldatasource_%p", this);
bool bRet = false;
if (IsSpecialFile(pszFilename))
{
/* Special file : don't try to open it */
char** argv = GetArgv(bExplicitFeatures, bWaypoints, bRoutes,
bTracks, pszGPSBabelDriverName, pszFilename);
VSILFILE* tmpfp = VSIFOpenL(osTmpFileName.c_str(), "wb");
bRet = (CPLSpawn(argv, NULL, tmpfp, TRUE) == 0);
VSIFCloseL(tmpfp);
tmpfp = NULL;
CSLDestroy(argv);
argv = NULL;
}
else
{
VSILFILE* fp = VSIFOpenL(pszFilename, "rb");
if (fp == NULL)
{
CPLError(CE_Failure, CPLE_AppDefined,
"Cannot open file %s", pszFilename);
return FALSE;
}
char** argv = GetArgv(bExplicitFeatures, bWaypoints, bRoutes,
bTracks, pszGPSBabelDriverName, "-");
VSILFILE* tmpfp = VSIFOpenL(osTmpFileName.c_str(), "wb");
CPLPushErrorHandler(CPLQuietErrorHandler);
bRet = (CPLSpawn(argv, fp, tmpfp, TRUE) == 0);
CPLPopErrorHandler();
CSLDestroy(argv);
argv = NULL;
CPLErr nLastErrorType = CPLGetLastErrorType();
CPLErrorNum nLastErrorNo = CPLGetLastErrorNo();
CPLString osLastErrorMsg = CPLGetLastErrorMsg();
示例4: IRasterIO
//.........这里部分代码省略.........
}
// Raise a query for missing tiles and cache them
if (nTilesToFetch > 0) {
/**
* There are several options here, to raise the query.
* - Get all the tiles which PKID is in a list of missing
* PKIDs.
* - Get all the tiles that intersect a polygon constructed
* based on the (min - max) values calculated before.
* - Get all the tiles with upper left pixel included in the
* range (min - max) calculated before.
*
* The first option is the most efficient one when a PKID exists.
* After that, the second one is the most efficient one when a
* spatial index exists.
* The third one is the only one available when neither a PKID or spatial
* index exist.
**/
CPLString osCommand;
PGresult * poResult;
CPLString osRasterToFetch;
if (bAllBandCaching)
osRasterToFetch = pszColumn;
else
osRasterToFetch.Printf("ST_Band(%s, %d)", pszColumn, nBand);
int bHasWhere = FALSE;
if (osIDsToFetch.size() && (poRDS->bIsFastPK || !(poRDS->HasSpatialIndex())) ) {
osCommand.Printf("SELECT %s, "
"ST_Metadata(%s), %s FROM %s.%s",
osRasterToFetch.c_str(), pszColumn,
poRDS->GetPrimaryKeyRef(), pszSchema, pszTable);
if( nTilesToFetch < poRDS->nTiles || poRDS->bBuildQuadTreeDynamically )
{
bHasWhere = TRUE;
osCommand += " WHERE ";
osCommand += poRDS->pszPrimaryKeyName;
osCommand += " IN (";
osCommand += osIDsToFetch;
osCommand += ")";
}
}
else {
CPLLocaleC oCLocale; // Force C locale to avoid commas instead of decimal points (for QGIS e.g.)
bHasWhere = TRUE;
osCommand.Printf("SELECT %s, ST_Metadata(%s), %s FROM %s.%s WHERE ",
osRasterToFetch.c_str(), pszColumn,
(poRDS->GetPrimaryKeyRef()) ? poRDS->GetPrimaryKeyRef() : "'foo'",
pszSchema, pszTable);
if( poRDS->HasSpatialIndex() )
{
osCommand += CPLSPrintf("%s && "
"ST_GeomFromText('POLYGON((%.18f %.18f,%.18f %.18f,%.18f %.18f,%.18f %.18f,%.18f %.18f))')",
pszColumn,
adfProjWin[0], adfProjWin[1],
adfProjWin[2], adfProjWin[3],
adfProjWin[4], adfProjWin[5],
adfProjWin[6], adfProjWin[7],
adfProjWin[0], adfProjWin[1]);
}
else
{
示例5: ReadHeaderSection
void OGRDXFDataSource::ReadHeaderSection()
{
char szLineBuf[257];
int nCode;
while( (nCode = ReadValue( szLineBuf, sizeof(szLineBuf) )) > -1
&& !EQUAL(szLineBuf,"ENDSEC") )
{
if( nCode != 9 )
continue;
CPLString osName = szLineBuf;
ReadValue( szLineBuf, sizeof(szLineBuf) );
CPLString osValue = szLineBuf;
oHeaderVariables[osName] = osValue;
}
if (nCode != -1)
{
nCode = ReadValue( szLineBuf, sizeof(szLineBuf) );
UnreadValue();
}
/* Unusual DXF files produced by dxflib */
/* such as http://www.ribbonsoft.com/library/architecture/plants/decd5.dxf */
/* where there is a spurious ENDSEC in the middle of the header variables */
if (nCode == 9 && EQUALN(szLineBuf,"$", 1) )
{
while( (nCode = ReadValue( szLineBuf, sizeof(szLineBuf) )) > -1
&& !EQUAL(szLineBuf,"ENDSEC") )
{
if( nCode != 9 )
continue;
CPLString osName = szLineBuf;
ReadValue( szLineBuf, sizeof(szLineBuf) );
CPLString osValue = szLineBuf;
oHeaderVariables[osName] = osValue;
}
}
CPLDebug( "DXF", "Read %d header variables.",
(int) oHeaderVariables.size() );
/* -------------------------------------------------------------------- */
/* Decide on what CPLRecode() name to use for the files */
/* encoding or allow the encoding to be overridden. */
/* -------------------------------------------------------------------- */
CPLString osCodepage = GetVariable( "$DWGCODEPAGE", "ANSI_1252" );
// not strictly accurate but works even without iconv.
if( osCodepage == "ANSI_1252" )
osEncoding = CPL_ENC_ISO8859_1;
else if( EQUALN(osCodepage,"ANSI_",5) )
{
osEncoding = "CP";
osEncoding += osCodepage + 5;
}
else
{
// fallback to the default
osEncoding = CPL_ENC_ISO8859_1;
}
if( CPLGetConfigOption( "DXF_ENCODING", NULL ) != NULL )
osEncoding = CPLGetConfigOption( "DXF_ENCODING", NULL );
if( osEncoding != CPL_ENC_ISO8859_1 )
CPLDebug( "DXF", "Treating DXF as encoding '%s', $DWGCODEPAGE='%s'",
osEncoding.c_str(), osCodepage.c_str() );
}
示例6: ICreateFeature
//.........这里部分代码省略.........
osCommand += "'";
osCommand += pszKML;
osCommand += "'";
CPLFree(pszKML);
}
continue;
}
if( !poFeature->IsFieldSet( iField ) )
{
osCommand += "''";
}
else
{
OGRFieldType eType = poFeatureDefn->GetFieldDefn(iField)->GetType();
if (eType != OFTInteger && eType != OFTReal)
{
CPLString osTmp;
const char* pszVal = poFeature->GetFieldAsString(iField);
if (!CPLIsUTF8(pszVal, -1))
{
static int bFirstTime = TRUE;
if (bFirstTime)
{
bFirstTime = FALSE;
CPLError(CE_Warning, CPLE_AppDefined,
"%s is not a valid UTF-8 string. Forcing it to ASCII.\n"
"This warning won't be issued anymore", pszVal);
}
else
{
CPLDebug("OGR", "%s is not a valid UTF-8 string. Forcing it to ASCII",
pszVal);
}
char* pszEscaped = CPLForceToASCII(pszVal, -1, '?');
osTmp = pszEscaped;
CPLFree(pszEscaped);
pszVal = osTmp.c_str();
}
osCommand += EscapeAndQuote(pszVal);
}
else
osCommand += poFeature->GetFieldAsString(iField);
}
}
osCommand += ")";
//CPLDebug("GFT", "%s", osCommand.c_str());
if (bInTransaction)
{
nFeaturesInTransaction ++;
if (nFeaturesInTransaction > 1)
osTransaction += "; ";
osTransaction += osCommand;
return OGRERR_NONE;
}
CPLHTTPResult * psResult = poDS->RunSQL(osCommand);
if (psResult == NULL)
{
CPLError(CE_Failure, CPLE_AppDefined, "Feature creation failed");
return OGRERR_FAILURE;
}
char* pszLine = (char*) psResult->pabyData;
if (pszLine == NULL ||
strncmp(pszLine, "rowid", 5) != 0 ||
psResult->pszErrBuf != NULL)
{
CPLError(CE_Failure, CPLE_AppDefined, "Feature creation failed");
CPLHTTPDestroyResult(psResult);
return OGRERR_FAILURE;
}
pszLine = OGRGFTGotoNextLine(pszLine);
if (pszLine == NULL)
{
CPLError(CE_Failure, CPLE_AppDefined, "Feature creation failed");
CPLHTTPDestroyResult(psResult);
return OGRERR_FAILURE;
}
char* pszNextLine = OGRGFTGotoNextLine(pszLine);
if (pszNextLine)
pszNextLine[-1] = 0;
CPLDebug("GFT", "Feature id = %s", pszLine);
int nFID = atoi(pszLine);
if (strcmp(CPLSPrintf("%d", nFID), pszLine) == 0)
poFeature->SetFID(nFID);
CPLHTTPDestroyResult(psResult);
return OGRERR_NONE;
}
示例7: IReadBlock
/*****************************************************
* \brief Read a natural block of raster band data
*****************************************************/
CPLErr PostGISRasterRasterBand::IReadBlock(int nBlockXOff,
int nBlockYOff, void * pImage)
{
PGresult * poResult = NULL;
CPLString osCommand;
int nXOff = 0;
int nYOff = 0;
int nNaturalBlockXSize = 0;
int nNaturalBlockYSize = 0;
double adfProjWin[8];
PostGISRasterDataset * poRDS = (PostGISRasterDataset *)poDS;
int nPixelSize = GDALGetDataTypeSize(eDataType) / 8;
// Construct a polygon to intersect with
GetBlockSize(&nNaturalBlockXSize, &nNaturalBlockYSize);
nXOff = nBlockXOff * nNaturalBlockXSize;
nYOff = nBlockYOff * nNaturalBlockYSize;
poRDS->PolygonFromCoords(nXOff, nYOff, nXOff + nNaturalBlockXSize, nYOff + nNaturalBlockYSize, adfProjWin);
// Raise the query
if (poRDS->pszWhere == NULL) {
osCommand.Printf("SELECT st_band(%s, %d) FROM %s.%s "
"WHERE st_intersects(%s, ST_PolygonFromText"
"('POLYGON((%.17f %.17f, %.17f %.17f, %.17f %.17f, %.17f "
"%.17f, %.17f %.17f))', %d))", pszColumn, nBand, pszSchema,
pszTable, pszColumn, adfProjWin[0], adfProjWin[1],
adfProjWin[2], adfProjWin[3], adfProjWin[4], adfProjWin[5],
adfProjWin[6], adfProjWin[7], adfProjWin[0], adfProjWin[1],
poRDS->nSrid);
}
else {
osCommand.Printf("SELECT st_band(%s, %d) FROM %s.%s WHERE (%s) "
"AND st_intersects(%s, ST_PolygonFromText"
"('POLYGON((%.17f %.17f, %.17f %.17f, %.17f %.17f, %.17f "
"%.17f, %.17f %.17f))', %d))", pszColumn, nBand, pszSchema,
pszTable, poRDS->pszWhere, pszColumn, adfProjWin[0],
adfProjWin[1], adfProjWin[2], adfProjWin[3], adfProjWin[4],
adfProjWin[5], adfProjWin[6], adfProjWin[7], adfProjWin[0],
adfProjWin[1], poRDS->nSrid);
}
#ifdef DEBUG_QUERY
CPLDebug("PostGIS_Raster",
"PostGISRasterRasterBand::IReadBlock(): Query = %s",
osCommand.c_str());
#endif
poResult = PQexec(poRDS->poConn, osCommand.c_str());
if (poResult == NULL ||
PQresultStatus(poResult) != PGRES_TUPLES_OK ||
PQntuples(poResult) < 0) {
if (poResult)
PQclear(poResult);
ReportError(CE_Failure, CPLE_AppDefined,
"Error retrieving raster data FROM database");
CPLDebug("PostGIS_Raster",
"PostGISRasterRasterBand::IRasterIO(): %s",
PQerrorMessage(poRDS->poConn));
return CE_Failure;
}
/**
* No data. Return the buffer filled with nodata values
**/
else if (PQntuples(poResult) == 0) {
PQclear(poResult);
CPLDebug("PostGIS_Raster",
"PostGISRasterRasterBand::IRasterIO(): Null block");
NullBlock(pImage);
return CE_None;
}
/**
* Ok, we get the data. Only data size, without payload
*
* TODO: Check byte order
**/
int nExpectedDataSize = nNaturalBlockXSize * nNaturalBlockYSize *
nPixelSize;
int nWKBLength = 0;
GByte * pbyData = CPLHexToBinary(PQgetvalue(poResult, 0, 0),
&nWKBLength);
//.........这里部分代码省略.........
示例8: SaveDB
void GDALPamProxyDB::SaveDB()
{
/* -------------------------------------------------------------------- */
/* Open the database relating original names to proxy .aux.xml */
/* file names. */
/* -------------------------------------------------------------------- */
CPLString osDBName =
CPLFormFilename( osProxyDBDir, "gdal_pam_proxy", "dat" );
void *hLock = CPLLockFile( osDBName, 1.0 );
// proceed even if lock fails - we need CPLBreakLockFile()!
if( hLock == NULL )
{
CPLError( CE_Warning, CPLE_AppDefined,
"GDALPamProxyDB::SaveDB() - Failed to lock %s file, proceeding anyways.",
osDBName.c_str() );
}
FILE *fpDB = VSIFOpenL( osDBName, "w" );
if( fpDB == NULL )
{
if( hLock )
CPLUnlockFile( hLock );
CPLError( CE_Failure, CPLE_AppDefined,
"Failed to save %s Pam Proxy DB.\n%s",
osDBName.c_str(),
VSIStrerror( errno ) );
return;
}
/* -------------------------------------------------------------------- */
/* Write header. */
/* -------------------------------------------------------------------- */
GByte abyHeader[100];
memset( abyHeader, ' ', sizeof(abyHeader) );
strncpy( (char *) abyHeader, "GDAL_PROXY", 10 );
sprintf( (char *) abyHeader + 10, "%9d", nUpdateCounter );
VSIFWriteL( abyHeader, 1, 100, fpDB );
/* -------------------------------------------------------------------- */
/* Write names. */
/* -------------------------------------------------------------------- */
unsigned int i;
for( i = 0; i < aosOriginalFiles.size(); i++ )
{
size_t nBytesWritten;
const char *pszProxyFile;
VSIFWriteL( aosOriginalFiles[i].c_str(), 1,
strlen(aosOriginalFiles[i].c_str())+1, fpDB );
pszProxyFile = CPLGetFilename(aosProxyFiles[i]);
nBytesWritten = VSIFWriteL( pszProxyFile, 1,
strlen(pszProxyFile)+1, fpDB );
if( nBytesWritten != strlen(pszProxyFile)+1 )
{
CPLError( CE_Failure, CPLE_AppDefined,
"Failed to write complete %s Pam Proxy DB.\n%s",
osDBName.c_str(),
VSIStrerror( errno ) );
VSIFCloseL( fpDB );
VSIUnlink( osDBName );
return;
}
}
VSIFCloseL( fpDB );
if( hLock )
CPLUnlockFile( hLock );
}
示例9: LoadDB
void GDALPamProxyDB::LoadDB()
{
/* -------------------------------------------------------------------- */
/* Open the database relating original names to proxy .aux.xml */
/* file names. */
/* -------------------------------------------------------------------- */
CPLString osDBName =
CPLFormFilename( osProxyDBDir, "gdal_pam_proxy", "dat" );
FILE *fpDB = VSIFOpenL( osDBName, "r" );
nUpdateCounter = 0;
if( fpDB == NULL )
return;
/* -------------------------------------------------------------------- */
/* Read header, verify and extract update counter. */
/* -------------------------------------------------------------------- */
GByte abyHeader[100];
if( VSIFReadL( abyHeader, 1, 100, fpDB ) != 100
|| strncmp( (const char *) abyHeader, "GDAL_PROXY", 10 ) != 0 )
{
CPLError( CE_Failure, CPLE_AppDefined,
"Problem reading %s header - short or corrupt?",
osDBName.c_str() );
return;
}
nUpdateCounter = atoi((const char *) abyHeader + 10);
/* -------------------------------------------------------------------- */
/* Read the file in one gulp. */
/* -------------------------------------------------------------------- */
int nBufLength;
char *pszDBData;
VSIFSeekL( fpDB, 0, SEEK_END );
nBufLength = (int) (VSIFTellL(fpDB) - 100);
pszDBData = (char *) CPLCalloc(1,nBufLength+1);
VSIFSeekL( fpDB, 100, SEEK_SET );
VSIFReadL( pszDBData, 1, nBufLength, fpDB );
VSIFCloseL( fpDB );
/* -------------------------------------------------------------------- */
/* Parse the list of in/out names. */
/* -------------------------------------------------------------------- */
int iNext = 0;
while( iNext < nBufLength )
{
CPLString osOriginal, osProxy;
osOriginal.assign( pszDBData + iNext );
for( ; iNext < nBufLength && pszDBData[iNext] != '\0'; iNext++ ) {}
if( iNext == nBufLength )
break;
iNext++;
osProxy = osProxyDBDir;
osProxy += "/";
osProxy += pszDBData + iNext;
for( ; iNext < nBufLength && pszDBData[iNext] != '\0'; iNext++ ) {}
iNext++;
aosOriginalFiles.push_back( osOriginal );
aosProxyFiles.push_back( osProxy );
}
CPLFree( pszDBData );
}
示例10: CreateField
//.........这里部分代码省略.........
pszType = "FLOAT";
else if( oField.GetType() == OFTBinary )
pszType = "BLOB";
else
pszType = "VARCHAR";
sprintf( pszNewFieldList+strlen(pszNewFieldList),
", '%s' %s", oField.GetNameRef(), pszType );
/* ==================================================================== */
/* Backup, destroy, recreate and repopulate the table. SQLite */
/* has no ALTER TABLE so we have to do all this to add a */
/* column. */
/* ==================================================================== */
/* -------------------------------------------------------------------- */
/* Do this all in a transaction. */
/* -------------------------------------------------------------------- */
poDS->SoftStartTransaction();
/* -------------------------------------------------------------------- */
/* Save existing related triggers and index */
/* -------------------------------------------------------------------- */
int rc;
char *pszErrMsg = NULL;
sqlite3 *hDB = poDS->GetDB();
CPLString osSQL;
osSQL.Printf( "SELECT sql FROM sqlite_master WHERE type IN ('trigger','index') AND tbl_name='%s'",
pszEscapedTableName );
int nRowTriggerIndexCount, nColTriggerIndexCount;
char **papszTriggerIndexResult = NULL;
rc = sqlite3_get_table( hDB, osSQL.c_str(), &papszTriggerIndexResult,
&nRowTriggerIndexCount, &nColTriggerIndexCount, &pszErrMsg );
/* -------------------------------------------------------------------- */
/* Make a backup of the table. */
/* -------------------------------------------------------------------- */
if( rc == SQLITE_OK )
rc = sqlite3_exec( hDB,
CPLSPrintf( "CREATE TEMPORARY TABLE t1_back(%s)",
pszOldFieldList ),
NULL, NULL, &pszErrMsg );
if( rc == SQLITE_OK )
rc = sqlite3_exec( hDB,
CPLSPrintf( "INSERT INTO t1_back SELECT %s FROM '%s'",
pszOldFieldList,
pszEscapedTableName ),
NULL, NULL, &pszErrMsg );
/* -------------------------------------------------------------------- */
/* Drop the original table, and recreate with new field. */
/* -------------------------------------------------------------------- */
if( rc == SQLITE_OK )
rc = sqlite3_exec( hDB,
CPLSPrintf( "DROP TABLE '%s'",
pszEscapedTableName ),
NULL, NULL, &pszErrMsg );
if( rc == SQLITE_OK )
{
const char *pszCmd =
示例11: CreateFeature
OGRErr OGRSQLiteTableLayer::CreateFeature( OGRFeature *poFeature )
{
sqlite3 *hDB = poDS->GetDB();
CPLString osCommand;
CPLString osValues;
int bNeedComma = FALSE;
if (bSpatialiteReadOnly || !poDS->GetUpdate())
{
CPLError( CE_Failure, CPLE_NotSupported,
"Can't create feature on a read-only layer.");
return OGRERR_FAILURE;
}
ResetReading();
/* -------------------------------------------------------------------- */
/* Form the INSERT command. */
/* -------------------------------------------------------------------- */
osCommand += CPLSPrintf( "INSERT INTO '%s' (", pszEscapedTableName );
/* -------------------------------------------------------------------- */
/* Add FID if we have a cleartext FID column. */
/* -------------------------------------------------------------------- */
if( pszFIDColumn != NULL // && !EQUAL(pszFIDColumn,"OGC_FID")
&& poFeature->GetFID() != OGRNullFID )
{
osCommand += pszFIDColumn;
osValues += CPLSPrintf( "%ld", poFeature->GetFID() );
bNeedComma = TRUE;
}
/* -------------------------------------------------------------------- */
/* Add geometry. */
/* -------------------------------------------------------------------- */
OGRGeometry *poGeom = poFeature->GetGeometryRef();
if( osGeomColumn.size() != 0 &&
poGeom != NULL &&
eGeomFormat != OSGF_FGF )
{
if( bNeedComma )
{
osCommand += ",";
osValues += ",";
}
osCommand += osGeomColumn;
osValues += "?";
bNeedComma = TRUE;
}
/* -------------------------------------------------------------------- */
/* Add field values. */
/* -------------------------------------------------------------------- */
int iField;
int nFieldCount = poFeatureDefn->GetFieldCount();
for( iField = 0; iField < nFieldCount; iField++ )
{
if( !poFeature->IsFieldSet( iField ) )
continue;
if( bNeedComma )
{
osCommand += ",";
osValues += ",";
}
osCommand += "'";
osCommand +=poFeatureDefn->GetFieldDefn(iField)->GetNameRef();
osCommand += "'";
osValues += "?";
bNeedComma = TRUE;
}
/* -------------------------------------------------------------------- */
/* Merge final command. */
/* -------------------------------------------------------------------- */
osCommand += ") VALUES (";
osCommand += osValues;
osCommand += ")";
/* -------------------------------------------------------------------- */
/* Prepare the statement. */
/* -------------------------------------------------------------------- */
int rc;
sqlite3_stmt *hInsertStmt;
#ifdef DEBUG
CPLDebug( "OGR_SQLITE", "prepare(%s)", osCommand.c_str() );
#endif
//.........这里部分代码省略.........
示例12: BuildWhere
void OGRSQLiteTableLayer::BuildWhere()
{
osWHERE = "";
if( m_poFilterGeom != NULL && bHasSpatialIndex )
{
OGREnvelope sEnvelope;
m_poFilterGeom->getEnvelope( &sEnvelope );
/* We first check that the spatial index table exists */
if (!bHasCheckedSpatialIndexTable)
{
bHasCheckedSpatialIndexTable = TRUE;
char **papszResult;
int nRowCount, nColCount;
char *pszErrMsg = NULL;
CPLString osSQL;
osSQL.Printf("SELECT name FROM sqlite_master "
"WHERE name='idx_%s_%s'",
pszEscapedTableName, osGeomColumn.c_str());
int rc = sqlite3_get_table( poDS->GetDB(), osSQL.c_str(),
&papszResult, &nRowCount,
&nColCount, &pszErrMsg );
if( rc != SQLITE_OK )
{
CPLError( CE_Failure, CPLE_AppDefined, "Error: %s",
pszErrMsg );
sqlite3_free( pszErrMsg );
bHasSpatialIndex = FALSE;
}
else
{
if (nRowCount != 1)
{
bHasSpatialIndex = FALSE;
}
sqlite3_free_table(papszResult);
}
}
if (bHasSpatialIndex)
{
osWHERE.Printf("WHERE ROWID IN ( SELECT pkid FROM 'idx_%s_%s' WHERE "
"xmax > %.12f AND xmin < %.12f AND ymax > %.12f AND ymin < %.12f) ",
pszEscapedTableName, osGeomColumn.c_str(),
sEnvelope.MinX - 1e-11, sEnvelope.MaxX + 1e-11,
sEnvelope.MinY - 1e-11, sEnvelope.MaxY + 1e-11);
}
else
{
CPLDebug("SQLITE", "Count not find idx_%s_%s layer. Disabling spatial index",
pszEscapedTableName, osGeomColumn.c_str());
}
}
if( m_poFilterGeom != NULL && bSpatialiteLoaded && !bHasSpatialIndex)
{
OGREnvelope sEnvelope;
m_poFilterGeom->getEnvelope( &sEnvelope );
/* A bit inefficient but still faster than OGR filtering */
osWHERE.Printf("WHERE MBRIntersects(\"%s\", BuildMBR(%.12f, %.12f, %.12f, %.12f, %d)) ",
osGeomColumn.c_str(),
sEnvelope.MinX - 1e-11, sEnvelope.MinY - 1e-11,
sEnvelope.MaxX + 1e-11, sEnvelope.MaxY + 1e-11,
nSRSId);
}
if( strlen(osQuery) > 0 )
{
if( strlen(osWHERE) == 0 )
{
osWHERE.Printf( "WHERE %s ", osQuery.c_str() );
}
else
{
osWHERE += "AND ";
osWHERE += osQuery;
}
}
}
示例13: AddFeature
/*!
\brief Add feature
\param poDataBlock pointer to VFKDataBlock instance
\param poFeature pointer to VFKFeature instance
*/
OGRErr VFKReaderSQLite::AddFeature(IVFKDataBlock *poDataBlock, VFKFeature *poFeature)
{
CPLString osCommand;
CPLString osValue;
const char *pszBlockName;
OGRFieldType ftype;
const VFKProperty *poProperty;
VFKFeatureSQLite *poNewFeature;
pszBlockName = poDataBlock->GetName();
osCommand.Printf("INSERT INTO '%s' VALUES(", pszBlockName);
for (int i = 0; i < poDataBlock->GetPropertyCount(); i++) {
ftype = poDataBlock->GetProperty(i)->GetType();
poProperty = poFeature->GetProperty(i);
if (i > 0)
osCommand += ",";
if (poProperty->IsNull())
osValue.Printf("NULL");
else {
switch (ftype) {
case OFTInteger:
osValue.Printf("%d", poProperty->GetValueI());
break;
case OFTReal:
osValue.Printf("%f", poProperty->GetValueD());
break;
case OFTString:
if (poDataBlock->GetProperty(i)->IsIntBig())
osValue.Printf("%s", poProperty->GetValueS());
else
osValue.Printf("'%s'", poProperty->GetValueS(TRUE));
break;
default:
osValue.Printf("'%s'", poProperty->GetValueS());
break;
}
}
osCommand += osValue;
}
osValue.Printf("," CPL_FRMT_GIB, poFeature->GetFID());
if (poDataBlock->GetGeometryType() != wkbNone) {
osValue += ",NULL";
}
osValue += ")";
osCommand += osValue;
if (ExecuteSQL(osCommand.c_str(), TRUE) != OGRERR_NONE)
return OGRERR_FAILURE;
if (EQUAL(pszBlockName, "SBP")) {
poProperty = poFeature->GetProperty("PORADOVE_CISLO_BODU");
if( poProperty == NULL )
{
CPLError(CE_Failure, CPLE_AppDefined, "Cannot find property PORADOVE_CISLO_BODU");
return OGRERR_FAILURE;
}
if (!EQUAL(poProperty->GetValueS(), "1"))
return OGRERR_NONE;
}
poNewFeature = new VFKFeatureSQLite(poDataBlock, poDataBlock->GetRecordCount(RecordValid) + 1,
poFeature->GetFID());
poDataBlock->AddFeature(poNewFeature);
return OGRERR_NONE;
}
示例14: VFKReader
/*!
\brief VFKReaderSQLite constructor
*/
VFKReaderSQLite::VFKReaderSQLite(const char *pszFilename) : VFKReader(pszFilename)
{
const char *pszDbNameConf;
CPLString osDbName;
CPLString osCommand;
VSIStatBufL sStatBufDb, sStatBufVfk;
/* open tmp SQLite DB (re-use DB file if already exists) */
pszDbNameConf = CPLGetConfigOption("OGR_VFK_DB_NAME", NULL);
if (pszDbNameConf) {
osDbName = pszDbNameConf;
}
else {
osDbName = CPLResetExtension(m_pszFilename, "db");
}
size_t nLen = osDbName.length();
if( nLen > 2048 )
{
nLen = 2048;
osDbName.resize(nLen);
}
m_pszDBname = new char [nLen+1];
std::strncpy(m_pszDBname, osDbName.c_str(), nLen);
m_pszDBname[nLen] = 0;
CPLDebug("OGR-VFK", "Using internal DB: %s",
m_pszDBname);
if (CPLTestBool(CPLGetConfigOption("OGR_VFK_DB_SPATIAL", "YES")))
m_bSpatial = TRUE; /* build geometry from DB */
else
m_bSpatial = FALSE; /* store also geometry in DB */
m_bNewDb = TRUE;
if (VSIStatL(osDbName, &sStatBufDb) == 0) {
if (CPLTestBool(CPLGetConfigOption("OGR_VFK_DB_OVERWRITE", "NO"))) {
m_bNewDb = TRUE; /* overwrite existing DB */
CPLDebug("OGR-VFK", "Internal DB (%s) already exists and will be overwritten",
m_pszDBname);
VSIUnlink(osDbName);
}
else {
if (VSIStatL(pszFilename, &sStatBufVfk) == 0 &&
sStatBufVfk.st_mtime > sStatBufDb.st_mtime) {
CPLDebug("OGR-VFK",
"Found %s but ignoring because it appears\n"
"be older than the associated VFK file.",
osDbName.c_str());
m_bNewDb = TRUE;
VSIUnlink(osDbName);
}
else {
m_bNewDb = FALSE; /* re-use existing DB */
}
}
}
/*
if (m_bNewDb) {
CPLError(CE_Warning, CPLE_AppDefined,
"INFO: No internal SQLite DB found. Reading VFK data may take some time...");
}
*/
CPLDebug("OGR-VFK", "New DB: %s Spatial: %s",
m_bNewDb ? "yes" : "no", m_bSpatial ? "yes" : "no");
if (SQLITE_OK != sqlite3_open(osDbName, &m_poDB)) {
CPLError(CE_Failure, CPLE_AppDefined,
"Creating SQLite DB failed");
}
else {
char* pszErrMsg = NULL;
CPL_IGNORE_RET_VAL(sqlite3_exec(m_poDB, "PRAGMA synchronous = OFF", NULL, NULL, &pszErrMsg));
sqlite3_free(pszErrMsg);
}
if (m_bNewDb) {
/* new DB, create support metadata tables */
osCommand.Printf("CREATE TABLE %s (file_name text, table_name text, num_records integer, "
"num_features integer, num_geometries integer, table_defn text)",
VFK_DB_TABLE);
ExecuteSQL(osCommand.c_str());
/* header table */
osCommand.Printf("CREATE TABLE %s (key text, value text)", VFK_DB_HEADER);
ExecuteSQL(osCommand.c_str());
}
}
示例15: Open
int OGRSelafinDataSource::Open( const char * pszFilename, int bUpdateIn,
int bCreate )
{
// Check if a range is set and extract it and the filename.
const char *pszc = pszFilename;
if (*pszFilename==0) return FALSE;
while (*pszc) ++pszc;
if (*(pszc-1)==']') {
--pszc;
while (pszc!=pszFilename && *pszc!='[') pszc--;
if (pszc==pszFilename) return FALSE;
poRange.setRange(pszc);
}
pszName = CPLStrdup( pszFilename );
pszName[pszc-pszFilename]=0;
bUpdate = CPL_TO_BOOL(bUpdateIn);
if (bCreate && EQUAL(pszName, "/vsistdout/")) return TRUE;
/* For writable /vsizip/, do nothing more */
if (bCreate && STARTS_WITH(pszName, "/vsizip/")) return TRUE;
CPLString osFilename(pszName);
CPLString osBaseFilename = CPLGetFilename(pszName);
// Determine what sort of object this is.
VSIStatBufL sStatBuf;
if (VSIStatExL( osFilename, &sStatBuf, VSI_STAT_NATURE_FLAG ) != 0) return FALSE;
// Is this a single Selafin file?
if (VSI_ISREG(sStatBuf.st_mode)) return OpenTable( pszName );
// Is this a single a ZIP file with only a Selafin file inside ?
if( STARTS_WITH(osFilename, "/vsizip/") && VSI_ISREG(sStatBuf.st_mode) ) {
char** papszFiles = VSIReadDir(osFilename);
if (CSLCount(papszFiles) != 1) {
CSLDestroy(papszFiles);
return FALSE;
}
osFilename = CPLFormFilename(osFilename, papszFiles[0], nullptr);
CSLDestroy(papszFiles);
return OpenTable( osFilename );
}
#ifdef notdef
// Otherwise it has to be a directory.
if( !VSI_ISDIR(sStatBuf.st_mode) ) return FALSE;
// Scan through for entries which look like Selafin files
int nNotSelafinCount = 0, i;
char **papszNames = VSIReadDir( osFilename );
for( i = 0; papszNames != NULL && papszNames[i] != NULL; i++ ) {
CPLString oSubFilename = CPLFormFilename( osFilename, papszNames[i], NULL );
if( EQUAL(papszNames[i],".") || EQUAL(papszNames[i],"..") ) continue;
if( VSIStatL( oSubFilename, &sStatBuf ) != 0 || !VSI_ISREG(sStatBuf.st_mode) ) {
nNotSelafinCount++;
continue;
}
if( !OpenTable( oSubFilename ) ) {
CPLDebug("Selafin", "Cannot open %s", oSubFilename.c_str());
nNotSelafinCount++;
continue;
}
}
CSLDestroy( papszNames );
// We presume that this is indeed intended to be a Selafin datasource if over half the files were Selafin files.
return nNotSelafinCount < nLayers;
#else
return FALSE;
#endif
}