예제 #1
0
        private async Task <string> InsertLock(string processName, int lockDuration)
        {
            //create the new Process Lock
            var newProcessLock = new DatabaseProcessLockRecord
            {
                ProcessName  = processName,
                Token        = Guid.NewGuid().ToString(),
                ExpiresOn    = DateTime.UtcNow.AddMilliseconds(lockDuration),
                LockDuration = lockDuration
            };

            try
            {
                //try to insert the new process lock
                await _repo.Create(newProcessLock);
            }
            catch (Exception ex)
            {
                if (_repo.IsUniqueKeyViolatedException(ex))
                {
                    return(null);
                }

                throw;
            }

            //If no errors are thrown during save then the insert was successful, return true

            return(newProcessLock.Token);
        }
        public async Task ViolateKeyConstraint_ConstraintViolated(IntegrationTestServerType serverType)
        {
            CheckIfSkipped(serverType);

            using (var scope = CreateScope(serverType))
            {
                var pl = scope.ServiceProvider.GetRequiredService <DatabaseProcessLockRepository>();

                var record = new DatabaseProcessLockRecord
                {
                    ProcessName  = Guid.NewGuid().ToString(),
                    Token        = Guid.NewGuid().ToString(),
                    ExpiresOn    = DateTime.UtcNow.AddMinutes(15),
                    LockDuration = (int)TimeSpan.FromMinutes(15).TotalMilliseconds
                };

                await pl.Create(record);

                try
                {
                    await pl.Create(record);
                }
                catch (Exception ex)
                {
                    pl.IsUniqueKeyViolatedException(ex).Should().BeTrue();
                }
            }
        }
        public async Task UpdateLock_RecordUpdated(IntegrationTestServerType serverType, bool readByToken)
        {
            CheckIfSkipped(serverType);

            using (var scope = CreateScope(serverType))
            {
                var pl = scope.ServiceProvider.GetRequiredService <DatabaseProcessLockRepository>();

                var processName  = Guid.NewGuid().ToString();
                var token        = Guid.NewGuid().ToString();
                var expiresOn    = DateTime.UtcNow.AddMinutes(15);
                var lockDuration = (int)TimeSpan.FromMinutes(15).TotalMilliseconds;

                // create

                var record = new DatabaseProcessLockRecord
                {
                    ProcessName  = processName,
                    Token        = token,
                    ExpiresOn    = expiresOn,
                    LockDuration = lockDuration
                };

                await pl.Create(record);

                var persistedRecord = readByToken ? await pl.ReadByToken(token) : await pl.ReadByProcessName(processName);

                persistedRecord.ProcessName.Should().Be(processName);
                persistedRecord.Token.Should().Be(token);
                persistedRecord.ExpiresOn.ToString("yyyy-MM-dd HH:mm:ss").Should().Be(expiresOn.ToString("yyyy-MM-dd HH:mm:ss"));
                persistedRecord.LockDuration.Should().Be(lockDuration);

                // update

                var processName2  = Guid.NewGuid().ToString();
                var token2        = Guid.NewGuid().ToString();
                var expiresOn2    = DateTime.UtcNow.AddMinutes(10);
                var lockDuration2 = (int)TimeSpan.FromMinutes(10).TotalMilliseconds;

                persistedRecord.ProcessName  = processName2;
                persistedRecord.ExpiresOn    = expiresOn2;
                persistedRecord.LockDuration = lockDuration2;

                await pl.Update(persistedRecord);

                persistedRecord = await pl.ReadByToken(token);

                persistedRecord.ProcessName.Should().Be(processName);
                persistedRecord.Token.Should().Be(token);
                persistedRecord.ExpiresOn.ToString("yyyy-MM-dd HH:mm:ss").Should().Be(expiresOn2.ToString("yyyy-MM-dd HH:mm:ss"));
                persistedRecord.LockDuration.Should().Be(lockDuration2);
            }
        }
예제 #4
0
        public async Task Create(DatabaseProcessLockRecord record)
        {
            await Task.Run(() =>
            {
                EnsureDependencies();

                var cmd         = _ctx.Connection.CreateCommand();
                cmd.CommandText = _scripts.GetInsertScript();
                cmd.CommandType = CommandType.Text;

                var paramProcessName           = cmd.CreateParameter();
                paramProcessName.ParameterName = "@ProcessName";
                paramProcessName.DbType        = DbType.String;
                paramProcessName.Value         = record.ProcessName;
                paramProcessName.Direction     = ParameterDirection.Input;

                var paramToken           = cmd.CreateParameter();
                paramToken.ParameterName = "@Token";
                paramToken.DbType        = DbType.String;
                paramToken.Value         = record.Token;
                paramToken.Direction     = ParameterDirection.Input;

                var ParamExpiresOn           = cmd.CreateParameter();
                ParamExpiresOn.ParameterName = "@ExpiresOn";
                ParamExpiresOn.DbType        = DbType.DateTime;
                ParamExpiresOn.Value         = record.ExpiresOn;
                ParamExpiresOn.Direction     = ParameterDirection.Input;

                var ParamLockDuration           = cmd.CreateParameter();
                ParamLockDuration.ParameterName = "@LockDuration";
                ParamLockDuration.DbType        = DbType.Int32;
                ParamLockDuration.Value         = record.LockDuration;
                ParamLockDuration.Direction     = ParameterDirection.Input;

                cmd.Parameters.Add(paramProcessName);
                cmd.Parameters.Add(paramToken);
                cmd.Parameters.Add(ParamExpiresOn);
                cmd.Parameters.Add(ParamLockDuration);

                lock (_ctx)
                    cmd.ExecuteNonQuery();
            });
        }