HRESULT CFastdbFeature::OnChangedName() { USES_CONVERSION; COM_TRY { // neuen Namen vom Bezugsobjekt besorgen CComBSTR bstrName; WTRiASFeature BaseFeat; THROW_FAILED_HRESULT(m_BaseUnk -> QueryInterface (BaseFeat.ppi())); THROW_FAILED_HRESULT(BaseFeat -> get_Name(CLEARED(&bstrName))) // zugehöriges DB-Objekt referenzieren LONG lCursor (GetPropertyFrom (BaseFeat, g_cbFeatureCursor, 0L)); if (0 != lCursor) { // Objekt fertig initialisiert dbCursor<CDBFeatureDesc> cursor (GetRelatedDatabase(GetUnknown()), dbCursorForUpdate); CDBFeatureDesc *pFeatDesc = cursor.at (dbReference<CDBFeatureDesc>(oid_t(lCursor))); if (NULL == pFeatDesc || cursor.isEmpty()) THROW_FAILED_HRESULT(FASTDB_E_FEATURE_BADREFERENCE); cursor -> m_pName = OLE2A(bstrName); cursor.update(); } } COM_CATCH; return S_OK; }
// eine neue Objekteigenschaft soll erzeugt werden STDMETHODIMP CFastdbFeatures::OnCreate (VARIANT Name, BSTR Type, FEATURETYPE rgType, ITRiASFeature **ppIFeat) { CHECKOUTPOINTER(ppIFeat); USES_CONVERSION; COM_TRY { // jetzt wirklich erzeugen CIID ClsId (Type, CIID::INITCIID_InitFromProgId); if (!ClsId) ClsId = CLSID_FastdbFeature; // default ClsId WTRiASFeatures BaseFeats; WDispatch Parent; THROW_FAILED_HRESULT(m_BaseUnk -> QueryInterface (BaseFeats.ppi())); THROW_FAILED_HRESULT(BaseFeats -> get_Parent (Parent.ppi())); // Parent muß hier Objektklasse sein WTRiASObjects Objs; THROW_FAILED_HRESULT(Parent -> QueryInterface (Objs.ppi())); // neuen Satz erzeugen und zu der Objektklasse hinzufügen LONG lCursor (GetPropertyFrom (Objs, g_cbObjectsCursor, 0L)); _ASSERTE(0 != lCursor); dbDatabase *pdb = GetRelatedDatabase(GetUnknown()); dbCursor<CDBClass> cursor (pdb); CDBClass *pClass = cursor.at (dbReference<CDBClass>(oid_t(lCursor))); if (NULL == pClass || cursor.isEmpty()) THROW_FAILED_HRESULT(FASTDB_E_OBJECTS_BADREFERENCE); CComVariant vVal; CDBFeatureDesc FDesc; THROW_FAILED_HRESULT(vVal.ChangeType (VT_BSTR, &Name)); FDesc.m_pName = OLE2A(V_BSTR(&vVal)); FDesc.m_rgType = rgType; FDesc.objclass = cursor.currentId(); dbCursor<CDBFeatureDesc> featuredesc (GetRelatedDatabase(GetUnknown())); featuredesc.at (pdb -> insert (FDesc)); THROW_FAILED_HRESULT(SetupFeature (ClsId, BaseFeats, featuredesc, Parent, ppIFeat)); } COM_CATCH; return S_OK; }
// Lesen der Metadaten für eine Objektmenge HRESULT DatenBasisObjekt::GetPBDDataMerkmal (HPROJECT hPr, PBDDATA *pData) { TX_ASSERT(IsTRiASDBBased()); VARIANT_BOOL fNameIsDefault = VARIANT_TRUE; USES_CONVERSION; { // wenns ein Ansichtsmerkmal sein soll, dann einfach wieder raus if ((sizeof(PBDMERKMAL) == pData -> dwSize || sizeof(PBDMERKMALEX) == pData -> dwSize) && MPViewFeature == (((PBDMERKMAL *)pData) -> ipbdMTyp & 0x7F)) { return HRESULT_FROM_ERRCODE(WC_NOTFOUND); } // Objekteigenschaft aus globaler Tabelle lesen WTRiASFeature Feat; HRESULT hr = S_OK; if (FAILED(hr = GetFeatureFromMap (pData -> pbdCode, Feat))) return hr; // Testen, ob das gefundene Feature zur geforderten Datenquelle paßt if (HACTCONNECTION != hPr) { HPROJECT hPrTarget = NULL; RETURN_FAILED_HRESULT(GetDatabaseHandle (Feat, &hPrTarget)); if (hPrTarget != hPr) // MCode aus anderer Datenquelle return HRESULT_FROM_ERRCODE(WC_NOTFOUND); } // Namen lesen und in Rückgabestruktur setzen CComBSTR bstr; RETURN_FAILED_HRESULT(Feat -> get_Name (CLEARED(&bstr))); fNameIsDefault = GetPropertyFrom (Feat, g_cbNameIsDefault, VARIANT_FALSE); char *pStr = OLE2A(bstr); if (pData -> pbdKTextLen > 0 && NULL != pData -> pbdKText) { if (pStr) { int iLen = strlen (pStr); iLen = min(iLen, pData -> pbdKTextLen-1); strncpy (pData -> pbdKText, pStr, iLen); pData -> pbdKText[iLen] = '\0'; pData -> pbdKTextLen = iLen; } else { *pData -> pbdKText = '\0'; pData -> pbdKTextLen = 0; } } else pData -> pbdKTextLen = (NULL != pStr) ? strlen(pStr)+1 : 0; // benötigte Buffergröße liefern // BeschreibungsInfo lesen und in Rückgabestruktur setzen CComBSTR bstrLT; if (SUCCEEDED(Feat -> get_Description (CLEARED(&bstrLT)))) { // möglicherweise wird 'get_Description' nicht unterstützt char *pStr = OLE2A(bstrLT); if (pData -> pbdLTextLen > 0 && NULL != pData -> pbdLText) { if (pStr) { int iLen = strlen (pStr); iLen = min(iLen, pData -> pbdLTextLen-1); strncpy (pData -> pbdLText, pStr, iLen); pData -> pbdLText[iLen] = '\0'; pData -> pbdLTextLen = iLen; } else { *pData -> pbdLText = '\0'; pData -> pbdLTextLen = 0; } } else pData -> pbdLTextLen = (NULL != pStr) ? strlen(pStr)+1 : 0; // benötigte Buffergröße liefern } else pData -> pbdLTextLen = 0; // evtl. zusätzliche Infos liefern if (sizeof(PBDMERKMAL) == pData -> dwSize || sizeof(PBDMERKMALEX) == pData -> dwSize) { PBDMERKMAL *pPbdM = (PBDMERKMAL *)pData; FEATURETYPE rgType = FEATURETYPE_Unknown; pPbdM -> ipbdMTyp = 'a'; // Objektmerkmal if (SUCCEEDED(Feat -> get_Type (&rgType))) { // Typ der Objekteigenschaft festellen switch (VT_FROM_DATATYPE(rgType)) { case VT_I4: case VT_I2: case VT_I1: case VT_INT: case VT_UI4: case VT_UI2: case VT_UI1: case VT_UINT: case VT_BOOL: case VT_ERROR: pPbdM -> ipbdMTyp = 'i'; break; case VT_R4: case VT_R8: case VT_DATE: pPbdM -> ipbdMTyp = 'f'; break; default: break; // VT_BSTR --> 'a' } // zusätzliche if (rgType & FEATURETYPE_System) pPbdM -> ipbdMTyp |= PBDMERKMAL_SYSTEMFLAG; if (rgType & FEATURETYPE_ReadOnly) pPbdM -> ipbdMTyp |= PBDMERKMAL_READONLY; } // Platzbedarf der Objekteigenschaft feststellen long lLen = 0; if (SUCCEEDED(Feat -> get_Length (&lLen))) pPbdM -> ipbdMLen = lLen; else pPbdM -> ipbdMLen = _MAX_PATH; // doch recht willkürlich } } return fNameIsDefault ? S_FALSE : S_OK; }
// Lesen der Metadaten für eine Objektmenge HRESULT DatenBasisObjekt::GetPBDDataIdent (HPROJECT hPr, PBDDATA *pData) { TX_ASSERT(IsTRiASDBBased()); VARIANT_BOOL fNameIsDefault = VARIANT_TRUE; USES_CONVERSION; { // Objektmenge aus globaler Tabelle lesen WTRiASObjects Objs; HRESULT hr = S_OK; if (FAILED(hr = GetObjectsFromMap (pData -> pbdCode, Objs))) return hr; // Testen, ob das gefundene Objektmenge zur geforderten Datenquelle paßt if (HACTCONNECTION != hPr) { HPROJECT hPrTarget = NULL; RETURN_FAILED_HRESULT(GetDatabaseOrProjectHandle (Objs, &hPrTarget)); if (hPrTarget != hPr) // Ident aus anderer Datenquelle return HRESULT_FROM_ERRCODE(WC_NOTFOUND); } // Namen lesen und in Rückgabestruktur setzen CComBSTR bstr; RETURN_FAILED_HRESULT(Objs -> get_Name (CLEARED(&bstr))); fNameIsDefault = GetPropertyFrom (Objs, g_cbNameIsDefault, VARIANT_TRUE); char *pStr = OLE2A(bstr); if (pData -> pbdKTextLen > 0 && NULL != pData -> pbdKText) { if (pStr) { int iLen = strlen (pStr); iLen = min(iLen, pData -> pbdKTextLen-1); strncpy (pData -> pbdKText, pStr, iLen); pData -> pbdKText[iLen] = '\0'; pData -> pbdKTextLen = iLen; } else { *pData -> pbdKText = '\0'; pData -> pbdKTextLen = 0; } } else pData -> pbdKTextLen = (NULL != pStr) ? strlen(pStr)+1 : 0; // benötigte Buffergröße liefern // BeschreibungsInfo lesen und in Rückgabestruktur setzen CComBSTR bstrLT; if (SUCCEEDED(Objs -> get_Description (CLEARED(&bstrLT)))) { // möglicherweise wird 'get_Description' nicht unterstützt char *pStr = OLE2A(bstrLT); if (pData -> pbdLTextLen > 0 && NULL != pData -> pbdLText) { if (pStr) { int iLen = strlen (pStr); iLen = min(iLen, pData -> pbdLTextLen-1); strncpy (pData -> pbdLText, pStr, iLen); pData -> pbdLText[iLen] = '\0'; pData -> pbdLTextLen = iLen; } else { *pData -> pbdLText = '\0'; pData -> pbdLTextLen = 0; } } else pData -> pbdLTextLen = (NULL != pStr) ? strlen(pStr)+1 : 0; // benötigte Buffergröße liefern } else pData -> pbdLTextLen = 0; } return fNameIsDefault ? S_FALSE : S_OK; }