acl  3.5.3.0
queue_manager.hpp
浏览该文件的文档.
1 #pragma once
2 #include <map>
3 #include "../stdlib/string.hpp"
4 #include "../stdlib/locker.hpp"
5 #include "../stdlib/noncopyable.hpp"
6 #include "queue_file.hpp"
7 
8 typedef struct ACL_SCAN_DIR ACL_SCAN_DIR;
9 
10 namespace acl {
11 
12 class queue_file;
13 
15 {
16 public:
17  /**
18  * 队列对象的构造函数
19  * @param home {const char*} 队列的根目录
20  * @param queueName {const char*} 该队列对象的队列名称
21  */
22  queue_manager(const char* home, const char* queueName,
23  unsigned sub_width = 2);
24  ~queue_manager();
25 
26  /**
27  * 获得队列名
28  * @return {const char*}
29  */
30  const char* get_queueName() const;
31 
32  /**
33  * 获得队列根目录
34  * @return {const char*}
35  */
36  const char* get_home() const;
37 
38  /**
39  * 创建队列文件
40  * @param extName {const char*} 队列文件扩展名
41  * @return {queue_file*} 队列文件对象, 永远非NULL, 该返回值
42  * 为动态创建的, 所以用完后需要 delete 以释放其所占内存
43  */
44  queue_file* create_file(const char* extName);
45 
46  /**
47  * 打开磁盘上存在的队列文件用于读/写
48  * @param path {const char*} 队列文件名
49  * @param no_cache {bool} 为 true 时,要求在缓存中该文件对应的 KEY
50  * 必须不存在,如果存在则返回 NULL 表示该文件正被锁定; 当该参数为
51  * false 时,则可以直接使用缓存中的对象
52  * @return {queue_file*} 队列文件对象, 出错或不存在则返回 NULL
53  */
54  queue_file* open_file(const char* path, bool no_cache = true);
55 
56  /**
57  * 关闭队列文件句柄, 并释放该文件对象,并不删除文件
58  * @param fp {queue_file*} 队列文件对象
59  * @return {bool} 关闭是否成功
60  */
61  bool close_file(queue_file* fp);
62 
63  /**
64  * 从磁盘上删除队列文件, 并释放该文件对象
65  * @param fp {queue_file*} 队列文件对象
66  * @return {bool} 删除文件是否成功
67  */
68  bool delete_file(queue_file* fp);
69 
70  /**
71  * 修改文件的扩展名
72  * @param fp {queue_file*} 队列文件对象
73  * @param extName {const char*} 新的扩展名
74  * @return {bool} 修改文件扩展名是否成功
75  */
76  bool rename_extname(queue_file* fp, const char* extName);
77 
78  /**
79  * 将队列文件移至目标队列中, 移动成功后, 文件对象内部内容将会发生改变
80  * @param fp {queue_file*} 队列文件对象
81  * @param queueName {const char*} 目标队列名
82  * @param extName {const char*} 文件扩展名
83  * @return {bool} 移动队列文件是否成功, 如果移动失败, 则调用者应用调用
84  * close_file 关闭该队列文件对象, 该文件将会被定时扫描任务移走
85  */
86  bool move_file(queue_file* fp, const char* queueName, const char* extName);
87 
88  /**
89  * 将一个队列文件对象移至目标队列对象中
90  * @param fp {queue_file*} 队列文件对象
91  * @param toQueue {queue_manager*} 目标队列对象
92  * @param extName {const char*} 文件扩展名
93  * @return {bool} 移动队列文件是否成功, 如果移动失败, 则调用者应用调用
94  * close_file 关闭该队列文件对象, 该文件将会被定时扫描任务移走
95  */
96  bool move_file(queue_file* fp, queue_manager* toQueue, const char* extName);
97 
98  /**
99  * 从磁盘上删除本队列文件, 删除成功后该队列文件句柄已经被删除, 不可再用,
100  * 即使删除文件失败, 该队列文件对象也被释放, 只是从磁盘上删除该文件失败,
101  * 所以调用此函数后 fp 不能再次使用
102  * @param fp {queue_file*}
103  * @return {bool} 删除是否成功
104  */
105  bool remove(queue_file* fp);
106 
107  /**
108  * 检查所给文件名是否正在被使用
109  * @param fileName {const char*} 文件名
110  * @return {bool} 是否被使用
111  */
112  bool busy(const char* fileName);
113 
114  /**
115  * 在队列对象的缓存中查找某个队列文件对象
116  * @param key {const char*} 队列文件的部分文件名(不含路径及扩展名)
117  * @return {queue_file*} 返回 NULL 则表示未查到
118  */
119  queue_file* cache_find(const char* key);
120 
121  /**
122  * 向队列对象的缓存中添加某个队列文件对象
123  * @param fp {queue_file*} 队列文件对象
124  * @return {bool} 添加是否成功, 若失败则说明该对象或其对应的键值
125  * 已经存在于缓存中
126  */
127  bool cache_add(queue_file* fp);
128 
129  /**
130  * 从队列对象的缓存中删除某个队列文件对象
131  * @param key {const char*} 队列文件对象的键值
132  * @return {bool} 删除是否成功, 若失败则说明该队列文件对象不存在
133  */
134  bool cache_del(const char* key);
135 
136  /*-------------------- 与队列扫描相关的函数 ------------------------*/
137 
138  /**
139  * 打开磁盘扫描队列
140  * @param scanSub {bool} 是否递归扫描子目录
141  * @return {bool} 打开队列是否成功
142  */
143  bool scan_open(bool scanSub = true);
144 
145  /**
146  * 关闭扫描队列
147  */
148  void scan_close();
149 
150  /**
151  * 获得磁盘队列中的下一个队列文件, 若扫描完毕则返回空
152  * @return {queue_file*} 扫描的队列文件对象, 返回空则表示扫描完毕
153  * 或出错,非空对象一定要在用完后 delete 以释放内部分配的资源
154  */
155  queue_file* scan_next(void);
156 
157  /**
158  * 根据文件路径分析出队列名, 文件名(不含路径及扩展名部分), 文件扩展名
159  * @param filePath {const char*} 文件全路径名
160  * @param home {acl::string*} 存储文件所在的根目录
161  * @param queueName {acl::string*} 存储文件所在的队列名
162  * @param queueSub {acl::string*} 存储文件的队列子目录
163  * @param partName {acl::string*} 存储文件的文件名部分(不含路径及扩展名)
164  * @param extName {acl::string*} 存储文件的扩展名部分
165  */
166  static bool parse_filePath(const char* filePath, acl::string* home,
167  string* queueName, string* queueSub,
168  string* partName, string* extName);
169 
170  /**
171  * 根据文件名称(含扩展名但不含路径), 分析出文件名(不含路径及扩展名),
172  * 和文件扩展名称
173  */
174  static bool parse_fileName(const char* fileName, acl::string* partName,
175  string* extName);
176 
177  /**
178  * 分析路径, 从中提取出队列名称
179  */
180  static bool parse_path(const char* path, acl::string* home,
181  string* queueName, acl::string* queueSub);
182 
183  /**
184  * 根据部分文件名(不含目录及扩展名)计算出其队列子目录路径(以数字表示)
185  * @param partName {const char*} 部分文件名
186  * @param width {unsigned} 队列二级目录的个数
187  * @return {unsigned int} 队列子目录路径(以数字表示)
188  */
189  static unsigned int hash_queueSub(const char* partName, unsigned width);
190 
191 protected:
192 private:
193  bool cache_check(queue_file* fp);
194 
195  //typedef struct ACL_SCAN_DIR ACL_SCAN_DIR;
196 
197  // 扫描目录的句柄
198  ACL_SCAN_DIR* m_scanDir;
199  string m_home;
200  string m_queueName;
201  unsigned sub_width_;
202 
203  std::map<string, queue_file*> m_queueList;
204  locker m_queueLocker;
205 };
206 
207 } // namespace acl
struct ACL_SCAN_DIR ACL_SCAN_DIR
Definition: acl_scan_dir.h:14
#define ACL_CPP_API