public IEnumerable<Message> GetAllMessages(string queue)
        {
            var rawList = new List<RawMessage>();
            using (var tx = BeginTransaction())
            {
                using (var command = tx.Connection.CreateCommand())
				{
					command.CommandTimeout = 240;
                    command.CommandText = "Queue.RecieveMessages";
                    command.CommandType = CommandType.StoredProcedure;
                    command.Transaction = tx.Transaction;
                    command.Parameters.AddWithValue("@Endpoint", _endpoint.ToString());
                    command.Parameters.AddWithValue("@Queue", _queueName);
                    command.Parameters.AddWithValue("@SubQueue", queue);

                    var reader = command.ExecuteReader();
                    var messageIdIndex = reader.GetOrdinal("MessageId");
                    var queueIdIndex = reader.GetOrdinal("QueueId");
                    var createdAtIndex = reader.GetOrdinal("CreatedAt");
                    var processingUntilIndex = reader.GetOrdinal("ProcessingUntil");
                    var processedIndex = reader.GetOrdinal("Processed");
                    var headersIndex = reader.GetOrdinal("Headers");
                    var payloadIndex = reader.GetOrdinal("Payload");
                    while (reader.Read())
                    {
                        var raw = new RawMessage
                        {
                            CreatedAt = reader.GetDateTime(createdAtIndex),
                            Headers = reader.GetString(headersIndex),
                            MessageId = reader.GetInt64(messageIdIndex),
                            Processed = reader.GetBoolean(processedIndex),
                            ProcessingUntil = reader.GetDateTime(processingUntilIndex),
                            QueueId = reader.GetInt32(queueIdIndex),
                            SubQueueName = queue
                        };
                        var binValue = reader.GetSqlBinary(payloadIndex);
                        if (!binValue.IsNull)
                        {
                            raw.Payload = binValue.Value;
                        }
                        rawList.Add(raw);
                    }
                    reader.Close();
                }
                tx.Transaction.Commit();
            }
            return rawList.Select(raw => raw.ToMessage());
        }
        public Message Receive(int queueId, TimeSpan timeOut)
        {
            RawMessage raw = null;

            using (var command = SqlTransactionContext.Current.Connection.CreateCommand())
            {
                command.CommandTimeout = timeOut.Seconds;
                command.CommandText = "Queue.RecieveMessage";
                command.CommandType = CommandType.StoredProcedure;
                command.Transaction = SqlTransactionContext.Current.Transaction;
                command.Parameters.AddWithValue("@QueueId", queueId);

                var reader = command.ExecuteReader();
                var messageIdIndex = reader.GetOrdinal("MessageId");
                var createdAtIndex = reader.GetOrdinal("CreatedAt");
                var processingUntilIndex = reader.GetOrdinal("ProcessingUntil");
                var processedCountIndex = reader.GetOrdinal("ProcessedCount");
                var processedIndex = reader.GetOrdinal("Processed");
                var headersIndex = reader.GetOrdinal("Headers");
                var payloadIndex = reader.GetOrdinal("Payload");
                while (reader.Read())
                {
                    raw = new RawMessage
                              {
                                  CreatedAt = reader.GetDateTime(createdAtIndex),
                                  Headers = reader.GetString(headersIndex),
                                  MessageId = reader.GetInt64(messageIdIndex),
                                  Processed = reader.GetBoolean(processedIndex),
                                  ProcessingUntil = reader.GetDateTime(processingUntilIndex),
                                  ProcessedCount = reader.GetInt32(processedCountIndex),
                                  QueueId = queueId,
                                  SubQueueName = null
                              };
                    
                    if (!reader.IsDBNull(payloadIndex))
                        raw.Payload = reader.GetSqlBinary(payloadIndex).Value;
                }
                reader.Close();
            }
            
            if (raw==null) throw new TimeoutException();
            return raw.ToMessage();
        }
        public Message PeekByIdIgnoringProcessingUntil(long messageId)
        {
            RawMessage raw = null;

            using (var command = SqlTransactionContext.Current.Connection.CreateCommand())
            {
                command.CommandText = "Queue.PeekMessageById";
                command.CommandType = CommandType.StoredProcedure;
                command.Transaction = SqlTransactionContext.Current.Transaction;
                command.Parameters.AddWithValue("@MessageId", messageId);

                var reader = command.ExecuteReader();
                var messageIdIndex = reader.GetOrdinal("MessageId");
                var queueIdIndex = reader.GetOrdinal("QueueId");
                var createdAtIndex = reader.GetOrdinal("CreatedAt");
                var processingUntilIndex = reader.GetOrdinal("ProcessingUntil");
                var processedIndex = reader.GetOrdinal("Processed");
                var headersIndex = reader.GetOrdinal("Headers");
                var payloadIndex = reader.GetOrdinal("Payload");
                var subQueueNameIndex = reader.GetOrdinal("SubqueueName");

                if (reader.HasRows)
                {
                    reader.Read();

                    raw = new RawMessage
                    {
                        CreatedAt = reader.GetDateTime(createdAtIndex),
                        Headers = reader.GetString(headersIndex),
                        MessageId = reader.GetInt64(messageIdIndex),
                        Processed = reader.GetBoolean(processedIndex),
                        ProcessingUntil = reader.GetDateTime(processingUntilIndex),
                        QueueId = reader.GetInt32(queueIdIndex)
                    };

                    if (!reader.IsDBNull(subQueueNameIndex))
                        raw.SubQueueName = reader.GetString(subQueueNameIndex);
                    if (!reader.IsDBNull(payloadIndex))
                        raw.Payload = reader.GetSqlBinary(payloadIndex).Value;
                }
                reader.Close();
            }
            return raw == null ? null : raw.ToMessage();
        }
        public void Send(Uri uri, MessagePayload payload)
        {
	        using (new internalTransactionScope(this))
	        {
		        using (var command = SqlTransactionContext.Current.Connection.CreateCommand())
				{
					command.CommandTimeout = 60;
			        command.CommandText = "Queue.EnqueueMessage";
			        command.CommandType = CommandType.StoredProcedure;
			        command.Transaction = SqlTransactionContext.Current.Transaction;
			        command.Parameters.AddWithValue("@Endpoint", uri.ToString());
			        command.Parameters.AddWithValue("@Queue", uri.GetQueueName());
			        command.Parameters.AddWithValue("@SubQueue", DBNull.Value);

			        var contents = new RawMessage
				        {
					        CreatedAt = payload.SentAt,
					        Payload = payload.Data,
					        ProcessingUntil = payload.SentAt
				        };
			        contents.SetHeaders(payload.Headers);

			        command.Parameters.AddWithValue("@CreatedAt", contents.CreatedAt);
			        command.Parameters.AddWithValue("@Payload", contents.Payload);
			        command.Parameters.AddWithValue("@ExpiresAt", DBNull.Value);
			        command.Parameters.AddWithValue("@ProcessingUntil", contents.CreatedAt);
			        command.Parameters.AddWithValue("@Headers", contents.Headers);

			        if (Logger.IsDebugEnabled)
			        {
				        Logger.DebugFormat("Sending message to {0} on {1}. Headers are '{2}'.", uri, uri.GetQueueName(),
				                           contents.Headers);
			        }

			        command.ExecuteNonQuery();
		        }
	        }
        }