durable_rules 2.0.6 → 2.0.7

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: c4dd49e4357fbd2d4df00d1055d3f28413f81631
4
- data.tar.gz: 8f27a057991ac417017ad5127a2161a0be2accd8
3
+ metadata.gz: 7c08ea6baf1f7ff23b7b360cbc0a4f5d27361524
4
+ data.tar.gz: c6e839c804df85c3aa26d752d42ed965c78382f8
5
5
  SHA512:
6
- metadata.gz: a8c5ad57d5aa1cbdc2b798dfc2c91bab920d127b4ac05190c5a61a2eada58dc2261ee6bf062078ad1c7a4aa42e82e338b2580646ea5f3accefe8459f54063777
7
- data.tar.gz: baa4b3ac0b646cf45cd427df314d015dc6a76d3d5d34b6126e2bc24cce39d971b43f540171422e7a874faa896d69573d8a6bba4f7baf5b1cf8e2861ead5d4473
6
+ metadata.gz: 042ada520d5d8434ccfaeeff78603af18efe209fc80b8033f595e2e521064cb2ff54d1e45edace0bb64cab912f8a6b822c172794ff7f9c039fa088e1b13522e3
7
+ data.tar.gz: d3f6b93ff29efcdcd1b5c90825965c73aa780a807f47a37c489e6134f660048a657042d63692aa33ea4ea6e1adf45fe6f44632e57dd6289929139c9c47675d7f
data/src/rules/events.c CHANGED
@@ -776,11 +776,16 @@ static unsigned int handleBetaFrame(ruleset *tree,
776
776
  node *oldNode,
777
777
  node *currentNode,
778
778
  leftFrameNode *oldFrame,
779
- leftFrameNode *currentFrame) {
779
+ leftFrameNode *currentFrame,
780
+ unsigned char sideEffect) {
780
781
  frameLocation currentFrameLocation;
781
782
  unsigned int frameType = LEFT_FRAME;
782
783
 
783
784
  if (currentNode->type == NODE_ACTION) {
785
+ if (!sideEffect) {
786
+ return RULES_OK;
787
+ }
788
+
784
789
  CHECK_RESULT(createActionFrame(state,
785
790
  currentNode,
786
791
  currentFrame,
@@ -898,7 +903,8 @@ static unsigned int handleBetaFrame(ruleset *tree,
898
903
  currentNode,
899
904
  nextNode,
900
905
  NULL,
901
- currentFrame);
906
+ currentFrame,
907
+ sideEffect);
902
908
 
903
909
  } else if (currentNode->type == NODE_BETA) {
904
910
  // Find all messages for frame
@@ -926,7 +932,8 @@ static unsigned int handleBetaFrame(ruleset *tree,
926
932
  currentNode,
927
933
  nextNode,
928
934
  NULL,
929
- currentFrame));
935
+ currentFrame,
936
+ sideEffect));
930
937
  }
931
938
 
932
939
  unsigned int rightFrameOffset = rightFrame->prevOffset;
@@ -959,7 +966,8 @@ static unsigned int handleBetaFrame(ruleset *tree,
959
966
  currentNode,
960
967
  nextNode,
961
968
  connectorFrame,
962
- currentFrame));
969
+ currentFrame,
970
+ sideEffect));
963
971
 
964
972
  connectorFrameOffset = connectorFrame->prevOffset;
965
973
  if (connectorFrameOffset == UNDEFINED_HASH_OFFSET) {
@@ -983,7 +991,8 @@ static unsigned int handleBetaFrame(ruleset *tree,
983
991
  currentNode,
984
992
  nextNode,
985
993
  NULL,
986
- currentFrame));
994
+ currentFrame,
995
+ sideEffect));
987
996
  }
988
997
 
989
998
  return RULES_OK;
@@ -1073,7 +1082,8 @@ static unsigned int handleDeleteMessage(ruleset *tree,
1073
1082
  currentNode,
1074
1083
  nextNode,
1075
1084
  NULL,
1076
- NULL));
1085
+ NULL,
1086
+ 1));
1077
1087
  }
1078
1088
  } else {
1079
1089
  unsigned int messageHash;
@@ -1109,7 +1119,8 @@ static unsigned int handleDeleteMessage(ruleset *tree,
1109
1119
  currentNode,
1110
1120
  nextNode,
1111
1121
  NULL,
1112
- currentFrame));
1122
+ currentFrame,
1123
+ 1));
1113
1124
  }
1114
1125
 
1115
1126
  unsigned int currentFrameOffset = currentFrame->prevOffset;
@@ -1285,7 +1296,8 @@ static unsigned int handleMatchFrames(ruleset *tree,
1285
1296
  node *currentNode,
1286
1297
  jsonObject *messageObject,
1287
1298
  unsigned int currentMessageOffset,
1288
- unsigned int messageHash) {
1299
+ unsigned int messageHash,
1300
+ unsigned char sideEffect) {
1289
1301
  // Find frames for message
1290
1302
  leftFrameNode *currentFrame = NULL;
1291
1303
  node *nextNode = &tree->nodePool[currentNode->value.b.nextOffset];
@@ -1311,7 +1323,8 @@ static unsigned int handleMatchFrames(ruleset *tree,
1311
1323
  currentNode,
1312
1324
  nextNode,
1313
1325
  NULL,
1314
- currentFrame));
1326
+ currentFrame,
1327
+ sideEffect));
1315
1328
  }
1316
1329
 
1317
1330
  unsigned int currentFrameOffset = currentFrame->prevOffset;
@@ -1336,7 +1349,8 @@ static unsigned int handleMatchFrames(ruleset *tree,
1336
1349
  currentNode,
1337
1350
  nextNode,
1338
1351
  NULL,
1339
- NULL);
1352
+ NULL,
1353
+ sideEffect);
1340
1354
  }
1341
1355
 
1342
1356
  return RULES_OK;
@@ -1346,7 +1360,8 @@ static unsigned int handleBetaMessage(ruleset *tree,
1346
1360
  stateNode *state,
1347
1361
  node *betaNode,
1348
1362
  jsonObject *messageObject,
1349
- unsigned int currentMessageOffset) {
1363
+ unsigned int currentMessageOffset,
1364
+ unsigned char sideEffect) {
1350
1365
  if (betaNode->value.b.isFirst && !betaNode->value.b.not) {
1351
1366
  node *nextNode = &tree->nodePool[betaNode->value.b.nextOffset];
1352
1367
  return handleBetaFrame(tree,
@@ -1355,7 +1370,8 @@ static unsigned int handleBetaMessage(ruleset *tree,
1355
1370
  betaNode,
1356
1371
  nextNode,
1357
1372
  NULL,
1358
- NULL);
1373
+ NULL,
1374
+ sideEffect);
1359
1375
  }
1360
1376
 
1361
1377
  frameLocation rightFrameLocation;
@@ -1397,7 +1413,8 @@ static unsigned int handleBetaMessage(ruleset *tree,
1397
1413
  betaNode,
1398
1414
  messageObject,
1399
1415
  currentMessageOffset,
1400
- messageHash);
1416
+ messageHash,
1417
+ sideEffect);
1401
1418
  }
1402
1419
 
1403
1420
  static unsigned int isArrayMatch(ruleset *tree,
@@ -1589,7 +1606,8 @@ static unsigned int handleAlpha(ruleset *tree,
1589
1606
  jsonObject *jo,
1590
1607
  unsigned char messageType,
1591
1608
  alpha *alphaNode,
1592
- unsigned int *messageOffset) {
1609
+ unsigned int *messageOffset,
1610
+ unsigned char sideEffect) {
1593
1611
  unsigned short top = 1;
1594
1612
  unsigned int entry;
1595
1613
  unsigned char messageStored = 0;
@@ -1671,6 +1689,7 @@ static unsigned int handleAlpha(ruleset *tree,
1671
1689
  mid,
1672
1690
  jo,
1673
1691
  messageType,
1692
+ sideEffect,
1674
1693
  messageOffset));
1675
1694
 
1676
1695
  messageStored = 1;
@@ -1683,7 +1702,8 @@ static unsigned int handleAlpha(ruleset *tree,
1683
1702
  state,
1684
1703
  &tree->nodePool[betaList[entry]],
1685
1704
  jo,
1686
- *messageOffset));
1705
+ *messageOffset,
1706
+ sideEffect));
1687
1707
  }
1688
1708
  }
1689
1709
  }
@@ -1695,7 +1715,8 @@ static unsigned int handleMessageCore(ruleset *tree,
1695
1715
  jsonObject *jo,
1696
1716
  unsigned char actionType,
1697
1717
  unsigned int *messageOffset,
1698
- unsigned int *stateOffset) {
1718
+ unsigned int *stateOffset,
1719
+ unsigned char sideEffect) {
1699
1720
  stateNode *sidState;
1700
1721
  jsonProperty *sidProperty = &jo->properties[jo->sidIndex];
1701
1722
  jsonProperty *midProperty = &jo->properties[jo->idIndex];
@@ -1763,7 +1784,8 @@ static unsigned int handleMessageCore(ruleset *tree,
1763
1784
  jo,
1764
1785
  MESSAGE_TYPE_FACT,
1765
1786
  &tree->nodePool[NODE_M_OFFSET].value.a,
1766
- messageOffset);
1787
+ messageOffset,
1788
+ sideEffect);
1767
1789
  if (result != RULES_OK && result != ERR_EVENT_NOT_HANDLED) {
1768
1790
  return result;
1769
1791
  } else if (result == ERR_EVENT_NOT_HANDLED) {
@@ -1771,7 +1793,8 @@ static unsigned int handleMessageCore(ruleset *tree,
1771
1793
  sidState,
1772
1794
  mid,
1773
1795
  jo,
1774
- MESSAGE_TYPE_FACT,
1796
+ MESSAGE_TYPE_STATE,
1797
+ sideEffect,
1775
1798
  messageOffset));
1776
1799
  }
1777
1800
 
@@ -1794,10 +1817,11 @@ static unsigned int handleMessageCore(ruleset *tree,
1794
1817
  jo,
1795
1818
  (actionType == ACTION_ASSERT_FACT ? MESSAGE_TYPE_FACT : MESSAGE_TYPE_EVENT),
1796
1819
  &tree->nodePool[NODE_M_OFFSET].value.a,
1797
- messageOffset);
1820
+ messageOffset,
1821
+ sideEffect);
1798
1822
 
1799
1823
  if (result == RULES_OK || result == ERR_EVENT_NOT_HANDLED) {
1800
- if (sidState->factOffset == UNDEFINED_HASH_OFFSET) {
1824
+ if (sideEffect && (sidState->factOffset == UNDEFINED_HASH_OFFSET)) {
1801
1825
  #ifdef _WIN32
1802
1826
  char *stateMessage = (char *)_alloca(sizeof(char)*(50 + sidProperty->valueLength * 2));
1803
1827
  sprintf_s(stateMessage, sizeof(char)*(50 + sidProperty->valueLength * 2), "{ \"sid\":\"%s\", \"id\":\"sid-%s\", \"$s\":1}", sid, sid);
@@ -1846,7 +1870,8 @@ static unsigned int handleMessage(ruleset *tree,
1846
1870
  &jo,
1847
1871
  actionType,
1848
1872
  messageOffset,
1849
- stateOffset);
1873
+ stateOffset,
1874
+ 1);
1850
1875
  }
1851
1876
 
1852
1877
  static unsigned int handleMessages(ruleset *tree,
@@ -1886,7 +1911,8 @@ static unsigned int handleMessages(ruleset *tree,
1886
1911
  &jo,
1887
1912
  actionType,
1888
1913
  &messageOffset,
1889
- stateOffset);
1914
+ stateOffset,
1915
+ 1);
1890
1916
 
1891
1917
  *last = lastTemp;
1892
1918
  if (result != RULES_OK && result != ERR_EVENT_NOT_HANDLED && result != ERR_EVENT_OBSERVED) {
@@ -1941,7 +1967,7 @@ unsigned int assertFacts(unsigned int handle,
1941
1967
  ruleset *tree;
1942
1968
  RESOLVE_HANDLE(handle, &tree);
1943
1969
 
1944
- return handleMessages(tree, ACTION_ASSERT_EVENT, messages, stateOffset);
1970
+ return handleMessages(tree, ACTION_ASSERT_FACT, messages, stateOffset);
1945
1971
  }
1946
1972
 
1947
1973
  unsigned int retractFact(unsigned int handle,
@@ -1979,7 +2005,8 @@ unsigned int updateState(unsigned int handle,
1979
2005
 
1980
2006
  static unsigned int replayMessages(ruleset *tree,
1981
2007
  char *messages,
1982
- unsigned int *stateOffset) {
2008
+ unsigned int *stateOffset,
2009
+ unsigned char sideEffect) {
1983
2010
  unsigned int result;
1984
2011
  unsigned int messageOffset;
1985
2012
  jsonObject jo;
@@ -1993,7 +2020,6 @@ static unsigned int replayMessages(ruleset *tree,
1993
2020
  &first,
1994
2021
  &last,
1995
2022
  &type) == PARSE_OK) {
1996
-
1997
2023
  if (type != JSON_INT) {
1998
2024
  return ERR_UNEXPECTED_TYPE;
1999
2025
  }
@@ -2028,13 +2054,15 @@ static unsigned int replayMessages(ruleset *tree,
2028
2054
  --last;
2029
2055
  }
2030
2056
 
2057
+
2031
2058
  lastTemp = *last;
2032
2059
  *last = '\0';
2033
2060
  result = handleMessageCore(tree,
2034
2061
  &jo,
2035
2062
  actionType,
2036
2063
  &messageOffset,
2037
- stateOffset);
2064
+ stateOffset,
2065
+ sideEffect);
2038
2066
 
2039
2067
  *last = lastTemp;
2040
2068
  if (result != RULES_OK && result != ERR_EVENT_NOT_HANDLED && result != ERR_EVENT_OBSERVED) {
@@ -2048,78 +2076,81 @@ static unsigned int replayMessages(ruleset *tree,
2048
2076
  }
2049
2077
 
2050
2078
 
2051
- static unsigned int flushQueuedActions(ruleset *tree) {
2079
+ static unsigned int startQueuedActions(ruleset *tree) {
2052
2080
  if (tree->getIdleStateCallback) {
2053
- char *sid;
2054
2081
  CHECK_RESULT(tree->getIdleStateCallback(tree->getIdleStateCallbackContext,
2055
- &tree->stringPool[tree->nameOffset],
2056
- &sid));
2057
- if (sid) {
2058
- stateNode *state;
2059
- unsigned int result = getStateNode(tree,
2060
- sid,
2061
- &state);
2062
- if (result != RULES_OK && result != ERR_SID_NOT_FOUND) {
2063
- return result;
2064
- } else if (result == RULES_OK) {
2065
- CHECK_RESULT(deleteStateNode(tree,
2066
- state));
2067
- }
2068
-
2069
- CHECK_RESULT(createStateNode(tree,
2070
- sid,
2071
- &state));
2072
-
2073
- free(sid);
2074
- if (tree->getStoredMessagesCallback) {
2075
- char *messages;
2076
- unsigned int stateOffset;
2077
- CHECK_RESULT(tree->getStoredMessagesCallback(tree->getStoredMessagesCallbackContext,
2078
- &tree->stringPool[tree->nameOffset],
2079
- state->sid,
2080
- &messages));
2081
- if (messages) {
2082
- result = replayMessages(tree,
2083
- messages,
2084
- &stateOffset);
2085
-
2086
- free(messages);
2087
- if (result != RULES_OK) {
2088
- return result;
2089
- }
2090
-
2091
- }
2092
- }
2093
- }
2082
+ &tree->stringPool[tree->nameOffset]));
2094
2083
  }
2095
2084
 
2096
-
2097
2085
  if (tree->getQueuedMessagesCallback) {
2098
2086
  for (unsigned int index = 0; index < tree->statePool.count; ++index) {
2099
2087
  unsigned int nodeOffset = tree->reverseStateIndex[index];
2100
2088
  stateNode *currentState = STATE_NODE(tree, nodeOffset);
2101
2089
 
2102
- char *messages;
2103
- unsigned int stateOffset;
2104
2090
  CHECK_RESULT(tree->getQueuedMessagesCallback(tree->getQueuedMessagesCallbackContext,
2105
2091
  &tree->stringPool[tree->nameOffset],
2106
- currentState->sid,
2107
- &messages));
2108
- if (messages) {
2109
- unsigned int result = replayMessages(tree,
2110
- messages,
2111
- &stateOffset);
2112
- free(messages);
2113
- if (result != RULES_OK) {
2114
- return result;
2115
- }
2116
- }
2092
+ currentState->sid));
2117
2093
  }
2118
2094
  }
2119
2095
 
2120
2096
  return RULES_OK;
2121
2097
  }
2122
2098
 
2099
+ unsigned int completeGetIdleState(unsigned int handle,
2100
+ char *sid,
2101
+ char *storedMessages) {
2102
+ ruleset *tree;
2103
+ RESOLVE_HANDLE(handle, &tree);
2104
+ stateNode *state;
2105
+ unsigned int result = getStateNode(tree,
2106
+ sid,
2107
+ &state);
2108
+ if (result != RULES_OK && result != ERR_SID_NOT_FOUND) {
2109
+ return result;
2110
+ } else if (result == RULES_OK) {
2111
+ CHECK_RESULT(deleteStateNode(tree,
2112
+ state));
2113
+ }
2114
+
2115
+ CHECK_RESULT(createStateNode(tree,
2116
+ sid,
2117
+ &state));
2118
+
2119
+
2120
+ if (storedMessages) {
2121
+ unsigned int stateOffset;
2122
+ CHECK_RESULT(replayMessages(tree,
2123
+ storedMessages,
2124
+ &stateOffset,
2125
+ 0));
2126
+ }
2127
+
2128
+ if (tree->getQueuedMessagesCallback) {
2129
+ CHECK_RESULT(tree->getQueuedMessagesCallback(tree->getQueuedMessagesCallbackContext,
2130
+ &tree->stringPool[tree->nameOffset],
2131
+ sid));
2132
+ }
2133
+
2134
+ return RULES_OK;
2135
+ }
2136
+
2137
+ unsigned int completeGetQueuedMessages(unsigned int handle,
2138
+ char *sid,
2139
+ char *queuedMessages) {
2140
+ ruleset *tree;
2141
+ RESOLVE_HANDLE(handle, &tree);
2142
+ stateNode *state;
2143
+ CHECK_RESULT(getStateNode(tree,
2144
+ sid,
2145
+ &state));
2146
+
2147
+ unsigned int stateOffset;
2148
+ return replayMessages(tree,
2149
+ queuedMessages,
2150
+ &stateOffset,
2151
+ 1);
2152
+ }
2153
+
2123
2154
  unsigned int startAction(unsigned int handle,
2124
2155
  char **stateFact,
2125
2156
  char **messages,
@@ -2133,8 +2164,8 @@ unsigned int startAction(unsigned int handle,
2133
2164
  unsigned int resultFrameOffset;
2134
2165
  time_t currentTime = time(NULL);
2135
2166
 
2136
- CHECK_RESULT(flushQueuedActions(tree));
2137
-
2167
+ CHECK_RESULT(startQueuedActions(tree));
2168
+
2138
2169
  CHECK_RESULT(getNextResult(tree,
2139
2170
  currentTime,
2140
2171
  &resultState,
@@ -2152,7 +2183,7 @@ unsigned int startAction(unsigned int handle,
2152
2183
  CHECK_RESULT(serializeState(resultState,
2153
2184
  &resultState->context.stateFact));
2154
2185
 
2155
-
2186
+
2156
2187
  resultState->context.actionStateIndex = actionStateIndex;
2157
2188
  resultState->context.resultCount = resultCount;
2158
2189
  resultState->context.resultFrameOffset = resultFrameOffset;
data/src/rules/json.c CHANGED
@@ -114,7 +114,7 @@ unsigned int readNextString(char *start, char **first, char **last, unsigned int
114
114
 
115
115
  unsigned int readNextArrayValue(char *start, char **first, char **last, unsigned char *type) {
116
116
  unsigned char state = ST_OBJECT_PROP_PARSE;
117
- if (start[0] == '[') {
117
+ if (start[0] == '[' || start[0] == ',') {
118
118
  state = ST_OBJECT_PROP_VAL;
119
119
  }
120
120
  ++start;
data/src/rules/rete.c CHANGED
@@ -1860,8 +1860,6 @@ unsigned int createRuleset(unsigned int *handle, char *name, char *rules) {
1860
1860
  tree->queueMessageCallbackContext = NULL;
1861
1861
  tree->getQueuedMessagesCallback = NULL;
1862
1862
  tree->getQueuedMessagesCallbackContext = NULL;
1863
- tree->getStoredMessagesCallback = NULL;
1864
- tree->getStoredMessagesCallbackContext = NULL;
1865
1863
  tree->getIdleStateCallback = NULL;
1866
1864
  tree->getIdleStateCallbackContext = NULL;
1867
1865
 
@@ -1939,7 +1937,7 @@ unsigned int setQueueMessageCallback(unsigned int handle,
1939
1937
 
1940
1938
  unsigned int setGetQueuedMessagesCallback(unsigned int handle,
1941
1939
  void *context,
1942
- unsigned int (*callback)(void *, char *, char *, char **)) {
1940
+ unsigned int (*callback)(void *, char *, char *)) {
1943
1941
  ruleset *tree;
1944
1942
  RESOLVE_HANDLE(handle, &tree);
1945
1943
 
@@ -1948,20 +1946,9 @@ unsigned int setGetQueuedMessagesCallback(unsigned int handle,
1948
1946
  return RULES_OK;
1949
1947
  }
1950
1948
 
1951
- unsigned int setGetStoredMessagesCallback(unsigned int handle,
1952
- void *context,
1953
- unsigned int (*callback)(void *, char *, char *, char **)) {
1954
- ruleset *tree;
1955
- RESOLVE_HANDLE(handle, &tree);
1956
-
1957
- tree->getStoredMessagesCallbackContext = context;
1958
- tree->getStoredMessagesCallback = callback;
1959
- return RULES_OK;
1960
- }
1961
-
1962
1949
  unsigned int setGetIdleStateCallback(unsigned int handle,
1963
1950
  void *context,
1964
- unsigned int (*callback)(void *, char *, char **)) {
1951
+ unsigned int (*callback)(void *, char *)) {
1965
1952
  ruleset *tree;
1966
1953
  RESOLVE_HANDLE(handle, &tree);
1967
1954
 
data/src/rules/rete.h CHANGED
@@ -157,13 +157,10 @@ typedef struct ruleset {
157
157
  unsigned int (*queueMessageCallback)(void *, char *, char *, unsigned char, char *);
158
158
  void *queueMessageCallbackContext;
159
159
 
160
- unsigned int (*getQueuedMessagesCallback)(void *, char *, char *, char **);
160
+ unsigned int (*getQueuedMessagesCallback)(void *, char *, char *);
161
161
  void *getQueuedMessagesCallbackContext;
162
162
 
163
- unsigned int (*getStoredMessagesCallback)(void *, char *, char *, char **);
164
- void *getStoredMessagesCallbackContext;
165
-
166
- unsigned int (*getIdleStateCallback)(void *, char *, char **);
163
+ unsigned int (*getIdleStateCallback)(void *, char *);
167
164
  void *getIdleStateCallbackContext;
168
165
 
169
166
 
data/src/rules/rules.h CHANGED
@@ -109,9 +109,6 @@ extern char entriesInitialized;
109
109
  if (!firstEmptyEntry) firstEmptyEntry = lastEmptyEntry; \
110
110
  } while(0)
111
111
 
112
-
113
- unsigned int cloneString(char **target, char *source);
114
-
115
112
  unsigned int createRuleset(unsigned int *handle,
116
113
  char *name,
117
114
  char *rules);
@@ -130,15 +127,19 @@ unsigned int setQueueMessageCallback(unsigned int handle,
130
127
 
131
128
  unsigned int setGetQueuedMessagesCallback(unsigned int handle,
132
129
  void *context,
133
- unsigned int (*callback)(void *, char *, char *, char **));
130
+ unsigned int (*callback)(void *, char *, char *));
134
131
 
135
- unsigned int setGetStoredMessagesCallback(unsigned int handle,
136
- void *context,
137
- unsigned int (*callback)(void *, char *, char *, char **));
132
+ unsigned int completeGetQueuedMessages(unsigned int handle,
133
+ char *sid,
134
+ char *queuedMessages);
138
135
 
139
136
  unsigned int setGetIdleStateCallback(unsigned int handle,
140
137
  void *context,
141
- unsigned int (*callback)(void *, char *, char **));
138
+ unsigned int (*callback)(void *, char *));
139
+
140
+ unsigned int completeGetIdleState(unsigned int handle,
141
+ char *sid,
142
+ char *storedMessages);
142
143
 
143
144
  unsigned int deleteRuleset(unsigned int handle);
144
145
 
data/src/rules/state.c CHANGED
@@ -154,17 +154,6 @@ int asprintf(char** ret, char* format, ...){
154
154
  --pool.count; \
155
155
  } while (0)
156
156
 
157
- unsigned int cloneString(char **target, char *source) {
158
- unsigned int length = (strlen(source) + 1) * sizeof(char);
159
- *target = malloc(length);
160
- if (!*target) {
161
- return ERR_OUT_OF_MEMORY;
162
- }
163
- memcpy(*target, source, length);
164
-
165
- return RULES_OK;
166
- }
167
-
168
157
  unsigned int fnv1Hash32(char *str, unsigned int length) {
169
158
  unsigned int hash = FNV_32_OFFSET_BASIS;
170
159
  for(unsigned int i = 0; i < length; str++, i++) {
@@ -750,6 +739,7 @@ unsigned int storeMessage(void *tree,
750
739
  char *mid,
751
740
  jsonObject *message,
752
741
  unsigned char messageType,
742
+ unsigned char sideEffect,
753
743
  unsigned int *valueOffset) {
754
744
  unsigned int hash = fnv1Hash32(mid, strlen(mid));
755
745
  *valueOffset = UNDEFINED_HASH_OFFSET;
@@ -787,12 +777,20 @@ unsigned int storeMessage(void *tree,
787
777
  CHECK_RESULT(copyMessage(&node->jo, message));
788
778
 
789
779
  ruleset *rulesetTree = (ruleset*)tree;
790
- if (rulesetTree->storeMessageCallback) {
791
- unsigned char actionType = ACTION_ASSERT_FACT;
792
- if (messageType == MESSAGE_TYPE_EVENT) {
793
- actionType = ACTION_ASSERT_EVENT;
780
+ if (sideEffect && rulesetTree->storeMessageCallback) {
781
+ unsigned char actionType;
782
+ switch (messageType) {
783
+ case MESSAGE_TYPE_EVENT:
784
+ actionType = ACTION_ASSERT_EVENT;
785
+ break;
786
+ case MESSAGE_TYPE_FACT:
787
+ actionType = ACTION_ASSERT_FACT;
788
+ break;
789
+ case MESSAGE_TYPE_STATE:
790
+ actionType = ACTION_UPDATE_STATE;
791
+ break;
794
792
  }
795
-
793
+
796
794
  return rulesetTree->storeMessageCallback(rulesetTree->storeMessageCallbackContext,
797
795
  &rulesetTree->stringPool[rulesetTree->nameOffset],
798
796
  state->sid,
data/src/rules/state.h CHANGED
@@ -9,6 +9,7 @@
9
9
 
10
10
  #define MESSAGE_TYPE_EVENT 0
11
11
  #define MESSAGE_TYPE_FACT 1
12
+ #define MESSAGE_TYPE_STATE 2
12
13
 
13
14
  #define ACTION_ASSERT_FACT 1
14
15
  #define ACTION_ASSERT_EVENT 2
@@ -326,6 +327,7 @@ unsigned int storeMessage(void *tree,
326
327
  char *mid,
327
328
  jsonObject *message,
328
329
  unsigned char messageType,
330
+ unsigned char sideEffect,
329
331
  unsigned int *valueOffset);
330
332
 
331
333
  unsigned int getStateNode(void *tree,
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: durable_rules
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.6
4
+ version: 2.0.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jesus Ruiz
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-08-05 00:00:00.000000000 Z
11
+ date: 2019-08-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake