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 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