public Task <ChangeResult> WriteAsync(Atom ns, Atom queue, Event evt) { const int MONGO_KEY_VIOLATION = 11000; checkRoute(ns, queue); var ve = evt.NonNull(nameof(Event)).Validate(); if (ve != null) { throw ve; } //Checkpoint is forced as the time of writing to disk at the client var bson = BsonConvert.ToBson(evt); var collection = getQueueCollection(ns, queue);//ensures indexes var crud = collection.Insert(bson); //need to detect key violation as it is a sign of idempotency retry which should be treated as success var success = (crud.WriteErrors == null) || (crud.WriteErrors.Length > 0 && crud.WriteErrors[0].Code == MONGO_KEY_VIOLATION); var result = success ? new ChangeResult(ChangeResult.ChangeType.Inserted, 1, "Affected: " + crud.TotalDocumentsAffected, crud.WriteErrors?.Select(e => new { e.Code, e.Message })) : new ChangeResult(ChangeResult.ChangeType.Undefined, 0, "Error", crud.WriteErrors?.Select(e => new { e.Code, e.Message })); return(Task.FromResult(result)); }
public Task <IEnumerable <Event> > FetchAsync(Atom ns, Atom queue, ulong checkpoint, int skip, int count, bool onlyid) { checkRoute(ns, queue); var collection = getQueueCollection(ns, queue); var qry = BsonConvert.GetFetchQuery(checkpoint); var selector = BsonConvert.GetFetchSelector(onlyid); IEnumerable <Event> result = null; if (skip < 0) { skip = 0; } count = count.KeepBetween(1, EventHubClientLogic.FETCH_BY_MAX); var fetchBy = Math.Min(count, EventHubClientLogic.FETCH_BY_MAX); using (var cursor = collection.Find(qry, skip, fetchBy, selector)) { result = cursor.Take(count) .Select(doc => BsonConvert.FromBson(doc)).ToArray(); } return(Task.FromResult(result)); }
private Collection getQueueCollection(Atom ns, Atom queue) { var db = getNamespaceDatabase(ns); var collection = db.GetOrRegister(queue.Value, out var wasAdded); if (wasAdded) { //Create index on CheckpointUtc this.DontLeak( () => db.RunCommand(BsonConvert.CreateIndex(queue.Value)), errorLogType: Azos.Log.MessageType.CriticalAlert ); } return(collection); }