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