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); } }
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(); }); }