int OGRIngresTableLayer::GetFeatureCount( int bForce ) { /* -------------------------------------------------------------------- */ /* Ensure any active long result is interrupted. */ /* -------------------------------------------------------------------- */ poDS->InterruptLongResult(); /* -------------------------------------------------------------------- */ /* Issue the appropriate select command. */ /* -------------------------------------------------------------------- */ INGRES_RES *hResult; const char *pszCommand; pszCommand = CPLSPrintf( "SELECT COUNT(*) FROM %s %s", poFeatureDefn->GetName(), pszWHERE ); if( ingres_query( poDS->GetConn(), pszCommand ) ) { poDS->ReportError( pszCommand ); return FALSE; } hResult = ingres_store_result( poDS->GetConn() ); if( hResult == NULL ) { poDS->ReportError( "ingres_store_result() failed on SELECT COUNT(*)." ); return FALSE; } /* -------------------------------------------------------------------- */ /* Capture the result. */ /* -------------------------------------------------------------------- */ char **papszRow = ingres_fetch_row( hResult ); int nCount = 0; if( papszRow != NULL && papszRow[0] != NULL ) nCount = atoi(papszRow[0]); if( hResultSet != NULL ) ingres_free_result( hResultSet ); hResultSet = NULL; return nCount; }
OGRErr OGRIngresTableLayer::GetExtent(OGREnvelope *psExtent, int bForce ) { if( GetLayerDefn()->GetGeomType() == wkbNone ) { psExtent->MinX = 0.0; psExtent->MaxX = 0.0; psExtent->MinY = 0.0; psExtent->MaxY = 0.0; return OGRERR_FAILURE; } OGREnvelope oEnv; CPLString osCommand; GBool bExtentSet = FALSE; osCommand.Printf( "SELECT Envelope(%s) FROM %s;", pszGeomColumn, pszGeomColumnTable); if (ingres_query(poDS->GetConn(), osCommand) == 0) { INGRES_RES* result = ingres_use_result(poDS->GetConn()); if ( result == NULL ) { poDS->ReportError( "ingres_use_result() failed on extents query." ); return OGRERR_FAILURE; } INGRES_ROW row; unsigned long *panLengths = NULL; while ((row = ingres_fetch_row(result))) { if (panLengths == NULL) { panLengths = ingres_fetch_lengths( result ); if ( panLengths == NULL ) { poDS->ReportError( "ingres_fetch_lengths() failed on extents query." ); return OGRERR_FAILURE; } } OGRGeometry *poGeometry = NULL; // Geometry columns will have the first 4 bytes contain the SRID. OGRGeometryFactory::createFromWkb(((GByte *)row[0]) + 4, NULL, &poGeometry, panLengths[0] - 4 ); if ( poGeometry != NULL ) { if (poGeometry && !bExtentSet) { poGeometry->getEnvelope(psExtent); bExtentSet = TRUE; } else if (poGeometry) { poGeometry->getEnvelope(&oEnv); if (oEnv.MinX < psExtent->MinX) psExtent->MinX = oEnv.MinX; if (oEnv.MinY < psExtent->MinY) psExtent->MinY = oEnv.MinY; if (oEnv.MaxX > psExtent->MaxX) psExtent->MaxX = oEnv.MaxX; if (oEnv.MaxY > psExtent->MaxY) psExtent->MaxY = oEnv.MaxY; } delete poGeometry; } } ingres_free_result(result); } return (bExtentSet ? OGRERR_NONE : OGRERR_FAILURE); }
OGRFeature *OGRIngresTableLayer::GetFeature( long nFeatureId ) { if( pszFIDColumn == NULL ) return OGRIngresLayer::GetFeature( nFeatureId ); /* -------------------------------------------------------------------- */ /* Discard any existing resultset. */ /* -------------------------------------------------------------------- */ ResetReading(); /* -------------------------------------------------------------------- */ /* Prepare query command that will just fetch the one record of */ /* interest. */ /* -------------------------------------------------------------------- */ char *pszFieldList = BuildFields(); char *pszCommand = (char *) CPLMalloc(strlen(pszFieldList)+2000); sprintf( pszCommand, "SELECT %s FROM %s WHERE %s = %ld", pszFieldList, poFeatureDefn->GetName(), pszFIDColumn, nFeatureId ); CPLFree( pszFieldList ); /* -------------------------------------------------------------------- */ /* Issue the command. */ /* -------------------------------------------------------------------- */ if( ingres_query( poDS->GetConn(), pszCommand ) ) { poDS->ReportError( pszCommand ); return NULL; } CPLFree( pszCommand ); hResultSet = ingres_store_result( poDS->GetConn() ); if( hResultSet == NULL ) { poDS->ReportError( "ingres_store_result() failed on query." ); return NULL; } /* -------------------------------------------------------------------- */ /* Fetch the result record. */ /* -------------------------------------------------------------------- */ char **papszRow; unsigned long *panLengths; papszRow = ingres_fetch_row( hResultSet ); if( papszRow == NULL ) return NULL; panLengths = ingres_fetch_lengths( hResultSet ); /* -------------------------------------------------------------------- */ /* Transform into a feature. */ /* -------------------------------------------------------------------- */ iNextShapeId = nFeatureId; OGRFeature *poFeature = RecordToFeature( papszRow, panLengths ); iNextShapeId = 0; /* -------------------------------------------------------------------- */ /* Cleanup */ /* -------------------------------------------------------------------- */ if( hResultSet != NULL ) ingres_free_result( hResultSet ); hResultSet = NULL; return poFeature; }
OGRErr OGRIngresDataSource::InitializeMetadataTables() { #ifdef notdef char szCommand[1024]; INGRES_RES *hResult; OGRErr eErr = OGRERR_NONE; sprintf( szCommand, "DESCRIBE geometry_columns" ); if( ingres_query(GetConn(), szCommand ) ) { sprintf(szCommand, "CREATE TABLE geometry_columns " "( F_TABLE_CATALOG VARCHAR(256), " "F_TABLE_SCHEMA VARCHAR(256), " "F_TABLE_NAME VARCHAR(256) NOT NULL," "F_GEOMETRY_COLUMN VARCHAR(256) NOT NULL, " "COORD_DIMENSION INT, " "SRID INT," "TYPE VARCHAR(256) NOT NULL)"); if( ingres_query(GetConn(), szCommand ) ) { ReportError( szCommand ); eErr = OGRERR_FAILURE; } else CPLDebug("INGRES","Creating geometry_columns metadata table"); } // make sure to attempt to free results of successful queries hResult = ingres_store_result( GetConn() ); if( hResult != NULL ) { ingres_free_result( hResult ); hResult = NULL; } sprintf( szCommand, "DESCRIBE spatial_ref_sys" ); if( ingres_query(GetConn(), szCommand ) ) { sprintf(szCommand, "CREATE TABLE spatial_ref_sys " "(SRID INT NOT NULL, " "AUTH_NAME VARCHAR(256), " "AUTH_SRID INT, " "SRTEXT VARCHAR(2048))"); if( ingres_query(GetConn(), szCommand ) ) { ReportError( szCommand ); eErr = OGRERR_FAILURE; } else CPLDebug("INGRES","Creating spatial_ref_sys metadata table"); } // make sure to attempt to free results of successful queries hResult = ingres_store_result( GetConn() ); if( hResult != NULL ) { ingres_free_result( hResult ); hResult = NULL; } return eErr; #endif return OGRERR_NONE; }