private bool HandleDatasetMerged(Dataset localDataset, List<string> mergedDatasetNames)
{
Debug.LogWarning("Sync merge");
if (mergeInCourse) {
Debug.LogWarning ("Already in a merge");
return false;
}
//This variable can be used to hold the game from actually starting
//and show a loading indicator to the user meanwhile
mergeInCourse = true;
//Delete the merged datasets and just keep the local data
foreach (string name in mergedDatasetNames) {
Dataset mergedDataset = syncManager.OpenOrCreateDataset(name);
//mergedDataset.Delete(); //Remove any data we could have from a previous execution of this handler
//Lambda function to delete the dataset after fetching it
EventHandler<SyncSuccessEvent> lambda =null;
Debug.Log ("fetching dataset to merge: " + name);
lambda = (object sender, SyncSuccessEvent e) => {
//Actual merge code: We join the local characters and the remote characters into a new single dataset.
List<string> allCharacters = new List<string>();
ICollection<string> existingCharacters = localDataset.GetAll().Values;
ICollection<string> newCharacters = mergedDataset.GetAll().Values;
Debug.LogWarning(localDataset.Metadata.DatasetName + ": " + existingCharacters.Count);
Debug.LogWarning(mergedDataset.Metadata.DatasetName + ": " + newCharacters.Count);
allCharacters.AddRange(existingCharacters);
allCharacters.AddRange(newCharacters);
int i = 0;
foreach (string characterString in allCharacters) {
localDataset.Put (indexToKey(i++), characterString);
}
Debug.Log ("deleting merged dataset: " + name);
mergedDataset.Delete(); //Delete the dataset locally
mergedDataset.OnSyncSuccess -= lambda; //We don't want this callback to be fired again
mergedDataset.OnSyncSuccess += (object s2, SyncSuccessEvent e2) => {
Debug.Log ("merge comleted (dataset merged and deleted)");
mergeInCourse = false;
localDataset.Synchronize(); //Continue the sync operation that was interrupted by the merge
};
mergedDataset.Synchronize(); //Synchronize it as deleted, failing to do so will leave us in an inconsistent state
};
mergedDataset.OnSyncSuccess += lambda;
mergedDataset.Synchronize(); //Asnchronously fetch the dataset
}
// returning true allows the Synchronize to continue and false cancels it
return true;
}