|
|
|
Greg Boone
|
Will these changes be submitted to the trunk as well?
-----Original Message----- From: [hidden email] [mailto:[hidden email]] On Behalf Of [hidden email] Sent: Monday, September 28, 2009 4:46 AM To: [hidden email] Subject: [fdo-commits] r4971 - branches/3.4/Providers/PostGIS/Src/Provider Author: scroux Date: 2009-09-28 04:45:46 -0400 (Mon, 28 Sep 2009) New Revision: 4971 Modified: branches/3.4/Providers/PostGIS/Src/Provider/ApplySchemaCommand.cpp branches/3.4/Providers/PostGIS/Src/Provider/ApplySchemaCommand.h branches/3.4/Providers/PostGIS/Src/Provider/CommandCapabilities.cpp branches/3.4/Providers/PostGIS/Src/Provider/Connection.cpp branches/3.4/Providers/PostGIS/Src/Provider/Connection.h branches/3.4/Providers/PostGIS/Src/Provider/ConnectionCapabilities.cpp branches/3.4/Providers/PostGIS/Src/Provider/DescribeSchemaCommand.cpp branches/3.4/Providers/PostGIS/Src/Provider/ExpressionProcessor.cpp branches/3.4/Providers/PostGIS/Src/Provider/GeometryCapabilities.cpp branches/3.4/Providers/PostGIS/Src/Provider/InsertCommand.cpp branches/3.4/Providers/PostGIS/Src/Provider/PgTablesReader.cpp branches/3.4/Providers/PostGIS/Src/Provider/PgTablesReader.h branches/3.4/Providers/PostGIS/Src/Provider/PostGisProvider.h branches/3.4/Providers/PostGIS/Src/Provider/PostGisProvider.vcproj branches/3.4/Providers/PostGIS/Src/Provider/SQLDataReader.cpp branches/3.4/Providers/PostGIS/Src/Provider/SchemaDescription.cpp branches/3.4/Providers/PostGIS/Src/Provider/SchemaDescription.h Log: bruno made by bruno Modified: branches/3.4/Providers/PostGIS/Src/Provider/ApplySchemaCommand.cpp =================================================================== --- branches/3.4/Providers/PostGIS/Src/Provider/ApplySchemaCommand.cpp 2009-09-28 07:48:00 UTC (rev 4970) +++ branches/3.4/Providers/PostGIS/Src/Provider/ApplySchemaCommand.cpp 2009-09-28 08:45:46 UTC (rev 4971) @@ -174,6 +174,8 @@ case FdoSchemaElementState_Detached: break; case FdoSchemaElementState_Modified: + AlterTable(classDef); + break; case FdoSchemaElementState_Unchanged: break; } @@ -260,6 +262,82 @@ return !hasData; } +void ApplySchemaCommand::AlterTable(FdoPtr<FdoClassDefinition> classDef) const +{ + FDOLOG_MARKER("ApplySchemaCommand::-AlterTable"); + + int nbPropModified=0; + ov::ClassDefinition* phClass; + phClass = this->GetClassDefinition(classDef->GetName()); + if (NULL == phClass) + { + CreateTable(classDef); + return; + /* + FdoStringP msg = FdoStringP::Format( + L"[PostGIS] ApplySchemaCommand: Alter class '%s' error! ClassDefinition not fount!", + classDef->GetName()); + FDOLOG_WRITE("ERROR: %s", static_cast<FdoString*>(msg)); + throw FdoCommandException::Create(msg); + */ + } + + std::string schemaName(static_cast<char const*>(phClass->GetSchemaName())); + std::string tableName (static_cast<char const*>(phClass->GetTableName())); + + std::string sqlAlter("ALTER TABLE "); + sqlAlter += tableName; + + FdoPtr<FdoPropertyDefinitionCollection> props(classDef->GetProperties()); + if (NULL != props && props->GetCount() > 0) + { + // + // Read properties and parse details: name, data type, size. + // + FdoInt32 const propsSize = props->GetCount(); + for (FdoInt32 j = 0; j < propsSize; j++) + { + FdoPtr<FdoPropertyDefinition> propDef(props->GetItem(j)); + if (FdoPropertyType_DataProperty == propDef->GetPropertyType()) + { + FdoSchemaElementState propState = propDef->GetElementState(); + FdoStringP propName(propDef->GetName()); + std::string sqlType(details::PgTypeFromFdoProperty(propDef)); + if (sqlType.empty()) + { + throw FdoCommandException::Create(L"ApplySchemaCommand::Execute: Unkown data property type"); + } + switch(propState) + { + case FdoSchemaElementState_Added: + if(nbPropModified > 0) sqlAlter += ','; + sqlAlter += " ADD COLUMN "; + sqlAlter += static_cast<char const*>(propName); + sqlAlter += " " + sqlType; + nbPropModified++; + break; + case FdoSchemaElementState_Deleted: + if(nbPropModified > 0) sqlAlter += ','; + sqlAlter += " DROP COLUMN "; + sqlAlter += static_cast<char const*>(propName); + nbPropModified++; + break; + } + + } + } + } + if(nbPropModified) + { + FDOLOG_WRITE("SQL:\n\t%s", sqlAlter.c_str()); + mConn->PgExecuteCommand(sqlAlter.c_str()); + // + // Update a Logical & Physical mapping of the feature class + // + mConn->ResetSchema(); + } +} + void ApplySchemaCommand::CreateTable(FdoPtr<FdoClassDefinition> classDef) const { FDOLOG_MARKER("ApplySchemaCommand::-CreateTable"); @@ -407,28 +485,14 @@ { CreateSequence(tableName, propId); } + InsertDummyRecord(tableName, propId); } // TODO: Add class description as a COMMENT - // Physical mapping for the feature class - if (NULL == phClass) { - ov::PhysicalSchemaMapping *schemaMapping=mConn->GetPhysicalSchemaMapping(); - if (schemaMapping) { - ov::ClassCollection::Ptr phClasses(schemaMapping->GetClasses()); - ov::ClassDefinition::Ptr classDef = ov::ClassDefinition::Create(); - classDef->SetName(className); - classDef->SetSchemaName(FdoStringP(schemaName.c_str())); - try { - phClasses->Add(classDef); - } - catch (FdoException* e) - { - FDOLOG_WRITE("Error Do not append ClassDefinition / Schema Mapping for class"); - e->Release(); - } - } - } + // Update Logical & Physical mapping for the feature class + //mConn->ResetSchema(); + } // if (NULL != props && props->GetCount() > 0) } @@ -557,6 +621,18 @@ mConn->PgExecuteCommand(sql.c_str()); } +void ApplySchemaCommand::InsertDummyRecord(std::string const& table, + FdoPtr<FdoDataPropertyDefinition> prop) const +{ + FDOLOG_MARKER("ApplySchemaCommand::-InsertDummyRecord"); + + assert(!table.empty()); + std::string column(static_cast<char const*>(FdoStringP(prop->GetName()).Lower())); + + std::string sql("INSERT INTO " + table + "(" + column + ") values(0)"); + mConn->PgExecuteCommand(sql.c_str()); +} + void ApplySchemaCommand::DropTable(FdoPtr<FdoClassDefinition> classDef) const { assert(NULL != mFeatureSchema); @@ -633,8 +709,9 @@ } // - // TODO: Remove a Physical mapping of the feature class + // Update a Logical & Physical mapping of the feature class // + mConn->ResetSchema(); } Modified: branches/3.4/Providers/PostGIS/Src/Provider/ApplySchemaCommand.h =================================================================== --- branches/3.4/Providers/PostGIS/Src/Provider/ApplySchemaCommand.h 2009-09-28 07:48:00 UTC (rev 4970) +++ branches/3.4/Providers/PostGIS/Src/Provider/ApplySchemaCommand.h 2009-09-28 08:45:46 UTC (rev 4971) @@ -154,6 +154,10 @@ // void DropTable(FdoPtr<FdoClassDefinition> classDef) const; + // This function alter a feature table, support only add and drop column + // classDef - definition of feature class + // + void AlterTable(FdoPtr<FdoClassDefinition> classDef) const; // This function registers geometry column in PostGIS meta-schema. // It is a simple proxy around SQL command: @@ -175,6 +179,7 @@ void CreateSpatialIndex(std::string const& table, FdoPtr<FdoGeometricPropertyDefinition> prop) const; void CreateSequence(std::string const& table, FdoPtr<FdoDataPropertyDefinition> prop) const; + void InsertDummyRecord(std::string const& table, FdoPtr<FdoDataPropertyDefinition> prop) const; ov::ClassDefinition* GetClassDefinition(FdoStringP className) const; Modified: branches/3.4/Providers/PostGIS/Src/Provider/CommandCapabilities.cpp =================================================================== --- branches/3.4/Providers/PostGIS/Src/Provider/CommandCapabilities.cpp 2009-09-28 07:48:00 UTC (rev 4970) +++ branches/3.4/Providers/PostGIS/Src/Provider/CommandCapabilities.cpp 2009-09-28 08:45:46 UTC (rev 4971) @@ -62,7 +62,8 @@ // Other commands FdoCommandType_SQLCommand, - FdoCommandType_GetSpatialContexts + FdoCommandType_GetSpatialContexts, + FdoCommandType_CreateSpatialContext }; size = (sizeof(commands) / sizeof(FdoCommandType)); @@ -72,7 +73,7 @@ bool CommandCapabilities::SupportsParameters() { - return false; + return true; } bool CommandCapabilities::SupportsTimeout() @@ -102,8 +103,7 @@ bool CommandCapabilities::SupportsSelectGrouping() { - // TODO: SelectAggregate commands is under construction - return false; + return true; } }} // namespace fdo::postgis Modified: branches/3.4/Providers/PostGIS/Src/Provider/Connection.cpp =================================================================== --- branches/3.4/Providers/PostGIS/Src/Provider/Connection.cpp 2009-09-28 07:48:00 UTC (rev 4970) +++ branches/3.4/Providers/PostGIS/Src/Provider/Connection.cpp 2009-09-28 08:45:46 UTC (rev 4971) @@ -37,6 +37,7 @@ #include "ApplySchemaCommand.h" #include "DescribeSchemaCommand.h" #include "GetSpatialContextsCommand.h" +#include "CreateSpatialContextCommand.h" #include "InsertCommand.h" #include "UpdateCommand.h" #include "DeleteCommand.h" @@ -423,6 +424,9 @@ case FdoCommandType_GetSpatialContexts: cmd = new GetSpatialContextsCommand(this); break; + case FdoCommandType_CreateSpatialContext: + cmd = new CreateSpatialContextCommand(this); + break; default: { FDOLOG_WRITE("ERROR: Unsupported command requested."); @@ -472,6 +476,18 @@ return sc->GetLogicalSchemas(); } +void Connection::ResetSchema() +{ + FDOLOG_MARKER("Connection::+ResetSchema"); + + if (NULL != mSchemaDesc) + { + mSchemaDesc->ResetSchema(); + FDO_SAFE_RELEASE(mSchemaDesc.p); + } + +} + ov::PhysicalSchemaMapping* Connection::GetPhysicalSchemaMapping() { FDOLOG_MARKER("Connection::+GetLogicalSchema"); @@ -783,7 +799,7 @@ if (0 >= mSoftTransactionLevel) { - FDOLOG_WRITE("No active transaction to commit"); + FDOLOG_WRITE("No active transaction to rollback"); } else { @@ -821,7 +837,7 @@ { FDOLOG_MARKER("Connection::-DescribeSchema"); - if (NULL == mSchemaDesc) + if (NULL == mSchemaDesc || mSchemaDesc->IsDescribed() == false) { // TODO: Add support of describing selected schema instead of all @@ -1095,4 +1111,74 @@ return schemaName; } +std::string Connection::GetPgNextVal(std::string sequence) +{ + FDOLOG_MARKER("Connection::-GetPgNextVal"); + + std::string sql("select nextval(\'" + sequence + "\')"); + + return PgQueryOneValue(sql); + +} + +std::string Connection::PgQueryOneValue(std::string sql) +{ + FDOLOG_MARKER("Connection::-PgQueryOneValue"); + boost::shared_ptr<PGresult> pgRes(PgExecuteQuery(sql.c_str()), PQclear); + std::string value; + value = PQgetvalue(pgRes.get(), 0, 0); + FDOLOG_WRITE(L"Value : %s", value.c_str()); + return value; +} + +bool Connection::GetCoordinateSystemWkt(std::string sridText,std::string& csName,std::string& csWkt) +{ + std::string sql("SELECT srtext FROM spatial_ref_sys WHERE srid = " + sridText); + boost::shared_ptr<PGresult> pgRes(PgExecuteQuery(sql.c_str()), PQclear); + if (PGRES_TUPLES_OK != PQresultStatus(pgRes.get()) || PQntuples(pgRes.get()) < 1) + { + FDOLOG_WRITE("ERROR: The Spatial Reference System for SRID=%s not found",sridText.c_str()); + /* + FdoStringP tmp = sridText.c_str(); + FdoStringP msg = FdoStringP::Format(L"The Spatial Reference System for SRID=%s not found.", + static_cast<FdoString const*>(tmp)); + throw FdoException::Create(static_cast<FdoString*>(msg)); + */ + return false; + } + + int const nfield = PQfnumber(pgRes.get(), "srtext"); + std::string wkt(PQgetvalue(pgRes.get(), 0, nfield)); + assert(!wkt.empty()); + csWkt = wkt; + + // Use substring between first quotes ("") as the SRS name + std::string wktName("UNKNOWN"); + std::string::size_type pos1 = wkt.find_first_of('"') + 1; + std::string::size_type pos2 = wkt.find_first_of(',') - 1; + if (pos1 != std::string::npos && pos2 != std::string::npos) + { + wktName = wkt.substr(pos1, pos2 - pos1); + } + csName = wktName; + return true; +} + +bool Connection::GetSrid(std::string csName,std::string& sridText) +{ + std::string sql("SELECT srid FROM spatial_ref_sys WHERE srtext like '%" + csName + "%'"); + boost::shared_ptr<PGresult> pgRes(PgExecuteQuery(sql.c_str()), PQclear); + if (PGRES_TUPLES_OK != PQresultStatus(pgRes.get()) || PQntuples(pgRes.get()) < 1) + { + FDOLOG_WRITE("ERROR: The SRID not found for csName=%s",csName.c_str()); + return false; + } + + int const nfield = PQfnumber(pgRes.get(), "srid"); + std::string srid(PQgetvalue(pgRes.get(), 0, nfield)); + assert(!srid.empty()); + sridText = srid; + return true; +} + }} // namespace fdo::postgis Modified: branches/3.4/Providers/PostGIS/Src/Provider/Connection.h =================================================================== --- branches/3.4/Providers/PostGIS/Src/Provider/Connection.h 2009-09-28 07:48:00 UTC (rev 4970) +++ branches/3.4/Providers/PostGIS/Src/Provider/Connection.h 2009-09-28 08:45:46 UTC (rev 4971) @@ -158,6 +158,9 @@ /// \todo To be documented. FdoFeatureSchemaCollection* GetLogicalSchema(); + /// clears all cached schema information, next access will recache. + void ResetSchema(); + /// \todo To be documented. ov::PhysicalSchemaMapping* GetPhysicalSchemaMapping(); @@ -210,6 +213,17 @@ /// Force unwinding of any active transaction with commit execution. void PgFlushSoftTransaction(); + /// retreive the next value giving a sequence name. + std::string GetPgNextVal(std::string sequence); + /// Execute a query and return a single value. + std::string PgQueryOneValue(std::string sql); + ///Return the csName and csWkt associated to the postgis srid number + bool GetCoordinateSystemWkt(std::string sridText,std::string& csName,std::string& csWkt); + ///try to find a srid number giving a coordsystem name + bool GetSrid(std::string csName,std::string& sridText); + + + protected: /// Destructor. Modified: branches/3.4/Providers/PostGIS/Src/Provider/ConnectionCapabilities.cpp =================================================================== --- branches/3.4/Providers/PostGIS/Src/Provider/ConnectionCapabilities.cpp 2009-09-28 07:48:00 UTC (rev 4970) +++ branches/3.4/Providers/PostGIS/Src/Provider/ConnectionCapabilities.cpp 2009-09-28 08:45:46 UTC (rev 4971) @@ -46,12 +46,14 @@ // TODO: Verify threading model return FdoThreadCapability_PerConnectionThreaded; + //return FdoThreadCapability_PerCommandThreaded; } FdoSpatialContextExtentType* ConnectionCapabilities::GetSpatialContextTypes(FdoInt32& size) { static FdoSpatialContextExtentType types[] = { - FdoSpatialContextExtentType_Static + //FdoSpatialContextExtentType_Static + FdoSpatialContextExtentType_Dynamic }; size = (sizeof(types) / sizeof(FdoSpatialContextExtentType)); @@ -120,7 +122,7 @@ bool ConnectionCapabilities::SupportsWrite() { - return false; + return true; } bool ConnectionCapabilities::SupportsMultiUserWrite() Modified: branches/3.4/Providers/PostGIS/Src/Provider/DescribeSchemaCommand.cpp =================================================================== --- branches/3.4/Providers/PostGIS/Src/Provider/DescribeSchemaCommand.cpp 2009-09-28 07:48:00 UTC (rev 4970) +++ branches/3.4/Providers/PostGIS/Src/Provider/DescribeSchemaCommand.cpp 2009-09-28 08:45:46 UTC (rev 4971) @@ -146,8 +146,18 @@ FDOLOG_WRITE("Number of schema elements fetched: %d", logicalSchema->GetCount()); - FDO_SAFE_ADDREF(logicalSchema.p); - return logicalSchema.p; + // need to create a copy to return beacuse of issue in MapGuide + // ( when decribe scchema command is running than MG serialize and temporary removes (and returns back ) + // class from this schema. + // and if multisession's (multhi threading) application is running and if they share this same schema + // then it got's exception. + // If I create a copy and for every request return copy than it is OK. + // and some other callers (FME) may change it and that is nt ok for us then + + FdoFeatureSchemaCollection* ret = FdoCommonSchemaUtil::DeepCopyFdoFeatureSchemas(logicalSchema); + return ret; + //FDO_SAFE_ADDREF(logicalSchema.p); + //return logicalSchema.p; } catch (FdoException* e) { Modified: branches/3.4/Providers/PostGIS/Src/Provider/ExpressionProcessor.cpp =================================================================== --- branches/3.4/Providers/PostGIS/Src/Provider/ExpressionProcessor.cpp 2009-09-28 07:48:00 UTC (rev 4970) +++ branches/3.4/Providers/PostGIS/Src/Provider/ExpressionProcessor.cpp 2009-09-28 08:45:46 UTC (rev 4971) @@ -166,11 +166,23 @@ } else if (0 == name.ICompare(FDO_FUNCTION_SPATIALEXTENTS)) { + /* processArgs = false; mBuffer.append("GeomFromEwkb(AsEwkb(Extent("); FdoPtr<FdoExpression> geomExpr(args->GetItem(0)); geomExpr->Process(this); mBuffer.append(")))"); + */ + + //Coalesce( GeomFromEwkb(AsEwkb(Extent(geometry_1))) , geomfromtext('POLYGON((0 0,0 0,0 0,0 0,0 0))')) + + processArgs = false; + mBuffer.append("Coalesce(GeomFromEwkb(AsEwkb(Extent("); + FdoPtr<FdoExpression> geomExpr(args->GetItem(0)); + geomExpr->Process(this); + mBuffer.append("))),geomfromtext('POLYGON((0 0,0 50,50 50,50 0,0 0))'))"); + + } else if (0 == name.ICompare(FDO_FUNCTION_AREA2D)) { Modified: branches/3.4/Providers/PostGIS/Src/Provider/GeometryCapabilities.cpp =================================================================== --- branches/3.4/Providers/PostGIS/Src/Provider/GeometryCapabilities.cpp 2009-09-28 07:48:00 UTC (rev 4970) +++ branches/3.4/Providers/PostGIS/Src/Provider/GeometryCapabilities.cpp 2009-09-28 08:45:46 UTC (rev 4971) @@ -89,7 +89,7 @@ FdoInt32 GeometryCapabilities::GetDimensionalities() { - return (FdoDimensionality_XY | FdoDimensionality_Z | FdoDimensionality_M); + return (FdoDimensionality_XY );//| FdoDimensionality_Z | FdoDimensionality_M); } Modified: branches/3.4/Providers/PostGIS/Src/Provider/InsertCommand.cpp =================================================================== --- branches/3.4/Providers/PostGIS/Src/Provider/InsertCommand.cpp 2009-09-28 07:48:00 UTC (rev 4970) +++ branches/3.4/Providers/PostGIS/Src/Provider/InsertCommand.cpp 2009-09-28 08:45:46 UTC (rev 4971) @@ -96,7 +96,12 @@ FdoBatchParameterValueCollection* InsertCommand::GetBatchParameterValues() { - return GetCollection(mBatchParameters); + if( !mBatchParameters.p ) + { + mBatchParameters = FdoBatchParameterValueCollection::Create(); + } + + return FDO_SAFE_ADDREF( mBatchParameters.p ); } FdoIFeatureReader* InsertCommand::Execute() @@ -128,11 +133,23 @@ throw FdoCommandException::Create(L"[PostGIS] InsertCommand can not find class definition or class mapping!"); } + if( mBatchParameters.p && mBatchParameters->GetCount() != 0 ) + { + // Collect bind parameters + details::pgexec_params_t params; + Base::PgGenerateExecParams(params); + + // Execute SQL statement + //mConn->PgExecuteCommand(sql.c_str(), params, cmdTuples); + } std::string sep; std::string columns; std::string values; std::string sequence; + std::string nextValue; + bool pkColumnFound = false; + FdoDataType pkDataType = FdoDataType_Int32; ExpressionProcessor::Ptr expProc(new ExpressionProcessor()); @@ -146,16 +163,20 @@ if (1 == propsIdentity->GetCount()) { FdoPtr<FdoDataPropertyDefinition> prop(propsIdentity->GetItem(0)); - if (prop->GetIsAutoGenerated() - && (FdoDataType_Int16 == prop->GetDataType() - || FdoDataType_Int32 == prop->GetDataType() - || FdoDataType_Int64 == prop->GetDataType())) + if (prop->GetIsAutoGenerated()) { - pkColumn = prop->GetName(); + pkDataType = prop->GetDataType(); + if( FdoDataType_Int16 == pkDataType + || FdoDataType_Int32 == pkDataType + || FdoDataType_Int64 == pkDataType) + { + pkColumn = prop->GetName(); - std::string table(static_cast<char const*>(phClass->GetTableName())); - std::string column(static_cast<char const*>(pkColumn)); - sequence = details::MakeSequenceName(table, column); + std::string table(static_cast<char const*>(phClass->GetTableName())); + std::string column(static_cast<char const*>(pkColumn)); + sequence = details::MakeSequenceName(table, column); + nextValue = mConn->GetPgNextVal(sequence); + } } } @@ -182,7 +203,8 @@ if (0 == pkColumn.ICompare(pName)) { - values += sep + "nextval(\'" + sequence + "\')"; + values += sep + nextValue; + pkColumnFound = true; } else { @@ -239,6 +261,29 @@ sep = ","; } + if(pkColumn.GetLength() && !pkColumnFound) + { + FdoPtr<FdoDataValue> newval; + values += sep + nextValue; + columns += sep + static_cast<char const*>(pkColumn);; + + switch(pkDataType) + { + case FdoDataType_Int16: + newval = FdoDataValue::Create((FdoInt16) boost::lexical_cast<FdoInt16>(nextValue)); + break; + case FdoDataType_Int32: + newval = FdoDataValue::Create((FdoInt32) boost::lexical_cast<FdoInt32>(nextValue)); + break; + case FdoDataType_Int64: + newval = FdoDataValue::Create((FdoInt64) boost::lexical_cast<FdoInt64>(nextValue)); + break; + } + + FdoPtr<FdoPropertyValue> propval = FdoPropertyValue::Create(pkColumn,newval); + mProperties->Insert(0,propval); + } + // // Build and execute SQL command // Modified: branches/3.4/Providers/PostGIS/Src/Provider/PgTablesReader.cpp =================================================================== --- branches/3.4/Providers/PostGIS/Src/Provider/PgTablesReader.cpp 2009-09-28 07:48:00 UTC (rev 4970) +++ branches/3.4/Providers/PostGIS/Src/Provider/PgTablesReader.cpp 2009-09-28 08:45:46 UTC (rev 4971) @@ -225,15 +225,18 @@ // Estimate bounding box of geometries in given column FdoPtr<FdoEnvelopeImpl> bbox; - bbox = EstimateColumnExtent(static_cast<char const*>(name)); - if (bbox->GetIsEmpty()) + if(IsEstimateColumnExtentAvailable(static_cast<char const*>(name))) { + bbox = EstimateColumnExtent(static_cast<char const*>(name)); + } + else + { bbox = SelectColumnExtent(static_cast<char const*>(name)); - if (bbox->GetIsEmpty()) - { - bbox = FdoEnvelopeImpl::Create(0.0, 0.0, 0.0, 0.0); - } } + if (bbox->GetIsEmpty()) + { + bbox = FdoEnvelopeImpl::Create(0.0, 0.0, 0.0, 0.0); + } // Describe geometry column and add to the collection PgGeometryColumn::Ptr col(new PgGeometryColumn(name, type, dim, srid, bbox)); @@ -315,6 +318,47 @@ } } +bool PgTablesReader::IsEstimateColumnExtentAvailable( + std::string const& column) const +{ + FDOLOG_MARKER("PgTablesReader::-IsEstimateColumnExtentAvailable"); + assert(!mCurrentSchema.empty() && !mTableCached.empty()); + + if (!mTableSpatialCached) { + return false; + } + + std::string sql("SELECT count(*) FROM pg_statistic s, pg_class c, pg_attribute a, pg_namespace n WHERE c.relname = '" + + mTableCached + "' AND a.attrelid = c.oid AND a.attname = '" + + column + "' AND n.nspname = '" + + mCurrentSchema + "' AND c.relnamespace = n.oid AND s.starelid=c.oid AND s.staattnum = a.attnum AND staattnum = attnum"); + try + { + boost::shared_ptr<PGresult> pgRes(mConn->PgExecuteQuery(sql.c_str()), PQclear); + assert(PGRES_TUPLES_OK == PQresultStatus(pgRes.get())); + assert(1 == PQntuples(pgRes.get())); + + bool nullVal = false; + char const* cval = NULL; + cval = PQgetvalue(pgRes.get(), 0, 0); + if (!cval || !strlen(cval)) return false; + int nbStats = StringConv<int>(cval); + if(nbStats > 0) return true; + return false; + } + catch (FdoException* e) + { + FDOLOG_WRITE(L"Warning! estimated_extent is empty! use VACUUM or ANALYZE"); + e->Release(); + return false; + } + catch (boost::bad_lexical_cast& e) + { + FDOLOG_WRITE("Extent coordinate value conversion failed: %s", e.what()); + throw FdoException::Create(L"Error occured while reading coordinate of estimated extent"); + } +} + FdoPtr<FdoEnvelopeImpl> PgTablesReader::EstimateColumnExtent( std::string const& column) const { @@ -389,9 +433,13 @@ } catch (FdoException* e) { - FDOLOG_WRITE(L"Error occured while reading coordinate of estimated extent"); - throw FdoException::Create(L"Error occured while reading coordinate of estimated extent"); + FdoPtr<FdoEnvelopeImpl> extent; + extent = FdoEnvelopeImpl::Create(); // create empty envelope! + FDOLOG_WRITE(L"Warning! estimated_extent is empty! use VACUUM or ANALYZE"); + //throw FdoException::Create(L"Error occured while reading coordinate of estimated extent"); e->Release(); + FDO_SAFE_ADDREF(extent.p); + return extent.p; } catch (boost::bad_lexical_cast& e) { @@ -425,14 +473,12 @@ + mCurrentSchema + "."+ mTableCached // TODO add mBaseName + ") AS box"); - // NOTE: The PgExecuteQuery throws on error, but if no exception occurs, - // valid query result is assumed. - - boost::shared_ptr<PGresult> pgRes(mConn->PgExecuteQuery(sql.c_str()), PQclear); - assert(PGRES_TUPLES_OK == PQresultStatus(pgRes.get())); - assert(1 == PQntuples(pgRes.get())); try { + boost::shared_ptr<PGresult> pgRes(mConn->PgExecuteQuery(sql.c_str()), PQclear); + assert(PGRES_TUPLES_OK == PQresultStatus(pgRes.get())); + assert(1 == PQntuples(pgRes.get())); + bool nullVal = false; char const* cval = NULL; @@ -468,10 +514,19 @@ FDO_SAFE_ADDREF(extent.p); return extent.p; } + catch (FdoException* e) + { + FdoPtr<FdoEnvelopeImpl> extent; + extent = FdoEnvelopeImpl::Create(); // create empty envelope! + FDOLOG_WRITE(L"Warning! SelectColumnExtent failed, table must be empty"); + FDO_SAFE_ADDREF(extent.p); + e->Release(); + return extent.p; + } catch (boost::bad_lexical_cast& e) { - FDOLOG_WRITE("Extent coordinate value conversion failed: %s", e.what()); - throw FdoException::Create(L"Error occured while select coordinate of extent"); + FDOLOG_WRITE("Extent coordinate value conversion failed: %s", e.what()); + throw FdoException::Create(L"Error occured while select coordinate of extent"); } } Modified: branches/3.4/Providers/PostGIS/Src/Provider/PgTablesReader.h =================================================================== --- branches/3.4/Providers/PostGIS/Src/Provider/PgTablesReader.h 2009-09-28 07:48:00 UTC (rev 4970) +++ branches/3.4/Providers/PostGIS/Src/Provider/PgTablesReader.h 2009-09-28 08:45:46 UTC (rev 4971) @@ -131,6 +131,13 @@ // Validates basic state of the reader instance. void ValidateConnectionState() const; + // Executes query to test if estimated_extent is available + // for the given geometry column in a table. + // Table is used with full path: schema.table. + bool IsEstimateColumnExtentAvailable( + std::string const& column) const; + + // Executes query to estimate spatial extent of features // in given geometry column in a table. // Table is used with full path: schema.table. Modified: branches/3.4/Providers/PostGIS/Src/Provider/PostGisProvider.h =================================================================== --- branches/3.4/Providers/PostGIS/Src/Provider/PostGisProvider.h 2009-09-28 07:48:00 UTC (rev 4970) +++ branches/3.4/Providers/PostGIS/Src/Provider/PostGisProvider.h 2009-09-28 08:45:46 UTC (rev 4971) @@ -101,7 +101,7 @@ const wchar_t SpatialContextDefaultName[8] = L"Default"; const wchar_t SpatialContextDefaultDesc[50] = L"Defines default properties of coordinate system."; -const wchar_t SpatialContextDefaultCoordSysName[8] = L"Unknown"; +const wchar_t SpatialContextDefaultCoordSysName[2] = L""; const wchar_t SpatialContextDefaulWkt[2] = L""; const double SpatialContextDefaultXYTolerance = 0.05; const double SpatialContextDefaultZTolerance = 0.05; Modified: branches/3.4/Providers/PostGIS/Src/Provider/PostGisProvider.vcproj =================================================================== --- branches/3.4/Providers/PostGIS/Src/Provider/PostGisProvider.vcproj 2009-09-28 07:48:00 UTC (rev 4970) +++ branches/3.4/Providers/PostGIS/Src/Provider/PostGisProvider.vcproj 2009-09-28 08:45:46 UTC (rev 4971) @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="windows-1250"?> <VisualStudioProject ProjectType="Visual C++" - Version="9,00" + Version="9.00" Name="PostGisProvider" ProjectGUID="{81A1E411-2952-42B5-8430-B588A89D9BE2}" RootNamespace="Provider" @@ -18,7 +18,7 @@ <Configurations> <Configuration Name="Debug|Win32" - OutputDirectory="..\..\Bin\Win32\Debug" + OutputDirectory="C:\Program Files\AutoCAD Map 3D 2010\FDO\bin" IntermediateDirectory="..\..\Obj\Win32\Debug\Provider" ConfigurationType="2" InheritedPropertySheets="..\PostGis.vsprops" @@ -100,7 +100,7 @@ </Configuration> <Configuration Name="Release|Win32" - OutputDirectory="..\..\Bin\Win32\Release" + OutputDirectory="C:\Program Files\AutoCAD Map 3D 2010\FDO\bin" IntermediateDirectory="..\..\Obj\Win32\Release\Provider" ConfigurationType="2" InheritedPropertySheets="..\PostGis.vsprops" @@ -177,7 +177,7 @@ <Tool Name="VCPostBuildEventTool" Description="Versioning PostGISProvider.dll" - CommandLine="$(FDOTHIRDPARTY)\util\stampver\StampVer.exe -v"..\..\..\SubDoc\Providers.version" -f"3.4.0.0%PROVIDERS_VERSION%" $(OutDir)\PostGISProvider.dll" + CommandLine="$(FDOTHIRDPARTY)\util\stampver\StampVer.exe -v"..\..\..\SubDoc\Providers.version" -f"3.4.0.0%PROVIDERS_VERSION%" "$(OutDir)\PostGISProvider.dll"" /> </Configuration> </Configurations> @@ -446,6 +446,14 @@ Name="SpatialContext" > <File + RelativePath=".\CreateSpatialContextCommand.cpp" + > + </File> + <File + RelativePath=".\CreateSpatialContextCommand.h" + > + </File> + <File RelativePath=".\GetSpatialContextsCommand.cpp" > </File> Modified: branches/3.4/Providers/PostGIS/Src/Provider/SQLDataReader.cpp =================================================================== --- branches/3.4/Providers/PostGIS/Src/Provider/SQLDataReader.cpp 2009-09-28 07:48:00 UTC (rev 4970) +++ branches/3.4/Providers/PostGIS/Src/Provider/SQLDataReader.cpp 2009-09-28 08:45:46 UTC (rev 4971) @@ -416,7 +416,9 @@ try { - if ((mCurrentTuple + 1 )>= mCursor->GetTuplesCount()) + FdoSize nbTupples = mCursor->GetTuplesCount(); + //if(nbTupples == 0) return eof; + if ((mCurrentTuple + 1 )>= nbTupples) { PgCursor::ResultPtr pgRes = mCursor->Fetch(mCoursorPageSize); if (PGRES_TUPLES_OK == PQresultStatus(pgRes)) Modified: branches/3.4/Providers/PostGIS/Src/Provider/SchemaDescription.cpp =================================================================== --- branches/3.4/Providers/PostGIS/Src/Provider/SchemaDescription.cpp 2009-09-28 07:48:00 UTC (rev 4970) +++ branches/3.4/Providers/PostGIS/Src/Provider/SchemaDescription.cpp 2009-09-28 08:45:46 UTC (rev 4971) @@ -69,6 +69,15 @@ return mIsDescribed; } +void SchemaDescription::ResetSchema() +{ + + FDO_SAFE_RELEASE(mLogicalSchemas.p); + FDO_SAFE_RELEASE(mSchemaMapping.p); + FDO_SAFE_RELEASE(mSpatialContexts.p); + mIsDescribed = false; +} + void SchemaDescription::SetLogicalSchemas(FdoFeatureSchemaCollection* logicalSchemas) { mLogicalSchemas = logicalSchemas; Modified: branches/3.4/Providers/PostGIS/Src/Provider/SchemaDescription.h =================================================================== --- branches/3.4/Providers/PostGIS/Src/Provider/SchemaDescription.h 2009-09-28 07:48:00 UTC (rev 4970) +++ branches/3.4/Providers/PostGIS/Src/Provider/SchemaDescription.h 2009-09-28 08:45:46 UTC (rev 4971) @@ -53,9 +53,11 @@ // default schema name: FdoPostGIS. // void DescribeSchema(Connection* conn, FdoString* schemaName); - + /// Get flag indicating if schema has been successfully described. bool IsDescribed() const; + + void ResetSchema(); void SetLogicalSchemas(FdoFeatureSchemaCollection* logicalSchemas); void SetSchemaMapping(ov::PhysicalSchemaMapping* phSchemaMapping); _______________________________________________ fdo-commits mailing list [hidden email] http://lists.osgeo.org/mailman/listinfo/fdo-commits _______________________________________________ fdo-internals mailing list [hidden email] http://lists.osgeo.org/mailman/listinfo/fdo-internals |
||||||||||||||||
| Free Embeddable Forum Powered by Nabble | Help |