public void Push() { ThrowExceptionIfNotConnected(); lock (mutex) { Log("Sending PUSH command."); BinaryEncoder.SendCommand(stream, ConnectionCommand.PUSH); using (Context context = new Context(config)) { List <long> selfMessages = new List <long>(); var toSend = context.ToSendMessages.ToList(); PushCapsula capsula = new PushCapsula(); foreach (var message in toSend) { if (message.RecepientId == UserId) { selfMessages.Add((long)message.BlobMessagesId); } capsula.PushMessages.Add(new PushMessage() { RecepientId = (int)message.RecepientId, Priority = (int)message.Priority }); } capsula.MessageToDeleteIds = context.BlobMessages .Where(u => u.DoDelete == 1) .Select(u => (long)u.PublicId).ToList(); #if (DEBUG) Log($"Sending capsula with {toSend.Count} messages. {capsula.MessageToDeleteIds.Count} will be deleted."); #endif TextEncoder.SendJson(stream, capsula); #if (DEBUG) Log($"Sending message blobs."); #endif foreach (var message in toSend) { BinaryEncoder.SendBytes(stream, message.Blob); } #if (DEBUG) Log($"Receiving PushResponse"); #endif PushResponse response = TextEncoder.ReadJson <PushResponse>(stream); var selfMessagesZip = selfMessages.Zip(response.MessageIds, (u, v) => new { PrivateId = u, PublicId = v }); foreach (var message in selfMessagesZip) { context.BlobMessages.Where(u => u.Id == message.PrivateId) .SingleOrDefault().PublicId = message.PublicId; } #if (DEBUG) Log("Saving new public ids."); #endif context.SaveChanges(); #if (DEBUG) Log("Cleaning queue."); #endif context.Database.ExecuteSqlCommand("delete from TO_SEND_MESSAGES;"); context.Database.ExecuteSqlCommand("delete from BLOB_MESSAGES where DO_DELETE=1 and PUBLIC_ID<>null;;"); context.SaveChanges(); } Log("Push have been done."); } }
private void Pull() { #if (DEBUG) Log("Pulling started."); Log("Receiving PushCapsula."); #endif PushCapsula capsula = TextEncoder.ReadJson <PushCapsula>(stream); PushResponse response = new PushResponse() { MessageIds = new List <long>() }; using (Context context = new Context(config)) { #if (DEBUG) Log($"Receiving and saving {capsula.PushMessages.Count} blobs."); #endif foreach (var pushMessage in capsula.PushMessages) { BlobMessages blobMessage = new BlobMessages() { Content = BinaryEncoder.ReceiveBytes(stream), RecepientId = pushMessage.RecepientId, SenderId = connectionInfo.UserId, Priority = pushMessage.Priority }; context.BlobMessages.Add(blobMessage); context.SaveChanges(); if (pushMessage.RecepientId == connectionInfo.UserId) { response.MessageIds.Add(blobMessage.Id); context.ClientsMessagesDownloaded.Add(new ClientsMessagesDownloaded() { BlobMessagesId = blobMessage.Id, ClientsId = connectionInfo.ClientId }); } context.SaveChanges(); } #if (DEBUG) Log($"Deleting {capsula.MessageToDeleteIds.Count} blobs."); #endif foreach (var toDeleteId in capsula.MessageToDeleteIds) { var toDelete = context.BlobMessages .Where(u => u.RecepientId == connectionInfo.UserId && u.Id == toDeleteId).SingleOrDefault(); if (toDelete != null) { context.BlobMessages.Remove(toDelete); } } context.SaveChanges(); } #if (DEBUG) Log("Sending push response."); #endif TextEncoder.SendJson(stream, response); #if (DEBUG) Log("Pulling ended."); #endif }