* added generic arguments to 'declare_queue' methodmaster
@@ -16,4 +16,5 @@ | |||||
#include <cppamqp/exception.inl> | #include <cppamqp/exception.inl> | ||||
#include <cppamqp/helper.inl> | #include <cppamqp/helper.inl> | ||||
#include <cppamqp/message.inl> | #include <cppamqp/message.inl> | ||||
#include <cppamqp/publish_options.inl> | |||||
#include <cppamqp/publish_options.inl> | |||||
#include <cppamqp/types.inl> |
@@ -42,7 +42,7 @@ namespace cppamqp | |||||
inline channel_number handle () const; | inline channel_number handle () const; | ||||
inline const connection_t& connection () const; | inline const connection_t& connection () const; | ||||
queue_declaration declare_queue (const std::string& name, const queue_flags& flags); | |||||
queue_declaration declare_queue (const std::string& name, const queue_flags& flags, const table& args = empty_table); | |||||
void bind_queue (const std::string& queue, const std::string& exchange, const std::string& routing_key); | void bind_queue (const std::string& queue, const std::string& exchange, const std::string& routing_key); | ||||
void publish (const std::string& exchange, const std::string& routing_key, const publish_flags& flags, const std::string& message, const publish_options* options = nullptr); | void publish (const std::string& exchange, const std::string& routing_key, const publish_flags& flags, const std::string& message, const publish_options* options = nullptr); | ||||
std::string consume (const std::string& queue, const std::string& consumer_tag, const consume_flags& flags); | std::string consume (const std::string& queue, const std::string& consumer_tag, const consume_flags& flags); | ||||
@@ -1,5 +1,6 @@ | |||||
#pragma once | #pragma once | ||||
#include <map> | |||||
#include <cppamqp/config.h> | #include <cppamqp/config.h> | ||||
namespace cppamqp | namespace cppamqp | ||||
@@ -14,4 +15,27 @@ namespace cppamqp | |||||
using channel_number = amqp_channel_t; | using channel_number = amqp_channel_t; | ||||
struct field_value | |||||
: private amqp_field_value_t | |||||
{ | |||||
private: | |||||
template<typename T_value> | |||||
inline void set(T_value&& value); | |||||
public: | |||||
inline field_value(); | |||||
template<typename T_value> | |||||
inline field_value(T_value&& value); | |||||
template<typename T_value> | |||||
inline field_value& operator=(T_value&& value); | |||||
inline const amqp_field_value_t& get() const; | |||||
}; | |||||
using table = std::map<std::string, field_value>; | |||||
const table empty_table; | |||||
} | } |
@@ -0,0 +1,105 @@ | |||||
#pragma once | |||||
#include <cppamqp/types.h> | |||||
namespace cppamqp | |||||
{ | |||||
template<> | |||||
inline void field_value::set<bool>(bool&& value) | |||||
{ | |||||
this->kind = AMQP_FIELD_KIND_BOOLEAN; | |||||
this->value.boolean = static_cast<int>(value); | |||||
} | |||||
template<> | |||||
inline void field_value::set<int8_t>(int8_t&& value) | |||||
{ | |||||
this->kind = AMQP_FIELD_KIND_I8; | |||||
this->value.i8 = value; | |||||
} | |||||
template<> | |||||
inline void field_value::set<uint8_t>(uint8_t&& value) | |||||
{ | |||||
this->kind = AMQP_FIELD_KIND_U8; | |||||
this->value.u8 = value; | |||||
} | |||||
template<> | |||||
inline void field_value::set<int16_t>(int16_t&& value) | |||||
{ | |||||
this->kind = AMQP_FIELD_KIND_I16; | |||||
this->value.i16 = value; | |||||
} | |||||
template<> | |||||
inline void field_value::set<uint16_t>(uint16_t&& value) | |||||
{ | |||||
this->kind = AMQP_FIELD_KIND_U16; | |||||
this->value.u16 = value; | |||||
} | |||||
template<> | |||||
inline void field_value::set<int32_t>(int32_t&& value) | |||||
{ | |||||
this->kind = AMQP_FIELD_KIND_I32; | |||||
this->value.i32 = value; | |||||
} | |||||
template<> | |||||
inline void field_value::set<uint32_t>(uint32_t&& value) | |||||
{ | |||||
this->kind = AMQP_FIELD_KIND_U32; | |||||
this->value.u32 = value; | |||||
} | |||||
template<> | |||||
inline void field_value::set<int64_t>(int64_t&& value) | |||||
{ | |||||
this->kind = AMQP_FIELD_KIND_I64; | |||||
this->value.i64 = value; | |||||
} | |||||
template<> | |||||
inline void field_value::set<uint64_t>(uint64_t&& value) | |||||
{ | |||||
this->kind = AMQP_FIELD_KIND_U64; | |||||
this->value.u64 = value; | |||||
} | |||||
template<> | |||||
inline void field_value::set<float>(float&& value) | |||||
{ | |||||
this->kind = AMQP_FIELD_KIND_F32; | |||||
this->value.f32 = value; | |||||
} | |||||
template<> | |||||
inline void field_value::set<double>(double&& value) | |||||
{ | |||||
this->kind = AMQP_FIELD_KIND_F64; | |||||
this->value.f64 = value; | |||||
} | |||||
field_value::field_value() | |||||
{ | |||||
this->kind = AMQP_FIELD_KIND_VOID; | |||||
} | |||||
template<typename T_value> | |||||
field_value::field_value(T_value&& value) | |||||
{ set(std::forward<T_value>(value)); } | |||||
template<typename T_value> | |||||
field_value& field_value::operator=(T_value&& value) | |||||
{ | |||||
set(std::forward<T_value>(value)); | |||||
return *this; | |||||
} | |||||
inline const amqp_field_value_t& field_value::get() const | |||||
{ return *this; } | |||||
} |
@@ -1,3 +1,4 @@ | |||||
#include <cppamqp/types.inl> | |||||
#include <cppamqp/helper.inl> | #include <cppamqp/helper.inl> | ||||
#include <cppamqp/channel.inl> | #include <cppamqp/channel.inl> | ||||
#include <cppamqp/exception.inl> | #include <cppamqp/exception.inl> | ||||
@@ -28,8 +29,20 @@ channel::internal::~internal() | |||||
true); | true); | ||||
} | } | ||||
queue_declaration channel::declare_queue(const std::string& name, const queue_flags& flags) | |||||
queue_declaration channel::declare_queue(const std::string& name, const queue_flags& flags, const table& args) | |||||
{ | { | ||||
size_t i = 0; | |||||
amqp_table_t arg_table; | |||||
amqp_table_entry_t entries[args.size()]; | |||||
arg_table.num_entries = static_cast<int>(args.size()); | |||||
arg_table.entries = &entries[0]; | |||||
for (auto& kvp : args) | |||||
{ | |||||
arg_table.entries[i].key = __impl::make_bytes(kvp.first); | |||||
arg_table.entries[i].value = kvp.second.get(); | |||||
++i; | |||||
} | |||||
auto ret = amqp_queue_declare( | auto ret = amqp_queue_declare( | ||||
connection().handle(), | connection().handle(), | ||||
handle(), | handle(), | ||||
@@ -38,7 +51,7 @@ queue_declaration channel::declare_queue(const std::string& name, const queue_fl | |||||
flags.is_set(queue_flag::durable) ? 1 : 0, | flags.is_set(queue_flag::durable) ? 1 : 0, | ||||
flags.is_set(queue_flag::exclusive) ? 1 : 0, | flags.is_set(queue_flag::exclusive) ? 1 : 0, | ||||
flags.is_set(queue_flag::auto_delete) ? 1 : 0, | flags.is_set(queue_flag::auto_delete) ? 1 : 0, | ||||
amqp_empty_table); | |||||
arg_table); | |||||
__impl::check_and_raise( | __impl::check_and_raise( | ||||
amqp_get_rpc_reply(connection().handle()), | amqp_get_rpc_reply(connection().handle()), | ||||
std::string("unable to declare queue '") + name + "'", | std::string("unable to declare queue '") + name + "'", | ||||