Advertisement
Guest User

Untitled

a guest
Apr 27th, 2017
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.94 KB | None | 0 0
  1. PHP_REDIS_API void
  2. generic_mset_old(INTERNAL_FUNCTION_PARAMETERS, char *kw, ResultCallback fun) {
  3. zval *object;
  4. RedisSock *redis_sock;
  5.  
  6. char *cmd = NULL, *p = NULL;
  7. int cmd_len = 0, argc = 0, kw_len = strlen(kw);
  8. int step = 0; // 0: compute size; 1: copy strings.
  9. zval *z_array;
  10.  
  11. HashTable *keytable;
  12.  
  13. if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Oa",
  14. &object, redis_ce, &z_array) == FAILURE)
  15. {
  16. RETURN_FALSE;
  17. }
  18.  
  19. if ((redis_sock = redis_sock_get(object TSRMLS_CC, 0)) == NULL) {
  20. RETURN_FALSE;
  21. }
  22.  
  23. if(zend_hash_num_elements(Z_ARRVAL_P(z_array)) == 0) {
  24. RETURN_FALSE;
  25. }
  26.  
  27. for(step = 0; step < 2; ++step) {
  28. if(step == 1) {
  29. /* '*' + arg count + NL */
  30. cmd_len += 1 + integer_length(1 + 2 * argc) + 2;
  31. /* '$' + strlen(kw) + NL */
  32. cmd_len += 1 + integer_length(kw_len) + 2;
  33. /* kw + NL */
  34. cmd_len += kw_len + 2;
  35.  
  36. p = cmd = emalloc(cmd_len + 1);
  37. p += sprintf(cmd, "*%d" _NL "$%d" _NL "%s" _NL, 1 + 2 * argc,
  38. kw_len, kw);
  39. }
  40.  
  41. ulong idx;
  42. zend_string *zkey;
  43. zval *z_value_p;
  44. keytable = Z_ARRVAL_P(z_array);
  45. ZEND_HASH_FOREACH_KEY_VAL(keytable, idx, zkey, z_value_p) {
  46. char *key, *val;
  47. strlen_t key_len;
  48. strlen_t val_len;
  49. int val_free, key_free;
  50. char buf[32];
  51.  
  52. if (zkey) {
  53. key = zkey->val;
  54. key_len = zkey->len;
  55. } else {
  56. // Create string representation of our index
  57. key_len = snprintf(buf, sizeof(buf), "%ld", (long)idx);
  58. key = (char*)buf;
  59. }
  60.  
  61. if(step == 0)
  62. argc++; /* found a valid arg */
  63.  
  64. val_free = redis_serialize(redis_sock, z_value_p, &val, &val_len
  65. TSRMLS_CC);
  66. key_free = redis_key_prefix(redis_sock, &key, &key_len);
  67.  
  68. if(step == 0) { /* counting */
  69. cmd_len += 1 + integer_length(key_len) + 2
  70. + key_len + 2
  71. + 1 + integer_length(val_len) + 2
  72. + val_len + 2;
  73. } else {
  74. p += sprintf(p, "$%d" _NL, key_len); /* key len */
  75. memcpy(p, key, key_len); p += key_len; /* key */
  76. memcpy(p, _NL, 2); p += 2;
  77.  
  78. p += sprintf(p, "$%d" _NL, val_len); /* val len */
  79. memcpy(p, val, val_len); p += val_len; /* val */
  80. memcpy(p, _NL, 2); p += 2;
  81. }
  82.  
  83. if (val_free) efree(val);
  84. if (key_free) efree(key);
  85. } ZEND_HASH_FOREACH_END();
  86. }
  87.  
  88. REDIS_PROCESS_REQUEST(redis_sock, cmd, cmd_len);
  89.  
  90. IF_ATOMIC() {
  91. fun(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, NULL, NULL);
  92. }
  93. REDIS_PROCESS_RESPONSE(fun);
  94. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement