Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
// 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;
}
Exemplo n.º 3
0
// 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;
}
Exemplo n.º 4
0
// 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;
}