durable_rules 2.0.20 → 2.0.21
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/librb/durable.rb +10 -2
- data/librb/engine.rb +47 -3
- data/src/rules/rules.h +8 -0
- data/src/rules/state.c +137 -30
- data/src/rulesrb/rules.c +42 -0
- metadata +12 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cc03b88548e96951b82c22fe1ddf28d275130f79
|
4
|
+
data.tar.gz: da5f07e4f707e4aa68fa73077f023bb4dd046c97
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4c204fd504883152da43e0f6586fea6ed1898b1200b0844b4e9d0e80cc2dcd261dd1e9f25d9627c79c8d3c709806d97743bf4b0fcaa561a1231167ed771793f0
|
7
|
+
data.tar.gz: d698a703e5e87fe9d3e478ad8e416ebe2c2ac8f1fa038f2856c3ca0dc532db8555a63bc5b2cf6d25e98dadbdb6fbbd64bbba34fe09c7aef83c449b9256845ee1
|
data/librb/durable.rb
CHANGED
@@ -43,14 +43,22 @@ module Durable
|
|
43
43
|
self.get_host().update_state ruleset_name, state, complete
|
44
44
|
end
|
45
45
|
|
46
|
-
def self.get_state(ruleset_name, sid)
|
46
|
+
def self.get_state(ruleset_name, sid = nil)
|
47
47
|
self.get_host().get_state ruleset_name, sid
|
48
48
|
end
|
49
49
|
|
50
|
-
def self.delete_state(ruleset_name, sid)
|
50
|
+
def self.delete_state(ruleset_name, sid = nil)
|
51
51
|
self.get_host().delete_state ruleset_name, sid
|
52
52
|
end
|
53
53
|
|
54
|
+
def self.get_facts(ruleset_name, sid = nil)
|
55
|
+
self.get_host().get_facts ruleset_name, sid
|
56
|
+
end
|
57
|
+
|
58
|
+
def self.get_pending_events(ruleset_name, sid = nil)
|
59
|
+
self.get_host().get_pending_events ruleset_name, sid
|
60
|
+
end
|
61
|
+
|
54
62
|
def self.ruleset(name, &block)
|
55
63
|
ruleset = Ruleset.new name, block
|
56
64
|
@@rulesets[name] = ruleset.rules
|
data/librb/engine.rb
CHANGED
@@ -144,6 +144,14 @@ module Engine
|
|
144
144
|
@_deleted = true
|
145
145
|
end
|
146
146
|
|
147
|
+
def get_facts()
|
148
|
+
@_ruleset.get_facts @s.sid
|
149
|
+
end
|
150
|
+
|
151
|
+
def get_pending_events()
|
152
|
+
@_ruleset.get_pending_events @s.sid
|
153
|
+
end
|
154
|
+
|
147
155
|
def has_completed()
|
148
156
|
if Time.now - @_start_time > 10000
|
149
157
|
@_completed = true
|
@@ -395,17 +403,45 @@ module Engine
|
|
395
403
|
end
|
396
404
|
|
397
405
|
def get_state(sid)
|
406
|
+
if sid == nil
|
407
|
+
sid = "0"
|
408
|
+
end
|
409
|
+
|
398
410
|
JSON.parse Rules.get_state(@handle, sid.to_s)
|
399
411
|
end
|
400
412
|
|
401
413
|
def delete_state(sid)
|
414
|
+
if sid == nil
|
415
|
+
sid = "0"
|
416
|
+
end
|
417
|
+
|
402
418
|
Rules.delete_state(@handle, sid.to_s)
|
403
419
|
end
|
404
420
|
|
405
421
|
def renew_action_lease(sid)
|
422
|
+
if sid == nil
|
423
|
+
sid = "0"
|
424
|
+
end
|
425
|
+
|
406
426
|
Rules.renew_action_lease @handle, sid.to_s
|
407
427
|
end
|
408
428
|
|
429
|
+
def get_facts(sid)
|
430
|
+
if sid == nil
|
431
|
+
sid = "0"
|
432
|
+
end
|
433
|
+
|
434
|
+
JSON.parse Rules.get_facts(@handle, sid.to_s)
|
435
|
+
end
|
436
|
+
|
437
|
+
def get_pending_events(sid)
|
438
|
+
if sid == nil
|
439
|
+
sid = "0"
|
440
|
+
end
|
441
|
+
|
442
|
+
JSON.parse Rules.get_events(@handle, sid)
|
443
|
+
end
|
444
|
+
|
409
445
|
def Ruleset.create_rulesets(host, ruleset_definitions)
|
410
446
|
branches = {}
|
411
447
|
for name, definition in ruleset_definitions do
|
@@ -983,18 +1019,26 @@ module Engine
|
|
983
1019
|
handle_function rules, @update_state_func, state, complete
|
984
1020
|
end
|
985
1021
|
|
986
|
-
def get_state(ruleset_name, sid)
|
1022
|
+
def get_state(ruleset_name, sid = nil)
|
987
1023
|
get_ruleset(ruleset_name).get_state sid
|
988
1024
|
end
|
989
1025
|
|
990
|
-
def delete_state(ruleset_name, sid)
|
1026
|
+
def delete_state(ruleset_name, sid = nil)
|
991
1027
|
get_ruleset(ruleset_name).delete_state sid
|
992
1028
|
end
|
993
1029
|
|
994
|
-
def renew_action_lease(ruleset_name, sid)
|
1030
|
+
def renew_action_lease(ruleset_name, sid = nil)
|
995
1031
|
get_ruleset(ruleset_name).renew_action_lease sid
|
996
1032
|
end
|
997
1033
|
|
1034
|
+
def get_facts(ruleset_name, sid = nil)
|
1035
|
+
get_ruleset(ruleset_name).get_facts sid
|
1036
|
+
end
|
1037
|
+
|
1038
|
+
def get_pending_events(ruleset_name, sid = nil)
|
1039
|
+
get_ruleset(ruleset_name).get_pending_events sid
|
1040
|
+
end
|
1041
|
+
|
998
1042
|
def register_rulesets(ruleset_definitions)
|
999
1043
|
rulesets = Ruleset.create_rulesets(self, ruleset_definitions)
|
1000
1044
|
for ruleset_name, ruleset in rulesets do
|
data/src/rules/rules.h
CHANGED
@@ -221,6 +221,14 @@ unsigned int deleteState(unsigned int handle,
|
|
221
221
|
unsigned int renewActionLease(unsigned int handle,
|
222
222
|
char *sid);
|
223
223
|
|
224
|
+
unsigned int getEvents(unsigned int handle,
|
225
|
+
char *sid,
|
226
|
+
char **messages);
|
227
|
+
|
228
|
+
unsigned int getFacts(unsigned int handle,
|
229
|
+
char *sid,
|
230
|
+
char **messages);
|
231
|
+
|
224
232
|
#ifdef _WIN32
|
225
233
|
int asprintf(char** ret, char* format, ...);
|
226
234
|
#endif
|
data/src/rules/state.c
CHANGED
@@ -957,9 +957,13 @@ unsigned int deleteStateNode(void *tree,
|
|
957
957
|
}
|
958
958
|
free(node->actionState);
|
959
959
|
|
960
|
-
for (unsigned int i = 0; i < MAX_MESSAGE_INDEX_LENGTH
|
961
|
-
|
962
|
-
|
960
|
+
for (unsigned int i = 0; i < MAX_MESSAGE_INDEX_LENGTH; ++i) {
|
961
|
+
unsigned int currentMessageOffset = node->messageIndex[i * 2];
|
962
|
+
while (currentMessageOffset != UNDEFINED_HASH_OFFSET) {
|
963
|
+
messageNode *currentMessageNode = MESSAGE_NODE(node, currentMessageOffset);
|
964
|
+
unsigned int nextMessageOffset = currentMessageNode->nextOffset;
|
965
|
+
deleteMessage(tree, node, NULL, currentMessageOffset);
|
966
|
+
currentMessageOffset = nextMessageOffset;
|
963
967
|
}
|
964
968
|
}
|
965
969
|
free(node->messagePool.content);
|
@@ -1131,20 +1135,6 @@ unsigned int serializeResult(void *tree,
|
|
1131
1135
|
return RULES_OK;
|
1132
1136
|
}
|
1133
1137
|
|
1134
|
-
unsigned int serializeState(stateNode *state,
|
1135
|
-
char **stateFact) {
|
1136
|
-
|
1137
|
-
messageNode *stateFactNode = MESSAGE_NODE(state, state->factOffset);
|
1138
|
-
unsigned int stateFactLength = strlen(stateFactNode->jo.content) + 1;
|
1139
|
-
*stateFact = malloc(stateFactLength * sizeof(char));
|
1140
|
-
if (!*stateFact) {
|
1141
|
-
return ERR_OUT_OF_MEMORY;
|
1142
|
-
}
|
1143
|
-
memcpy(*stateFact, stateFactNode->jo.content, stateFactLength);
|
1144
|
-
|
1145
|
-
return RULES_OK;
|
1146
|
-
}
|
1147
|
-
|
1148
1138
|
unsigned int getNextResultInState(void *tree,
|
1149
1139
|
time_t currentTime,
|
1150
1140
|
stateNode *state,
|
@@ -1547,33 +1537,150 @@ unsigned int constructObject(char *root,
|
|
1547
1537
|
return (result == PARSE_END ? RULES_OK: result);
|
1548
1538
|
}
|
1549
1539
|
|
1550
|
-
unsigned int
|
1540
|
+
static unsigned int getMessagesLength(stateNode *state,
|
1541
|
+
char messageType,
|
1542
|
+
unsigned int *messageCount) {
|
1543
|
+
unsigned int resultLength = 2;
|
1544
|
+
*messageCount = 0;
|
1545
|
+
for (unsigned int i = 0; i < MAX_MESSAGE_INDEX_LENGTH; ++i) {
|
1546
|
+
unsigned int currentMessageOffset = state->messageIndex[i * 2];
|
1547
|
+
while (currentMessageOffset != UNDEFINED_HASH_OFFSET) {
|
1548
|
+
messageNode *currentMessageNode = MESSAGE_NODE(state, currentMessageOffset);
|
1549
|
+
if (currentMessageNode->messageType == messageType) {
|
1550
|
+
++*messageCount;
|
1551
|
+
resultLength += strlen(currentMessageNode->jo.content) + 1;
|
1552
|
+
}
|
1553
|
+
currentMessageOffset = currentMessageNode->nextOffset;
|
1554
|
+
}
|
1555
|
+
}
|
1556
|
+
|
1557
|
+
if (!*messageCount) {
|
1558
|
+
++resultLength;
|
1559
|
+
}
|
1560
|
+
|
1561
|
+
return resultLength;
|
1562
|
+
}
|
1563
|
+
|
1564
|
+
static unsigned int serializeMessages(stateNode *state,
|
1565
|
+
char messageType,
|
1566
|
+
unsigned int messageCount,
|
1567
|
+
char *messages) {
|
1568
|
+
|
1569
|
+
messages[0] = '[';
|
1570
|
+
++messages;
|
1571
|
+
unsigned int currentMessageCount = 0;
|
1572
|
+
for (unsigned int i = 0; i < MAX_MESSAGE_INDEX_LENGTH && currentMessageCount < messageCount; ++i) {
|
1573
|
+
unsigned int currentMessageOffset = state->messageIndex[i * 2];
|
1574
|
+
while (currentMessageOffset != UNDEFINED_HASH_OFFSET && currentMessageCount < messageCount) {
|
1575
|
+
messageNode *currentMessageNode = MESSAGE_NODE(state, currentMessageOffset);
|
1576
|
+
if (currentMessageNode->messageType == messageType) {
|
1577
|
+
++currentMessageCount;
|
1578
|
+
unsigned int tupleLength = strlen(currentMessageNode->jo.content) + 1;
|
1579
|
+
if (currentMessageCount < messageCount) {
|
1580
|
+
++tupleLength;
|
1581
|
+
#ifdef _WIN32
|
1582
|
+
sprintf_s(messages, tupleLength, "%s,", currentMessageNode->jo.content);
|
1583
|
+
#else
|
1584
|
+
snprintf(messages, tupleLength, "%s,", currentMessageNode->jo.content);
|
1585
|
+
#endif
|
1586
|
+
} else {
|
1587
|
+
#ifdef _WIN32
|
1588
|
+
sprintf_s(messages, tupleLength, "%s", currentMessageNode->jo.content);
|
1589
|
+
#else
|
1590
|
+
snprintf(messages, tupleLength, "%s", currentMessageNode->jo.content);
|
1591
|
+
#endif
|
1592
|
+
}
|
1593
|
+
|
1594
|
+
messages += (tupleLength - 1);
|
1595
|
+
}
|
1596
|
+
currentMessageOffset = currentMessageNode->nextOffset;
|
1597
|
+
}
|
1598
|
+
}
|
1599
|
+
|
1600
|
+
messages[0] = ']';
|
1601
|
+
messages[1] = 0;
|
1602
|
+
return RULES_OK;
|
1603
|
+
}
|
1604
|
+
|
1605
|
+
|
1606
|
+
static unsigned int getMessagesForType(unsigned int handle,
|
1607
|
+
char *sid,
|
1608
|
+
char messageType,
|
1609
|
+
char **messages) {
|
1551
1610
|
ruleset *tree;
|
1552
1611
|
RESOLVE_HANDLE(handle, &tree);
|
1553
1612
|
|
1554
1613
|
if (!sid) {
|
1555
1614
|
sid = "0";
|
1556
1615
|
}
|
1557
|
-
unsigned int sidHash = fnv1Hash32(sid, strlen(sid));
|
1558
|
-
unsigned int nodeOffset;
|
1559
1616
|
|
1560
|
-
|
1561
|
-
|
1562
|
-
MAX_STATE_INDEX_LENGTH,
|
1563
|
-
((ruleset*)tree)->statePool,
|
1564
|
-
sidHash,
|
1565
|
-
nodeOffset);
|
1617
|
+
stateNode *state = NULL;
|
1618
|
+
CHECK_RESULT(getStateNode(tree, sid, &state));
|
1566
1619
|
|
1567
|
-
|
1568
|
-
|
1620
|
+
unsigned int messageCount = 0;
|
1621
|
+
unsigned int messagesLength = getMessagesLength(state,
|
1622
|
+
messageType,
|
1623
|
+
&messageCount);
|
1624
|
+
|
1625
|
+
*messages = malloc(messagesLength * sizeof(char));
|
1626
|
+
if (!*messages) {
|
1627
|
+
return ERR_OUT_OF_MEMORY;
|
1569
1628
|
}
|
1570
1629
|
|
1571
|
-
|
1630
|
+
return serializeMessages(state,
|
1631
|
+
messageType,
|
1632
|
+
messageCount,
|
1633
|
+
*messages);
|
1634
|
+
|
1635
|
+
}
|
1572
1636
|
|
1573
|
-
|
1637
|
+
unsigned int getEvents(unsigned int handle,
|
1638
|
+
char *sid,
|
1639
|
+
char **messages) {
|
1640
|
+
|
1641
|
+
return getMessagesForType(handle,
|
1642
|
+
sid,
|
1643
|
+
MESSAGE_TYPE_EVENT,
|
1644
|
+
messages);
|
1645
|
+
|
1646
|
+
}
|
1647
|
+
|
1648
|
+
unsigned int getFacts(unsigned int handle,
|
1649
|
+
char *sid,
|
1650
|
+
char **messages) {
|
1651
|
+
|
1652
|
+
return getMessagesForType(handle,
|
1653
|
+
sid,
|
1654
|
+
MESSAGE_TYPE_FACT,
|
1655
|
+
messages);
|
1656
|
+
|
1657
|
+
}
|
1658
|
+
|
1659
|
+
unsigned int serializeState(stateNode *state, char **stateFact) {
|
1660
|
+
messageNode *stateFactNode = MESSAGE_NODE(state, state->factOffset);
|
1661
|
+
unsigned int stateFactLength = strlen(stateFactNode->jo.content) + 1;
|
1662
|
+
*stateFact = malloc(stateFactLength * sizeof(char));
|
1663
|
+
if (!*stateFact) {
|
1664
|
+
return ERR_OUT_OF_MEMORY;
|
1665
|
+
}
|
1666
|
+
memcpy(*stateFact, stateFactNode->jo.content, stateFactLength);
|
1667
|
+
|
1668
|
+
return RULES_OK;
|
1574
1669
|
}
|
1575
1670
|
|
1671
|
+
unsigned int getState(unsigned int handle, char *sid, char **state) {
|
1672
|
+
ruleset *tree;
|
1673
|
+
RESOLVE_HANDLE(handle, &tree);
|
1674
|
+
|
1675
|
+
if (!sid) {
|
1676
|
+
sid = "0";
|
1677
|
+
}
|
1678
|
+
|
1679
|
+
stateNode *node = NULL;
|
1680
|
+
CHECK_RESULT(getStateNode(tree, sid, &node));
|
1576
1681
|
|
1682
|
+
return serializeState(node, state);
|
1683
|
+
}
|
1577
1684
|
|
1578
1685
|
unsigned int deleteState(unsigned int handle, char *sid) {
|
1579
1686
|
ruleset *tree;
|
data/src/rulesrb/rules.c
CHANGED
@@ -371,6 +371,46 @@ static VALUE rbRenewActionLease(VALUE self, VALUE handle, VALUE sid) {
|
|
371
371
|
return Qnil;
|
372
372
|
}
|
373
373
|
|
374
|
+
static VALUE rbGetFacts(VALUE self, VALUE handle, VALUE sid) {
|
375
|
+
Check_Type(handle, T_FIXNUM);
|
376
|
+
Check_Type(sid, T_STRING);
|
377
|
+
|
378
|
+
char *facts;
|
379
|
+
unsigned int result = getFacts(FIX2INT(handle), RSTRING_PTR(sid), &facts);
|
380
|
+
if (result != RULES_OK) {
|
381
|
+
if (result == ERR_OUT_OF_MEMORY) {
|
382
|
+
rb_raise(rb_eNoMemError, "Out of memory");
|
383
|
+
} else {
|
384
|
+
rb_raise(rb_eException, "Could not get facts, error code: %d", result);
|
385
|
+
}
|
386
|
+
}
|
387
|
+
|
388
|
+
VALUE output = rb_str_new2(facts);
|
389
|
+
free(facts);
|
390
|
+
return output;
|
391
|
+
}
|
392
|
+
|
393
|
+
|
394
|
+
static VALUE rbGetEvents(VALUE self, VALUE handle, VALUE sid) {
|
395
|
+
Check_Type(handle, T_FIXNUM);
|
396
|
+
Check_Type(sid, T_STRING);
|
397
|
+
|
398
|
+
char *events;
|
399
|
+
unsigned int result = getEvents(FIX2INT(handle), RSTRING_PTR(sid), &events);
|
400
|
+
if (result != RULES_OK) {
|
401
|
+
if (result == ERR_OUT_OF_MEMORY) {
|
402
|
+
rb_raise(rb_eNoMemError, "Out of memory");
|
403
|
+
} else {
|
404
|
+
rb_raise(rb_eException, "Could not get events, error code: %d", result);
|
405
|
+
}
|
406
|
+
}
|
407
|
+
|
408
|
+
VALUE output = rb_str_new2(events);
|
409
|
+
free(events);
|
410
|
+
return output;
|
411
|
+
}
|
412
|
+
|
413
|
+
|
374
414
|
void Init_rules() {
|
375
415
|
rulesModule = rb_define_module("Rules");
|
376
416
|
rb_define_singleton_method(rulesModule, "create_ruleset", rbCreateRuleset, 2);
|
@@ -392,6 +432,8 @@ void Init_rules() {
|
|
392
432
|
rb_define_singleton_method(rulesModule, "get_state", rbGetState, 2);
|
393
433
|
rb_define_singleton_method(rulesModule, "delete_state", rbDeleteState, 2);
|
394
434
|
rb_define_singleton_method(rulesModule, "renew_action_lease", rbRenewActionLease, 2);
|
435
|
+
rb_define_singleton_method(rulesModule, "get_facts", rbGetFacts, 2);
|
436
|
+
rb_define_singleton_method(rulesModule, "get_events", rbGetEvents, 2);
|
395
437
|
}
|
396
438
|
|
397
439
|
|
metadata
CHANGED
@@ -1,29 +1,35 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: durable_rules
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.21
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jesus Ruiz
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-03-
|
11
|
+
date: 2020-03-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '12.3'
|
20
|
+
- - ">="
|
18
21
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
22
|
+
version: 12.3.3
|
20
23
|
type: :development
|
21
24
|
prerelease: false
|
22
25
|
version_requirements: !ruby/object:Gem::Requirement
|
23
26
|
requirements:
|
24
|
-
- -
|
27
|
+
- - "~>"
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '12.3'
|
30
|
+
- - ">="
|
25
31
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
32
|
+
version: 12.3.3
|
27
33
|
- !ruby/object:Gem::Dependency
|
28
34
|
name: rake-compiler
|
29
35
|
requirement: !ruby/object:Gem::Requirement
|