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 +4 -4
 - data/src/rules/events.c +115 -84
 - data/src/rules/json.c +1 -1
 - data/src/rules/rete.c +2 -15
 - data/src/rules/rete.h +2 -5
 - data/src/rules/rules.h +9 -8
 - data/src/rules/state.c +14 -16
 - data/src/rules/state.h +2 -0
 - metadata +2 -2
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA1:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 7c08ea6baf1f7ff23b7b360cbc0a4f5d27361524
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: c6e839c804df85c3aa26d752d42ed965c78382f8
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 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 
     | 
    
         
            -
                                               
     | 
| 
      
 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,  
     | 
| 
      
 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  
     | 
| 
      
 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( 
     | 
| 
       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  
     | 
| 
      
 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  
     | 
| 
      
 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  
     | 
| 
      
 160 
     | 
    
         
            +
                unsigned int (*getQueuedMessagesCallback)(void *, char *, char *);
         
     | 
| 
       161 
161 
     | 
    
         
             
                void *getQueuedMessagesCallbackContext;
         
     | 
| 
       162 
162 
     | 
    
         | 
| 
       163 
     | 
    
         
            -
                unsigned int (* 
     | 
| 
       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  
     | 
| 
      
 130 
     | 
    
         
            +
                                                      unsigned int (*callback)(void *, char *, char *));
         
     | 
| 
       134 
131 
     | 
    
         | 
| 
       135 
     | 
    
         
            -
            unsigned int  
     | 
| 
       136 
     | 
    
         
            -
             
     | 
| 
       137 
     | 
    
         
            -
             
     | 
| 
      
 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  
     | 
| 
      
 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 
     | 
| 
       792 
     | 
    
         
            -
                     
     | 
| 
       793 
     | 
    
         
            -
                         
     | 
| 
      
 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. 
     | 
| 
      
 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- 
     | 
| 
      
 11 
     | 
    
         
            +
            date: 2019-08-11 00:00:00.000000000 Z
         
     | 
| 
       12 
12 
     | 
    
         
             
            dependencies:
         
     | 
| 
       13 
13 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       14 
14 
     | 
    
         
             
              name: rake
         
     |