PageRenderTime 45ms CodeModel.GetById 16ms RepoModel.GetById 1ms app.codeStats 0ms

/redis_cluster.h

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