PageRenderTime 46ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/redis_cluster.h

http://github.com/nicolasff/phpredis
C Header | 298 lines | 265 code | 17 blank | 16 comment | 17 complexity | 7ee636a7f1ad95f8cc16606d4b4ae008 MD5 | raw file
Possible License(s): BSD-3-Clause, MPL-2.0-no-copyleft-exception
  1. #ifndef REDIS_CLUSTER_H
  2. #define REDIS_CLUSTER_H
  3. #include "cluster_library.h"
  4. #include <php.h>
  5. #include <stddef.h>
  6. /* Get attached object context */
  7. #define GET_CONTEXT() PHPREDIS_ZVAL_GET_OBJECT(redisCluster, getThis())
  8. /* Command building/processing is identical for every command */
  9. #define CLUSTER_BUILD_CMD(name, c, cmd, cmd_len, slot) \
  10. redis_##name##_cmd(INTERNAL_FUNCTION_PARAM_PASSTHRU, c->flags, &cmd, \
  11. &cmd_len, &slot)
  12. /* Append information required to handle MULTI commands to the tail of our MULTI
  13. * linked list. */
  14. #define CLUSTER_ENQUEUE_RESPONSE(c, slot, cb, ctx) \
  15. clusterFoldItem *_item; \
  16. _item = emalloc(sizeof(clusterFoldItem)); \
  17. _item->callback = cb; \
  18. _item->slot = slot; \
  19. _item->ctx = ctx; \
  20. _item->next = NULL; \
  21. if(c->multi_head == NULL) { \
  22. c->multi_head = _item; \
  23. c->multi_curr = _item; \
  24. } else { \
  25. c->multi_curr->next = _item; \
  26. c->multi_curr = _item; \
  27. } \
  28. /* Simple macro to free our enqueued callbacks after we EXEC */
  29. #define CLUSTER_FREE_QUEUE(c) \
  30. clusterFoldItem *_item = c->multi_head, *_tmp; \
  31. while(_item) { \
  32. _tmp = _item->next; \
  33. efree(_item); \
  34. _item = _tmp; \
  35. } \
  36. c->multi_head = c->multi_curr = NULL; \
  37. /* Reset anything flagged as MULTI */
  38. #define CLUSTER_RESET_MULTI(c) \
  39. redisClusterNode *_node; \
  40. ZEND_HASH_FOREACH_PTR(c->nodes, _node) { \
  41. if (_node == NULL) break; \
  42. _node->sock->watching = 0; \
  43. _node->sock->mode = ATOMIC; \
  44. } ZEND_HASH_FOREACH_END(); \
  45. c->flags->watching = 0; \
  46. c->flags->mode = ATOMIC; \
  47. /* Simple 1-1 command -> response macro */
  48. #define CLUSTER_PROCESS_CMD(cmdname, resp_func, readcmd) \
  49. redisCluster *c = GET_CONTEXT(); \
  50. c->readonly = CLUSTER_IS_ATOMIC(c) && readcmd; \
  51. char *cmd; int cmd_len; short slot; void *ctx=NULL; \
  52. if(redis_##cmdname##_cmd(INTERNAL_FUNCTION_PARAM_PASSTHRU,c->flags, &cmd, \
  53. &cmd_len, &slot, &ctx)==FAILURE) { \
  54. RETURN_FALSE; \
  55. } \
  56. if(cluster_send_command(c,slot,cmd,cmd_len)<0 || c->err!=NULL) {\
  57. efree(cmd); \
  58. RETURN_FALSE; \
  59. } \
  60. efree(cmd); \
  61. if(c->flags->mode == MULTI) { \
  62. CLUSTER_ENQUEUE_RESPONSE(c, slot, resp_func, ctx); \
  63. RETURN_ZVAL(getThis(), 1, 0); \
  64. } \
  65. resp_func(INTERNAL_FUNCTION_PARAM_PASSTHRU, c, ctx);
  66. /* More generic processing, where only the keyword differs */
  67. #define CLUSTER_PROCESS_KW_CMD(kw, cmdfunc, resp_func, readcmd) \
  68. redisCluster *c = GET_CONTEXT(); \
  69. c->readonly = CLUSTER_IS_ATOMIC(c) && readcmd; \
  70. char *cmd; int cmd_len; short slot; void *ctx=NULL; \
  71. if(cmdfunc(INTERNAL_FUNCTION_PARAM_PASSTHRU, c->flags, kw, &cmd, &cmd_len,\
  72. &slot,&ctx)==FAILURE) { \
  73. RETURN_FALSE; \
  74. } \
  75. if(cluster_send_command(c,slot,cmd,cmd_len)<0 || c->err!=NULL) { \
  76. efree(cmd); \
  77. RETURN_FALSE; \
  78. } \
  79. efree(cmd); \
  80. if(c->flags->mode == MULTI) { \
  81. CLUSTER_ENQUEUE_RESPONSE(c, slot, resp_func, ctx); \
  82. RETURN_ZVAL(getThis(), 1, 0); \
  83. } \
  84. resp_func(INTERNAL_FUNCTION_PARAM_PASSTHRU, c, ctx);
  85. /* Create cluster context */
  86. zend_object *create_cluster_context(zend_class_entry *class_type);
  87. /* Free cluster context struct */
  88. void free_cluster_context(zend_object *object);
  89. /* RedisCluster method implementation */
  90. PHP_METHOD(RedisCluster, __construct);
  91. PHP_METHOD(RedisCluster, close);
  92. PHP_METHOD(RedisCluster, get);
  93. PHP_METHOD(RedisCluster, set);
  94. PHP_METHOD(RedisCluster, mget);
  95. PHP_METHOD(RedisCluster, mset);
  96. PHP_METHOD(RedisCluster, msetnx);
  97. PHP_METHOD(RedisCluster, mset);
  98. PHP_METHOD(RedisCluster, del);
  99. PHP_METHOD(RedisCluster, unlink);
  100. PHP_METHOD(RedisCluster, dump);
  101. PHP_METHOD(RedisCluster, setex);
  102. PHP_METHOD(RedisCluster, psetex);
  103. PHP_METHOD(RedisCluster, setnx);
  104. PHP_METHOD(RedisCluster, getset);
  105. PHP_METHOD(RedisCluster, exists);
  106. PHP_METHOD(RedisCluster, keys);
  107. PHP_METHOD(RedisCluster, type);
  108. PHP_METHOD(RedisCluster, persist);
  109. PHP_METHOD(RedisCluster, lpop);
  110. PHP_METHOD(RedisCluster, rpop);
  111. PHP_METHOD(RedisCluster, spop);
  112. PHP_METHOD(RedisCluster, rpush);
  113. PHP_METHOD(RedisCluster, lpush);
  114. PHP_METHOD(RedisCluster, blpop);
  115. PHP_METHOD(RedisCluster, brpop);
  116. PHP_METHOD(RedisCluster, rpushx);
  117. PHP_METHOD(RedisCluster, lpushx);
  118. PHP_METHOD(RedisCluster, linsert);
  119. PHP_METHOD(RedisCluster, lindex);
  120. PHP_METHOD(RedisCluster, lrem);
  121. PHP_METHOD(RedisCluster, brpoplpush);
  122. PHP_METHOD(RedisCluster, rpoplpush);
  123. PHP_METHOD(RedisCluster, llen);
  124. PHP_METHOD(RedisCluster, scard);
  125. PHP_METHOD(RedisCluster, smembers);
  126. PHP_METHOD(RedisCluster, sismember);
  127. PHP_METHOD(RedisCluster, sadd);
  128. PHP_METHOD(RedisCluster, saddarray);
  129. PHP_METHOD(RedisCluster, srem);
  130. PHP_METHOD(RedisCluster, sunion);
  131. PHP_METHOD(RedisCluster, sunionstore);
  132. PHP_METHOD(RedisCluster, sinter);
  133. PHP_METHOD(RedisCluster, sinterstore);
  134. PHP_METHOD(RedisCluster, sdiff);
  135. PHP_METHOD(RedisCluster, sdiffstore);
  136. PHP_METHOD(RedisCluster, strlen);
  137. PHP_METHOD(RedisCluster, ttl);
  138. PHP_METHOD(RedisCluster, pttl);
  139. PHP_METHOD(RedisCluster, zcard);
  140. PHP_METHOD(RedisCluster, zscore);
  141. PHP_METHOD(RedisCluster, zcount);
  142. PHP_METHOD(RedisCluster, zrem);
  143. PHP_METHOD(RedisCluster, zremrangebyscore);
  144. PHP_METHOD(RedisCluster, zrank);
  145. PHP_METHOD(RedisCluster, zrevrank);
  146. PHP_METHOD(RedisCluster, zadd);
  147. PHP_METHOD(RedisCluster, zincrby);
  148. PHP_METHOD(RedisCluster, hlen);
  149. PHP_METHOD(RedisCluster, hget);
  150. PHP_METHOD(RedisCluster, hkeys);
  151. PHP_METHOD(RedisCluster, hvals);
  152. PHP_METHOD(RedisCluster, hmget);
  153. PHP_METHOD(RedisCluster, hmset);
  154. PHP_METHOD(RedisCluster, hdel);
  155. PHP_METHOD(RedisCluster, hgetall);
  156. PHP_METHOD(RedisCluster, hexists);
  157. PHP_METHOD(RedisCluster, hincrby);
  158. PHP_METHOD(RedisCluster, hincrbyfloat);
  159. PHP_METHOD(RedisCluster, hset);
  160. PHP_METHOD(RedisCluster, hsetnx);
  161. PHP_METHOD(RedisCluster, hstrlen);
  162. PHP_METHOD(RedisCluster, incr);
  163. PHP_METHOD(RedisCluster, decr);
  164. PHP_METHOD(RedisCluster, incrby);
  165. PHP_METHOD(RedisCluster, decrby);
  166. PHP_METHOD(RedisCluster, incrbyfloat);
  167. PHP_METHOD(RedisCluster, expire);
  168. PHP_METHOD(RedisCluster, expireat);
  169. PHP_METHOD(RedisCluster, pexpire);
  170. PHP_METHOD(RedisCluster, pexpireat);
  171. PHP_METHOD(RedisCluster, append);
  172. PHP_METHOD(RedisCluster, getbit);
  173. PHP_METHOD(RedisCluster, setbit);
  174. PHP_METHOD(RedisCluster, bitop);
  175. PHP_METHOD(RedisCluster, bitpos);
  176. PHP_METHOD(RedisCluster, bitcount);
  177. PHP_METHOD(RedisCluster, lget);
  178. PHP_METHOD(RedisCluster, getrange);
  179. PHP_METHOD(RedisCluster, ltrim);
  180. PHP_METHOD(RedisCluster, lrange);
  181. PHP_METHOD(RedisCluster, zremrangebyrank);
  182. PHP_METHOD(RedisCluster, publish);
  183. PHP_METHOD(RedisCluster, lset);
  184. PHP_METHOD(RedisCluster, rename);
  185. PHP_METHOD(RedisCluster, renamenx);
  186. PHP_METHOD(RedisCluster, pfcount);
  187. PHP_METHOD(RedisCluster, pfadd);
  188. PHP_METHOD(RedisCluster, pfmerge);
  189. PHP_METHOD(RedisCluster, restore);
  190. PHP_METHOD(RedisCluster, setrange);
  191. PHP_METHOD(RedisCluster, smove);
  192. PHP_METHOD(RedisCluster, srandmember);
  193. PHP_METHOD(RedisCluster, zpopmin);
  194. PHP_METHOD(RedisCluster, zpopmax);
  195. PHP_METHOD(RedisCluster, bzpopmax);
  196. PHP_METHOD(RedisCluster, bzpopmin);
  197. PHP_METHOD(RedisCluster, zrange);
  198. PHP_METHOD(RedisCluster, zrevrange);
  199. PHP_METHOD(RedisCluster, zrangebyscore);
  200. PHP_METHOD(RedisCluster, zrevrangebyscore);
  201. PHP_METHOD(RedisCluster, zrangebylex);
  202. PHP_METHOD(RedisCluster, zrevrangebylex);
  203. PHP_METHOD(RedisCluster, zlexcount);
  204. PHP_METHOD(RedisCluster, zremrangebylex);
  205. PHP_METHOD(RedisCluster, zunionstore);
  206. PHP_METHOD(RedisCluster, zinterstore);
  207. PHP_METHOD(RedisCluster, sort);
  208. PHP_METHOD(RedisCluster, object);
  209. PHP_METHOD(RedisCluster, subscribe);
  210. PHP_METHOD(RedisCluster, psubscribe);
  211. PHP_METHOD(RedisCluster, unsubscribe);
  212. PHP_METHOD(RedisCluster, punsubscribe);
  213. PHP_METHOD(RedisCluster, eval);
  214. PHP_METHOD(RedisCluster, evalsha);
  215. PHP_METHOD(RedisCluster, info);
  216. PHP_METHOD(RedisCluster, cluster);
  217. PHP_METHOD(RedisCluster, client);
  218. PHP_METHOD(RedisCluster, config);
  219. PHP_METHOD(RedisCluster, pubsub);
  220. PHP_METHOD(RedisCluster, script);
  221. PHP_METHOD(RedisCluster, slowlog);
  222. PHP_METHOD(RedisCluster, command);
  223. PHP_METHOD(RedisCluster, geoadd);
  224. PHP_METHOD(RedisCluster, geohash);
  225. PHP_METHOD(RedisCluster, geopos);
  226. PHP_METHOD(RedisCluster, geodist);
  227. PHP_METHOD(RedisCluster, georadius);
  228. PHP_METHOD(RedisCluster, georadius_ro);
  229. PHP_METHOD(RedisCluster, georadiusbymember);
  230. PHP_METHOD(RedisCluster, georadiusbymember_ro);
  231. /* SCAN and friends */
  232. PHP_METHOD(RedisCluster, scan);
  233. PHP_METHOD(RedisCluster, zscan);
  234. PHP_METHOD(RedisCluster, hscan);
  235. PHP_METHOD(RedisCluster, sscan);
  236. /* STREAMS */
  237. PHP_METHOD(RedisCluster, xack);
  238. PHP_METHOD(RedisCluster, xadd);
  239. PHP_METHOD(RedisCluster, xclaim);
  240. PHP_METHOD(RedisCluster, xdel);
  241. PHP_METHOD(RedisCluster, xgroup);
  242. PHP_METHOD(RedisCluster, xinfo);
  243. PHP_METHOD(RedisCluster, xlen);
  244. PHP_METHOD(RedisCluster, xpending);
  245. PHP_METHOD(RedisCluster, xrange);
  246. PHP_METHOD(RedisCluster, xread);
  247. PHP_METHOD(RedisCluster, xreadgroup);
  248. PHP_METHOD(RedisCluster, xrevrange);
  249. PHP_METHOD(RedisCluster, xtrim);
  250. /* Transactions */
  251. PHP_METHOD(RedisCluster, multi);
  252. PHP_METHOD(RedisCluster, exec);
  253. PHP_METHOD(RedisCluster, discard);
  254. PHP_METHOD(RedisCluster, watch);
  255. PHP_METHOD(RedisCluster, unwatch);
  256. /* Commands we direct to a node */
  257. PHP_METHOD(RedisCluster, save);
  258. PHP_METHOD(RedisCluster, bgsave);
  259. PHP_METHOD(RedisCluster, flushdb);
  260. PHP_METHOD(RedisCluster, flushall);
  261. PHP_METHOD(RedisCluster, dbsize);
  262. PHP_METHOD(RedisCluster, bgrewriteaof);
  263. PHP_METHOD(RedisCluster, lastsave);
  264. PHP_METHOD(RedisCluster, role);
  265. PHP_METHOD(RedisCluster, time);
  266. PHP_METHOD(RedisCluster, randomkey);
  267. PHP_METHOD(RedisCluster, ping);
  268. PHP_METHOD(RedisCluster, echo);
  269. PHP_METHOD(RedisCluster, rawcommand);
  270. /* Introspection */
  271. PHP_METHOD(RedisCluster, getmode);
  272. PHP_METHOD(RedisCluster, getlasterror);
  273. PHP_METHOD(RedisCluster, clearlasterror);
  274. PHP_METHOD(RedisCluster, getoption);
  275. PHP_METHOD(RedisCluster, setoption);
  276. PHP_METHOD(RedisCluster, _prefix);
  277. PHP_METHOD(RedisCluster, _serialize);
  278. PHP_METHOD(RedisCluster, _unserialize);
  279. PHP_METHOD(RedisCluster, _masters);
  280. PHP_METHOD(RedisCluster, _redir);
  281. #endif