/// <inheritdoc/> public async ValueTask UpdateTransactionState(IStorageTransaction storageTrans, long transId, TransactionState state, string?endReason = null, DateTime?endDateTime = null) { await this.ExecuteAsync( async (connection) => { const string sql = "UPDATE transactions SET end_datetime = @EndDateTime, state = @State, end_reason = @EndReason WHERE id = @Id;"; await connection.ExecuteAsync( sql, new { Id = transId, State = state, EndDateTime = endDateTime, EndReason = endReason }, storageTrans.NpgsqlTransaction()); }, storageTrans.NpgsqlTransaction().Connection); }
/// <inheritdoc/> public async ValueTask <int> DeleteAddedMessages(IStorageTransaction storageTrans, long transId) { const string sql = "DELETE FROM messages where transaction_id = @TransId AND transaction_action = @TransactionAction AND state = @MessageState;"; var sqliteConnection = storageTrans.NpgsqlTransaction().Connection; return(await this.ExecuteAsync <int>( async (connection) => { return await connection.ExecuteAsync( sql, transaction: (storageTrans as DbTransaction)?.NpgsqlTransaction, param: new { TransId = transId, TransactionAction = TransactionAction.Add, MessageState = MessageState.InTransaction }); }, sqliteConnection)); }
/// <inheritdoc/> public async ValueTask <int> UpdateMessageAttemptCount(IStorageTransaction storageTrans, long transId, TransactionAction transactionAction, MessageState messageState) { const string sql = "Update messages set attempts = attempts + 1 " + "where transaction_id = @TransId AND transaction_action = @TransactionAction AND state = @MessageState;"; var sqliteConnection = storageTrans.NpgsqlTransaction().Connection; return(await this.ExecuteAsync <int>( async (connection) => { return await connection.ExecuteAsync( sql, transaction: (storageTrans as DbTransaction)?.NpgsqlTransaction, param: new { TransId = transId, TransactionAction = transactionAction, MessageState = messageState }); }, sqliteConnection)); }
/// <inheritdoc/> public async ValueTask <int> DeleteAddedMessagesInExpiredTrans(IStorageTransaction storageTrans, DateTime currentDateTime) { const string sql = "Delete from messages where transaction_action = @TransactionAction AND state = @MessageState AND " + "transaction_id in (select id from transactions Where expiry_datetime <= @CurrentDateTime);"; var sqliteConnection = storageTrans.NpgsqlTransaction().Connection; return(await this.ExecuteAsync <int>( async (connection) => { return await connection.ExecuteAsync( sql, transaction: (storageTrans as DbTransaction)?.NpgsqlTransaction, param: new { TransactionAction = TransactionAction.Add, MessageState = MessageState.InTransaction, CurrentDateTime = currentDateTime }); }, sqliteConnection)); }
/// <inheritdoc/> public async ValueTask <int> ExpireTransactions(IStorageTransaction storageTrans, DateTime currentDateTime) { const string sql = "Update transactions SET state = @NewTransactionState, end_datetime = @CurrentDateTime, end_reason = 'Expired' " + "Where expiry_datetime <= @CurrentDateTime AND state = @OldTransactionState;"; var sqliteConnection = storageTrans.NpgsqlTransaction().Connection; return(await this.ExecuteAsync <int>( async (connection) => { return await connection.ExecuteAsync( sql, transaction: (storageTrans as DbTransaction)?.NpgsqlTransaction, param: new { NewTransactionState = TransactionState.Expired, MessageState = MessageState.InTransaction, CurrentDateTime = currentDateTime, OldTransactionState = TransactionState.Active }); }, sqliteConnection)); }
/// <inheritdoc/> public async ValueTask <int> UpdateMessageAttemptsInExpiredTrans(IStorageTransaction storageTrans, DateTime currentDateTime) { const string sql = "Update messages set attempts = attempts + 1, transaction_action = 0, transaction_id = null, state = @NewMessageState " + "where transaction_action = @TransactionAction AND state = @MessageState AND " + "transaction_id in (select id from transactions Where expiry_datetime <= @CurrentDateTime);"; var sqliteConnection = storageTrans.NpgsqlTransaction().Connection; return(await this.ExecuteAsync <int>( async (connection) => { return await connection.ExecuteAsync( sql, transaction: (storageTrans as DbTransaction)?.NpgsqlTransaction, param: new { TransactionAction = TransactionAction.Pull, MessageState = MessageState.InTransaction, CurrentDateTime = currentDateTime, NewMessageState = MessageState.Active // Return to active for now. We won't worry about closing it here, if it needs to be. }); }, sqliteConnection)); }
/// <inheritdoc/> public async ValueTask <int> UpdateMessages(IStorageTransaction storageTrans, long transId, TransactionAction transactionAction, MessageState oldMessageState, MessageState newMessageState, DateTime?closeDateTime) { const string sql = "Update messages set transaction_id = null, transaction_action = 0, " + "state = @NewMessageState, close_datetime = @CloseDateTime " + "where transaction_id = @TransId AND transaction_action = @TransactionAction AND state = @OldMessageState;"; var sqliteConnection = storageTrans.NpgsqlTransaction().Connection; return(await this.ExecuteAsync <int>( async (connection) => { return await connection.ExecuteAsync( sql, transaction: (storageTrans as DbTransaction)?.NpgsqlTransaction, param: new { TransId = transId, TransactionAction = transactionAction, OldMessageState = oldMessageState, NewMessageState = newMessageState, CloseDateTime = closeDateTime }); }, sqliteConnection)); }