Changeset 23945


Ignore:
Timestamp:
Feb 11, 2012, 6:33:34 AM (13 years ago)
Author:
Even Rouault
Message:

SQLite: defered layer definition building for table and view layers

Location:
trunk/gdal/ogr/ogrsf_frmts/sqlite
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/gdal/ogr/ogrsf_frmts/sqlite/ogr_sqlite.h

    r23944 r23945  
    358358    int                 bHasCheckedSpatialIndexTable;
    359359
     360    char               *pszViewName;
    360361    char               *pszEscapedTableName;
    361362    char               *pszEscapedUnderlyingTableName;
    362363
     364    int                 bLayerDefnError;
     365
    363366    CPLString           osUnderlyingTableName;
    364367    CPLString           osUnderlyingGeometryColumn;
     
    368371    OGRErr              ResetStatement();
    369372
     373    CPLErr              EstablishFeatureDefn();
     374
    370375  public:
    371376                        OGRSQLiteViewLayer( OGRSQLiteDataSource * );
    372377                        ~OGRSQLiteViewLayer();
     378
     379    virtual const char* GetName() { return pszViewName; }
     380    virtual OGRwkbGeometryType GetGeomType();
    373381
    374382    CPLErr              Initialize( const char *pszViewName,
     
    379387                                    int bSpatialiteLoaded);
    380388
     389    virtual OGRFeatureDefn *GetLayerDefn();
     390    int                 HasLayerDefnError() { GetLayerDefn(); return bLayerDefnError; }
     391
     392    virtual OGRFeature *GetNextFeature();
    381393    virtual int         GetFeatureCount( int );
    382394
     
    387399
    388400    virtual int         TestCapability( const char * );
     401
     402    virtual OGRSpatialReference *GetSpatialRef();
    389403
    390404    virtual CPLString    GetSpatialWhere(OGRGeometry* poFilterGeom);
  • trunk/gdal/ogr/ogrsf_frmts/sqlite/ogrsqlitedatasource.cpp

    r23736 r23945  
    10891089    }
    10901090
    1091     /* If not a slow file, then establish layer definition immediately */
    1092     /* to check if the table is valid */
    1093     /* Note: we could do differed table layer definition for all files */
    1094     /* but it is only worth doing for slow files. */
    1095     if ( strncmp(pszName, "/vsicurl/", 9) != 0 &&
    1096          poLayer->HasLayerDefnError() )
    1097     {
    1098         delete poLayer;
    1099         return FALSE;
    1100     }
    1101    
    11021091    poLayer->SetSpatialite2D ( bForce2D );
    11031092
  • trunk/gdal/ogr/ogrsf_frmts/sqlite/ogrsqliteviewlayer.cpp

    r23944 r23945  
    4949
    5050    poFeatureDefn = NULL;
     51    pszViewName = NULL;
    5152    pszEscapedTableName = NULL;
    5253    pszEscapedUnderlyingTableName = NULL;
    5354
    5455    bHasCheckedSpatialIndexTable = FALSE;
     56
     57    bLayerDefnError = FALSE;
    5558}
    5659
     
    6366{
    6467    ClearStatement();
     68    CPLFree(pszViewName);
    6569    CPLFree(pszEscapedTableName);
    6670    CPLFree(pszEscapedUnderlyingTableName);
     
    7983
    8084{
     85    this->pszViewName = CPLStrdup(pszViewName);
     86
     87    osGeomColumn = pszViewGeometry;
     88    eGeomFormat = OSGF_SpatiaLite;
     89
     90    CPLFree( pszFIDColumn );
     91    pszFIDColumn = CPLStrdup( pszViewRowid );
     92
     93    osUnderlyingTableName = pszUnderlyingTableName;
     94    osUnderlyingGeometryColumn = pszUnderlyingGeometryColumn;
     95
     96    this->bSpatialiteLoaded = bSpatialiteLoaded;
     97    //this->bHasM = bHasM;
     98
     99    pszEscapedTableName = CPLStrdup(OGRSQLiteEscape(pszViewName));
     100    pszEscapedUnderlyingTableName = CPLStrdup(OGRSQLiteEscape(pszUnderlyingTableName));
     101
     102    return CE_None;
     103}
     104
     105/************************************************************************/
     106/*                           GetLayerDefn()                             */
     107/************************************************************************/
     108
     109OGRFeatureDefn* OGRSQLiteViewLayer::GetLayerDefn()
     110{
     111    if (poFeatureDefn)
     112        return poFeatureDefn;
     113
     114    EstablishFeatureDefn();
     115
     116    if (poFeatureDefn == NULL)
     117    {
     118        bLayerDefnError = TRUE;
     119
     120        poFeatureDefn = new OGRFeatureDefn( pszViewName );
     121        poFeatureDefn->Reference();
     122    }
     123
     124    return poFeatureDefn;
     125}
     126
     127/************************************************************************/
     128/*                            GetGeomType()                             */
     129/************************************************************************/
     130
     131OGRwkbGeometryType OGRSQLiteViewLayer::GetGeomType()
     132{
     133    if (poFeatureDefn)
     134        return poFeatureDefn->GetGeomType();
     135
     136    OGRSQLiteLayer* poUnderlyingLayer = (OGRSQLiteLayer*) poDS->GetLayerByName(osUnderlyingTableName);
     137    if (poUnderlyingLayer)
     138        return poUnderlyingLayer->GetGeomType();
     139
     140    return wkbUnknown;
     141}
     142
     143/************************************************************************/
     144/*                         EstablishFeatureDefn()                       */
     145/************************************************************************/
     146
     147CPLErr OGRSQLiteViewLayer::EstablishFeatureDefn()
     148{
    81149    int rc;
    82150    sqlite3 *hDB = poDS->GetDB();
    83 
    84     OGRSQLiteLayer* poUnderlyingLayer = (OGRSQLiteLayer*) poDS->GetLayerByName(pszUnderlyingTableName);
     151    sqlite3_stmt *hColStmt = NULL;
     152    const char *pszSQL;
     153
     154    OGRSQLiteLayer* poUnderlyingLayer = (OGRSQLiteLayer*) poDS->GetLayerByName(osUnderlyingTableName);
    85155    if (poUnderlyingLayer == NULL)
    86156    {
    87157        CPLError(CE_Failure, CPLE_AppDefined,
    88158                 "Cannot find underlying layer %s for view %s",
    89                  pszUnderlyingTableName, pszViewName);
     159                 osUnderlyingTableName.c_str(), pszViewName);
    90160        return CE_Failure;
    91161    }
     
    94164        CPLError(CE_Failure, CPLE_AppDefined,
    95165                 "Underlying layer %s for view %s is not a regular table",
    96                  pszUnderlyingTableName, pszViewName);
     166                 osUnderlyingTableName.c_str(), pszViewName);
    97167        return CE_Failure;
    98168    }
     
    100170    const char* pszRealUnderlyingGeometryColumn = poUnderlyingLayer->GetGeometryColumn();
    101171    if ( pszRealUnderlyingGeometryColumn == NULL ||
    102          !EQUAL(pszRealUnderlyingGeometryColumn, pszUnderlyingGeometryColumn) )
     172         !EQUAL(pszRealUnderlyingGeometryColumn, osUnderlyingGeometryColumn.c_str()) )
    103173    {
    104174        CPLError(CE_Failure, CPLE_AppDefined,
    105175                 "Underlying layer %s for view %s has not expected geometry column name (%s instead of %s)",
    106                  pszUnderlyingTableName, pszViewName,
     176                 osUnderlyingTableName.c_str(), pszViewName,
    107177                 pszRealUnderlyingGeometryColumn ? pszRealUnderlyingGeometryColumn : "(null)",
    108                  pszUnderlyingGeometryColumn);
     178                 osUnderlyingGeometryColumn.c_str());
    109179        return CE_Failure;
    110180    }
    111 
    112     osGeomColumn = pszViewGeometry;
    113     eGeomFormat = OSGF_SpatiaLite;
    114 
    115     CPLFree( pszFIDColumn );
    116     pszFIDColumn = CPLStrdup( pszViewRowid );
    117 
    118     osUnderlyingTableName = pszUnderlyingTableName;
    119     osUnderlyingGeometryColumn = pszUnderlyingGeometryColumn;
    120181
    121182    poSRS = poUnderlyingLayer->GetSpatialRef();
     
    124185
    125186    this->bHasSpatialIndex = poUnderlyingLayer->HasSpatialIndex();
    126     this->bSpatialiteLoaded = bSpatialiteLoaded;
    127     //this->bHasM = bHasM;
    128 
    129     pszEscapedTableName = CPLStrdup(OGRSQLiteEscape(pszViewName));
    130     pszEscapedUnderlyingTableName = CPLStrdup(OGRSQLiteEscape(pszUnderlyingTableName));
    131 
    132     sqlite3_stmt *hColStmt = NULL;
    133     const char *pszSQL;
    134187
    135188/* -------------------------------------------------------------------- */
     
    209262}
    210263
     264/************************************************************************/
     265/*                           GetSpatialRef()                            */
     266/************************************************************************/
     267
     268OGRSpatialReference *OGRSQLiteViewLayer::GetSpatialRef()
     269
     270{
     271    if (HasLayerDefnError())
     272        return NULL;
     273
     274    return poSRS;
     275}
     276
     277/************************************************************************/
     278/*                           GetNextFeature()                           */
     279/************************************************************************/
     280
     281OGRFeature *OGRSQLiteViewLayer::GetNextFeature()
     282
     283{
     284    if (HasLayerDefnError())
     285        return NULL;
     286
     287    return OGRSQLiteLayer::GetNextFeature();
     288}
    211289
    212290/************************************************************************/
     
    217295
    218296{
     297    if (HasLayerDefnError())
     298        return NULL;
     299
    219300/* -------------------------------------------------------------------- */
    220301/*      If we don't have an explicit FID column, just read through      */
     
    305386{
    306387    CPLString osSpatialWHERE;
     388
     389    if (HasLayerDefnError())
     390        return "";
    307391
    308392    if( poFilterGeom != NULL && bHasSpatialIndex )
     
    422506
    423507{
     508    if (HasLayerDefnError())
     509        return FALSE;
     510
    424511    if (EQUAL(pszCap,OLCFastFeatureCount))
    425512        return m_poFilterGeom == NULL || osGeomColumn.size() == 0 ||
     
    445532
    446533{
     534    if (HasLayerDefnError())
     535        return 0;
     536
    447537    if( !TestCapability(OLCFastFeatureCount) )
    448538        return OGRSQLiteLayer::GetFeatureCount( bForce );
Note: See TracChangeset for help on using the changeset viewer.