13#include "../common/logger.hpp" 
   14#include "../common/helper.hpp" 
   15#include "../common/msg.pb.h" 
   17#include <unordered_map> 
   27        using ptr = std::shared_ptr<Binding>; 
 
   37        Binding(
const std::string &ename, 
const std::string &qname, 
const std::string &key)
 
 
 
   55    using BindingMap = std::unordered_map<std::string, MsgQueueBindingMap>;
 
   75            const char *CREATE_TABLE = 
"create table if not exists binding_table(exchange_name varchar(32), msgqueue_name varchar(32), binding_key varchar(128));";
 
   79                fatal(
logger, 
"创建绑定信息数据库表失败!");
 
 
   86            const char *DROP_TABLE = 
"drop table if exists binding_table;";
 
   90                fatal(
logger, 
"删除绑定信息数据库表失败!");
 
 
   99            const char *INSERT_SQL = 
"insert into binding_table values('%s', '%s', '%s');";
 
  100            char sql_str[4096] = {0};
 
  101            sprintf(sql_str, INSERT_SQL, binding->exchange_name.c_str(),
 
  102                    binding->msgqueue_name.c_str(), binding->binding_key.c_str());
 
  106                error(
logger, 
"数据库: 插入绑定信息失败!");
 
 
  115        bool remove(
const std::string &ename, 
const std::string &qname)
 
  117            const char *DELETE_SQL = 
"delete from binding_table where exchange_name = '%s' \ 
  118            and msgqueue_name = '%s';";
 
  119            char sql_str[4096] = {0};
 
  120            sprintf(sql_str, DELETE_SQL, ename.c_str(), qname.c_str());
 
  124                error(
logger, 
"数据库: 删除绑定信息失败!");
 
 
  134            const char *DELETE_SQL = 
"delete from binding_table where exchange_name = '%s';";
 
  135            char sql_str[4096] = {0};
 
  136            sprintf(sql_str, DELETE_SQL, ename.c_str());
 
  140                error(
logger, 
"数据库: 删除交换机绑定信息失败!");
 
 
  150            const char *DELETE_SQL = 
"delete from binding_table where msgqueue_name = '%s';";
 
  151            char sql_str[4096] = {0};
 
  152            sprintf(sql_str, DELETE_SQL, qname.c_str());
 
  156                error(
logger, 
"数据库: 删除消息队列绑定信息失败!");
 
 
  167            const char *SELECT_SQL = 
"select * from binding_table;";
 
 
  182            Binding::ptr bp = std::make_shared<Binding>(row[0], row[1], row[2]);
 
  188            qmap.insert(std::make_pair(bp->msgqueue_name, bp));
 
 
 
  200        using ptr = std::shared_ptr<BindingManager>; 
 
  213        bool bind(
const std::string &ename, 
const std::string &qname, 
const std::string &key, 
bool durable)
 
  216            std::unique_lock<std::mutex> lock(
_mutex);
 
  218            if (it != 
_bindings.end() && it->second.find(qname) != it->second.end()) 
 
  220            Binding::ptr bp = std::make_shared<Binding>(ename, qname, key);
 
  228            qbmap.insert(std::make_pair(qname, bp));
 
 
  234        void unbind(
const std::string &ename, 
const std::string &qname)
 
  236            std::unique_lock<std::mutex> lock(
_mutex);
 
  240            auto qit = eit->second.find(qname); 
 
  241            if (qit == eit->second.end())
 
 
  250            std::unique_lock<std::mutex> lock(
_mutex);
 
 
  258            std::unique_lock<std::mutex> lock(
_mutex);
 
  261                binding.second.erase(qname);
 
 
  268            std::unique_lock<std::mutex> lock(
_mutex);
 
 
  281            std::unique_lock<std::mutex> lock(
_mutex);
 
  285            auto qit = eit->second.find(qname);
 
  286            if (qit == eit->second.end())
 
 
  294        bool exists(
const std::string &ename, 
const std::string &qname)
 
  296            std::unique_lock<std::mutex> lock(
_mutex);
 
  300            auto qit = eit->second.find(qname);
 
  301            if (qit == eit->second.end())
 
 
  309            size_t total_size = 0;
 
  310            std::unique_lock<std::mutex> lock(
_mutex);
 
  312                total_size += it.second.size();
 
 
  318            std::unique_lock<std::mutex> lock(
_mutex);
 
 
 
绑定信息内存管理类
Definition binding.hpp:198
bool exists(const std::string &ename, const std::string &qname)
判断绑定信息是否存在
Definition binding.hpp:294
size_t size()
获取绑定信息数量
Definition binding.hpp:307
BindingMap _bindings
绑定映射表
Definition binding.hpp:326
MsgQueueBindingMap getExchangeBindings(const std::string &ename)
获取指定交换机的绑定信息
Definition binding.hpp:266
void removeExchangeBindings(const std::string &ename)
移除指定交换机的所有绑定信息
Definition binding.hpp:248
void removeMsgQueueBindings(const std::string &qname)
移除指定消息队列的所有绑定信息
Definition binding.hpp:256
void clear()
清除绑定信息
Definition binding.hpp:316
BindingMapper _mapper
绑定信息持久化管理类
Definition binding.hpp:325
std::mutex _mutex
互斥锁
Definition binding.hpp:324
void unbind(const std::string &ename, const std::string &qname)
解除绑定信息
Definition binding.hpp:234
BindingManager(const std::string &dbfile)
绑定信息数据内存管理类 构造函数 从数据库中恢复数据
Definition binding.hpp:203
bool bind(const std::string &ename, const std::string &qname, const std::string &key, bool durable)
添加绑定信息
Definition binding.hpp:213
Binding::ptr getBinding(const std::string &ename, const std::string &qname)
获取绑定信息
Definition binding.hpp:279
std::shared_ptr< BindingManager > ptr
绑定信息内存管理类指针
Definition binding.hpp:200
绑定信息持久化管理类
Definition binding.hpp:59
static int selectCallback(void *arg, int numcol, char **row, char **fields)
select语句的回调函数 将获取到的数据存入参数中
Definition binding.hpp:179
bool insert(Binding::ptr &binding)
新增一个绑定信息
Definition binding.hpp:97
bool remove(const std::string &ename, const std::string &qname)
移除一个绑定信息
Definition binding.hpp:115
void removeTable()
移除一张表
Definition binding.hpp:84
bool removeExchangeBindings(const std::string &ename)
移除交换机绑定信息
Definition binding.hpp:132
bool removeQueueBindings(const std::string &qname)
移除消息队列绑定信息
Definition binding.hpp:148
SqliteHelper _sql_helper
数据库操作对象
Definition binding.hpp:193
void createTable()
创建一张表
Definition binding.hpp:73
BindingMap recovery()
获取所有绑定信息 从数据库加载到内存
Definition binding.hpp:164
BindingMapper(const std::string &dbfile)
绑定信息持久化管理类 构造函数
Definition binding.hpp:64
static bool createDirectory(const std::string &pathname)
创建目录
Definition helper.hpp:414
static std::string parentDirectory(const std::string &filename)
获取文件的父目录
Definition helper.hpp:357
SQLite 数据库操作助手类
Definition helper.hpp:58
bool exec(const std::string &sql, SqliteCallback cb, void *arg)
执行 SQL 语句
Definition helper.hpp:109
bool open(int safe_level=SQLITE_OPEN_FULLMUTEX)
打开数据库
Definition helper.hpp:90
Definition channel.hpp:22
Xulog::Logger::ptr logger
日志器的智能指针类型
Definition logger.hpp:24
std::unordered_map< std::string, MsgQueueBindingMap > BindingMap
绑定映射表-—交换机->消息队列绑定映射表的映射表
Definition binding.hpp:55
std::unordered_map< std::string, Binding::ptr > MsgQueueBindingMap
消息队列绑定映射表-—消息队列->绑定信息的映射表
Definition binding.hpp:43
绑定信息结构体
Definition binding.hpp:26
Binding()
无参构造
Definition binding.hpp:32
Binding(const std::string &ename, const std::string &qname, const std::string &key)
绑定信息结构体 构造函数
Definition binding.hpp:37
std::string exchange_name
交换机名称
Definition binding.hpp:28
std::string binding_key
绑定关键字
Definition binding.hpp:30
std::shared_ptr< Binding > ptr
绑定信息指针
Definition binding.hpp:27
std::string msgqueue_name
消息队列名称
Definition binding.hpp:29