GWSExtendedFeatureId GwsCommonFdoUtils::MakeFeatureId ( const GWSQualifiedName & classname, FdoPtr<FdoPropertyValueCollection> ident, const wchar_t * ltname ) { static_cast<void>(&(ltname)); // For "unreferenced formal parameter" warning static GWSExtendedFeatureId s_fid; try { CGwsDataValueCollection * keyvals = NULL; keyvals = (CGwsDataValueCollection *) CGwsDataValueCollection::Create (); int size = ident->GetCount (); for (int i = 0; i < size ; i++) { FdoPtr<FdoPropertyValue> propval; FdoPtr<FdoDataValue> value; propval = ident->GetItem (i); value = (FdoDataValue *) propval->GetValue (); keyvals->Add (value); } return GWSExtendedFeatureId (classname, keyvals); } catch (FdoException * e) { assert (false); e->Release (); } return s_fid; }
FdoLOBValue* FdoXmlFeatureReaderImpl::GetBLOBProperty(FdoString* name) { FdoPtr<FdoLOBValue> rv; FdoPtr<FdoXmlBLOBProperty> blobProp = m_blobProperties->FindItem(name); if (blobProp != NULL) { rv = blobProp->GetValue(); } return FDO_SAFE_ADDREF(rv.p); }
MgPropertyCollection* MgdUpdateFeaturesCommand::ExecuteInsert(MgResourceIdentifier* resource, CREFSTRING className, MgBatchPropertyCollection* batchPropertyValues, MgTransaction* trans) { Ptr<MgPropertyCollection> ret; MG_FEATURE_SERVICE_TRY() CHECK_FEATURE_SOURCE_ARGUMENT(resource, L"MgdUpdateFeaturesCommand::ExecuteInsert"); CHECKARGUMENTNULL(batchPropertyValues, L"MgdUpdateFeaturesCommand::ExecuteInsert"); if (className.empty()) throw new MgNullArgumentException(L"MgdUpdateFeaturesCommand::ExecuteInsert", __LINE__, __WFILE__, NULL, L"", NULL); ret = new MgPropertyCollection(); Ptr<MgdFeatureConnection> connWrap; FdoPtr<FdoIConnection> conn; FdoPtr<FdoITransaction> fdoTrans; Ptr<MgdTransaction> mgTrans = dynamic_cast<MgdTransaction*>(trans); if (NULL != mgTrans) { SAFE_ADDREF(mgTrans.p); Ptr<MgResourceIdentifier> origFeatureSource = mgTrans->GetFeatureSource(); //Check that the transaction originates from the same feature source if (origFeatureSource->ToString() != resource->ToString()) throw new MgInvalidArgumentException(L"MgdUpdateFeaturesCommand::ExecuteInsert", __LINE__, __WFILE__, NULL, L"", NULL); connWrap = mgTrans->GetConnection(); //Connection is already open fdoTrans = mgTrans->GetFdoTransaction(); } else { connWrap = new MgdFeatureConnection(resource); } conn = connWrap->GetConnection(); FdoPtr<FdoIInsert> insert = (FdoIInsert*)conn->CreateCommand(FdoCommandType_Insert); insert->SetFeatureClassName(className.c_str()); FdoPtr<FdoPropertyValueCollection> propVals = insert->GetPropertyValues(); if (NULL != fdoTrans.p) insert->SetTransaction(fdoTrans); //TODO: Support batch parameters, the main beneficiary of this API. Even then, //the value flipping approach employed here has performance benefits for certain //providers, like SQLite for (INT32 i = 0; i < batchPropertyValues->GetCount(); i++) { Ptr<MgPropertyCollection> propertyValues = batchPropertyValues->GetItem(i); //First feature, set up the FDO property value collection if (i == 0) { for (INT32 i = 0; i < propertyValues->GetCount(); i++) { Ptr<MgProperty> mgp = propertyValues->GetItem(i); FdoPtr<FdoPropertyValue> pv = MgdFeatureUtil::MgPropertyToFdoProperty(mgp); propVals->Add(pv); } } else //Feature after the first { //Set all to null for (INT32 i = 0; i < propVals->GetCount(); i++) { FdoPtr<FdoPropertyValue> fp = propVals->GetItem(i); FdoPtr<FdoValueExpression> expr = fp->GetValue(); FdoDataValue* fdv = dynamic_cast<FdoDataValue*>(expr.p); FdoGeometryValue* fgv = dynamic_cast<FdoGeometryValue*>(expr.p); if (fdv) { fdv->SetNull(); } else if (fgv) { fgv->SetNullValue(); } } //Now set the appropriate values. MgdFeatureUtil does the work for (INT32 i = 0; i < propertyValues->GetCount(); i++) { Ptr<MgNullableProperty> mgp = (MgNullableProperty*)propertyValues->GetItem(i); if (!mgp->IsNull()) { FdoPtr<FdoPropertyValue> fp = propVals->GetItem(mgp->GetName().c_str()); MgdFeatureUtil::UpdateFdoPropertyValue(fp, mgp); } } } STRING sIndex; MgUtil::Int32ToString(i, sIndex); //Insert and stash the result in the property collection FdoPtr<FdoIFeatureReader> insertRes = insert->Execute(); Ptr<MgFeatureReader> fr = new MgdFeatureReader(connWrap, insertRes); Ptr<MgFeatureProperty> fp = new MgFeatureProperty(sIndex, fr); ret->Add(fp); } MG_FEATURE_SERVICE_CATCH_AND_THROW_WITH_FEATURE_SOURCE(L"MgdUpdateFeaturesCommand::ExecuteInsert", resource) return ret.Detach(); }