durable_rules 2.0.20 → 2.0.21
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/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
|