📄 ogrdatasource.cpp
字号:
/* -------------------------------------------------------------------- */
if( EQUALN(pszStatement,"DROP INDEX",10) )
{
ProcessSQLDropIndex( pszStatement );
return NULL;
}
/* -------------------------------------------------------------------- */
/* Preparse the SQL statement. */
/* -------------------------------------------------------------------- */
pszError = swq_select_preparse( pszStatement, &psSelectInfo );
if( pszError != NULL )
{
CPLError( CE_Failure, CPLE_AppDefined,
"SQL: %s", pszError );
return NULL;
}
/* -------------------------------------------------------------------- */
/* Validate that all the source tables are recognised, count */
/* fields. */
/* -------------------------------------------------------------------- */
int nFieldCount = 0, iTable, iField;
for( iTable = 0; iTable < psSelectInfo->table_count; iTable++ )
{
swq_table_def *psTableDef = psSelectInfo->table_defs + iTable;
OGRLayer *poSrcLayer;
OGRDataSource *poTableDS = this;
if( psTableDef->data_source != NULL )
{
poTableDS = (OGRDataSource *)
OGROpenShared( psTableDef->data_source, FALSE, NULL );
if( poTableDS == NULL )
{
if( strlen(CPLGetLastErrorMsg()) == 0 )
CPLError( CE_Failure, CPLE_AppDefined,
"Unable to open secondary datasource\n"
"`%s' required by JOIN.",
psTableDef->data_source );
swq_select_free( psSelectInfo );
return NULL;
}
// This drops explicit reference, but leave it open for use by
// code in ogr_gensql.cpp
poTableDS->Dereference();
}
poSrcLayer = poTableDS->GetLayerByName( psTableDef->table_name );
if( poSrcLayer == NULL )
{
CPLError( CE_Failure, CPLE_AppDefined,
"SELECT from table %s failed, no such table/featureclass.",
psTableDef->table_name );
swq_select_free( psSelectInfo );
return NULL;
}
nFieldCount += poSrcLayer->GetLayerDefn()->GetFieldCount();
}
/* -------------------------------------------------------------------- */
/* Build the field list for all indicated tables. */
/* -------------------------------------------------------------------- */
swq_field_list sFieldList;
int nFIDIndex = 0;
memset( &sFieldList, 0, sizeof(sFieldList) );
sFieldList.table_count = psSelectInfo->table_count;
sFieldList.table_defs = psSelectInfo->table_defs;
sFieldList.count = 0;
sFieldList.names = (char **) CPLMalloc( sizeof(char *) * (nFieldCount+SPECIAL_FIELD_COUNT) );
sFieldList.types = (swq_field_type *)
CPLMalloc( sizeof(swq_field_type) * (nFieldCount+SPECIAL_FIELD_COUNT) );
sFieldList.table_ids = (int *)
CPLMalloc( sizeof(int) * (nFieldCount+SPECIAL_FIELD_COUNT) );
sFieldList.ids = (int *)
CPLMalloc( sizeof(int) * (nFieldCount+SPECIAL_FIELD_COUNT) );
for( iTable = 0; iTable < psSelectInfo->table_count; iTable++ )
{
swq_table_def *psTableDef = psSelectInfo->table_defs + iTable;
OGRDataSource *poTableDS = this;
OGRLayer *poSrcLayer;
if( psTableDef->data_source != NULL )
{
poTableDS = (OGRDataSource *)
OGROpenShared( psTableDef->data_source, FALSE, NULL );
CPLAssert( poTableDS != NULL );
poTableDS->Dereference();
}
poSrcLayer = poTableDS->GetLayerByName( psTableDef->table_name );
for( iField = 0;
iField < poSrcLayer->GetLayerDefn()->GetFieldCount();
iField++ )
{
OGRFieldDefn *poFDefn=poSrcLayer->GetLayerDefn()->GetFieldDefn(iField);
int iOutField = sFieldList.count++;
sFieldList.names[iOutField] = (char *) poFDefn->GetNameRef();
if( poFDefn->GetType() == OFTInteger )
sFieldList.types[iOutField] = SWQ_INTEGER;
else if( poFDefn->GetType() == OFTReal )
sFieldList.types[iOutField] = SWQ_FLOAT;
else if( poFDefn->GetType() == OFTString )
sFieldList.types[iOutField] = SWQ_STRING;
else
sFieldList.types[iOutField] = SWQ_OTHER;
sFieldList.table_ids[iOutField] = iTable;
sFieldList.ids[iOutField] = iField;
}
if( iTable == 0 )
nFIDIndex = poSrcLayer->GetLayerDefn()->GetFieldCount();
}
/* -------------------------------------------------------------------- */
/* Expand '*' in 'SELECT *' now before we add the pseudo fields */
/* -------------------------------------------------------------------- */
pszError =
swq_select_expand_wildcard( psSelectInfo, &sFieldList );
if( pszError != NULL )
{
CPLError( CE_Failure, CPLE_AppDefined,
"SQL: %s", pszError );
return NULL;
}
for (iField = 0; iField < SPECIAL_FIELD_COUNT; iField++)
{
sFieldList.names[sFieldList.count] = SpecialFieldNames[iField];
sFieldList.types[sFieldList.count] = SpecialFieldTypes[iField];
sFieldList.table_ids[sFieldList.count] = 0;
sFieldList.ids[sFieldList.count] = nFIDIndex + iField;
sFieldList.count++;
}
/* -------------------------------------------------------------------- */
/* Finish the parse operation. */
/* -------------------------------------------------------------------- */
pszError = swq_select_parse( psSelectInfo, &sFieldList, 0 );
CPLFree( sFieldList.names );
CPLFree( sFieldList.types );
CPLFree( sFieldList.table_ids );
CPLFree( sFieldList.ids );
if( pszError != NULL )
{
CPLError( CE_Failure, CPLE_AppDefined,
"SQL: %s", pszError );
return NULL;
}
/* -------------------------------------------------------------------- */
/* Everything seems OK, try to instantiate a results layer. */
/* -------------------------------------------------------------------- */
OGRGenSQLResultsLayer *poResults;
poResults = new OGRGenSQLResultsLayer( this, psSelectInfo,
poSpatialFilter );
// Eventually, we should keep track of layers to cleanup.
return poResults;
}
/************************************************************************/
/* OGR_DS_ExecuteSQL() */
/************************************************************************/
OGRLayerH OGR_DS_ExecuteSQL( OGRDataSourceH hDS,
const char *pszStatement,
OGRGeometryH hSpatialFilter,
const char *pszDialect )
{
return (OGRLayerH)
((OGRDataSource *)hDS)->ExecuteSQL( pszStatement,
(OGRGeometry *) hSpatialFilter,
pszDialect );
}
/************************************************************************/
/* ReleaseResultSet() */
/************************************************************************/
void OGRDataSource::ReleaseResultSet( OGRLayer * poResultsSet )
{
delete poResultsSet;
}
/************************************************************************/
/* OGR_DS_ReleaseResultSet() */
/************************************************************************/
void OGR_DS_ReleaseResultSet( OGRDataSourceH hDS, OGRLayerH hLayer )
{
((OGRDataSource *) hDS)->ReleaseResultSet( (OGRLayer *) hLayer );
}
/************************************************************************/
/* OGR_DS_TestCapability() */
/************************************************************************/
int OGR_DS_TestCapability( OGRDataSourceH hDS, const char *pszCap )
{
return ((OGRDataSource *) hDS)->TestCapability( pszCap );
}
/************************************************************************/
/* OGR_DS_GetLayerCount() */
/************************************************************************/
int OGR_DS_GetLayerCount( OGRDataSourceH hDS )
{
return ((OGRDataSource *)hDS)->GetLayerCount();
}
/************************************************************************/
/* OGR_DS_GetLayer() */
/************************************************************************/
OGRLayerH OGR_DS_GetLayer( OGRDataSourceH hDS, int iLayer )
{
return (OGRLayerH) ((OGRDataSource*)hDS)->GetLayer( iLayer );
}
/************************************************************************/
/* OGR_DS_GetName() */
/************************************************************************/
const char *OGR_DS_GetName( OGRDataSourceH hDS )
{
return ((OGRDataSource*)hDS)->GetName();
}
/************************************************************************/
/* SyncToDisk() */
/************************************************************************/
OGRErr OGRDataSource::SyncToDisk()
{
int i;
OGRErr eErr;
for( i = 0; i < GetLayerCount(); i++ )
{
OGRLayer *poLayer = GetLayer(i);
if( poLayer )
{
eErr = poLayer->SyncToDisk();
if( eErr != OGRERR_NONE )
return eErr;
}
}
return OGRERR_NONE;
}
/************************************************************************/
/* OGR_DS_SyncToDisk() */
/************************************************************************/
OGRErr OGR_DS_SyncToDisk( OGRDataSourceH hDS )
{
return ((OGRDataSource *) hDS)->SyncToDisk();
}
/************************************************************************/
/* GetDriver() */
/************************************************************************/
OGRSFDriver *OGRDataSource::GetDriver() const
{
return m_poDriver;
}
/************************************************************************/
/* OGR_DS_GetDriver() */
/************************************************************************/
OGRSFDriverH OGR_DS_GetDriver( OGRDataSourceH hDS )
{
return (OGRSFDriverH) ((OGRDataSource *) hDS)->GetDriver();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -