durable_rules 0.33.13 → 0.34.01
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/deps/hiredis/Makefile +110 -41
- data/deps/hiredis/async.c +87 -22
- data/deps/hiredis/async.h +4 -0
- data/deps/hiredis/fmacros.h +6 -1
- data/deps/hiredis/hiredis.c +270 -534
- data/deps/hiredis/hiredis.h +89 -76
- data/deps/hiredis/net.c +206 -47
- data/deps/hiredis/net.h +12 -6
- data/deps/hiredis/read.c +525 -0
- data/deps/hiredis/read.h +116 -0
- data/deps/hiredis/sds.c +260 -47
- data/deps/hiredis/sds.h +11 -6
- data/deps/hiredis/test.c +171 -18
- data/deps/hiredis/win32.h +42 -0
- data/librb/durable.rb +35 -6
- data/librb/engine.rb +173 -40
- data/src/rules/events.c +42 -4
- data/src/rules/net.c +184 -96
- data/src/rules/net.h +10 -0
- data/src/rules/rules.h +13 -0
- data/src/rulesrb/rules.c +55 -0
- metadata +5 -3
- data/deps/hiredis/zmalloc.h +0 -13
data/src/rules/net.c
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
#include <stdlib.h>
|
|
3
3
|
#include <string.h>
|
|
4
4
|
#include <time.h>
|
|
5
|
+
#include <errno.h>
|
|
5
6
|
#include "net.h"
|
|
6
7
|
#include "rules.h"
|
|
7
8
|
#include "json.h"
|
|
@@ -894,7 +895,6 @@ static unsigned int loadCommands(ruleset *tree, binding *rulesBinding) {
|
|
|
894
895
|
"local events_mids_cache = {}\n"
|
|
895
896
|
"local context_directory = {}\n"
|
|
896
897
|
"local input_keys = {}\n"
|
|
897
|
-
"local candidate = nil\n"
|
|
898
898
|
"local toggle\n"
|
|
899
899
|
"local expressions_count\n"
|
|
900
900
|
"local results\n"
|
|
@@ -1138,7 +1138,6 @@ static unsigned int loadCommands(ruleset *tree, binding *rulesBinding) {
|
|
|
1138
1138
|
"end\n"
|
|
1139
1139
|
"local process_key_with_span = function(message, span)\n"
|
|
1140
1140
|
" local index = directory[key]\n"
|
|
1141
|
-
" local next_result = nil\n"
|
|
1142
1141
|
" local queue_lock = false\n"
|
|
1143
1142
|
" if index then\n"
|
|
1144
1143
|
" local last_score = redis.call(\"get\", results_key .. \"!d\")\n"
|
|
@@ -1176,11 +1175,10 @@ static unsigned int loadCommands(ruleset *tree, binding *rulesBinding) {
|
|
|
1176
1175
|
" end\n"
|
|
1177
1176
|
" end\n"
|
|
1178
1177
|
" end\n"
|
|
1179
|
-
" return queue_lock
|
|
1178
|
+
" return queue_lock\n"
|
|
1180
1179
|
"end\n"
|
|
1181
1180
|
"local process_key_with_cap = function(message, cap)\n"
|
|
1182
1181
|
" local index = directory[key]\n"
|
|
1183
|
-
" local next_result = nil\n"
|
|
1184
1182
|
" local queue_lock = false\n"
|
|
1185
1183
|
" if index then\n"
|
|
1186
1184
|
" local count = 0\n"
|
|
@@ -1204,20 +1202,6 @@ static unsigned int loadCommands(ruleset *tree, binding *rulesBinding) {
|
|
|
1204
1202
|
" local diff\n"
|
|
1205
1203
|
" local new_count, new_remain = math.modf(#results / cap)\n"
|
|
1206
1204
|
" local new_remain = #results %% cap\n"
|
|
1207
|
-
" if redis.call(\"llen\", actions_key .. \"!\" .. sid) == 2 then\n"
|
|
1208
|
-
" local frames = {}\n"
|
|
1209
|
-
" if new_count > 0 then\n"
|
|
1210
|
-
" for i = 0, cap - 1, 1 do\n"
|
|
1211
|
-
" table.insert(frames, unpacked_results[#unpacked_results - i])\n"
|
|
1212
|
-
" end\n"
|
|
1213
|
-
" else\n"
|
|
1214
|
-
" for i = 0, new_remain - 1, 1 do\n"
|
|
1215
|
-
" table.insert(frames, unpacked_results[#unpacked_results - i])\n"
|
|
1216
|
-
" end\n"
|
|
1217
|
-
" end\n"
|
|
1218
|
-
" local last_name = string.find(results_key, \"!\") - 1\n"
|
|
1219
|
-
" next_result = {[string.sub(results_key, 1, last_name)] = frames}\n"
|
|
1220
|
-
" end\n"
|
|
1221
1205
|
" if new_count > 0 then\n"
|
|
1222
1206
|
" for i = 1, new_count, 1 do\n"
|
|
1223
1207
|
" redis.call(\"rpush\", actions_key .. \"!\" .. sid, results_key)\n"
|
|
@@ -1233,11 +1217,10 @@ static unsigned int loadCommands(ruleset *tree, binding *rulesBinding) {
|
|
|
1233
1217
|
" end\n"
|
|
1234
1218
|
" end\n"
|
|
1235
1219
|
" end\n"
|
|
1236
|
-
" return queue_lock
|
|
1220
|
+
" return queue_lock\n"
|
|
1237
1221
|
"end\n"
|
|
1238
1222
|
"local process_key_with_window = function(message, window)\n"
|
|
1239
1223
|
" local index = directory[key]\n"
|
|
1240
|
-
" local next_result = nil\n"
|
|
1241
1224
|
" local queue_lock = false\n"
|
|
1242
1225
|
" if index then\n"
|
|
1243
1226
|
" local count = 0\n"
|
|
@@ -1264,18 +1247,6 @@ static unsigned int loadCommands(ruleset *tree, binding *rulesBinding) {
|
|
|
1264
1247
|
" local new_count, prev_remain = math.modf(length / window)\n"
|
|
1265
1248
|
" diff = new_count - prev_count\n"
|
|
1266
1249
|
" if diff > 0 then\n"
|
|
1267
|
-
" if redis.call(\"llen\", actions_key .. \"!\" .. sid) == 2 then\n"
|
|
1268
|
-
" local frames = {}\n"
|
|
1269
|
-
" for i = 0, window - 1, 1 do\n"
|
|
1270
|
-
" table.insert(frames, unpacked_results[#unpacked_results - i])\n"
|
|
1271
|
-
" end\n"
|
|
1272
|
-
" local last_name = string.find(results_key, \"!\") - 1\n"
|
|
1273
|
-
" if window == 1 then\n"
|
|
1274
|
-
" next_result = {[string.sub(results_key, 1, last_name)] = frames[1]}\n"
|
|
1275
|
-
" else\n"
|
|
1276
|
-
" next_result = {[string.sub(results_key, 1, last_name)] = frames}\n"
|
|
1277
|
-
" end\n"
|
|
1278
|
-
" end\n"
|
|
1279
1250
|
" for i = 0, diff - 1, 1 do\n"
|
|
1280
1251
|
" redis.call(\"rpush\", actions_key .. \"!\" .. sid, results_key)\n"
|
|
1281
1252
|
" if window == 1 then\n"
|
|
@@ -1288,7 +1259,7 @@ static unsigned int loadCommands(ruleset *tree, binding *rulesBinding) {
|
|
|
1288
1259
|
" end\n"
|
|
1289
1260
|
" end\n"
|
|
1290
1261
|
" end\n"
|
|
1291
|
-
" return queue_lock
|
|
1262
|
+
" return queue_lock\n"
|
|
1292
1263
|
"end\n"
|
|
1293
1264
|
"local message = nil\n"
|
|
1294
1265
|
"if #ARGV > (6 + keys_count) then\n"
|
|
@@ -1341,11 +1312,7 @@ static unsigned int loadCommands(ruleset *tree, binding *rulesBinding) {
|
|
|
1341
1312
|
" expressions_count = context[\"expressions_count\"]\n"
|
|
1342
1313
|
" local process_key = context[\"process_key\"]\n"
|
|
1343
1314
|
" local process_key_count = context[\"process_key_count\"]\n"
|
|
1344
|
-
"
|
|
1345
|
-
" queue_action, new_candidate = process_key(message, process_key_count)\n"
|
|
1346
|
-
" if new_candidate then\n"
|
|
1347
|
-
" candidate = new_candidate\n"
|
|
1348
|
-
" end\n"
|
|
1315
|
+
" queue_action = process_key(message, process_key_count)\n"
|
|
1349
1316
|
" if assert_fact == 0 and events_message_cache[tostring(message[\"id\"])] == false then\n"
|
|
1350
1317
|
" break\n"
|
|
1351
1318
|
" end\n"
|
|
@@ -1355,14 +1322,7 @@ static unsigned int loadCommands(ruleset *tree, binding *rulesBinding) {
|
|
|
1355
1322
|
" redis.call(\"zadd\", actions_key , score, sid)\n"
|
|
1356
1323
|
" end\n"
|
|
1357
1324
|
"end\n"
|
|
1358
|
-
"
|
|
1359
|
-
" if redis.call(\"llen\", actions_key .. \"!\" .. sid) > 2 then\n"
|
|
1360
|
-
" end\n"
|
|
1361
|
-
" return nil\n"
|
|
1362
|
-
"else\n"
|
|
1363
|
-
" redis.call(\"set\", \"skip\", \"yes\")\n"
|
|
1364
|
-
" return {sid, cjson.encode(candidate)}\n"
|
|
1365
|
-
"end\n",
|
|
1325
|
+
"return nil\n",
|
|
1366
1326
|
name,
|
|
1367
1327
|
name,
|
|
1368
1328
|
name,
|
|
@@ -1388,10 +1348,6 @@ static unsigned int loadCommands(ruleset *tree, binding *rulesBinding) {
|
|
|
1388
1348
|
free(lua);
|
|
1389
1349
|
|
|
1390
1350
|
if (asprintf(&lua,
|
|
1391
|
-
"if redis.call(\"get\", \"skip\") == \"yes\" then\n"
|
|
1392
|
-
" redis.call(\"set\", \"skip\", \"no\")\n"
|
|
1393
|
-
" return nil\n"
|
|
1394
|
-
"end\n"
|
|
1395
1351
|
"local facts_key = \"%s!f!\"\n"
|
|
1396
1352
|
"local events_key = \"%s!e!\"\n"
|
|
1397
1353
|
"local action_key = \"%s!a\"\n"
|
|
@@ -1567,7 +1523,7 @@ static unsigned int loadCommands(ruleset *tree, binding *rulesBinding) {
|
|
|
1567
1523
|
"end\n"
|
|
1568
1524
|
"local load_frame = function(max_score)\n"
|
|
1569
1525
|
" local current_action = redis.call(\"zrange\", action_key, 0, 0, \"withscores\")\n"
|
|
1570
|
-
" if #current_action == 0 or (tonumber(current_action[2]) > (max_score + 5)) then\n"
|
|
1526
|
+
" if (#current_action == 0) or (tonumber(current_action[2]) > (max_score + 5)) then\n"
|
|
1571
1527
|
" return nil, nil, nil\n"
|
|
1572
1528
|
" end\n"
|
|
1573
1529
|
" local sid = current_action[1]\n"
|
|
@@ -1592,13 +1548,13 @@ static unsigned int loadCommands(ruleset *tree, binding *rulesBinding) {
|
|
|
1592
1548
|
"local new_sid, action_name, frame\n"
|
|
1593
1549
|
"if #ARGV == 3 then\n"
|
|
1594
1550
|
" new_sid = ARGV[3]\n"
|
|
1595
|
-
" action_name, frame = load_frame_from_sid(new_sid, ARGV[2])\n"
|
|
1551
|
+
" action_name, frame = load_frame_from_sid(new_sid, tonumber(ARGV[2]))\n"
|
|
1596
1552
|
"else\n"
|
|
1597
1553
|
" new_sid, action_name, frame = load_frame(tonumber(ARGV[2]))\n"
|
|
1598
1554
|
"end\n"
|
|
1599
1555
|
"if frame then\n"
|
|
1556
|
+
" redis.call(\"zadd\", action_key, tonumber(ARGV[1]), new_sid)\n"
|
|
1600
1557
|
" if #ARGV == 2 then\n"
|
|
1601
|
-
" redis.call(\"zincrby\", action_key, tonumber(ARGV[1]), new_sid)\n"
|
|
1602
1558
|
" local state = redis.call(\"hget\", state_key, new_sid)\n"
|
|
1603
1559
|
" return {new_sid, state, cjson.encode({[action_name] = frame})}\n"
|
|
1604
1560
|
" else\n"
|
|
@@ -1706,7 +1662,7 @@ static unsigned int loadCommands(ruleset *tree, binding *rulesBinding) {
|
|
|
1706
1662
|
free(lua);
|
|
1707
1663
|
|
|
1708
1664
|
if (asprintf(&lua,
|
|
1709
|
-
"local delete_frame = function(key)\n"
|
|
1665
|
+
"local delete_frame = function(key, action_key)\n"
|
|
1710
1666
|
" local rule_action_key = redis.call(\"lpop\", key)\n"
|
|
1711
1667
|
" local raw_count = redis.call(\"lpop\", key)\n"
|
|
1712
1668
|
" local count = 1\n"
|
|
@@ -1720,7 +1676,7 @@ static unsigned int loadCommands(ruleset *tree, binding *rulesBinding) {
|
|
|
1720
1676
|
" end\n"
|
|
1721
1677
|
" else\n"
|
|
1722
1678
|
" for i = 0, count - 1, 1 do\n"
|
|
1723
|
-
" redis.call(\"
|
|
1679
|
+
" local packed_frame = redis.call(\"rpop\", rule_action_key)\n"
|
|
1724
1680
|
" end\n"
|
|
1725
1681
|
" end\n"
|
|
1726
1682
|
" return (redis.call(\"llen\", key) > 0)\n"
|
|
@@ -1728,14 +1684,10 @@ static unsigned int loadCommands(ruleset *tree, binding *rulesBinding) {
|
|
|
1728
1684
|
"local sid = ARGV[1]\n"
|
|
1729
1685
|
"local max_score = tonumber(ARGV[2])\n"
|
|
1730
1686
|
"local action_key = \"%s!a\"\n"
|
|
1731
|
-
"if delete_frame(action_key .. \"!\" .. sid) then\n"
|
|
1732
|
-
|
|
1733
|
-
" redis.call(\"zadd\", action_key, max_score, sid)\n"
|
|
1734
|
-
//" end\n"
|
|
1687
|
+
"if delete_frame(action_key .. \"!\" .. sid, action_key) then\n"
|
|
1688
|
+
" redis.call(\"zadd\", action_key , max_score, sid)\n"
|
|
1735
1689
|
"else\n"
|
|
1736
|
-
|
|
1737
|
-
" redis.call(\"zrem\", action_key, sid)\n"
|
|
1738
|
-
//" end\n"
|
|
1690
|
+
" redis.call(\"zrem\", action_key, sid)\n"
|
|
1739
1691
|
"end\n", name) == -1) {
|
|
1740
1692
|
return ERR_OUT_OF_MEMORY;
|
|
1741
1693
|
}
|
|
@@ -1806,6 +1758,29 @@ static unsigned int loadCommands(ruleset *tree, binding *rulesBinding) {
|
|
|
1806
1758
|
freeReplyObject(reply);
|
|
1807
1759
|
free(lua);
|
|
1808
1760
|
|
|
1761
|
+
if (asprintf(&lua,
|
|
1762
|
+
"local actions_key = \"%s!a\"\n"
|
|
1763
|
+
"local score = tonumber(ARGV[2])\n"
|
|
1764
|
+
"local sid = ARGV[1]\n"
|
|
1765
|
+
"if redis.call(\"zscore\", actions_key, sid) then\n"
|
|
1766
|
+
" redis.call(\"zadd\", actions_key , score, sid)\n"
|
|
1767
|
+
"end\n", name) == -1) {
|
|
1768
|
+
return ERR_OUT_OF_MEMORY;
|
|
1769
|
+
}
|
|
1770
|
+
|
|
1771
|
+
redisAppendCommand(reContext, "SCRIPT LOAD %s", lua);
|
|
1772
|
+
redisGetReply(reContext, (void**)&reply);
|
|
1773
|
+
if (reply->type == REDIS_REPLY_ERROR) {
|
|
1774
|
+
printf("%s\n", reply->str);
|
|
1775
|
+
freeReplyObject(reply);
|
|
1776
|
+
return ERR_REDIS_ERROR;
|
|
1777
|
+
}
|
|
1778
|
+
|
|
1779
|
+
strncpy(rulesBinding->updateActionHash, reply->str, 40);
|
|
1780
|
+
rulesBinding->updateActionHash[40] = '\0';
|
|
1781
|
+
freeReplyObject(reply);
|
|
1782
|
+
free(lua);
|
|
1783
|
+
|
|
1809
1784
|
char *sessionHashset = malloc((nameLength + 3) * sizeof(char));
|
|
1810
1785
|
if (!sessionHashset) {
|
|
1811
1786
|
return ERR_OUT_OF_MEMORY;
|
|
@@ -1887,8 +1862,16 @@ unsigned int bindRuleset(void *handle,
|
|
|
1887
1862
|
return ERR_CONNECT_REDIS;
|
|
1888
1863
|
}
|
|
1889
1864
|
|
|
1865
|
+
struct timeval tv;
|
|
1866
|
+
tv.tv_sec = 10;
|
|
1867
|
+
tv.tv_usec = 0;
|
|
1868
|
+
int result = redisSetTimeout(reContext, tv);
|
|
1869
|
+
if (result != REDIS_OK) {
|
|
1870
|
+
return ERR_REDIS_ERROR;
|
|
1871
|
+
}
|
|
1872
|
+
|
|
1890
1873
|
if (password != NULL) {
|
|
1891
|
-
|
|
1874
|
+
result = redisAppendCommand(reContext, "auth %s", password);
|
|
1892
1875
|
if (result != REDIS_OK) {
|
|
1893
1876
|
return ERR_REDIS_ERROR;
|
|
1894
1877
|
}
|
|
@@ -2012,7 +1995,7 @@ unsigned int formatEvalMessage(void *rulesBinding,
|
|
|
2012
1995
|
argv[4] = mid;
|
|
2013
1996
|
argvl[4] = strlen(mid);
|
|
2014
1997
|
argv[5] = score;
|
|
2015
|
-
argvl[5] =
|
|
1998
|
+
argvl[5] = strlen(score);
|
|
2016
1999
|
argv[6] = (actionType == ACTION_ASSERT_FACT || actionType == ACTION_RETRACT_FACT) ? "1" : "0";
|
|
2017
2000
|
argvl[6] = 1;
|
|
2018
2001
|
argv[7] = keysLengthString;
|
|
@@ -2268,7 +2251,7 @@ unsigned int formatPeekAction(void *rulesBinding,
|
|
|
2268
2251
|
int result = redisFormatCommand(command,
|
|
2269
2252
|
"evalsha %s 0 %d %ld %s",
|
|
2270
2253
|
currentBinding->peekActionHash,
|
|
2271
|
-
|
|
2254
|
+
currentTime + 15,
|
|
2272
2255
|
currentTime,
|
|
2273
2256
|
sid);
|
|
2274
2257
|
if (result == 0) {
|
|
@@ -2291,22 +2274,22 @@ unsigned int startNonBlockingBatch(void *rulesBinding,
|
|
|
2291
2274
|
unsigned int result = RULES_OK;
|
|
2292
2275
|
binding *currentBinding = (binding*)rulesBinding;
|
|
2293
2276
|
redisContext *reContext = currentBinding->reContext;
|
|
2294
|
-
|
|
2277
|
+
|
|
2278
|
+
sds newbuf = sdsempty();
|
|
2295
2279
|
for (unsigned int i = 0; i < commandCount; ++i) {
|
|
2296
|
-
|
|
2297
|
-
newbuf = sdscatlen(reContext->obuf, commands[i], strlen(commands[i]));
|
|
2280
|
+
newbuf = sdscatlen(newbuf, commands[i], strlen(commands[i]));
|
|
2298
2281
|
if (newbuf == NULL) {
|
|
2299
2282
|
return ERR_OUT_OF_MEMORY;
|
|
2300
2283
|
}
|
|
2301
2284
|
|
|
2302
|
-
reContext->obuf = newbuf;
|
|
2303
2285
|
free(commands[i]);
|
|
2304
2286
|
}
|
|
2305
2287
|
|
|
2288
|
+
reContext->obuf = newbuf;
|
|
2306
2289
|
int wdone = 0;
|
|
2307
2290
|
do {
|
|
2308
2291
|
if (redisBufferWrite(reContext, &wdone) == REDIS_ERR) {
|
|
2309
|
-
printf("error %u %s\n", reContext->err, reContext->errstr);
|
|
2292
|
+
printf("start non blocking batch error %u %s\n", reContext->err, reContext->errstr);
|
|
2310
2293
|
return ERR_REDIS_ERROR;
|
|
2311
2294
|
}
|
|
2312
2295
|
} while (!wdone);
|
|
@@ -2314,6 +2297,22 @@ unsigned int startNonBlockingBatch(void *rulesBinding,
|
|
|
2314
2297
|
return result;
|
|
2315
2298
|
}
|
|
2316
2299
|
|
|
2300
|
+
static unsigned int tryGetReply(redisContext *reContext,
|
|
2301
|
+
redisReply **reply) {
|
|
2302
|
+
|
|
2303
|
+
if (redisGetReply(reContext, (void**)reply) != REDIS_OK) {
|
|
2304
|
+
printf("getReply err %d, %d, %s\n", reContext->err, errno, reContext->errstr);
|
|
2305
|
+
if (redisReconnect(reContext) != REDIS_OK) {
|
|
2306
|
+
printf("reconnect err %d, %d, %s\n", reContext->err, errno, reContext->errstr);
|
|
2307
|
+
return ERR_REDIS_ERROR;
|
|
2308
|
+
}
|
|
2309
|
+
|
|
2310
|
+
return ERR_TRY_AGAIN;
|
|
2311
|
+
}
|
|
2312
|
+
|
|
2313
|
+
return RULES_OK;
|
|
2314
|
+
}
|
|
2315
|
+
|
|
2317
2316
|
unsigned int completeNonBlockingBatch(void *rulesBinding,
|
|
2318
2317
|
unsigned int replyCount) {
|
|
2319
2318
|
if (replyCount == 0) {
|
|
@@ -2325,12 +2324,12 @@ unsigned int completeNonBlockingBatch(void *rulesBinding,
|
|
|
2325
2324
|
redisContext *reContext = currentBinding->reContext;
|
|
2326
2325
|
redisReply *reply;
|
|
2327
2326
|
for (unsigned int i = 0; i < replyCount; ++i) {
|
|
2328
|
-
result =
|
|
2329
|
-
if (result !=
|
|
2330
|
-
result
|
|
2327
|
+
result = tryGetReply(reContext, &reply);
|
|
2328
|
+
if (result != RULES_OK) {
|
|
2329
|
+
return result;
|
|
2331
2330
|
} else {
|
|
2332
2331
|
if (reply->type == REDIS_REPLY_ERROR) {
|
|
2333
|
-
printf("error %d %s\n", i, reply->str);
|
|
2332
|
+
printf("complete non blocking batch error %d %s\n", i, reply->str);
|
|
2334
2333
|
result = ERR_REDIS_ERROR;
|
|
2335
2334
|
}
|
|
2336
2335
|
|
|
@@ -2364,22 +2363,22 @@ unsigned int executeBatchWithReply(void *rulesBinding,
|
|
|
2364
2363
|
*lastReply = NULL;
|
|
2365
2364
|
}
|
|
2366
2365
|
|
|
2366
|
+
sds newbuf = sdsempty();
|
|
2367
2367
|
for (unsigned int i = 0; i < commandCount; ++i) {
|
|
2368
|
-
|
|
2369
|
-
newbuf = sdscatlen(reContext->obuf, commands[i], strlen(commands[i]));
|
|
2368
|
+
newbuf = sdscatlen(newbuf, commands[i], strlen(commands[i]));
|
|
2370
2369
|
if (newbuf == NULL) {
|
|
2371
2370
|
return ERR_OUT_OF_MEMORY;
|
|
2372
2371
|
}
|
|
2373
2372
|
|
|
2374
|
-
reContext->obuf = newbuf;
|
|
2375
2373
|
free(commands[i]);
|
|
2376
2374
|
}
|
|
2377
2375
|
|
|
2376
|
+
reContext->obuf = newbuf;
|
|
2378
2377
|
redisReply *reply;
|
|
2379
2378
|
for (unsigned int i = 0; i < replyCount; ++i) {
|
|
2380
|
-
result =
|
|
2381
|
-
if (result !=
|
|
2382
|
-
result
|
|
2379
|
+
result = tryGetReply(reContext, &reply);
|
|
2380
|
+
if (result != RULES_OK) {
|
|
2381
|
+
return result;
|
|
2383
2382
|
} else {
|
|
2384
2383
|
if (reply->type == REDIS_REPLY_ERROR) {
|
|
2385
2384
|
printf("%s\n", reply->str);
|
|
@@ -2417,12 +2416,13 @@ unsigned int removeMessage(void *rulesBinding, char *sid, char *mid) {
|
|
|
2417
2416
|
}
|
|
2418
2417
|
|
|
2419
2418
|
redisReply *reply;
|
|
2420
|
-
result =
|
|
2421
|
-
if (result !=
|
|
2422
|
-
return
|
|
2419
|
+
result = tryGetReply(reContext, &reply);
|
|
2420
|
+
if (result != RULES_OK) {
|
|
2421
|
+
return result;
|
|
2423
2422
|
}
|
|
2424
2423
|
|
|
2425
2424
|
if (reply->type == REDIS_REPLY_ERROR) {
|
|
2425
|
+
printf("removeMessage err string %s\n", reply->str);
|
|
2426
2426
|
freeReplyObject(reply);
|
|
2427
2427
|
return ERR_REDIS_ERROR;
|
|
2428
2428
|
}
|
|
@@ -2442,19 +2442,19 @@ unsigned int peekAction(ruleset *tree, void **bindingContext, redisReply **reply
|
|
|
2442
2442
|
int result = redisAppendCommand(reContext,
|
|
2443
2443
|
"evalsha %s 0 %d %ld",
|
|
2444
2444
|
currentBinding->peekActionHash,
|
|
2445
|
-
|
|
2445
|
+
currentTime + 15,
|
|
2446
2446
|
currentTime);
|
|
2447
2447
|
if (result != REDIS_OK) {
|
|
2448
2448
|
continue;
|
|
2449
2449
|
}
|
|
2450
2450
|
|
|
2451
|
-
result =
|
|
2452
|
-
if (result !=
|
|
2453
|
-
return
|
|
2451
|
+
result = tryGetReply(reContext, reply);
|
|
2452
|
+
if (result != RULES_OK) {
|
|
2453
|
+
return result;
|
|
2454
2454
|
}
|
|
2455
2455
|
|
|
2456
2456
|
if ((*reply)->type == REDIS_REPLY_ERROR) {
|
|
2457
|
-
printf("%s\n", (*reply)->str);
|
|
2457
|
+
printf("peekAction err string %s\n", (*reply)->str);
|
|
2458
2458
|
freeReplyObject(*reply);
|
|
2459
2459
|
return ERR_REDIS_ERROR;
|
|
2460
2460
|
}
|
|
@@ -2486,12 +2486,13 @@ unsigned int peekTimers(ruleset *tree, void **bindingContext, redisReply **reply
|
|
|
2486
2486
|
continue;
|
|
2487
2487
|
}
|
|
2488
2488
|
|
|
2489
|
-
result =
|
|
2490
|
-
if (result !=
|
|
2491
|
-
return
|
|
2489
|
+
result = tryGetReply(reContext, reply);
|
|
2490
|
+
if (result != RULES_OK) {
|
|
2491
|
+
return result;
|
|
2492
2492
|
}
|
|
2493
2493
|
|
|
2494
2494
|
if ((*reply)->type == REDIS_REPLY_ERROR) {
|
|
2495
|
+
printf("peekTimers err string %s\n", (*reply)->str);
|
|
2495
2496
|
freeReplyObject(*reply);
|
|
2496
2497
|
return ERR_REDIS_ERROR;
|
|
2497
2498
|
}
|
|
@@ -2522,12 +2523,71 @@ unsigned int registerTimer(void *rulesBinding, unsigned int duration, char *time
|
|
|
2522
2523
|
}
|
|
2523
2524
|
|
|
2524
2525
|
redisReply *reply;
|
|
2525
|
-
result =
|
|
2526
|
+
result = tryGetReply(reContext, &reply);
|
|
2527
|
+
if (result != RULES_OK) {
|
|
2528
|
+
return result;
|
|
2529
|
+
}
|
|
2530
|
+
|
|
2531
|
+
if (reply->type == REDIS_REPLY_ERROR) {
|
|
2532
|
+
printf("registerTimer err string %s\n", reply->str);
|
|
2533
|
+
freeReplyObject(reply);
|
|
2534
|
+
return ERR_REDIS_ERROR;
|
|
2535
|
+
}
|
|
2536
|
+
|
|
2537
|
+
freeReplyObject(reply);
|
|
2538
|
+
return RULES_OK;
|
|
2539
|
+
}
|
|
2540
|
+
|
|
2541
|
+
unsigned int removeTimer(void *rulesBinding, char *timer) {
|
|
2542
|
+
binding *currentBinding = (binding*)rulesBinding;
|
|
2543
|
+
redisContext *reContext = currentBinding->reContext;
|
|
2544
|
+
|
|
2545
|
+
int result = redisAppendCommand(reContext,
|
|
2546
|
+
"zrem %s %s",
|
|
2547
|
+
currentBinding->timersSortedset,
|
|
2548
|
+
timer);
|
|
2526
2549
|
if (result != REDIS_OK) {
|
|
2527
2550
|
return ERR_REDIS_ERROR;
|
|
2528
2551
|
}
|
|
2552
|
+
|
|
2553
|
+
redisReply *reply;
|
|
2554
|
+
result = tryGetReply(reContext, &reply);
|
|
2555
|
+
if (result != RULES_OK) {
|
|
2556
|
+
return result;
|
|
2557
|
+
}
|
|
2529
2558
|
|
|
2530
2559
|
if (reply->type == REDIS_REPLY_ERROR) {
|
|
2560
|
+
printf("deleteTimer err string %s\n", reply->str);
|
|
2561
|
+
freeReplyObject(reply);
|
|
2562
|
+
return ERR_REDIS_ERROR;
|
|
2563
|
+
}
|
|
2564
|
+
|
|
2565
|
+
freeReplyObject(reply);
|
|
2566
|
+
return RULES_OK;
|
|
2567
|
+
}
|
|
2568
|
+
|
|
2569
|
+
unsigned int registerMessage(void *rulesBinding, char *destination, char *message) {
|
|
2570
|
+
binding *currentBinding = (binding*)rulesBinding;
|
|
2571
|
+
redisContext *reContext = currentBinding->reContext;
|
|
2572
|
+
time_t currentTime = time(NULL);
|
|
2573
|
+
|
|
2574
|
+
int result = redisAppendCommand(reContext,
|
|
2575
|
+
"zadd %s!t %ld %s",
|
|
2576
|
+
destination,
|
|
2577
|
+
currentTime,
|
|
2578
|
+
message);
|
|
2579
|
+
if (result != REDIS_OK) {
|
|
2580
|
+
return ERR_REDIS_ERROR;
|
|
2581
|
+
}
|
|
2582
|
+
|
|
2583
|
+
redisReply *reply;
|
|
2584
|
+
result = tryGetReply(reContext, &reply);
|
|
2585
|
+
if (result != RULES_OK) {
|
|
2586
|
+
return result;
|
|
2587
|
+
}
|
|
2588
|
+
|
|
2589
|
+
if (reply->type == REDIS_REPLY_ERROR) {
|
|
2590
|
+
printf("registerMessage err string %s\n", reply->str);
|
|
2531
2591
|
freeReplyObject(reply);
|
|
2532
2592
|
return ERR_REDIS_ERROR;
|
|
2533
2593
|
}
|
|
@@ -2548,9 +2608,9 @@ unsigned int getSession(void *rulesBinding, char *sid, char **state) {
|
|
|
2548
2608
|
}
|
|
2549
2609
|
|
|
2550
2610
|
redisReply *reply;
|
|
2551
|
-
result =
|
|
2552
|
-
if (result !=
|
|
2553
|
-
return
|
|
2611
|
+
result = tryGetReply(reContext, &reply);
|
|
2612
|
+
if (result != RULES_OK) {
|
|
2613
|
+
return result;
|
|
2554
2614
|
}
|
|
2555
2615
|
|
|
2556
2616
|
if (reply->type == REDIS_REPLY_ERROR) {
|
|
@@ -2563,7 +2623,7 @@ unsigned int getSession(void *rulesBinding, char *sid, char **state) {
|
|
|
2563
2623
|
return ERR_NEW_SESSION;
|
|
2564
2624
|
}
|
|
2565
2625
|
|
|
2566
|
-
*state = malloc(strlen(reply->str) * sizeof(char));
|
|
2626
|
+
*state = malloc((strlen(reply->str) + 1) * sizeof(char));
|
|
2567
2627
|
if (!*state) {
|
|
2568
2628
|
return ERR_OUT_OF_MEMORY;
|
|
2569
2629
|
}
|
|
@@ -2572,4 +2632,32 @@ unsigned int getSession(void *rulesBinding, char *sid, char **state) {
|
|
|
2572
2632
|
return REDIS_OK;
|
|
2573
2633
|
}
|
|
2574
2634
|
|
|
2635
|
+
unsigned int updateAction(void *rulesBinding, char *sid) {
|
|
2636
|
+
binding *currentBinding = (binding*)rulesBinding;
|
|
2637
|
+
redisContext *reContext = currentBinding->reContext;
|
|
2638
|
+
time_t currentTime = time(NULL);
|
|
2575
2639
|
|
|
2640
|
+
int result = redisAppendCommand(reContext,
|
|
2641
|
+
"evalsha %s 0 %s %ld",
|
|
2642
|
+
currentBinding->updateActionHash,
|
|
2643
|
+
sid,
|
|
2644
|
+
currentTime + 15);
|
|
2645
|
+
if (result != REDIS_OK) {
|
|
2646
|
+
return ERR_REDIS_ERROR;
|
|
2647
|
+
}
|
|
2648
|
+
|
|
2649
|
+
redisReply *reply;
|
|
2650
|
+
result = tryGetReply(reContext, &reply);
|
|
2651
|
+
if (result != RULES_OK) {
|
|
2652
|
+
return result;
|
|
2653
|
+
}
|
|
2654
|
+
|
|
2655
|
+
if (reply->type == REDIS_REPLY_ERROR) {
|
|
2656
|
+
printf("updateAction err string %s\n", reply->str);
|
|
2657
|
+
freeReplyObject(reply);
|
|
2658
|
+
return ERR_REDIS_ERROR;
|
|
2659
|
+
}
|
|
2660
|
+
|
|
2661
|
+
freeReplyObject(reply);
|
|
2662
|
+
return RULES_OK;
|
|
2663
|
+
}
|