// 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; }
void FbDatabase::JoinThread(FbThread * thread) { sqlite3 * db = (sqlite3*) GetDatabaseHandle(); if (db) sqlite3_progress_handler( db, 100, DatabaseThreadCallback, thread); }