Freigeben über


IDestinationChangeVersionsBuilder::AddItemMetadata

Fügt der Liste eine angegebene Elementänderung hinzu.

HRESULT AddItemMetadata(
  const BYTE * pbOwnerReplicaId, 
  const BYTE * pbItemId, 
  const SYNC_VERSION * pChangeVersion,
  const SYNC_VERSION * pCreationVersion, 
  DWORD dwFlags,
  ISyncChangeBuilder ** ppChangeBuilder);

Parameter

  • pbOwnerReplicaId
    [in] Die Replikat-ID des Replikats, in dem pChangeVersion und pCreationVersion gültig sind. Das ID-Format muss mit dem Format übereinstimmen, das von der ID_PARAMETERS-Struktur des Anbieters angegeben wird.
  • pbItemId
    [in] Die ID des Elements. Das ID-Format muss mit dem Format übereinstimmen, das von der ID_PARAMETERS-Struktur des Anbieters angegeben wird.
  • pChangeVersion
    [in] Die Version dieser Änderung.
  • pCreationVersion
    [in] Die Erstellungsversion des Elements.
  • dwFlags
    [in] Flags, die den Status der Elementänderung angeben. Die Flagwerte finden Sie unter SYNC_CHANGE_FLAG-Flags.
  • ppChangeBuilder
    [out] Gibt ein Objekt zurück, das verwendet werden kann, um der Änderung Informationen über die Änderungseinheit hinzuzufügen.

Rückgabewert

  • S_OK

  • E_POINTER

  • E_INVALIDARG, wenn dwFlags andere Werte als SYNC_CHANGE_FLAG_DELETED oder SYNC_CHANGE_FLAG_DOES_NOT_EXIST enthält.

  • SYNC_E_INVALID_OPERATION, wenn ein ungültiger Vorgang auftritt.

  • SYNC_E_ID_FORMAT_MISMATCH, wenn das Format von pbOwnerReplicaId oder pbItemId nicht mit dem Format übereinstimmt, das vom ID-Formatschema des Anbieters angegeben wird.

Beispiel

Im folgenden Beispiel wird dargestellt, wie Sie Änderungen in einem Remoteänderungsbatch auflisten und eine Liste entsprechender lokaler Versionen erstellen, indem Sie AddItemMetadata verwenden, um lokale Versionen zu einem IDestinationChangeVersionsBuilder-Objekt hinzuzufügen. Im Beispiel wird weiterhin IDestinationChangeVersionsBuilder::GetChangeEnumerator verwendet, um die Liste lokaler Versionen zurückzugeben.

STDMETHODIMP CMetadataMgr::GetItemBatchVersions(
    ISyncChangeBatch * pRemoteSyncChangeBatch,
    IEnumSyncChanges ** ppLocalVersionsEnum)
{
    HRESULT hr = E_UNEXPECTED;

    if (NULL == pRemoteSyncChangeBatch || NULL == ppLocalVersionsEnum)
    {
        hr = E_POINTER;
    }
    else
    {
        IProviderSyncServices* pProvSvc;
        hr = GetProviderSyncServices(&c_idParams, &pProvSvc);
        if (SUCCEEDED(hr))
        {
            IDestinationChangeVersionsBuilder* pDestChangeBuilder = NULL;
            hr = pProvSvc->CreateDestinationChangeVersionsBuilder(&pDestChangeBuilder);
            if (SUCCEEDED(hr))
            {
                IEnumSyncChanges* pRemoteEnum = NULL;
                hr = pRemoteSyncChangeBatch->GetChangeEnumerator(&pRemoteEnum);
                if (SUCCEEDED(hr))
                {
                    ULONG cFetched;

                    ISyncChange* pChange;
                    SYNC_GID gidItem;
                    DWORD cbID = sizeof(gidItem);
                    DWORD dwFlags;
                    SYNC_VERSION verCurrent;
                    SYNC_VERSION verCreation;
                    HRESULT hrEnum = S_OK;
                    while (S_OK == hrEnum && SUCCEEDED(hr))
                    {
                        pChange = NULL;
                        hrEnum = pRemoteEnum->Next(1, &pChange, &cFetched);
                        if (S_OK == hrEnum)
                        {
                            hr = pChange->GetRootItemId((BYTE*)&gidItem, &cbID);
                            if (SUCCEEDED(hr))
                            {
                                // Try to find the item in the local (destination) metadata.
                                IItemMetadata* pItem = NULL;
                                hr = FindItemMetadataByGlobalId((BYTE*)&gidItem, &pItem);
                                if (S_OK == hr)
                                {
                                    // S_OK means the item exists in our local store.
                                    // Extract its version and tombstone information.
                                    dwFlags = 0;

                                    BOOL fTombstone = FALSE;
                                    hr = pItem->GetIsDeleted(&fTombstone);
                                    if (SUCCEEDED(hr))
                                    {
                                        if (fTombstone)
                                        {
                                            dwFlags = SYNC_CHANGE_FLAG_DELETED;
                                        }
                                    }

                                    if (SUCCEEDED(hr))
                                    {
                                        hr = pItem->GetChangeVersion(&verCurrent);
                                        if (SUCCEEDED(hr))
                                        {
                                            hr = pItem->GetCreationVersion(&verCreation);                                            
                                        }
                                    }

                                    pItem->Release();
                                }
                                else if (S_FALSE == hr)
                                {
                                    // S_FALSE means this item does not exist in our local store.
                                    // Set versions to 0 and flag it as a new item.
                                    verCurrent.dwLastUpdatingReplicaKey = 0;
                                    verCurrent.ullTickCount = 0;
                                    verCreation.dwLastUpdatingReplicaKey = 0;
                                    verCreation.ullTickCount = 0;
                                    dwFlags = SYNC_CHANGE_FLAG_DOES_NOT_EXIST;
                                }

                                if (SUCCEEDED(hr))
                                {
                                    // Add the item to the batch of destination versions.
                                    GUID guidReplicaID = GUID_NULL;
                                    ULONG cbID = sizeof(guidReplicaID);
                                    hr = GetReplicaId((BYTE*)&guidReplicaID, &cbID);
                                    if (SUCCEEDED(hr))
                                    {
                                        hr = pDestChangeBuilder->AddItemMetadata((BYTE*)&guidReplicaID,
                                            (BYTE*)&gidItem, &verCurrent, &verCreation, dwFlags, NULL);
                                    }
                                }
                            }

                            pChange->Release();
                        }
                    }

                    if (FAILED(hrEnum))
                    {
                        hr = hrEnum;                    
                    }

                    pRemoteEnum->Release();                
                }

                if (SUCCEEDED(hr))
                {
                    hr = pDestChangeBuilder->GetChangeEnumerator(ppLocalVersionsEnum);               
                }

                pDestChangeBuilder->Release();
            }

            pProvSvc->Release();        
        }
    }

    return hr;
}

Siehe auch

Verweis

IDestinationChangeVersionsBuilder-Schnittstelle