private UpdateCollectionMessage CreateUpdateCollectionMessage(DataMessage dataMessage, Sequence sequence, Identity identity, int position, int updateMode) { UpdateCollectionMessage updateCollectionMessage = new UpdateCollectionMessage(); // The unique identifier for the collection that was updated. For a collection filled with the // DataService.fill() method this contains an Array of the parameters specified. updateCollectionMessage.collectionId = sequence.Parameters; updateCollectionMessage.destination = dataMessage.destination; updateCollectionMessage.replace = false; updateCollectionMessage.updateMode = updateMode; updateCollectionMessage.messageId = "srv:" + Guid.NewGuid().ToString("D") + ":0"; updateCollectionMessage.correlationId = dataMessage.correlationId; UpdateCollectionRange updateCollectionRange = new UpdateCollectionRange(); // An Array of identity objects that represent which items were either deleted or inserted in the // associated collection starting at the position indicated by the position property updateCollectionRange.identities = new object[1]; //(updateCollectionRange.identities as IList).Add( identity ); (updateCollectionRange.identities as object[])[0] = identity; updateCollectionRange.updateType = UpdateCollectionRange.InsertIntoCollection; updateCollectionRange.position = position; //ArrayList body = new ArrayList(); //body.Add(updateCollectionRange); object[] body = new object[1]; body[0] = updateCollectionRange; updateCollectionMessage.body = body; return(updateCollectionMessage); }
private void ApplyUpdateCollectionMessage(Sequence sequence, UpdateCollectionMessage updateCollectionMessage) { IList body = updateCollectionMessage.body as IList; for (int i = 0; i < body.Count; i++) { UpdateCollectionRange range = body[i] as UpdateCollectionRange; int num2 = 0; for (int j = 0; j < range.identities.Length; j++) { Identity identity = range.identities[j] as Identity; if (identity == null) { identity = new Identity(range.identities[j] as IDictionary); } if (range.updateType == 0) { this.AddIdentityToSequence(sequence, range.position + num2, identity, null); num2++; } if (range.updateType == 1) { this.RemoveIdentityFromSequence(sequence, identity, range.position, null); } } } }
void ApplyUpdateCollectionMessage(Sequence sequence, UpdateCollectionMessage updateCollectionMessage) { IList updateCollectionRanges = updateCollectionMessage.body as IList; for (int k = 0; k < updateCollectionRanges.Count; k++) { UpdateCollectionRange updateCollectionRange = updateCollectionRanges[k] as UpdateCollectionRange; int insertCount = 0; for (int l = 0; l < updateCollectionRange.identities.Length; l++) { Identity identity = updateCollectionRange.identities[l] as Identity; if (identity == null) { identity = new Identity(updateCollectionRange.identities[l] as IDictionary); } if (updateCollectionRange.updateType == UpdateCollectionRange.InsertIntoCollection) { this.AddIdentityToSequence(sequence, updateCollectionRange.position + insertCount, identity, null); insertCount++; } if (updateCollectionRange.updateType == UpdateCollectionRange.DeleteFromCollection) { this.RemoveIdentityFromSequence(sequence, identity, updateCollectionRange.position, null); } } } }
public void ManageMessageBatch(MessageBatch messageBatch, DataServiceTransaction dataServiceTransaction) { DataMessage dataMessage = messageBatch.IncomingMessage; //Manage existing sequences for (int j = 0; j < messageBatch.Messages.Count; j++) { IMessage message = messageBatch.Messages[j] as IMessage; if (message is UpdateCollectionMessage) { UpdateCollectionMessage updateCollectionMessage = message as UpdateCollectionMessage; //update collections, fix sequences IList fillParameters = updateCollectionMessage.collectionId as IList; Sequence sequence = _dataDestination.SequenceManager.GetSequence(fillParameters); if (sequence != null) { ApplyUpdateCollectionMessage(sequence, updateCollectionMessage); } } } for (int j = 0; j < messageBatch.Messages.Count; j++) { DataMessage dataMessageTmp = messageBatch.Messages[j] as DataMessage; if (dataMessageTmp != null) { switch (dataMessageTmp.operation) { case DataMessage.CreateAndSequenceOperation: { //dataMessage.identity contains identity //dataMessage.body contains the object IList result = new ArrayList(); result.Add(dataMessageTmp.body); //Will generate an UpdateCollectionMessage too (server adding item to collection) Sequence sequence = this.CreateSequence(dataMessageTmp.clientId as string, result, null, dataServiceTransaction); SequencedMessage sequencedMessage = this.GetSequencedMessage(dataMessageTmp, sequence); messageBatch.Messages[j] = sequencedMessage; } break; } } } for (int j = 0; j < messageBatch.Messages.Count; j++) { if (messageBatch.Messages[j] is DataMessage) { DataMessage dataMessageTmp = messageBatch.Messages[j] as DataMessage; SyncSequenceChanges(dataMessageTmp, dataServiceTransaction); } if (messageBatch.Messages[j] is SequencedMessage) { SequencedMessage sequencedMessage = messageBatch.Messages[j] as SequencedMessage; DataMessage dataMessageTmp = sequencedMessage.dataMessage; SyncSequenceChanges(dataMessageTmp, dataServiceTransaction); } } }
private IMessage UpdateCollection(UpdateCollectionMessage updateCollectionMessage, IList messages) { IList updateCollectionRanges = updateCollectionMessage.body as IList; for (int i = 0; i < updateCollectionRanges.Count; i++) { UpdateCollectionRange updateCollectionRange = updateCollectionRanges[i] as UpdateCollectionRange; for (int j = 0; j < updateCollectionRange.identities.Length; j++) { string messageId = updateCollectionRange.identities[j] as string; Identity identity = null; if (messageId != null) { //Search for previous Create or CreateAndSequence //This was a "pending update collection" sent from the client and it must be replaced by the actual Identity IMessage refMessage = GetMessage(messages, messageId); DataMessage dataMessage = refMessage as DataMessage; if (dataMessage != null) { DataDestination dataDestination = this.Destination as DataDestination; identity = Identity.GetIdentity(dataMessage.body, dataDestination); } //replace with the actual identity updateCollectionRange.identities[j] = identity; } else { IDictionary identityMap = updateCollectionRange.identities[j] as IDictionary; if (identityMap != null) { identity = new Identity(identityMap); } } IList fillParameters = updateCollectionMessage.collectionId as IList; IAssembler assembler = GetAssembler(); if (assembler != null) { if (updateCollectionRange.updateType == UpdateCollectionRange.InsertIntoCollection) { assembler.AddItemToFill(fillParameters, updateCollectionRange.position + j, identity); } if (updateCollectionRange.updateType == UpdateCollectionRange.DeleteFromCollection) { assembler.RemoveItemFromFill(fillParameters, updateCollectionRange.position, identity); } } } } return(updateCollectionMessage); }
internal void GenerateUpdateCollectionMessage(int updateType, DataDestination dataDestination, Sequence sequence, int position, Identity identity) { UpdateCollectionMessage message = this.CreateUpdateCollectionMessage(dataDestination, sequence); message.AddItemIdentityChange(updateType, position, identity); if (message.collectionId != null) { this._updateCollectionMessages[message.collectionId] = message; } else { this._updateCollectionMessages[new object[0]] = message; } }
private UpdateCollectionMessage CreateUpdateCollectionMessage(DataDestination dataDestination, Sequence sequence) { UpdateCollectionMessage message = new UpdateCollectionMessage { clientId = this.ClientId, updateMode = 1, collectionId = sequence.Parameters, destination = dataDestination.Id, correlationId = this.CorrelationId, messageId = "srv:" + Guid.NewGuid().ToString("D") + ":" + _idCounter.ToString() }; Interlocked.Increment(ref _idCounter); return(message); }
public void ManageMessageBatch(MessageBatch messageBatch, DataServiceTransaction dataServiceTransaction) { int num; Sequence sequence; DataMessage dataMessage; SequencedMessage sequencedMessage; DataMessage incomingMessage = messageBatch.IncomingMessage; for (num = 0; num < messageBatch.Messages.Count; num++) { IMessage message2 = messageBatch.Messages[num] as IMessage; if (message2 is UpdateCollectionMessage) { UpdateCollectionMessage updateCollectionMessage = message2 as UpdateCollectionMessage; IList collectionId = updateCollectionMessage.collectionId; sequence = this._dataDestination.SequenceManager.GetSequence(collectionId); if (sequence != null) { this.ApplyUpdateCollectionMessage(sequence, updateCollectionMessage); } } } for (num = 0; num < messageBatch.Messages.Count; num++) { dataMessage = messageBatch.Messages[num] as DataMessage; if ((dataMessage != null) && (dataMessage.operation == 11)) { IList result = new ArrayList(); result.Add(dataMessage.body); sequence = this.CreateSequence(dataMessage.clientId as string, result, null, dataServiceTransaction); sequencedMessage = this.GetSequencedMessage(dataMessage, sequence); messageBatch.Messages[num] = sequencedMessage; } } for (num = 0; num < messageBatch.Messages.Count; num++) { if (messageBatch.Messages[num] is DataMessage) { dataMessage = messageBatch.Messages[num] as DataMessage; this.SyncSequenceChanges(dataMessage, dataServiceTransaction); } if (messageBatch.Messages[num] is SequencedMessage) { sequencedMessage = messageBatch.Messages[num] as SequencedMessage; dataMessage = sequencedMessage.dataMessage; this.SyncSequenceChanges(dataMessage, dataServiceTransaction); } } }
internal void GenerateUpdateCollectionMessage(int updateType, DataDestination dataDestination, Sequence sequence, int position, Identity identity) { UpdateCollectionMessage updateCollectionMessage = CreateUpdateCollectionMessage(dataDestination, sequence); updateCollectionMessage.AddItemIdentityChange(updateType, position, identity); if (updateCollectionMessage.collectionId != null) { _updateCollectionMessages[updateCollectionMessage.collectionId] = updateCollectionMessage; } else { //without fill parameters _updateCollectionMessages[new object[0]] = updateCollectionMessage; } }
private UpdateCollectionMessage CreateUpdateCollectionMessage(DataDestination dataDestination, Sequence sequence) { UpdateCollectionMessage updateCollectionMessage = new UpdateCollectionMessage(); updateCollectionMessage.clientId = this.ClientId; updateCollectionMessage.updateMode = UpdateCollectionMessage.ServerUpdate; // The unique identifier for the collection that was updated. For a collection filled with the // DataService.fill() method this contains an Array of the parameters specified. updateCollectionMessage.collectionId = sequence.Parameters; updateCollectionMessage.destination = dataDestination.Id; updateCollectionMessage.correlationId = this.CorrelationId; updateCollectionMessage.messageId = "srv:" + Guid.NewGuid().ToString("D") + ":" + _idCounter.ToString(); System.Threading.Interlocked.Increment(ref _idCounter); return(updateCollectionMessage); }
private IMessage UpdateCollection(UpdateCollectionMessage updateCollectionMessage, IList messages) { IList body = updateCollectionMessage.body as IList; for (int i = 0; i < body.Count; i++) { UpdateCollectionRange range = body[i] as UpdateCollectionRange; for (int j = 0; j < range.identities.Length; j++) { string messageId = range.identities[j] as string; Identity identity = null; if (messageId != null) { DataMessage message = this.GetMessage(messages, messageId) as DataMessage; if (message != null) { DataDestination destination = base.Destination as DataDestination; identity = Identity.GetIdentity(message.body, destination); } range.identities[j] = identity; } else { IDictionary map = range.identities[j] as IDictionary; if (map != null) { identity = new Identity(map); } } IList collectionId = updateCollectionMessage.collectionId; IAssembler assembler = this.GetAssembler(); if (assembler != null) { if (range.updateType == 0) { assembler.AddItemToFill(collectionId, range.position + j, identity); } if (range.updateType == 1) { assembler.RemoveItemFromFill(collectionId, range.position, identity); } } } } return(updateCollectionMessage); }
private UpdateCollectionMessage CreateUpdateCollectionMessage(DataMessage dataMessage, Sequence sequence, Identity identity, int position, int updateMode) { UpdateCollectionMessage message = new UpdateCollectionMessage { collectionId = sequence.Parameters, destination = dataMessage.destination, replace = false, updateMode = updateMode, messageId = "srv:" + Guid.NewGuid().ToString("D") + ":0", correlationId = dataMessage.correlationId }; UpdateCollectionRange range = new UpdateCollectionRange { identities = new object[] { identity }, updateType = 0, position = position }; object[] objArray = new object[] { range }; message.body = objArray; return(message); }
internal void AddClientUpdateCollection(UpdateCollectionMessage updateCollectionMessage) { _clientUpdateCollectionMessages[updateCollectionMessage.collectionId] = updateCollectionMessage; }
/// <summary> /// Clients can call this method to commit the transaction. You should only use this method if /// you used the begin method to create the DataServiceTransaction. /// Otherwise, the gateway will commit or rollback the transaction as necessary. /// </summary> public void Commit() { if (_rollbackOnly) { Rollback(); return; } try { ProcessRefreshFills(); _pushMessages = new ArrayList(); for (int i = 0; i < _processedMessageBatches.Count; i++) { MessageBatch messageBatch = _processedMessageBatches[i] as MessageBatch; if (messageBatch.Messages != null && messageBatch.Messages.Count > 0) { DataDestination dataDestination = _dataService.GetDestination(messageBatch.IncomingMessage) as DataDestination; try { dataDestination.SequenceManager.ManageMessageBatch(messageBatch, this); } catch (Exception ex) { MessageException messageException = new MessageException(ex); ErrorMessage errorMessage = messageException.GetErrorMessage(); errorMessage.correlationId = messageBatch.IncomingMessage.messageId; errorMessage.destination = messageBatch.IncomingMessage.destination; messageBatch.Messages.Clear(); messageBatch.Messages.Add(errorMessage); } for (int j = 0; j < messageBatch.Messages.Count; j++) { IMessage message = messageBatch.Messages[j] as IMessage; if (!(message is ErrorMessage)) { _pushMessages.Add(message); } } } _outgoingMessages.AddRange(messageBatch.Messages); } for (int i = 0; i < _pushMessages.Count; i++) { IMessage message = _pushMessages[i] as IMessage; DataMessage dataMessage = message as DataMessage; if (dataMessage != null) { PushMessage(GetSubscribers(message), message); } } foreach (DictionaryEntry entry in _clientUpdateCollectionMessages) { UpdateCollectionMessage updateCollectionMessage = entry.Value as UpdateCollectionMessage; _outgoingMessages.Add(updateCollectionMessage); PushMessage(GetSubscribers(updateCollectionMessage), updateCollectionMessage); } foreach (DictionaryEntry entry in _updateCollectionMessages) { UpdateCollectionMessage updateCollectionMessage = entry.Value as UpdateCollectionMessage; _outgoingMessages.Add(updateCollectionMessage); PushMessage(GetSubscribers(updateCollectionMessage), updateCollectionMessage); } } finally { _transactionState = TransactionState.Committed; } }