public async Task <IdReservationResult> ReserveIdAsync(string dataType, string id, string submitter)
        {
            var isNewCollection = await IsNewCollectionAsync(dataType);

            if (isNewCollection)
            {
                await CreateTable(dataType);
            }
            else if (await ExistsAsync(dataType, id))
            {
                return(IdReservationResult.Failed());
            }
            var utcNow = DateTime.UtcNow;
            var query  = $"INSERT INTO {dataType} (Id,OriginalSubmitter,CreatedTimeUtc,Submitter,SubmissionTimeUtc) "
                         + $"VALUES ('{id}','{submitter}','{utcNow:yyyy-MM-dd HH:mm:ss}','{submitter}','{utcNow:yyyy-MM-dd HH:mm:ss}')";

            try
            {
                await sqlQueryExecutor.ExecuteQueryAsync(query);

                return(IdReservationResult.Success(id, isNewCollection));
            }
            catch
            {
                return(IdReservationResult.Failed());
            }
        }
Exemple #2
0
        public async Task <IdReservationResult> ReserveIdAsync(string dataType, string id, string submitter)
        {
            if (await ExistsAsync(dataType, id))
            {
                return(IdReservationResult.Failed());
            }
            try
            {
                var isNewCollection = await IsNewCollection(dataType);

                var utcNow = DateTime.UtcNow;
                await metadataStorage.StoreAsync(
                    dataType,
                    new GenericDataContainer(id, submitter, utcNow, submitter, utcNow, ApiVersion.Current, new BsonDocument()),
                    false);

                var container = binaryDataStorage.GetContainer(dataType);
                await container.CreateIfNotExistsAsync();

                var blob = binaryDataStorage.GetBlob(dataType, id);
                await blob.WriteAsync(new MemoryStream(Encoding.ASCII.GetBytes("Reserved")));

                return(IdReservationResult.Success(id, isNewCollection));
            }
            catch (DocumentAlreadyExistsException)
            {
                return(IdReservationResult.Failed());
            }
        }
Exemple #3
0
        public async Task RdDataStorageIdIsUsed()
        {
            var rdDataStorageId     = "RdDataStorageId";
            var idReservationResult = IdReservationResult.Success(rdDataStorageId, false);
            var rdDataStorage       = new Mock <IRdDataStorage>();

            rdDataStorage.Setup(x => x.GetIdsAsync(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <int>())).Returns(Task.FromResult(new List <IdReservationResult> {
                idReservationResult
            }));
            var obj        = new ClassWithoutId("Bob");
            var submitBody = new SubmitDataBody(nameof(ClassWithoutId), obj, false); // ! No ID provided !

            submitBody = JsonConvert.DeserializeObject <SubmitDataBody>(JsonConvert.SerializeObject(submitBody));
            var sut    = new DefaultIdPolicy();
            var actual = await sut.DetermineIdAsync(submitBody, Submitter, rdDataStorage.Object);

            Assert.That(actual.Id, Is.EqualTo(rdDataStorageId));
            rdDataStorage.Verify(x => x.GetIdsAsync(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <int>()), Times.Once);
        }
Exemple #4
0
        public async Task <IdReservationResult> ReserveIdAsync(string dataType, string id, string submitter)
        {
            var isNewCollection = await IsNewCollectionAsync(dataType);

            var collection = rdDataClient.DataDatabase.GetCollection <GenericDataContainer>(dataType);

            try
            {
                var utcNow = DateTime.UtcNow;
                await collection.InsertOneAsync(new GenericDataContainer(id, submitter, utcNow, submitter, utcNow, ApiVersion.Current, new BsonDocument()));

                return(IdReservationResult.Success(id, isNewCollection));
            }
            catch (MongoWriteException writeException)
            {
                if (writeException.WriteError.Category == ServerErrorCategory.DuplicateKey)
                {
                    return(IdReservationResult.Failed());
                }
                throw;
            }
        }
        public async Task <List <IdReservationResult> > GetIdsAsync(string dataType, string submitter, int count)
        {
            var tableSetup           = tableSetups[dataType];
            var reservationContainer = tableSetup.BuildReservationContainer(submitter);
            var reservationResults   = new List <IdReservationResult>();

            for (int i = 0; i < count; i++)
            {
                IdReservationResult reservationResult;
                try
                {
                    var storeResult = await StoreAsync(dataType, reservationContainer, false);

                    reservationResult = IdReservationResult.Success(storeResult.Id, storeResult.IsNewCollection);
                }
                catch (DocumentAlreadyExistsException)
                {
                    reservationResult = IdReservationResult.Failed();
                }
                reservationResults.Add(reservationResult);
            }
            return(reservationResults);
        }