async Task InnerSend(string destinationAddress, TransportMessage message, ConnectionWrapper connection) { using (var command = connection.Connection.CreateCommand()) { command.CommandText = "PKG_REBUS.P_Enqueue_Rebus_Msg"; command.CommandType = CommandType.StoredProcedure; var headers = message.Headers.Clone(); var priority = GetMessagePriority(headers); var delay = GetDelayInSeconds(headers); var expiration = GetExpirationInSeconds(headers); var headers_keys = headers.Select(h => h.Key).ToArray(); var headers_values = headers.Select(h => h.Value).ToArray(); command.BindByName = true; command.Parameters.Add(new OracleParameter("p_Queue_Name", OracleDbType.Varchar2, destinationAddress, ParameterDirection.Input)); command.Parameters.Add(new OracleParameter("p_EO_Visibility", OracleDbType.Byte, GetVisibility(_options.EnqueueOptions.Visibility), ParameterDirection.Input)); command.Parameters.Add(new OracleParameter("p_EO_Transformation", OracleDbType.Varchar2, _options.EnqueueOptions.Tranformation, ParameterDirection.Input)); command.Parameters.Add(new OracleParameter("p_EO_Delivery_Mode", OracleDbType.Byte, GetEnqueueDeliveryMode(_options.EnqueueOptions.DeliveryMode), ParameterDirection.Input)); command.Parameters.Add(new OracleParameter("p_MP_Priority", OracleDbType.Int32, priority, ParameterDirection.Input)); command.Parameters.Add(new OracleParameter("p_MP_Delay", OracleDbType.Int32, delay, ParameterDirection.Input)); command.Parameters.Add(new OracleParameter("p_MP_Expiration", OracleDbType.Int32, expiration, ParameterDirection.Input)); bool storeBodyInRaw = message.Body.Length <= 2000 && !_options.ForceBlobStore; var headerKeysParam = command.Parameters.Add(new OracleParameter("p_Headers_Keys", OracleDbType.Varchar2)); headerKeysParam.Direction = System.Data.ParameterDirection.Input; headerKeysParam.CollectionType = OracleCollectionType.PLSQLAssociativeArray; headerKeysParam.Value = headers_keys; headerKeysParam.Size = headers_keys.Count(); headerKeysParam.ArrayBindSize = headers_keys.Select(key => key.Length).ToArray(); headerKeysParam.ArrayBindStatus = Enumerable.Repeat(OracleParameterStatus.Success, headers_keys.Count()).ToArray(); var headerValuesParam = command.Parameters.Add(new OracleParameter("p_Headers_Values", OracleDbType.Varchar2)); headerValuesParam.Direction = System.Data.ParameterDirection.Input; headerValuesParam.CollectionType = OracleCollectionType.PLSQLAssociativeArray; headerValuesParam.Value = headers_values; headerValuesParam.Size = headers_values.Count(); headerValuesParam.ArrayBindSize = headers_values.Select(key => key.Length).ToArray(); headerValuesParam.ArrayBindStatus = Enumerable.Repeat(OracleParameterStatus.Success, headers_values.Count()).ToArray(); command.Parameters.Add(new OracleParameter("p_Body_Raw", OracleDbType.Raw, storeBodyInRaw ? message.Body : null, ParameterDirection.Input)); command.Parameters.Add(new OracleParameter("p_Body_Blob", OracleDbType.Blob, !storeBodyInRaw ? message.Body : null, ParameterDirection.Input)); await command.ExecuteNonQueryAsync(); headerKeysParam.Dispose(); headerValuesParam.Dispose(); } }
Task <ConnectionWrapper> GetConnection(ITransactionContext context) { return(context .GetOrAdd(CurrentConnectionKey, async() => { var dbConnection = await _connectionHelper.GetConnection(); var connectionWrapper = new ConnectionWrapper(dbConnection); context.OnCommitted(() => { dbConnection.Complete(); return Task.FromResult(0); }); context.OnDisposed(() => connectionWrapper.Dispose()); return connectionWrapper; })); }
ConnectionWrapper GetConnection(ITransactionContext context) { return(context .GetOrAdd(CurrentConnectionKey, () => { var dbConnection = _connectionHelper.GetConnection(); var connectionWrapper = new ConnectionWrapper(dbConnection); context.OnCommitted(() => { dbConnection.Complete(); return Task.CompletedTask; }); context.OnDisposed(() => connectionWrapper.Dispose()); return connectionWrapper; })); }
void InnerSend(string destinationAddress, TransportMessage message, ConnectionWrapper connection) { using (var command = connection.Connection.CreateCommand()) { command.CommandText = $@" INSERT INTO {_table} ( recipient, headers, body, priority, visible, expiration ) VALUES ( :recipient, :headers, :body, :priority, :now + :visible, :now + :ttlseconds )"; var headers = message.Headers.Clone(); var priority = GetMessagePriority(headers); var initialVisibilityDelay = new TimeSpan(0, 0, 0, GetInitialVisibilityDelay(headers)); var ttlSeconds = new TimeSpan(0, 0, 0, GetTtlSeconds(headers)); // must be last because the other functions on the headers might change them var serializedHeaders = HeaderSerializer.Serialize(headers); command.BindByName = true; command.Parameters.Add(new OracleParameter("recipient", OracleDbType.Varchar2, destinationAddress, ParameterDirection.Input)); command.Parameters.Add(new OracleParameter("headers", OracleDbType.Blob, serializedHeaders, ParameterDirection.Input)); command.Parameters.Add(new OracleParameter("body", OracleDbType.Blob, message.Body, ParameterDirection.Input)); command.Parameters.Add(new OracleParameter("priority", OracleDbType.Int32, priority, ParameterDirection.Input)); command.Parameters.Add(new OracleParameter("visible", OracleDbType.IntervalDS, initialVisibilityDelay, ParameterDirection.Input)); command.Parameters.Add(new OracleParameter("now", _rebusTime.Now.ToOracleTimeStamp())); command.Parameters.Add(new OracleParameter("ttlseconds", OracleDbType.IntervalDS, ttlSeconds, ParameterDirection.Input)); command.ExecuteNonQuery(); } }