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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e31ed367e85b98094b59ee77e36313d16f55050f
4
- data.tar.gz: 1d569b73e027e8078d4f46d9d464e57ae0a3213e
3
+ metadata.gz: cc03b88548e96951b82c22fe1ddf28d275130f79
4
+ data.tar.gz: da5f07e4f707e4aa68fa73077f023bb4dd046c97
5
5
  SHA512:
6
- metadata.gz: 0e9916597fe2a07f54946da6ceeb6dec73d0c1d6ab995b6bf4d8c960c4168ebe320e0419d03e55cda12d7b764bdc8ddf2bce9f62de38a32a7c4a7eef0e223281
7
- data.tar.gz: e53b6782a8e0d6692890e62ddc500d932ebdc416635bfd07d2538b27ef15944eb8b34a9362d0c3500efa3169db1f3f688bc2a03ba4cd8e755523053b49809b63
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 * 2; ++i) {
961
- if (node->messageIndex[i] != UNDEFINED_HASH_OFFSET) {
962
- deleteMessage(tree, node, NULL, node->messageIndex[i]);
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 getState(unsigned int handle, char *sid, char **state) {
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
- GET_FIRST(stateNode,
1561
- tree->stateIndex,
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
- if (nodeOffset == UNDEFINED_HASH_OFFSET) {
1568
- return ERR_SID_NOT_FOUND;
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
- stateNode *node = STATE_NODE(tree, nodeOffset);
1630
+ return serializeMessages(state,
1631
+ messageType,
1632
+ messageCount,
1633
+ *messages);
1634
+
1635
+ }
1572
1636
 
1573
- return serializeState(node, state);
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.20
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-07 00:00:00.000000000 Z
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: 10.4.2
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: 10.4.2
32
+ version: 12.3.3
27
33
  - !ruby/object:Gem::Dependency
28
34
  name: rake-compiler
29
35
  requirement: !ruby/object:Gem::Requirement