durable_rules 0.34.57 → 2.00.001
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/librb/durable.rb +46 -28
- data/librb/engine.rb +257 -548
- data/src/rules/Makefile +6 -7
- data/src/rules/events.c +1690 -1559
- data/src/rules/json.h +10 -6
- data/src/rules/rete.c +829 -1046
- data/src/rules/rete.h +66 -52
- data/src/rules/rules.h +67 -109
- data/src/rules/state.c +1245 -449
- data/src/rules/state.h +305 -31
- data/src/rulesrb/extconf.rb +1 -8
- data/src/rulesrb/rules.c +71 -369
- metadata +2 -36
- data/deps/hiredis/COPYING +0 -29
- data/deps/hiredis/Makefile +0 -217
- data/deps/hiredis/async.c +0 -687
- data/deps/hiredis/async.h +0 -129
- data/deps/hiredis/dict.c +0 -338
- data/deps/hiredis/dict.h +0 -126
- data/deps/hiredis/fmacros.h +0 -21
- data/deps/hiredis/hiredis.c +0 -1021
- data/deps/hiredis/hiredis.h +0 -223
- data/deps/hiredis/net.c +0 -458
- data/deps/hiredis/net.h +0 -53
- data/deps/hiredis/read.c +0 -525
- data/deps/hiredis/read.h +0 -116
- data/deps/hiredis/sds.c +0 -1095
- data/deps/hiredis/sds.h +0 -105
- data/deps/hiredis/test.c +0 -807
- data/deps/hiredis/win32.h +0 -42
- data/librb/interface.rb +0 -126
- data/src/rules/net.c +0 -3257
- data/src/rules/net.h +0 -165
data/src/rules/json.h
CHANGED
@@ -10,12 +10,10 @@
|
|
10
10
|
#define JSON_ARRAY 0x05
|
11
11
|
#define JSON_OBJECT 0x06
|
12
12
|
#define JSON_NIL 0x07
|
13
|
-
#define
|
14
|
-
#define
|
15
|
-
#define
|
16
|
-
#define
|
17
|
-
#define JSON_EVENT_IDIOM 0x0C
|
18
|
-
#define JSON_EVENT_LOCAL_IDIOM 0x0D
|
13
|
+
#define JSON_IDENTIFIER 0x09
|
14
|
+
#define JSON_MESSAGE_IDENTIFIER 0x0A
|
15
|
+
#define JSON_EXPRESSION 0x0C
|
16
|
+
#define JSON_MESSAGE_EXPRESSION 0x0D
|
19
17
|
#define JSON_REGEX 0x0E
|
20
18
|
#define JSON_IREGEX 0x0F
|
21
19
|
|
@@ -25,6 +23,12 @@
|
|
25
23
|
#define FNV_64_OFFSET_BASIS 0xcbf29ce484222325
|
26
24
|
#define FNV_64_PRIME 1099511628211
|
27
25
|
|
26
|
+
#define CHECK_PARSE_RESULT(result) do { \
|
27
|
+
if (result != PARSE_OK) { \
|
28
|
+
return result; \
|
29
|
+
} \
|
30
|
+
} while(0)
|
31
|
+
|
28
32
|
unsigned int readNextName(char *start, char **first, char **last, unsigned int *hash);
|
29
33
|
unsigned int readNextValue(char *start, char **first, char **last, unsigned char *type);
|
30
34
|
unsigned int readNextArrayValue(char *start, char **first, char **last, unsigned char *type);
|
data/src/rules/rete.c
CHANGED
@@ -4,9 +4,9 @@
|
|
4
4
|
#include <time.h>
|
5
5
|
#include <string.h>
|
6
6
|
#include "rules.h"
|
7
|
-
#include "net.h"
|
8
7
|
#include "json.h"
|
9
8
|
#include "regex.h"
|
9
|
+
#include "rete.h"
|
10
10
|
|
11
11
|
#define HASH_ALL 321211332 // all
|
12
12
|
#define HASH_ANY 740945997 // any
|
@@ -28,7 +28,6 @@
|
|
28
28
|
#define HASH_NEX 2605470202 // $nex
|
29
29
|
#define HASH_OR 340911698 // $or
|
30
30
|
#define HASH_AND 3746487396 // $and
|
31
|
-
#define HASH_S 1186729920 // $s
|
32
31
|
#define HASH_M 1690058490 // $m
|
33
32
|
#define HASH_NAME 2369371622 // name
|
34
33
|
#define HASH_ADD 4081054038 // $add
|
@@ -39,25 +38,26 @@
|
|
39
38
|
#define HASH_R 1203507539 //$r
|
40
39
|
#define HASH_FORWARD 739185624 // $forward
|
41
40
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
}
|
41
|
+
#define MAX_ACTIONS 4096
|
42
|
+
|
43
|
+
#define GET_EXPRESSION(tree, betaOffset, expr) do { \
|
44
|
+
expressionSequence *exprs = &tree->nodePool[betaOffset].value.b.expressionSequence; \
|
45
|
+
expr = &exprs->expressions[exprs->length]; \
|
46
|
+
++exprs->length; \
|
47
|
+
if (exprs->length == MAX_SEQUENCE_EXPRESSIONS) { \
|
48
|
+
return ERR_EXPRESSION_LIMIT_EXCEEDED; \
|
49
|
+
} \
|
50
|
+
} while(0)
|
51
|
+
|
52
|
+
#define APPEND_EXPRESSION(tree, betaOffset, op) do { \
|
53
|
+
expressionSequence *exprs = &tree->nodePool[betaOffset].value.b.expressionSequence; \
|
54
|
+
exprs->expressions[exprs->length].operator = op; \
|
55
|
+
++exprs->length; \
|
56
|
+
if (exprs->length == MAX_SEQUENCE_EXPRESSIONS) { \
|
57
|
+
return ERR_EXPRESSION_LIMIT_EXCEEDED; \
|
58
|
+
} \
|
59
|
+
} while(0)
|
60
|
+
|
61
61
|
|
62
62
|
unsigned int firstEmptyEntry = 1;
|
63
63
|
unsigned int lastEmptyEntry = MAX_HANDLES -1;
|
@@ -65,14 +65,6 @@ char entriesInitialized = 0;
|
|
65
65
|
|
66
66
|
static unsigned int validateAlgebra(char *rule);
|
67
67
|
|
68
|
-
static unsigned int createBeta(ruleset *tree,
|
69
|
-
char *rule,
|
70
|
-
unsigned char operator,
|
71
|
-
unsigned short distinct,
|
72
|
-
unsigned int nextOffset,
|
73
|
-
path *nextPath,
|
74
|
-
path **outPath);
|
75
|
-
|
76
68
|
static unsigned int storeString(ruleset *tree,
|
77
69
|
char *newString,
|
78
70
|
unsigned int *stringOffset,
|
@@ -103,8 +95,8 @@ static unsigned int storeString(ruleset *tree,
|
|
103
95
|
}
|
104
96
|
|
105
97
|
static unsigned int storeExpression(ruleset *tree,
|
106
|
-
|
107
|
-
|
98
|
+
expression **newExpression,
|
99
|
+
unsigned int *expressionOffset) {
|
108
100
|
|
109
101
|
if (!tree->expressionPool) {
|
110
102
|
tree->expressionPool = malloc(sizeof(expression));
|
@@ -129,87 +121,9 @@ static unsigned int storeExpression(ruleset *tree,
|
|
129
121
|
return RULES_OK;
|
130
122
|
}
|
131
123
|
|
132
|
-
static unsigned int storeIdiom(ruleset *tree,
|
133
|
-
idiom **newIdiom,
|
134
|
-
unsigned int *idiomOffset) {
|
135
|
-
|
136
|
-
if (!tree->idiomPool) {
|
137
|
-
tree->idiomPool = malloc(sizeof(idiom));
|
138
|
-
if (!tree->idiomPool) {
|
139
|
-
return ERR_OUT_OF_MEMORY;
|
140
|
-
}
|
141
|
-
|
142
|
-
*idiomOffset = 0;
|
143
|
-
*newIdiom = &tree->idiomPool[0];
|
144
|
-
tree->idiomOffset = 1;
|
145
|
-
} else {
|
146
|
-
tree->idiomPool = realloc(tree->idiomPool, (tree->idiomOffset + 1) * sizeof(idiom));
|
147
|
-
if (!tree->idiomPool) {
|
148
|
-
return ERR_OUT_OF_MEMORY;
|
149
|
-
}
|
150
|
-
|
151
|
-
*idiomOffset = tree->idiomOffset;
|
152
|
-
*newIdiom = &tree->idiomPool[tree->idiomOffset];
|
153
|
-
tree->idiomOffset = tree->idiomOffset + 1;
|
154
|
-
}
|
155
|
-
|
156
|
-
return RULES_OK;
|
157
|
-
}
|
158
|
-
|
159
|
-
static unsigned int appendTerm(expression *expr, unsigned int nodeOffset) {
|
160
|
-
if (expr->termsLength == 0) {
|
161
|
-
expr->termsLength = 1;
|
162
|
-
expr->t.termsPointer = malloc(sizeof(unsigned int));
|
163
|
-
if (!expr->t.termsPointer) {
|
164
|
-
return ERR_OUT_OF_MEMORY;
|
165
|
-
}
|
166
|
-
|
167
|
-
expr->t.termsPointer[0] = nodeOffset;
|
168
|
-
}
|
169
|
-
else {
|
170
|
-
expr->termsLength = expr->termsLength + 1;
|
171
|
-
expr->t.termsPointer = realloc(expr->t.termsPointer, expr->termsLength * sizeof(unsigned int));
|
172
|
-
if (!expr->t.termsPointer) {
|
173
|
-
return ERR_OUT_OF_MEMORY;
|
174
|
-
}
|
175
|
-
|
176
|
-
expr->t.termsPointer[expr->termsLength - 1] = nodeOffset;
|
177
|
-
}
|
178
|
-
|
179
|
-
return RULES_OK;
|
180
|
-
}
|
181
|
-
|
182
|
-
static unsigned int storeJoin(ruleset *tree,
|
183
|
-
join **newJoin,
|
184
|
-
unsigned int *joinOffset) {
|
185
|
-
|
186
|
-
if (!tree->joinPool) {
|
187
|
-
tree->joinPool = malloc(sizeof(join));
|
188
|
-
if (!tree->joinPool) {
|
189
|
-
return ERR_OUT_OF_MEMORY;
|
190
|
-
}
|
191
|
-
|
192
|
-
*joinOffset = 0;
|
193
|
-
*newJoin = &tree->joinPool[0];
|
194
|
-
tree->joinOffset = 1;
|
195
|
-
} else {
|
196
|
-
tree->joinPool = realloc(tree->joinPool, (tree->joinOffset + 1) * sizeof(join));
|
197
|
-
if (!tree->joinPool) {
|
198
|
-
return ERR_OUT_OF_MEMORY;
|
199
|
-
}
|
200
|
-
|
201
|
-
*joinOffset = tree->joinOffset;
|
202
|
-
*newJoin = &tree->joinPool[tree->joinOffset];
|
203
|
-
tree->joinOffset = tree->joinOffset + 1;
|
204
|
-
}
|
205
|
-
|
206
|
-
return RULES_OK;
|
207
|
-
}
|
208
|
-
|
209
124
|
static unsigned int storeNode(ruleset *tree,
|
210
125
|
node **newNode,
|
211
126
|
unsigned int *nodeOffset) {
|
212
|
-
|
213
127
|
if (!tree->nodePool) {
|
214
128
|
tree->nodePool = malloc(sizeof(node));
|
215
129
|
if (!tree->nodePool) {
|
@@ -300,29 +214,71 @@ static unsigned int ensureBetaList(ruleset *tree, node *newNode) {
|
|
300
214
|
return RULES_OK;
|
301
215
|
}
|
302
216
|
|
217
|
+
static void copyOperand(operand *op,
|
218
|
+
operand *target) {
|
219
|
+
target->type = op->type;
|
220
|
+
switch(op->type) {
|
221
|
+
case JSON_IDENTIFIER:
|
222
|
+
case JSON_MESSAGE_IDENTIFIER:
|
223
|
+
target->value.id.propertyNameHash = op->value.id.propertyNameHash;
|
224
|
+
target->value.id.propertyNameOffset = op->value.id.propertyNameOffset;
|
225
|
+
target->value.id.nameOffset = op->value.id.nameOffset;
|
226
|
+
target->value.id.nameHash = op->value.id.nameHash;
|
227
|
+
break;
|
228
|
+
case JSON_EXPRESSION:
|
229
|
+
case JSON_MESSAGE_EXPRESSION:
|
230
|
+
target->value.expressionOffset = op->value.expressionOffset;
|
231
|
+
break;
|
232
|
+
case JSON_STRING:
|
233
|
+
target->value.stringOffset = op->value.stringOffset;
|
234
|
+
break;
|
235
|
+
case JSON_INT:
|
236
|
+
target->value.i = op->value.i;
|
237
|
+
break;
|
238
|
+
case JSON_DOUBLE:
|
239
|
+
target->value.d = op->value.d;
|
240
|
+
break;
|
241
|
+
case JSON_BOOL:
|
242
|
+
target->value.b = op->value.b;
|
243
|
+
break;
|
244
|
+
case JSON_REGEX:
|
245
|
+
case JSON_IREGEX:
|
246
|
+
target->value.regex.stringOffset = op->value.regex.stringOffset;
|
247
|
+
target->value.regex.vocabularyLength = op->value.regex.vocabularyLength;
|
248
|
+
target->value.regex.statesLength = op->value.regex.statesLength;
|
249
|
+
target->value.regex.stateMachineOffset = op->value.regex.stateMachineOffset;
|
250
|
+
break;
|
251
|
+
}
|
252
|
+
}
|
253
|
+
|
254
|
+
static void copyExpression(expression *expr, expression *target) {
|
255
|
+
target->operator = expr->operator;
|
256
|
+
copyOperand(&expr->right, &target->right);
|
257
|
+
copyOperand(&expr->left, &target->left);
|
258
|
+
}
|
259
|
+
|
303
260
|
static unsigned int copyValue(ruleset *tree,
|
304
|
-
|
261
|
+
operand *right,
|
305
262
|
char *first,
|
306
263
|
char *last,
|
307
|
-
unsigned int
|
308
|
-
|
264
|
+
unsigned int expressionOffset,
|
265
|
+
identifier *id,
|
309
266
|
unsigned char type) {
|
310
267
|
unsigned int result = RULES_OK;
|
311
268
|
right->type = type;
|
312
269
|
unsigned int leftLength;
|
313
270
|
char temp;
|
314
271
|
switch(type) {
|
315
|
-
case
|
316
|
-
case
|
317
|
-
|
318
|
-
right->value.
|
319
|
-
right->value.
|
320
|
-
right->value.
|
272
|
+
case JSON_IDENTIFIER:
|
273
|
+
case JSON_MESSAGE_IDENTIFIER:
|
274
|
+
right->value.id.propertyNameHash = id->propertyNameHash;
|
275
|
+
right->value.id.propertyNameOffset = id->propertyNameOffset;
|
276
|
+
right->value.id.nameOffset = id->nameOffset;
|
277
|
+
right->value.id.nameHash = id->nameHash;
|
321
278
|
break;
|
322
|
-
case
|
323
|
-
case
|
324
|
-
|
325
|
-
right->value.idiomOffset = idiomOffset;
|
279
|
+
case JSON_EXPRESSION:
|
280
|
+
case JSON_MESSAGE_EXPRESSION:
|
281
|
+
right->value.expressionOffset = expressionOffset;
|
326
282
|
break;
|
327
283
|
case JSON_STRING:
|
328
284
|
leftLength = last - first;
|
@@ -351,11 +307,11 @@ static unsigned int copyValue(ruleset *tree,
|
|
351
307
|
case JSON_REGEX:
|
352
308
|
case JSON_IREGEX:
|
353
309
|
leftLength = last - first;
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
310
|
+
CHECK_RESULT(storeString(tree,
|
311
|
+
first,
|
312
|
+
&right->value.regex.stringOffset,
|
313
|
+
leftLength));
|
314
|
+
|
359
315
|
result = compileRegex(tree,
|
360
316
|
first,
|
361
317
|
last,
|
@@ -370,10 +326,10 @@ static unsigned int copyValue(ruleset *tree,
|
|
370
326
|
}
|
371
327
|
|
372
328
|
static unsigned char compareValue(ruleset *tree,
|
373
|
-
|
329
|
+
operand *right,
|
374
330
|
char *first,
|
375
331
|
char *last,
|
376
|
-
|
332
|
+
identifier *id,
|
377
333
|
unsigned char type) {
|
378
334
|
|
379
335
|
if (right->type != type) {
|
@@ -383,18 +339,17 @@ static unsigned char compareValue(ruleset *tree,
|
|
383
339
|
unsigned int leftLength;
|
384
340
|
char temp;
|
385
341
|
switch(type) {
|
386
|
-
case
|
387
|
-
case
|
388
|
-
|
389
|
-
|
390
|
-
right->value.
|
391
|
-
right->value.
|
342
|
+
case JSON_IDENTIFIER:
|
343
|
+
case JSON_MESSAGE_IDENTIFIER:
|
344
|
+
if (right->value.id.propertyNameHash == id->propertyNameHash &&
|
345
|
+
right->value.id.propertyNameOffset == id->propertyNameOffset &&
|
346
|
+
right->value.id.nameHash == id->nameHash &&
|
347
|
+
right->value.id.nameOffset == id->nameOffset)
|
392
348
|
return 1;
|
393
349
|
|
394
350
|
return 0;
|
395
|
-
case
|
396
|
-
case
|
397
|
-
case JSON_EVENT_LOCAL_IDIOM:
|
351
|
+
case JSON_EXPRESSION:
|
352
|
+
case JSON_MESSAGE_EXPRESSION:
|
398
353
|
return 0;
|
399
354
|
case JSON_STRING:
|
400
355
|
{
|
@@ -446,7 +401,7 @@ static unsigned int validateSetting(unsigned int settingHash, char *rule, unsign
|
|
446
401
|
return ERR_UNEXPECTED_TYPE;
|
447
402
|
}
|
448
403
|
|
449
|
-
return
|
404
|
+
return RULES_OK;
|
450
405
|
}
|
451
406
|
|
452
407
|
result = readNextName(last, &first, &last, &hash);
|
@@ -455,63 +410,31 @@ static unsigned int validateSetting(unsigned int settingHash, char *rule, unsign
|
|
455
410
|
return ERR_SETTING_NOT_FOUND;
|
456
411
|
}
|
457
412
|
|
458
|
-
static unsigned int
|
413
|
+
static unsigned int validateIdentifier(char *rule, unsigned char *identifierType) {
|
459
414
|
char *first;
|
460
415
|
char *last;
|
461
|
-
unsigned char type;
|
462
416
|
unsigned int hash;
|
463
|
-
|
464
|
-
|
465
|
-
|
466
|
-
|
467
|
-
|
468
|
-
}
|
469
|
-
|
470
|
-
if (hash != HASH_S) {
|
471
|
-
*referenceType = JSON_EVENT_PROPERTY;
|
472
|
-
|
473
|
-
if (hash == HASH_M) {
|
474
|
-
*referenceType = JSON_EVENT_LOCAL_PROPERTY;
|
475
|
-
}
|
417
|
+
|
418
|
+
CHECK_PARSE_RESULT(readNextName(rule,
|
419
|
+
&first,
|
420
|
+
&last,
|
421
|
+
&hash));
|
476
422
|
|
477
|
-
|
478
|
-
if (result != PARSE_OK) {
|
479
|
-
return result;
|
480
|
-
}
|
481
|
-
} else {
|
482
|
-
*referenceType = JSON_STATE_PROPERTY;
|
483
|
-
if (readNextString(last, &first, &last, &hash) != PARSE_OK) {
|
484
|
-
result = readNextValue(last, &first, &last, &type);
|
485
|
-
if (result != PARSE_OK) {
|
486
|
-
return result;
|
487
|
-
}
|
488
|
-
|
489
|
-
unsigned int result = readNextName(first, &first, &last, &hash);
|
490
|
-
while (result == PARSE_OK) {
|
491
|
-
switch (hash) {
|
492
|
-
case HASH_NAME:
|
493
|
-
result = readNextString(last, &first, &last, &hash);
|
494
|
-
break;
|
495
|
-
case HASH_ID:
|
496
|
-
result = readNextValue(last, &first, &last, &type);
|
497
|
-
break;
|
498
|
-
default:
|
499
|
-
result = readNextValue(last, &first, &last, &type);
|
500
|
-
break;
|
501
|
-
}
|
423
|
+
*identifierType = JSON_IDENTIFIER;
|
502
424
|
|
503
|
-
|
504
|
-
|
505
|
-
}
|
506
|
-
result = readNextName(last, &first, &last, &hash);
|
507
|
-
}
|
508
|
-
}
|
425
|
+
if (hash == HASH_M) {
|
426
|
+
*identifierType = JSON_MESSAGE_IDENTIFIER;
|
509
427
|
}
|
510
428
|
|
511
|
-
|
429
|
+
CHECK_PARSE_RESULT(readNextString(last,
|
430
|
+
&first,
|
431
|
+
&last,
|
432
|
+
&hash));
|
433
|
+
|
434
|
+
return RULES_OK;
|
512
435
|
}
|
513
436
|
|
514
|
-
static unsigned int
|
437
|
+
static unsigned int validateExpression(char *rule, unsigned char *expressionType) {
|
515
438
|
char *first;
|
516
439
|
char *last;
|
517
440
|
unsigned char type;
|
@@ -525,54 +448,41 @@ static unsigned int validateIdiom(char *rule, unsigned char *idiomType) {
|
|
525
448
|
|
526
449
|
if (hash != HASH_ADD && hash != HASH_SUB &&
|
527
450
|
hash != HASH_MUL && hash != HASH_DIV) {
|
528
|
-
return
|
451
|
+
return validateIdentifier(rule, expressionType);
|
529
452
|
} else {
|
530
453
|
result = readNextValue(last, &first, &last, &type);
|
531
454
|
if (result != PARSE_OK) {
|
532
455
|
return result;
|
533
456
|
}
|
534
457
|
|
535
|
-
*
|
458
|
+
*expressionType = 0;
|
536
459
|
result = readNextName(first, &first, &last, &hash);
|
537
460
|
while (result == PARSE_OK) {
|
538
|
-
unsigned char
|
539
|
-
|
540
|
-
|
541
|
-
|
542
|
-
|
543
|
-
|
461
|
+
unsigned char newExpressionType = 0;
|
462
|
+
CHECK_PARSE_RESULT(readNextValue(last,
|
463
|
+
&first,
|
464
|
+
&last,
|
465
|
+
&type));
|
466
|
+
|
544
467
|
if (type == JSON_OBJECT) {
|
545
|
-
|
546
|
-
|
547
|
-
return result;
|
548
|
-
}
|
468
|
+
CHECK_RESULT(validateExpression(first,
|
469
|
+
&newExpressionType));
|
549
470
|
}
|
550
471
|
|
551
|
-
if (
|
552
|
-
if (*
|
553
|
-
*idiomType == JSON_EVENT_LOCAL_PROPERTY || *idiomType == JSON_EVENT_LOCAL_PROPERTY) {
|
472
|
+
if (newExpressionType == JSON_IDENTIFIER || newExpressionType == JSON_EXPRESSION) {
|
473
|
+
if (*expressionType == JSON_MESSAGE_IDENTIFIER) {
|
554
474
|
return ERR_UNEXPECTED_TYPE;
|
555
475
|
}
|
556
476
|
|
557
|
-
*
|
558
|
-
}
|
559
|
-
|
560
|
-
if (newIdiomType == JSON_STATE_PROPERTY || newIdiomType == JSON_STATE_IDIOM) {
|
561
|
-
if (*idiomType == JSON_EVENT_PROPERTY || *idiomType == JSON_EVENT_IDIOM ||
|
562
|
-
*idiomType == JSON_EVENT_LOCAL_PROPERTY || *idiomType == JSON_EVENT_LOCAL_IDIOM) {
|
563
|
-
return ERR_UNEXPECTED_TYPE;
|
564
|
-
}
|
477
|
+
*expressionType = JSON_EXPRESSION;
|
478
|
+
}
|
565
479
|
|
566
|
-
|
567
|
-
|
568
|
-
|
569
|
-
if (newIdiomType == JSON_EVENT_LOCAL_PROPERTY || newIdiomType == JSON_EVENT_LOCAL_IDIOM) {
|
570
|
-
if (*idiomType == JSON_STATE_PROPERTY || *idiomType == JSON_STATE_IDIOM ||
|
571
|
-
*idiomType == JSON_EVENT_PROPERTY || *idiomType == JSON_EVENT_PROPERTY) {
|
480
|
+
if (newExpressionType == JSON_MESSAGE_IDENTIFIER || newExpressionType == JSON_MESSAGE_EXPRESSION) {
|
481
|
+
if (*expressionType == JSON_IDENTIFIER) {
|
572
482
|
return ERR_UNEXPECTED_TYPE;
|
573
483
|
}
|
574
484
|
|
575
|
-
*
|
485
|
+
*expressionType = JSON_EXPRESSION;
|
576
486
|
}
|
577
487
|
|
578
488
|
if (hash != HASH_L && hash != HASH_R) {
|
@@ -583,11 +493,11 @@ static unsigned int validateIdiom(char *rule, unsigned char *idiomType) {
|
|
583
493
|
}
|
584
494
|
}
|
585
495
|
|
586
|
-
return
|
496
|
+
return RULES_OK;
|
587
497
|
}
|
588
498
|
|
589
499
|
|
590
|
-
static unsigned int
|
500
|
+
static unsigned int validateExpressionSequence(char *rule) {
|
591
501
|
char *first;
|
592
502
|
char *last;
|
593
503
|
unsigned char type;
|
@@ -644,10 +554,7 @@ static unsigned int validateExpression(char *rule) {
|
|
644
554
|
|
645
555
|
result = readNextArrayValue(first, &first, &last, &type);
|
646
556
|
while (result == PARSE_OK) {
|
647
|
-
|
648
|
-
if (result != PARSE_OK) {
|
649
|
-
return result;
|
650
|
-
}
|
557
|
+
CHECK_RESULT(validateExpressionSequence(first));
|
651
558
|
|
652
559
|
result = readNextArrayValue(last, &first, &last, &type);
|
653
560
|
}
|
@@ -659,28 +566,28 @@ static unsigned int validateExpression(char *rule) {
|
|
659
566
|
operator = OP_EQ;
|
660
567
|
first = rule;
|
661
568
|
} else {
|
662
|
-
|
663
|
-
|
664
|
-
|
665
|
-
|
569
|
+
CHECK_PARSE_RESULT(readNextValue(last,
|
570
|
+
&first,
|
571
|
+
&last,
|
572
|
+
&type));
|
666
573
|
if (type != JSON_OBJECT) {
|
667
574
|
return ERR_UNEXPECTED_TYPE;
|
668
575
|
}
|
669
576
|
}
|
670
577
|
|
671
|
-
|
672
|
-
|
673
|
-
|
674
|
-
|
675
|
-
|
676
|
-
// Validating
|
677
|
-
|
678
|
-
|
679
|
-
|
680
|
-
|
681
|
-
|
578
|
+
CHECK_PARSE_RESULT(readNextName(first,
|
579
|
+
&first,
|
580
|
+
&last,
|
581
|
+
&hash));
|
582
|
+
|
583
|
+
// Validating expressionSequence rValue
|
584
|
+
CHECK_PARSE_RESULT(readNextValue(last,
|
585
|
+
&first,
|
586
|
+
&last,
|
587
|
+
&type));
|
588
|
+
|
682
589
|
if (operator == OP_IALL || operator == OP_IANY) {
|
683
|
-
result =
|
590
|
+
result = validateExpressionSequence(first);
|
684
591
|
return result;
|
685
592
|
}
|
686
593
|
|
@@ -689,10 +596,8 @@ static unsigned int validateExpression(char *rule) {
|
|
689
596
|
return ERR_UNEXPECTED_TYPE;
|
690
597
|
}
|
691
598
|
|
692
|
-
|
693
|
-
|
694
|
-
return result;
|
695
|
-
}
|
599
|
+
CHECK_RESULT(validateRegex(first,
|
600
|
+
last));
|
696
601
|
}
|
697
602
|
|
698
603
|
if (type == JSON_ARRAY) {
|
@@ -700,14 +605,12 @@ static unsigned int validateExpression(char *rule) {
|
|
700
605
|
}
|
701
606
|
|
702
607
|
if (type == JSON_OBJECT) {
|
703
|
-
unsigned char
|
704
|
-
|
705
|
-
|
706
|
-
return result;
|
707
|
-
}
|
608
|
+
unsigned char expressionType = 0;
|
609
|
+
CHECK_RESULT(validateExpression(first,
|
610
|
+
&expressionType));
|
708
611
|
}
|
709
612
|
|
710
|
-
return
|
613
|
+
return RULES_OK;
|
711
614
|
}
|
712
615
|
|
713
616
|
static unsigned int validateAlgebra(char *rule) {
|
@@ -717,9 +620,16 @@ static unsigned int validateAlgebra(char *rule) {
|
|
717
620
|
unsigned int hash;
|
718
621
|
unsigned char type;
|
719
622
|
unsigned char reenter = 0;
|
720
|
-
unsigned int result = readNextArrayValue(rule,
|
623
|
+
unsigned int result = readNextArrayValue(rule,
|
624
|
+
&first,
|
625
|
+
&lastArrayValue,
|
626
|
+
&type);
|
721
627
|
while (result == PARSE_OK) {
|
722
|
-
result = readNextName(first,
|
628
|
+
result = readNextName(first,
|
629
|
+
&first,
|
630
|
+
&last,
|
631
|
+
&hash);
|
632
|
+
|
723
633
|
unsigned int nameLength = last - first;
|
724
634
|
if (nameLength >= 4) {
|
725
635
|
if (!strncmp("$all", last - 4, 4)) {
|
@@ -737,24 +647,27 @@ static unsigned int validateAlgebra(char *rule) {
|
|
737
647
|
}
|
738
648
|
}
|
739
649
|
|
740
|
-
|
741
|
-
|
742
|
-
|
743
|
-
|
650
|
+
CHECK_PARSE_RESULT(readNextValue(last,
|
651
|
+
&first,
|
652
|
+
&last,
|
653
|
+
&type));
|
744
654
|
|
745
655
|
if (!reenter) {
|
746
|
-
result =
|
656
|
+
result = validateExpressionSequence(first);
|
747
657
|
}
|
748
658
|
else {
|
749
659
|
result = validateAlgebra(first);
|
750
660
|
reenter = 0;
|
751
661
|
}
|
752
662
|
|
753
|
-
if (result !=
|
663
|
+
if (result != RULES_OK) {
|
754
664
|
return result;
|
755
665
|
}
|
756
666
|
|
757
|
-
result = readNextArrayValue(lastArrayValue,
|
667
|
+
result = readNextArrayValue(lastArrayValue,
|
668
|
+
&first,
|
669
|
+
&lastArrayValue,
|
670
|
+
&type);
|
758
671
|
}
|
759
672
|
|
760
673
|
return (result == PARSE_END ? PARSE_OK: result);
|
@@ -769,22 +682,30 @@ static unsigned int validateRuleset(char *rules) {
|
|
769
682
|
unsigned char type;
|
770
683
|
unsigned int hash;
|
771
684
|
unsigned int result;
|
772
|
-
result = readNextName(rules,
|
685
|
+
result = readNextName(rules,
|
686
|
+
&firstName,
|
687
|
+
&lastName,
|
688
|
+
&hash);
|
689
|
+
|
773
690
|
while (result == PARSE_OK) {
|
774
|
-
|
775
|
-
|
776
|
-
|
777
|
-
|
691
|
+
CHECK_PARSE_RESULT(readNextValue(lastName,
|
692
|
+
&first,
|
693
|
+
&lastRuleValue,
|
694
|
+
&type));
|
778
695
|
if (type != JSON_OBJECT) {
|
779
696
|
return ERR_UNEXPECTED_TYPE;
|
780
697
|
}
|
781
698
|
|
782
|
-
unsigned int countResult = validateSetting(HASH_COUNT,
|
699
|
+
unsigned int countResult = validateSetting(HASH_COUNT,
|
700
|
+
first,
|
701
|
+
JSON_INT);
|
783
702
|
if (countResult != PARSE_OK && countResult != ERR_SETTING_NOT_FOUND) {
|
784
703
|
return countResult;
|
785
704
|
}
|
786
705
|
|
787
|
-
unsigned int capResult = validateSetting(HASH_CAP,
|
706
|
+
unsigned int capResult = validateSetting(HASH_CAP,
|
707
|
+
first,
|
708
|
+
JSON_INT);
|
788
709
|
if (capResult != PARSE_OK && capResult != ERR_SETTING_NOT_FOUND) {
|
789
710
|
return capResult;
|
790
711
|
}
|
@@ -793,22 +714,26 @@ static unsigned int validateRuleset(char *rules) {
|
|
793
714
|
return ERR_UNEXPECTED_NAME;
|
794
715
|
}
|
795
716
|
|
796
|
-
result = validateSetting(HASH_PRI,
|
717
|
+
result = validateSetting(HASH_PRI,
|
718
|
+
first,
|
719
|
+
JSON_INT);
|
797
720
|
if (result != PARSE_OK && result != ERR_SETTING_NOT_FOUND) {
|
798
721
|
return result;
|
799
722
|
}
|
800
723
|
|
801
|
-
result = validateSetting(HASH_DIST,
|
724
|
+
result = validateSetting(HASH_DIST,
|
725
|
+
first,
|
726
|
+
JSON_INT);
|
802
727
|
if (result != PARSE_OK && result != ERR_SETTING_NOT_FOUND) {
|
803
728
|
return result;
|
804
729
|
}
|
805
730
|
|
806
731
|
result = readNextName(first, &first, &last, &hash);
|
807
732
|
while (result == PARSE_OK) {
|
808
|
-
|
809
|
-
|
810
|
-
|
811
|
-
|
733
|
+
CHECK_PARSE_RESULT(readNextValue(last,
|
734
|
+
&first,
|
735
|
+
&last,
|
736
|
+
&type));
|
812
737
|
|
813
738
|
if (hash == HASH_ALL || hash == HASH_ANY) {
|
814
739
|
result = validateAlgebra(first);
|
@@ -831,16 +756,13 @@ static unsigned int validateRuleset(char *rules) {
|
|
831
756
|
static unsigned int linkAlpha(ruleset *tree,
|
832
757
|
unsigned int parentOffset,
|
833
758
|
unsigned int nextOffset) {
|
834
|
-
unsigned int result;
|
835
759
|
unsigned int entry;
|
836
760
|
node *parentAlpha = &tree->nodePool[parentOffset];
|
837
761
|
node *nextNode = &tree->nodePool[nextOffset];
|
838
762
|
if (nextNode->type != NODE_ALPHA) {
|
839
|
-
|
840
|
-
|
841
|
-
|
842
|
-
}
|
843
|
-
|
763
|
+
CHECK_RESULT(ensureBetaList(tree,
|
764
|
+
parentAlpha));
|
765
|
+
|
844
766
|
unsigned int *parentBetaList = &tree->nextPool[parentAlpha->value.a.betaListOffset];
|
845
767
|
for (entry = 0; parentBetaList[entry] != 0; ++entry) {
|
846
768
|
if (entry == BETA_LIST_LENGTH) {
|
@@ -849,12 +771,10 @@ static unsigned int linkAlpha(ruleset *tree,
|
|
849
771
|
}
|
850
772
|
|
851
773
|
parentBetaList[entry] = nextOffset;
|
852
|
-
} else if (nextNode->value.a.operator == OP_NEX) {
|
853
|
-
|
854
|
-
|
855
|
-
|
856
|
-
}
|
857
|
-
|
774
|
+
} else if (nextNode->value.a.expression.operator == OP_NEX) {
|
775
|
+
CHECK_RESULT(ensureNextList(tree,
|
776
|
+
parentAlpha));
|
777
|
+
|
858
778
|
unsigned int *parentNextList = &tree->nextPool[parentAlpha->value.a.nextListOffset];
|
859
779
|
unsigned int entry;
|
860
780
|
for (entry = 0; parentNextList[entry] != 0; ++entry) {
|
@@ -865,13 +785,11 @@ static unsigned int linkAlpha(ruleset *tree,
|
|
865
785
|
|
866
786
|
parentNextList[entry] = nextOffset;
|
867
787
|
} else {
|
868
|
-
|
869
|
-
|
870
|
-
|
871
|
-
}
|
872
|
-
|
788
|
+
CHECK_RESULT(ensureNextHashset(tree,
|
789
|
+
parentAlpha));
|
790
|
+
|
873
791
|
unsigned int *parentNext = &tree->nextPool[parentAlpha->value.a.nextOffset];
|
874
|
-
unsigned int hash = nextNode->value.a.
|
792
|
+
unsigned int hash = nextNode->value.a.expression.left.value.id.propertyNameHash;
|
875
793
|
for (entry = hash & HASH_MASK; parentNext[entry] != 0; entry = (entry + 1) % NEXT_BUCKET_LENGTH) {
|
876
794
|
if ((entry + 1) % NEXT_BUCKET_LENGTH == (hash & HASH_MASK)) {
|
877
795
|
return ERR_RULE_LIMIT_EXCEEDED;
|
@@ -884,82 +802,37 @@ static unsigned int linkAlpha(ruleset *tree,
|
|
884
802
|
return RULES_OK;
|
885
803
|
}
|
886
804
|
|
887
|
-
static unsigned int
|
805
|
+
static unsigned int readIdentifier(ruleset *tree, char *rule, unsigned char *expressionType, identifier *id) {
|
888
806
|
char *first;
|
889
807
|
char *last;
|
890
|
-
unsigned char type;
|
891
808
|
unsigned int hash;
|
892
|
-
|
893
|
-
|
894
|
-
|
895
|
-
ref->idOffset = 0;
|
809
|
+
*expressionType = JSON_IDENTIFIER;
|
810
|
+
id->nameOffset = 0;
|
896
811
|
readNextName(rule, &first, &last, &hash);
|
897
|
-
|
898
|
-
|
899
|
-
|
900
|
-
|
901
|
-
|
902
|
-
|
903
|
-
|
904
|
-
|
905
|
-
|
906
|
-
|
907
|
-
|
908
|
-
|
909
|
-
|
910
|
-
|
911
|
-
|
912
|
-
|
913
|
-
|
914
|
-
|
915
|
-
|
916
|
-
|
917
|
-
result = storeString(tree, first, &ref->nameOffset, last - first);
|
918
|
-
if (result != RULES_OK) {
|
919
|
-
return result;
|
920
|
-
}
|
921
|
-
} else {
|
922
|
-
readNextValue(last, &first, &last, &type);
|
923
|
-
result = readNextName(first, &first, &last, &hash);
|
924
|
-
while (result == PARSE_OK) {
|
925
|
-
switch (hash) {
|
926
|
-
case HASH_NAME:
|
927
|
-
readNextString(last, &first, &last, &hash);
|
928
|
-
ref->nameHash = hash;
|
929
|
-
result = storeString(tree, first, &ref->nameOffset, last - first);
|
930
|
-
if (result != RULES_OK) {
|
931
|
-
return result;
|
932
|
-
}
|
933
|
-
break;
|
934
|
-
case HASH_ID:
|
935
|
-
readNextValue(last, &first, &last, &type);
|
936
|
-
if (type == JSON_STRING) {
|
937
|
-
result = storeString(tree, first, &ref->idOffset, last - first);
|
938
|
-
if (result != RULES_OK) {
|
939
|
-
return result;
|
940
|
-
}
|
941
|
-
} else{
|
942
|
-
result = storeString(tree, first, &ref->idOffset, last - first + 1);
|
943
|
-
if (result != RULES_OK) {
|
944
|
-
return result;
|
945
|
-
}
|
946
|
-
}
|
947
|
-
|
948
|
-
break;
|
949
|
-
default:
|
950
|
-
readNextValue(last, &first, &last, &type);
|
951
|
-
break;
|
952
|
-
}
|
953
|
-
|
954
|
-
result = readNextName(last, &first, &last, &hash);
|
955
|
-
}
|
956
|
-
}
|
957
|
-
}
|
958
|
-
|
812
|
+
id->nameHash = hash;
|
813
|
+
CHECK_RESULT(storeString(tree,
|
814
|
+
first,
|
815
|
+
&id->nameOffset,
|
816
|
+
last - first));
|
817
|
+
|
818
|
+
if (hash == HASH_M) {
|
819
|
+
*expressionType = JSON_MESSAGE_IDENTIFIER;
|
820
|
+
}
|
821
|
+
|
822
|
+
CHECK_PARSE_RESULT(readNextString(last,
|
823
|
+
&first,
|
824
|
+
&last,
|
825
|
+
&hash));
|
826
|
+
id->propertyNameHash = hash;
|
827
|
+
CHECK_RESULT(storeString(tree,
|
828
|
+
first,
|
829
|
+
&id->propertyNameOffset,
|
830
|
+
last - first));
|
831
|
+
|
959
832
|
return RULES_OK;
|
960
833
|
}
|
961
834
|
|
962
|
-
static unsigned int
|
835
|
+
static unsigned int readExpression(ruleset *tree, char *rule, unsigned char *expressionType, unsigned int *expressionOffset, identifier *id) {
|
963
836
|
char *first;
|
964
837
|
char *last;
|
965
838
|
unsigned char type = 0;
|
@@ -967,7 +840,10 @@ static unsigned int readIdiom(ruleset *tree, char *rule, unsigned char *idiomTyp
|
|
967
840
|
unsigned int hash;
|
968
841
|
unsigned int result;
|
969
842
|
|
970
|
-
readNextName(rule,
|
843
|
+
CHECK_PARSE_RESULT(readNextName(rule,
|
844
|
+
&first,
|
845
|
+
&last,
|
846
|
+
&hash));
|
971
847
|
switch (hash) {
|
972
848
|
case HASH_ADD:
|
973
849
|
operator = OP_ADD;
|
@@ -984,48 +860,55 @@ static unsigned int readIdiom(ruleset *tree, char *rule, unsigned char *idiomTyp
|
|
984
860
|
}
|
985
861
|
|
986
862
|
if (operator == OP_NOP) {
|
987
|
-
|
988
|
-
|
989
|
-
|
990
|
-
|
863
|
+
CHECK_RESULT(readIdentifier(tree,
|
864
|
+
rule,
|
865
|
+
expressionType,
|
866
|
+
id));
|
991
867
|
} else {
|
992
|
-
|
993
|
-
|
994
|
-
|
995
|
-
|
996
|
-
|
868
|
+
expression *newExpression = NULL;
|
869
|
+
CHECK_RESULT(storeExpression(tree,
|
870
|
+
&newExpression,
|
871
|
+
expressionOffset));
|
872
|
+
|
873
|
+
*expressionType = JSON_EXPRESSION;
|
874
|
+
newExpression->operator = operator;
|
875
|
+
CHECK_PARSE_RESULT(readNextValue(last,
|
876
|
+
&first,
|
877
|
+
&last,
|
878
|
+
&type));
|
997
879
|
|
998
|
-
*idiomType = JSON_STATE_IDIOM;
|
999
|
-
newIdiom->operator = operator;
|
1000
|
-
readNextValue(last, &first, &last, &type);
|
1001
880
|
result = readNextName(first, &first, &last, &hash);
|
1002
881
|
while (result == PARSE_OK) {
|
1003
|
-
unsigned int
|
1004
|
-
|
1005
|
-
readNextValue(last,
|
882
|
+
unsigned int newExpressionOffset = 0;
|
883
|
+
identifier newRef;
|
884
|
+
CHECK_PARSE_RESULT(readNextValue(last,
|
885
|
+
&first,
|
886
|
+
&last,
|
887
|
+
&type));
|
1006
888
|
if (type == JSON_OBJECT) {
|
1007
|
-
|
1008
|
-
|
1009
|
-
|
1010
|
-
|
889
|
+
CHECK_RESULT(readExpression(tree,
|
890
|
+
first,
|
891
|
+
&type,
|
892
|
+
&newExpressionOffset,
|
893
|
+
&newRef));
|
1011
894
|
}
|
1012
895
|
|
1013
|
-
if (type ==
|
1014
|
-
*
|
896
|
+
if (type == JSON_IDENTIFIER || type == JSON_EXPRESSION) {
|
897
|
+
*expressionType = JSON_EXPRESSION;
|
1015
898
|
}
|
1016
899
|
|
1017
|
-
if (*
|
1018
|
-
*
|
900
|
+
if (*expressionType != JSON_EXPRESSION && (type == JSON_MESSAGE_IDENTIFIER || type == JSON_MESSAGE_EXPRESSION)) {
|
901
|
+
*expressionType = JSON_MESSAGE_EXPRESSION;
|
1019
902
|
}
|
1020
903
|
|
1021
|
-
//
|
1022
|
-
|
904
|
+
// newExpression address might have changed after readExpression
|
905
|
+
newExpression = &tree->expressionPool[*expressionOffset];
|
1023
906
|
switch (hash) {
|
1024
907
|
case HASH_L:
|
1025
|
-
copyValue(tree, &
|
908
|
+
copyValue(tree, &newExpression->left, first, last, newExpressionOffset, &newRef, type);
|
1026
909
|
break;
|
1027
910
|
case HASH_R:
|
1028
|
-
copyValue(tree, &
|
911
|
+
copyValue(tree, &newExpression->right, first, last, newExpressionOffset, &newRef, type);
|
1029
912
|
break;
|
1030
913
|
}
|
1031
914
|
|
@@ -1040,7 +923,7 @@ static unsigned int findAlpha(ruleset *tree,
|
|
1040
923
|
unsigned int parentOffset,
|
1041
924
|
unsigned char operator,
|
1042
925
|
char *rule,
|
1043
|
-
|
926
|
+
unsigned int betaOffset,
|
1044
927
|
unsigned int *resultOffset) {
|
1045
928
|
char *first;
|
1046
929
|
char *last;
|
@@ -1049,17 +932,25 @@ static unsigned int findAlpha(ruleset *tree,
|
|
1049
932
|
unsigned char type;
|
1050
933
|
unsigned int entry;
|
1051
934
|
unsigned int hash;
|
1052
|
-
unsigned int
|
1053
|
-
|
1054
|
-
reference ref;
|
935
|
+
unsigned int expressionOffset;
|
936
|
+
identifier id;
|
1055
937
|
|
1056
|
-
readNextName(rule,
|
1057
|
-
|
938
|
+
CHECK_PARSE_RESULT(readNextName(rule,
|
939
|
+
&firstName,
|
940
|
+
&lastName,
|
941
|
+
&hash));
|
942
|
+
|
943
|
+
CHECK_PARSE_RESULT(readNextValue(lastName,
|
944
|
+
&first,
|
945
|
+
&last,
|
946
|
+
&type));
|
947
|
+
|
1058
948
|
if (type == JSON_OBJECT && operator != OP_IALL && operator != OP_IANY) {
|
1059
|
-
|
1060
|
-
|
1061
|
-
|
1062
|
-
|
949
|
+
CHECK_RESULT(readExpression(tree,
|
950
|
+
first,
|
951
|
+
&type,
|
952
|
+
&expressionOffset,
|
953
|
+
&id));
|
1063
954
|
}
|
1064
955
|
|
1065
956
|
node *parent = &tree->nodePool[parentOffset];
|
@@ -1068,10 +959,10 @@ static unsigned int findAlpha(ruleset *tree,
|
|
1068
959
|
parentNext = &tree->nextPool[parent->value.a.nextOffset];
|
1069
960
|
for (entry = hash & HASH_MASK; parentNext[entry] != 0; entry = (entry + 1) % NEXT_BUCKET_LENGTH) {
|
1070
961
|
node *currentNode = &tree->nodePool[parentNext[entry]];
|
1071
|
-
if (currentNode->value.a.
|
1072
|
-
currentNode->value.a.operator == operator) {
|
962
|
+
if (currentNode->value.a.expression.left.value.id.propertyNameHash == hash &&
|
963
|
+
currentNode->value.a.expression.operator == operator) {
|
1073
964
|
if (operator != OP_IALL && operator != OP_IANY) {
|
1074
|
-
if (compareValue(tree, ¤tNode->value.a.right, first, last, &
|
965
|
+
if (compareValue(tree, ¤tNode->value.a.expression.right, first, last, &id, type)) {
|
1075
966
|
*resultOffset = parentNext[entry];
|
1076
967
|
return RULES_OK;
|
1077
968
|
}
|
@@ -1084,10 +975,10 @@ static unsigned int findAlpha(ruleset *tree,
|
|
1084
975
|
parentNext = &tree->nextPool[parent->value.a.nextListOffset];
|
1085
976
|
for (entry = 0; parentNext[entry] != 0; ++entry) {
|
1086
977
|
node *currentNode = &tree->nodePool[parentNext[entry]];
|
1087
|
-
if (currentNode->value.a.
|
1088
|
-
currentNode->value.a.operator == operator) {
|
978
|
+
if (currentNode->value.a.expression.left.value.id.propertyNameHash == hash &&
|
979
|
+
currentNode->value.a.expression.operator == operator) {
|
1089
980
|
if (operator != OP_IALL && operator != OP_IANY) {
|
1090
|
-
if (compareValue(tree, ¤tNode->value.a.right, first, last, &
|
981
|
+
if (compareValue(tree, ¤tNode->value.a.expression.right, first, last, &id, type)) {
|
1091
982
|
*resultOffset = parentNext[entry];
|
1092
983
|
return RULES_OK;
|
1093
984
|
}
|
@@ -1097,21 +988,24 @@ static unsigned int findAlpha(ruleset *tree,
|
|
1097
988
|
}
|
1098
989
|
|
1099
990
|
unsigned int stringOffset;
|
1100
|
-
|
1101
|
-
|
1102
|
-
|
1103
|
-
|
1104
|
-
|
991
|
+
CHECK_RESULT(storeString(tree,
|
992
|
+
firstName,
|
993
|
+
&stringOffset,
|
994
|
+
lastName - firstName));
|
995
|
+
|
1105
996
|
node *newAlpha;
|
1106
|
-
|
1107
|
-
|
1108
|
-
|
1109
|
-
|
1110
|
-
|
997
|
+
CHECK_RESULT(storeAlpha(tree,
|
998
|
+
&newAlpha,
|
999
|
+
resultOffset));
|
1000
|
+
|
1111
1001
|
newAlpha->nameOffset = stringOffset;
|
1112
1002
|
newAlpha->type = NODE_ALPHA;
|
1113
|
-
newAlpha->value.a.
|
1114
|
-
newAlpha->value.a.
|
1003
|
+
newAlpha->value.a.expression.left.type = JSON_MESSAGE_IDENTIFIER;
|
1004
|
+
newAlpha->value.a.expression.left.value.id.propertyNameHash = hash;
|
1005
|
+
newAlpha->value.a.expression.left.value.id.propertyNameOffset = newAlpha->nameOffset;
|
1006
|
+
newAlpha->value.a.expression.left.value.id.nameOffset = 0;
|
1007
|
+
newAlpha->value.a.expression.left.value.id.nameHash = 0;
|
1008
|
+
newAlpha->value.a.expression.operator = operator;
|
1115
1009
|
if (operator == OP_MT) {
|
1116
1010
|
type = JSON_REGEX;
|
1117
1011
|
}
|
@@ -1120,34 +1014,44 @@ static unsigned int findAlpha(ruleset *tree,
|
|
1120
1014
|
type = JSON_IREGEX;
|
1121
1015
|
}
|
1122
1016
|
|
1123
|
-
if (operator == OP_IANY || operator == OP_IALL) {
|
1124
|
-
|
1125
|
-
} else {
|
1126
|
-
|
1127
|
-
|
1128
|
-
|
1129
|
-
|
1130
|
-
|
1131
|
-
|
1132
|
-
|
1133
|
-
|
1134
|
-
|
1135
|
-
|
1017
|
+
//if (operator == OP_IANY || operator == OP_IALL) {
|
1018
|
+
// newAlpha->value.a.expression.right.type = JSON_NIL;
|
1019
|
+
//} else {
|
1020
|
+
CHECK_RESULT(copyValue(tree,
|
1021
|
+
&newAlpha->value.a.expression.right,
|
1022
|
+
first,
|
1023
|
+
last,
|
1024
|
+
expressionOffset,
|
1025
|
+
&id,
|
1026
|
+
type));
|
1027
|
+
|
1028
|
+
if (type == JSON_IDENTIFIER || type == JSON_EXPRESSION) {
|
1029
|
+
expression *expr;
|
1030
|
+
GET_EXPRESSION(tree,
|
1031
|
+
betaOffset,
|
1032
|
+
expr);
|
1033
|
+
copyExpression(&newAlpha->value.a.expression, expr);
|
1136
1034
|
}
|
1137
|
-
}
|
1035
|
+
//}
|
1138
1036
|
|
1139
1037
|
return linkAlpha(tree, parentOffset, *resultOffset);
|
1140
1038
|
}
|
1141
1039
|
|
1142
|
-
static
|
1040
|
+
static unsigned int getSetting(unsigned int settingHash, char *rule, unsigned short *value) {
|
1143
1041
|
char *first;
|
1144
1042
|
char *last;
|
1145
1043
|
char temp;
|
1146
1044
|
unsigned int hash;
|
1147
1045
|
unsigned char type;
|
1148
|
-
unsigned int result = readNextName(rule,
|
1046
|
+
unsigned int result = readNextName(rule,
|
1047
|
+
&first,
|
1048
|
+
&last,
|
1049
|
+
&hash);
|
1149
1050
|
while (result == PARSE_OK) {
|
1150
|
-
readNextValue(last,
|
1051
|
+
CHECK_PARSE_RESULT(readNextValue(last,
|
1052
|
+
&first,
|
1053
|
+
&last,
|
1054
|
+
&type));
|
1151
1055
|
if (hash == settingHash) {
|
1152
1056
|
temp = first[last - first + 1];
|
1153
1057
|
first[last - first + 1] = '\0';
|
@@ -1155,29 +1059,37 @@ static void getSetting(unsigned int settingHash, char *rule, unsigned short *val
|
|
1155
1059
|
first[last - first + 1] = temp;
|
1156
1060
|
break;
|
1157
1061
|
}
|
1158
|
-
result = readNextName(last,
|
1062
|
+
result = readNextName(last,
|
1063
|
+
&first,
|
1064
|
+
&last,
|
1065
|
+
&hash);
|
1159
1066
|
}
|
1067
|
+
|
1068
|
+
return RULES_OK;
|
1160
1069
|
}
|
1161
1070
|
|
1162
1071
|
static unsigned int createForwardAlpha(ruleset *tree,
|
1163
1072
|
unsigned int *newOffset) {
|
1164
1073
|
node *newAlpha;
|
1165
|
-
|
1166
|
-
|
1167
|
-
|
1168
|
-
|
1169
|
-
|
1074
|
+
CHECK_RESULT(storeAlpha(tree,
|
1075
|
+
&newAlpha,
|
1076
|
+
newOffset));
|
1077
|
+
|
1170
1078
|
newAlpha->nameOffset = 0;
|
1171
1079
|
newAlpha->type = NODE_ALPHA;
|
1172
|
-
newAlpha->value.a.
|
1173
|
-
newAlpha->value.a.
|
1080
|
+
newAlpha->value.a.expression.left.type = JSON_MESSAGE_IDENTIFIER;
|
1081
|
+
newAlpha->value.a.expression.left.value.id.propertyNameOffset = 0;
|
1082
|
+
newAlpha->value.a.expression.left.value.id.propertyNameHash = HASH_FORWARD;
|
1083
|
+
newAlpha->value.a.expression.left.value.id.nameOffset = 0;
|
1084
|
+
newAlpha->value.a.expression.left.value.id.nameHash = 0;
|
1085
|
+
newAlpha->value.a.expression.operator = OP_NEX;
|
1174
1086
|
|
1175
1087
|
return RULES_OK;
|
1176
1088
|
}
|
1177
1089
|
|
1178
1090
|
static unsigned int createAlpha(ruleset *tree,
|
1179
1091
|
char *rule,
|
1180
|
-
|
1092
|
+
unsigned int betaOffset,
|
1181
1093
|
unsigned int nextOffset,
|
1182
1094
|
unsigned int *newOffset) {
|
1183
1095
|
char *first;
|
@@ -1187,7 +1099,10 @@ static unsigned int createAlpha(ruleset *tree,
|
|
1187
1099
|
unsigned int hash;
|
1188
1100
|
unsigned int result;
|
1189
1101
|
unsigned int parentOffset = *newOffset;
|
1190
|
-
readNextName(rule,
|
1102
|
+
CHECK_PARSE_RESULT(readNextName(rule,
|
1103
|
+
&first,
|
1104
|
+
&last,
|
1105
|
+
&hash));
|
1191
1106
|
switch (hash) {
|
1192
1107
|
case HASH_EQ:
|
1193
1108
|
operator = OP_EQ;
|
@@ -1226,71 +1141,83 @@ static unsigned int createAlpha(ruleset *tree,
|
|
1226
1141
|
operator = OP_LTE;
|
1227
1142
|
break;
|
1228
1143
|
case HASH_AND:
|
1229
|
-
|
1230
|
-
|
1231
|
-
|
1232
|
-
|
1144
|
+
APPEND_EXPRESSION(tree,
|
1145
|
+
betaOffset,
|
1146
|
+
OP_AND);
|
1147
|
+
|
1148
|
+
CHECK_PARSE_RESULT(readNextValue(last,
|
1149
|
+
&first,
|
1150
|
+
&last,
|
1151
|
+
&type));
|
1233
1152
|
|
1234
|
-
readNextValue(last, &first, &last, &type);
|
1235
1153
|
unsigned int previousOffset = 0;
|
1236
1154
|
unsigned int resultOffset = parentOffset;
|
1237
|
-
result = readNextArrayValue(first,
|
1155
|
+
result = readNextArrayValue(first,
|
1156
|
+
&first,
|
1157
|
+
&last,
|
1158
|
+
&type);
|
1238
1159
|
while (result == PARSE_OK) {
|
1239
|
-
|
1240
|
-
|
1241
|
-
|
1242
|
-
|
1243
|
-
|
1160
|
+
CHECK_RESULT(createAlpha(tree,
|
1161
|
+
first,
|
1162
|
+
betaOffset,
|
1163
|
+
0,
|
1164
|
+
&resultOffset));
|
1165
|
+
|
1244
1166
|
previousOffset = resultOffset;
|
1245
|
-
result = readNextArrayValue(last,
|
1167
|
+
result = readNextArrayValue(last,
|
1168
|
+
&first,
|
1169
|
+
&last,
|
1170
|
+
&type);
|
1246
1171
|
}
|
1247
1172
|
*newOffset = previousOffset;
|
1248
1173
|
|
1249
|
-
|
1250
|
-
|
1251
|
-
|
1252
|
-
}
|
1253
|
-
|
1174
|
+
APPEND_EXPRESSION(tree,
|
1175
|
+
betaOffset,
|
1176
|
+
OP_END);
|
1254
1177
|
if (nextOffset != 0) {
|
1255
|
-
return linkAlpha(tree,
|
1178
|
+
return linkAlpha(tree,
|
1179
|
+
previousOffset,
|
1180
|
+
nextOffset);
|
1256
1181
|
}
|
1257
1182
|
|
1258
1183
|
return RULES_OK;
|
1259
1184
|
case HASH_OR:
|
1260
|
-
|
1261
|
-
|
1262
|
-
|
1263
|
-
|
1264
|
-
|
1265
|
-
|
1266
|
-
|
1267
|
-
|
1268
|
-
}
|
1185
|
+
APPEND_EXPRESSION(tree, betaOffset, OP_OR);
|
1186
|
+
CHECK_RESULT(createForwardAlpha(tree,
|
1187
|
+
newOffset));
|
1188
|
+
|
1189
|
+
CHECK_PARSE_RESULT(readNextValue(last,
|
1190
|
+
&first,
|
1191
|
+
&last,
|
1192
|
+
&type));
|
1269
1193
|
|
1270
|
-
readNextValue(last, &first, &last, &type);
|
1271
1194
|
result = readNextArrayValue(first, &first, &last, &type);
|
1272
1195
|
while (result == PARSE_OK) {
|
1273
1196
|
unsigned int single_offset = parentOffset;
|
1274
|
-
|
1275
|
-
|
1276
|
-
|
1277
|
-
|
1278
|
-
|
1279
|
-
|
1280
|
-
|
1281
|
-
|
1282
|
-
|
1283
|
-
|
1284
|
-
|
1285
|
-
|
1286
|
-
|
1287
|
-
|
1288
|
-
|
1289
|
-
return result;
|
1197
|
+
CHECK_RESULT(createAlpha(tree,
|
1198
|
+
first,
|
1199
|
+
betaOffset,
|
1200
|
+
0,
|
1201
|
+
&single_offset));
|
1202
|
+
|
1203
|
+
CHECK_RESULT(linkAlpha(tree,
|
1204
|
+
single_offset,
|
1205
|
+
*newOffset));
|
1206
|
+
|
1207
|
+
|
1208
|
+
result = readNextArrayValue(last,
|
1209
|
+
&first,
|
1210
|
+
&last,
|
1211
|
+
&type);
|
1290
1212
|
}
|
1291
1213
|
|
1214
|
+
APPEND_EXPRESSION(tree,
|
1215
|
+
betaOffset,
|
1216
|
+
OP_END);
|
1292
1217
|
if (nextOffset != 0) {
|
1293
|
-
return linkAlpha(tree,
|
1218
|
+
return linkAlpha(tree,
|
1219
|
+
*newOffset,
|
1220
|
+
nextOffset);
|
1294
1221
|
}
|
1295
1222
|
|
1296
1223
|
return RULES_OK;
|
@@ -1300,81 +1227,106 @@ static unsigned int createAlpha(ruleset *tree,
|
|
1300
1227
|
operator = OP_EQ;
|
1301
1228
|
first = rule;
|
1302
1229
|
} else {
|
1303
|
-
readNextValue(last,
|
1230
|
+
CHECK_PARSE_RESULT(readNextValue(last,
|
1231
|
+
&first,
|
1232
|
+
&last,
|
1233
|
+
&type));
|
1304
1234
|
}
|
1305
1235
|
|
1306
1236
|
if (operator == OP_IANY || operator == OP_IALL) {
|
1307
|
-
|
1308
|
-
|
1309
|
-
|
1310
|
-
|
1311
|
-
|
1237
|
+
CHECK_RESULT(findAlpha(tree,
|
1238
|
+
parentOffset,
|
1239
|
+
operator,
|
1240
|
+
first,
|
1241
|
+
betaOffset,
|
1242
|
+
newOffset));
|
1243
|
+
|
1312
1244
|
unsigned int inner_offset = *newOffset;
|
1313
|
-
readNextName(first,
|
1314
|
-
|
1315
|
-
|
1316
|
-
|
1317
|
-
|
1318
|
-
|
1319
|
-
|
1245
|
+
CHECK_PARSE_RESULT(readNextName(first,
|
1246
|
+
&first,
|
1247
|
+
&last,
|
1248
|
+
&hash));
|
1249
|
+
|
1250
|
+
CHECK_PARSE_RESULT(readNextValue(last,
|
1251
|
+
&first,
|
1252
|
+
&last,
|
1253
|
+
&type));
|
1254
|
+
|
1255
|
+
CHECK_RESULT(createAlpha(tree,
|
1256
|
+
first,
|
1257
|
+
betaOffset,
|
1258
|
+
nextOffset,
|
1259
|
+
&inner_offset));
|
1260
|
+
|
1320
1261
|
node *newAlpha = &tree->nodePool[inner_offset];
|
1321
|
-
if (newAlpha->value.a.right.type !=
|
1322
|
-
return linkAlpha(tree,
|
1262
|
+
if (newAlpha->value.a.expression.right.type != JSON_IDENTIFIER && newAlpha->value.a.expression.right.type != JSON_EXPRESSION) {
|
1263
|
+
return linkAlpha(tree,
|
1264
|
+
*newOffset,
|
1265
|
+
nextOffset);
|
1323
1266
|
} else {
|
1324
1267
|
// Functions that can execute in client or backend should follow this pattern
|
1325
1268
|
node *oldAlpha = &tree->nodePool[*newOffset];
|
1326
|
-
|
1327
|
-
unsigned int
|
1328
|
-
|
1329
|
-
|
1330
|
-
|
1331
|
-
|
1269
|
+
expression *newExpression = NULL;
|
1270
|
+
unsigned int expressionOffset = 0;
|
1271
|
+
CHECK_RESULT(storeExpression(tree,
|
1272
|
+
&newExpression,
|
1273
|
+
&expressionOffset));
|
1274
|
+
|
1275
|
+
oldAlpha->value.a.expression.right.type = JSON_EXPRESSION;
|
1276
|
+
oldAlpha->value.a.expression.right.value.expressionOffset = expressionOffset;
|
1277
|
+
copyExpression(&newAlpha->value.a.expression, newExpression);
|
1332
1278
|
|
1333
|
-
|
1334
|
-
|
1279
|
+
expression *betaExpression;
|
1280
|
+
GET_EXPRESSION(tree,
|
1281
|
+
betaOffset,
|
1282
|
+
betaExpression);
|
1335
1283
|
|
1336
|
-
|
1337
|
-
newIdiom->right.type = newAlpha->value.a.right.type;
|
1338
|
-
if (newAlpha->value.a.right.type == JSON_EVENT_IDIOM) {
|
1339
|
-
newIdiom->right.value.idiomOffset = newAlpha->value.a.right.value.idiomOffset;
|
1340
|
-
} else {
|
1341
|
-
newIdiom->right.value.property.nameHash = newAlpha->value.a.right.value.property.nameHash;
|
1342
|
-
newIdiom->right.value.property.nameOffset = newAlpha->value.a.right.value.property.nameOffset;
|
1343
|
-
newIdiom->right.value.property.idOffset = newAlpha->value.a.right.value.property.idOffset;
|
1344
|
-
}
|
1345
|
-
newIdiom->left.type = JSON_EVENT_PROPERTY;
|
1346
|
-
newIdiom->left.value.property.nameHash = newAlpha->value.a.hash;
|
1347
|
-
newIdiom->left.value.property.nameOffset = newAlpha->nameOffset;
|
1348
|
-
newIdiom->left.value.property.idOffset = 0;
|
1284
|
+
copyExpression(newExpression, betaExpression);
|
1349
1285
|
|
1350
|
-
|
1351
|
-
|
1286
|
+
return linkAlpha(tree,
|
1287
|
+
*newOffset,
|
1288
|
+
nextOffset);
|
1352
1289
|
}
|
1353
1290
|
}
|
1354
1291
|
|
1355
1292
|
if (nextOffset == 0) {
|
1356
|
-
return findAlpha(tree,
|
1293
|
+
return findAlpha(tree,
|
1294
|
+
parentOffset,
|
1295
|
+
operator,
|
1296
|
+
first,
|
1297
|
+
betaOffset,
|
1298
|
+
newOffset);
|
1357
1299
|
} else {
|
1358
|
-
|
1359
|
-
|
1360
|
-
|
1361
|
-
|
1362
|
-
|
1363
|
-
|
1300
|
+
CHECK_RESULT(findAlpha(tree,
|
1301
|
+
parentOffset,
|
1302
|
+
operator,
|
1303
|
+
first,
|
1304
|
+
betaOffset,
|
1305
|
+
newOffset));
|
1306
|
+
|
1307
|
+
return linkAlpha(tree,
|
1308
|
+
*newOffset,
|
1309
|
+
nextOffset);
|
1364
1310
|
}
|
1365
1311
|
}
|
1366
1312
|
|
1367
|
-
static unsigned int
|
1368
|
-
|
1369
|
-
|
1370
|
-
|
1371
|
-
|
1313
|
+
static unsigned int createBeta(ruleset *tree,
|
1314
|
+
char *rule,
|
1315
|
+
unsigned char gateType,
|
1316
|
+
unsigned short distinct,
|
1317
|
+
unsigned int nextOffset) {
|
1372
1318
|
char *first;
|
1373
1319
|
char *last;
|
1374
1320
|
char *lastArrayValue;
|
1375
1321
|
unsigned int hash;
|
1322
|
+
unsigned int previousOffset = 0;
|
1376
1323
|
unsigned char type;
|
1377
|
-
unsigned
|
1324
|
+
unsigned char nextGateType = GATE_AND;
|
1325
|
+
|
1326
|
+
unsigned int result = readNextArrayValue(rule,
|
1327
|
+
&first,
|
1328
|
+
&lastArrayValue,
|
1329
|
+
&type);
|
1378
1330
|
while (result == PARSE_OK) {
|
1379
1331
|
readNextName(first, &first, &last, &hash);
|
1380
1332
|
unsigned int nameLength = last - first;
|
@@ -1384,6 +1336,7 @@ static unsigned int createBetaConnector(ruleset *tree,
|
|
1384
1336
|
operator = OP_ALL;
|
1385
1337
|
} else if (!strncmp("$any", last - 4, 4)) {
|
1386
1338
|
operator = OP_ANY;
|
1339
|
+
nextGateType = GATE_OR;
|
1387
1340
|
} else if (!strncmp("$not", last - 4, 4)) {
|
1388
1341
|
operator = OP_NOT;
|
1389
1342
|
}
|
@@ -1395,400 +1348,303 @@ static unsigned int createBetaConnector(ruleset *tree,
|
|
1395
1348
|
}
|
1396
1349
|
|
1397
1350
|
unsigned int stringOffset;
|
1398
|
-
|
1399
|
-
|
1400
|
-
|
1401
|
-
|
1402
|
-
|
1403
|
-
node *
|
1404
|
-
unsigned int
|
1405
|
-
|
1406
|
-
|
1407
|
-
|
1351
|
+
CHECK_RESULT(storeString(tree,
|
1352
|
+
first,
|
1353
|
+
&stringOffset,
|
1354
|
+
nameLength));
|
1355
|
+
|
1356
|
+
node *newBeta;
|
1357
|
+
unsigned int betaOffset;
|
1358
|
+
CHECK_RESULT(storeNode(tree,
|
1359
|
+
&newBeta,
|
1360
|
+
&betaOffset));
|
1361
|
+
|
1362
|
+
newBeta->nameOffset = stringOffset;
|
1363
|
+
newBeta->value.b.nextOffset = nextOffset;
|
1364
|
+
newBeta->value.b.aOffset = betaOffset;
|
1365
|
+
newBeta->value.b.bOffset = betaOffset;
|
1366
|
+
newBeta->value.b.gateType = gateType;
|
1367
|
+
newBeta->value.b.not = (operator == OP_NOT) ? 1: 0;
|
1368
|
+
newBeta->value.b.distinct = (distinct != 0) ? 1 : 0;
|
1369
|
+
newBeta->value.b.hash = hash;
|
1370
|
+
|
1371
|
+
if (operator != OP_ALL && operator != OP_ANY) {
|
1372
|
+
newBeta->value.b.index = tree->betaCount;
|
1373
|
+
++tree->betaCount;
|
1374
|
+
newBeta->type = NODE_BETA;
|
1375
|
+
} else {
|
1376
|
+
newBeta->value.b.index = tree->connectorCount;
|
1377
|
+
++tree->connectorCount;
|
1378
|
+
newBeta->type = NODE_CONNECTOR;
|
1408
1379
|
}
|
1409
1380
|
|
1410
|
-
|
1411
|
-
|
1412
|
-
|
1413
|
-
|
1414
|
-
|
1415
|
-
|
1416
|
-
|
1417
|
-
|
1418
|
-
betaPath->expressions = malloc(sizeof(expression));
|
1419
|
-
if (!betaPath->expressions) {
|
1420
|
-
return ERR_OUT_OF_MEMORY;
|
1421
|
-
}
|
1422
|
-
|
1423
|
-
expr = betaPath->expressions;
|
1424
|
-
}
|
1425
|
-
else {
|
1426
|
-
betaPath->expressionsLength = betaPath->expressionsLength + 1;
|
1427
|
-
betaPath->expressions = realloc(betaPath->expressions, betaPath->expressionsLength * sizeof(expression));
|
1428
|
-
if (!betaPath->expressions) {
|
1429
|
-
return ERR_OUT_OF_MEMORY;
|
1381
|
+
if (previousOffset == 0) {
|
1382
|
+
newBeta->value.b.isFirst = 1;
|
1383
|
+
} else {
|
1384
|
+
newBeta->value.b.isFirst = 0;
|
1385
|
+
tree->nodePool[previousOffset].value.b.nextOffset = betaOffset;
|
1386
|
+
if (newBeta->type == NODE_CONNECTOR) {
|
1387
|
+
// always set 'a' to previous beta in array
|
1388
|
+
newBeta->value.b.aOffset = previousOffset;
|
1430
1389
|
}
|
1390
|
+
}
|
1431
1391
|
|
1432
|
-
|
1392
|
+
if (tree->nodePool[nextOffset].type == NODE_CONNECTOR) {
|
1393
|
+
// always set 'b' to last beta in array
|
1394
|
+
tree->nodePool[nextOffset].value.b.bOffset = betaOffset;
|
1433
1395
|
}
|
1396
|
+
|
1397
|
+
previousOffset = betaOffset;
|
1434
1398
|
|
1435
|
-
|
1436
|
-
|
1437
|
-
|
1438
|
-
|
1439
|
-
expr->t.termsPointer = NULL;
|
1440
|
-
expr->distinct = (distinct != 0) ? 1 : 0;
|
1399
|
+
newBeta->value.b.expressionSequence.nameOffset = stringOffset;
|
1400
|
+
newBeta->value.b.expressionSequence.aliasOffset = stringOffset;
|
1401
|
+
newBeta->value.b.expressionSequence.not = (operator == OP_NOT) ? 1 : 0;
|
1402
|
+
newBeta->value.b.expressionSequence.length = 0;
|
1441
1403
|
if (operator == OP_NOP || operator == OP_NOT) {
|
1442
1404
|
unsigned int resultOffset = NODE_M_OFFSET;
|
1443
|
-
readNextValue(last,
|
1444
|
-
|
1405
|
+
CHECK_PARSE_RESULT(readNextValue(last,
|
1406
|
+
&first,
|
1407
|
+
&last,
|
1408
|
+
&type));
|
1409
|
+
CHECK_RESULT(createAlpha(tree,
|
1410
|
+
first,
|
1411
|
+
betaOffset,
|
1412
|
+
betaOffset,
|
1413
|
+
&resultOffset));
|
1414
|
+
|
1445
1415
|
}
|
1446
1416
|
else {
|
1447
|
-
readNextValue(last,
|
1448
|
-
|
1449
|
-
|
1417
|
+
CHECK_PARSE_RESULT(readNextValue(last,
|
1418
|
+
&first,
|
1419
|
+
&last,
|
1420
|
+
&type));
|
1450
1421
|
|
1451
|
-
|
1452
|
-
|
1422
|
+
CHECK_RESULT(createBeta(tree,
|
1423
|
+
first,
|
1424
|
+
nextGateType,
|
1425
|
+
distinct,
|
1426
|
+
betaOffset));
|
1453
1427
|
}
|
1454
1428
|
|
1455
|
-
result = readNextArrayValue(lastArrayValue,
|
1429
|
+
result = readNextArrayValue(lastArrayValue,
|
1430
|
+
&first,
|
1431
|
+
&lastArrayValue,
|
1432
|
+
&type);
|
1456
1433
|
}
|
1457
1434
|
|
1458
1435
|
return (result == PARSE_END ? RULES_OK: result);
|
1459
1436
|
}
|
1460
1437
|
|
1461
|
-
|
1462
|
-
char *rule,
|
1463
|
-
unsigned char operator,
|
1464
|
-
unsigned short distinct,
|
1465
|
-
unsigned int nextOffset,
|
1466
|
-
path *nextPath,
|
1467
|
-
path **outPath) {
|
1468
|
-
|
1469
|
-
path *betaPath = malloc(sizeof(path));
|
1470
|
-
if (!betaPath) {
|
1471
|
-
return ERR_OUT_OF_MEMORY;
|
1472
|
-
}
|
1438
|
+
#ifdef _PRINT
|
1473
1439
|
|
1474
|
-
|
1475
|
-
|
1476
|
-
|
1477
|
-
|
1478
|
-
|
1479
|
-
|
1480
|
-
|
1481
|
-
|
1482
|
-
|
1483
|
-
|
1484
|
-
|
1485
|
-
|
1440
|
+
static void printExpression(ruleset *tree, operand *newValue) {
|
1441
|
+
char *rightProperty;
|
1442
|
+
char *rightAlias;
|
1443
|
+
char *valueString;
|
1444
|
+
expression *newExpression;
|
1445
|
+
switch (newValue->type) {
|
1446
|
+
case JSON_IDENTIFIER:
|
1447
|
+
rightProperty = &tree->stringPool[newValue->value.id.propertyNameOffset];
|
1448
|
+
rightAlias = &tree->stringPool[newValue->value.id.nameOffset];
|
1449
|
+
printf("frame[\"%s\"][\"%s\"]", rightAlias, rightProperty);
|
1450
|
+
break;
|
1451
|
+
case JSON_MESSAGE_IDENTIFIER:
|
1452
|
+
rightProperty = &tree->stringPool[newValue->value.id.propertyNameOffset];
|
1453
|
+
printf("message[\"%s\"]", rightProperty);
|
1454
|
+
break;
|
1455
|
+
case JSON_MESSAGE_EXPRESSION:
|
1456
|
+
case JSON_EXPRESSION:
|
1457
|
+
newExpression = &tree->expressionPool[newValue->value.expressionOffset];
|
1458
|
+
printf("(");
|
1459
|
+
printExpression(tree, &newExpression->left);
|
1460
|
+
switch (newExpression->operator) {
|
1461
|
+
case OP_ADD:
|
1462
|
+
printf("+");
|
1463
|
+
break;
|
1464
|
+
case OP_SUB:
|
1465
|
+
printf("-");
|
1466
|
+
break;
|
1467
|
+
case OP_MUL:
|
1468
|
+
printf("*");
|
1469
|
+
break;
|
1470
|
+
case OP_DIV:
|
1471
|
+
printf("/");
|
1472
|
+
break;
|
1486
1473
|
}
|
1487
|
-
|
1488
|
-
|
1489
|
-
|
1490
|
-
|
1491
|
-
|
1492
|
-
|
1493
|
-
|
1474
|
+
printExpression(tree, &newExpression->right);
|
1475
|
+
printf(")");
|
1476
|
+
break;
|
1477
|
+
case JSON_STRING:
|
1478
|
+
valueString = &tree->stringPool[newValue->value.stringOffset];
|
1479
|
+
printf("%s", valueString);
|
1480
|
+
break;
|
1481
|
+
case JSON_INT:
|
1482
|
+
printf("%ld", newValue->value.i);
|
1483
|
+
break;
|
1484
|
+
case JSON_DOUBLE:
|
1485
|
+
printf("%g", newValue->value.d);
|
1486
|
+
break;
|
1487
|
+
case JSON_BOOL:
|
1488
|
+
if (newValue->value.b == 0) {
|
1489
|
+
printf("false");
|
1494
1490
|
}
|
1495
|
-
|
1496
|
-
|
1497
|
-
nextPath->parents[nextPath->parentsLength + i] = NULL;
|
1491
|
+
else {
|
1492
|
+
printf("true");
|
1498
1493
|
}
|
1499
|
-
|
1500
|
-
nextPath->parentsLength = nextPath->expressionsLength;
|
1501
|
-
nextPath->parents[nextPath->parentsLength - 1] = betaPath;
|
1502
|
-
}
|
1503
|
-
}
|
1504
|
-
|
1505
|
-
if (outPath) {
|
1506
|
-
*outPath = betaPath;
|
1507
|
-
}
|
1508
|
-
|
1509
|
-
return createBetaConnector(tree, rule, betaPath, distinct, nextOffset);
|
1510
|
-
}
|
1511
|
-
|
1512
|
-
static unsigned int add(any *right, any *left, any **result) {
|
1513
|
-
right->nodes = realloc(right->nodes, (right->nodesLength + left->nodesLength) * sizeof(all*));
|
1514
|
-
if (!right->nodes) {
|
1515
|
-
return ERR_OUT_OF_MEMORY;
|
1516
|
-
}
|
1517
|
-
for (unsigned int i = 0; i < left->nodesLength; ++i) {
|
1518
|
-
right->nodes[right->nodesLength + i] = left->nodes[i];
|
1494
|
+
break;
|
1519
1495
|
}
|
1520
|
-
right->nodesLength = right->nodesLength + left->nodesLength;
|
1521
|
-
free(left->nodes);
|
1522
|
-
free(left);
|
1523
|
-
*result = right;
|
1524
|
-
return RULES_OK;
|
1525
1496
|
}
|
1526
1497
|
|
1527
|
-
|
1528
|
-
|
1529
|
-
|
1530
|
-
|
1531
|
-
|
1532
|
-
|
1533
|
-
|
1534
|
-
|
1535
|
-
|
1536
|
-
|
1537
|
-
|
1538
|
-
|
1539
|
-
|
1540
|
-
|
1541
|
-
|
1542
|
-
|
1543
|
-
|
1544
|
-
|
1545
|
-
|
1546
|
-
|
1547
|
-
|
1548
|
-
|
1549
|
-
|
1550
|
-
|
1551
|
-
|
1552
|
-
|
1553
|
-
|
1554
|
-
|
1555
|
-
|
1556
|
-
|
1498
|
+
void printSimpleExpression(ruleset *tree, expression *currentExpression, unsigned char first, char *comp) {
|
1499
|
+
if (currentExpression->operator == OP_IALL || currentExpression->operator == OP_IANY) {
|
1500
|
+
char *leftProperty = &tree->stringPool[currentExpression->left.value.id.propertyNameOffset];
|
1501
|
+
printf("compare array: %s", leftProperty);
|
1502
|
+
} else {
|
1503
|
+
char *op = "";
|
1504
|
+
switch (currentExpression->operator) {
|
1505
|
+
case OP_LT:
|
1506
|
+
op = "<";
|
1507
|
+
break;
|
1508
|
+
case OP_LTE:
|
1509
|
+
op = "<=";
|
1510
|
+
break;
|
1511
|
+
case OP_GT:
|
1512
|
+
op = ">";
|
1513
|
+
break;
|
1514
|
+
case OP_GTE:
|
1515
|
+
op = ">=";
|
1516
|
+
break;
|
1517
|
+
case OP_EQ:
|
1518
|
+
op = "==";
|
1519
|
+
break;
|
1520
|
+
case OP_NEQ:
|
1521
|
+
op = "!=";
|
1522
|
+
break;
|
1523
|
+
case OP_NOP:
|
1524
|
+
case OP_NEX:
|
1525
|
+
case OP_EX:
|
1526
|
+
case OP_TYPE:
|
1527
|
+
case OP_MT:
|
1528
|
+
case OP_IMT:
|
1529
|
+
return;
|
1530
|
+
}
|
1531
|
+
|
1532
|
+
char *leftProperty = &tree->stringPool[currentExpression->left.value.id.propertyNameOffset];
|
1533
|
+
if (!first) {
|
1534
|
+
printf(" %s message[\"%s\"] %s ", comp, leftProperty, op);
|
1535
|
+
} else {
|
1536
|
+
printf("message[\"%s\"] %s ", leftProperty, op);
|
1557
1537
|
}
|
1558
1538
|
|
1559
|
-
|
1560
|
-
free(leftAll);
|
1561
|
-
}
|
1562
|
-
|
1563
|
-
for (unsigned int i = 0; i < right->nodesLength; ++i) {
|
1564
|
-
all *rightAll = right->nodes[i];
|
1565
|
-
free(rightAll->expressions);
|
1566
|
-
free(rightAll);
|
1539
|
+
printExpression(tree, ¤tExpression->right);
|
1567
1540
|
}
|
1568
1541
|
|
1569
|
-
free(right->nodes);
|
1570
|
-
free(right);
|
1571
|
-
free(left->nodes);
|
1572
|
-
free(left);
|
1573
|
-
*result = product;
|
1574
|
-
return RULES_OK;
|
1575
1542
|
}
|
1576
1543
|
|
1577
|
-
|
1578
|
-
|
1579
|
-
|
1580
|
-
any **resultAny) {
|
1581
|
-
any *newAny = malloc(sizeof(any));
|
1582
|
-
if (!newAny) {
|
1583
|
-
return ERR_OUT_OF_MEMORY;
|
1584
|
-
}
|
1585
|
-
|
1586
|
-
newAny->nodesLength = 1;
|
1587
|
-
newAny->nodes = malloc(sizeof(all*));
|
1588
|
-
if (!newAny->nodes) {
|
1589
|
-
return ERR_OUT_OF_MEMORY;
|
1590
|
-
}
|
1591
|
-
|
1592
|
-
newAny->nodes[0] = malloc(sizeof(all));
|
1593
|
-
if (!newAny->nodes[0]) {
|
1594
|
-
return ERR_OUT_OF_MEMORY;
|
1595
|
-
}
|
1596
|
-
|
1597
|
-
newAny->nodes[0]->expressionsLength = 1;
|
1598
|
-
newAny->nodes[0]->expressions = malloc(sizeof(unsigned int));
|
1599
|
-
if (!newAny->nodes[0]->expressions) {
|
1600
|
-
return ERR_OUT_OF_MEMORY;
|
1601
|
-
}
|
1602
|
-
|
1603
|
-
expression *newExpression;
|
1604
|
-
unsigned int result = storeExpression(tree, &newExpression, newAny->nodes[0]->expressions);
|
1605
|
-
if (result != RULES_OK) {
|
1606
|
-
return result;
|
1607
|
-
}
|
1608
|
-
|
1609
|
-
result = storeString(tree, name, &newExpression->nameOffset, strlen(name));
|
1610
|
-
if (result != RULES_OK) {
|
1611
|
-
return result;
|
1612
|
-
}
|
1613
|
-
|
1614
|
-
newExpression->aliasOffset = expr->aliasOffset;
|
1615
|
-
newExpression->termsLength = expr->termsLength;
|
1616
|
-
newExpression->not = expr->not;
|
1617
|
-
newExpression->distinct = expr->distinct;
|
1618
|
-
if (expr->termsLength) {
|
1619
|
-
result = allocateNext(tree, expr->termsLength, &newExpression->t.termsOffset);
|
1620
|
-
if (result != RULES_OK) {
|
1621
|
-
return result;
|
1622
|
-
}
|
1623
|
-
|
1624
|
-
for (unsigned short i = 0; i < expr->termsLength; ++i) {
|
1625
|
-
tree->nextPool[newExpression->t.termsOffset + i] = expr->t.termsPointer[i];
|
1626
|
-
}
|
1627
|
-
|
1628
|
-
free(expr->t.termsPointer);
|
1544
|
+
void printExpressionSequence(ruleset *tree, expressionSequence *exprs, int level) {
|
1545
|
+
for (int i = 0; i < level; ++ i) {
|
1546
|
+
printf(" ");
|
1629
1547
|
}
|
1630
1548
|
|
1631
|
-
*
|
1632
|
-
|
1633
|
-
|
1634
|
-
|
1635
|
-
|
1636
|
-
|
1637
|
-
|
1638
|
-
|
1639
|
-
|
1640
|
-
|
1641
|
-
|
1642
|
-
expression *expr = &betaPath->expressions[i];
|
1643
|
-
if (betaPath->operator == OP_NOP) {
|
1644
|
-
result = createSingleQuery(tree, postfix, expr, anyResult);
|
1645
|
-
if (result != RULES_OK) {
|
1646
|
-
return result;
|
1647
|
-
}
|
1648
|
-
|
1649
|
-
free(betaPath->expressions);
|
1650
|
-
free(betaPath);
|
1651
|
-
return RULES_OK;
|
1652
|
-
}
|
1653
|
-
|
1654
|
-
char *name = &tree->stringPool[expr->nameOffset];
|
1655
|
-
int nameLength = strlen(name);
|
1656
|
-
#ifdef _WIN32
|
1657
|
-
char *nextPostfix = (char *)_alloca(sizeof(char)*(strlen(postfix) + nameLength + 2));
|
1658
|
-
#else
|
1659
|
-
char nextPostfix[strlen(postfix) + nameLength + 2];
|
1660
|
-
#endif
|
1661
|
-
strcpy(nextPostfix, name);
|
1662
|
-
nextPostfix[nameLength] = '!';
|
1663
|
-
strcpy(&nextPostfix[nameLength + 1], postfix);
|
1664
|
-
|
1665
|
-
any *newAny = NULL;
|
1666
|
-
if (i >= betaPath->parentsLength || !betaPath->parents[i]) {
|
1667
|
-
result = createSingleQuery(tree, nextPostfix, expr, &newAny);
|
1668
|
-
if (result != RULES_OK) {
|
1669
|
-
return result;
|
1670
|
-
}
|
1671
|
-
}
|
1672
|
-
else {
|
1673
|
-
result = createQueries(tree, nextPostfix, betaPath->parents[i], &newAny);
|
1674
|
-
if (result != RULES_OK) {
|
1675
|
-
return result;
|
1549
|
+
char *comp = NULL;
|
1550
|
+
char *compStack[32];
|
1551
|
+
unsigned char compTop = 0;
|
1552
|
+
unsigned char first = 1;
|
1553
|
+
for (unsigned short i = 0; i < exprs->length; ++i) {
|
1554
|
+
expression *currentExpression = &exprs->expressions[i];
|
1555
|
+
if (currentExpression->operator == OP_AND || currentExpression->operator == OP_OR) {
|
1556
|
+
if (first) {
|
1557
|
+
printf("(");
|
1558
|
+
} else {
|
1559
|
+
printf("%s (", comp);
|
1676
1560
|
}
|
1677
|
-
|
1561
|
+
|
1562
|
+
compStack[compTop] = comp;
|
1563
|
+
++compTop;
|
1564
|
+
first = 1;
|
1678
1565
|
|
1679
|
-
|
1680
|
-
|
1681
|
-
|
1682
|
-
|
1683
|
-
result = add(currentAny, newAny, ¤tAny);
|
1684
|
-
if (result != RULES_OK) {
|
1685
|
-
return result;
|
1686
|
-
}
|
1687
|
-
}
|
1688
|
-
else if (betaPath->operator == OP_ALL) {
|
1689
|
-
result = multiply(tree, currentAny, newAny, ¤tAny);
|
1690
|
-
if (result != RULES_OK) {
|
1691
|
-
return result;
|
1566
|
+
if (currentExpression->operator == OP_AND) {
|
1567
|
+
comp = "and";
|
1568
|
+
} else {
|
1569
|
+
comp = "or";
|
1692
1570
|
}
|
1571
|
+
|
1572
|
+
} else if (currentExpression->operator == OP_END) {
|
1573
|
+
--compTop;
|
1574
|
+
comp = compStack[compTop];
|
1575
|
+
printf(")");
|
1576
|
+
} else {
|
1577
|
+
printSimpleExpression(tree, currentExpression, first, comp);
|
1578
|
+
first = 0;
|
1693
1579
|
}
|
1694
1580
|
}
|
1695
|
-
|
1696
|
-
free(betaPath->expressions);
|
1697
|
-
free(betaPath->parents);
|
1698
|
-
free(betaPath);
|
1699
|
-
*anyResult = currentAny;
|
1700
|
-
return RULES_OK;
|
1701
|
-
}
|
1702
|
-
|
1703
|
-
static unsigned int fixupQueries(ruleset *tree, unsigned int actionOffset, char* postfix, path *betaPath) {
|
1704
|
-
node *actionNode = &tree->nodePool[actionOffset];
|
1705
|
-
#ifdef _WIN32
|
1706
|
-
char *copyPostfix = (char *)_alloca(sizeof(char)*(strlen(postfix) + 1));
|
1707
|
-
#else
|
1708
|
-
char copyPostfix[strlen(postfix) + 1];
|
1709
|
-
#endif
|
1710
|
-
|
1711
|
-
strcpy(copyPostfix, postfix);
|
1712
|
-
|
1713
|
-
any *query;
|
1714
|
-
unsigned int result = createQueries(tree, copyPostfix, betaPath, &query);
|
1715
|
-
if (result != RULES_OK) {
|
1716
|
-
return result;
|
1717
|
-
}
|
1718
|
-
|
1719
|
-
actionNode->value.c.joinsLength = query->nodesLength;
|
1720
|
-
result = allocateNext(tree, query->nodesLength, &actionNode->value.c.joinsOffset);
|
1721
|
-
if (result != RULES_OK) {
|
1722
|
-
return result;
|
1723
|
-
}
|
1724
|
-
|
1725
|
-
for (unsigned int i = 0; i < query->nodesLength; ++i) {
|
1726
|
-
all *currentAll = query->nodes[i];
|
1727
|
-
|
1728
|
-
join *newJoin;
|
1729
|
-
result = storeJoin(tree, &newJoin, &tree->nextPool[actionNode->value.c.joinsOffset + i]);
|
1730
|
-
if (result != RULES_OK) {
|
1731
|
-
return result;
|
1732
|
-
}
|
1733
|
-
|
1734
|
-
newJoin->expressionsLength = currentAll->expressionsLength;
|
1735
|
-
result = allocateNext(tree, currentAll->expressionsLength, &newJoin->expressionsOffset);
|
1736
|
-
if (result != RULES_OK) {
|
1737
|
-
return result;
|
1738
|
-
}
|
1739
|
-
|
1740
|
-
for (unsigned int ii = 0; ii < currentAll->expressionsLength; ++ii) {
|
1741
|
-
tree->nextPool[newJoin->expressionsOffset + ii] = currentAll->expressions[ii];
|
1742
|
-
}
|
1743
|
-
|
1744
|
-
free(currentAll->expressions);
|
1745
|
-
free(currentAll);
|
1746
|
-
}
|
1747
|
-
|
1748
|
-
free(query->nodes);
|
1749
|
-
free(query);
|
1750
|
-
return RULES_OK;
|
1581
|
+
printf("\n");
|
1751
1582
|
}
|
1752
1583
|
|
1753
|
-
|
1754
|
-
|
1755
|
-
static void printActionNode(ruleset *tree, node *actionNode, int level) {
|
1584
|
+
static void printActionNode(ruleset *tree, node *actionNode, int level, unsigned int offset) {
|
1756
1585
|
for (int i = 0; i < level; ++ i) {
|
1757
1586
|
printf(" ");
|
1758
1587
|
}
|
1759
1588
|
|
1760
|
-
printf("-> action: name %s, count %d, cap %d, priority %d\n",
|
1589
|
+
printf("-> action: name %s, count %d, cap %d, priority %d, index %d, offset %u\n",
|
1761
1590
|
&tree->stringPool[actionNode->nameOffset],
|
1762
1591
|
actionNode->value.c.count,
|
1763
1592
|
actionNode->value.c.cap,
|
1764
|
-
actionNode->value.c.priority
|
1593
|
+
actionNode->value.c.priority,
|
1594
|
+
actionNode->value.c.index,
|
1595
|
+
offset);
|
1765
1596
|
}
|
1766
1597
|
|
1767
|
-
static void printBetaNode(ruleset *tree, node *betaNode, int level) {
|
1598
|
+
static void printBetaNode(ruleset *tree, node *betaNode, int level, unsigned int offset) {
|
1768
1599
|
for (int i = 0; i < level; ++ i) {
|
1769
1600
|
printf(" ");
|
1770
1601
|
}
|
1771
1602
|
|
1772
|
-
|
1603
|
+
if (betaNode->type == NODE_BETA) {
|
1604
|
+
printf("-> beta: ");
|
1605
|
+
} else {
|
1606
|
+
printf("-> connector: ");
|
1607
|
+
}
|
1608
|
+
printf("name %s, isFirst %d, not %d, distinct %d, gate %d, index %d, a %d, b %d, offset %u\n",
|
1609
|
+
&tree->stringPool[betaNode->nameOffset],
|
1610
|
+
betaNode->value.b.isFirst,
|
1611
|
+
betaNode->value.b.not,
|
1612
|
+
betaNode->value.b.distinct,
|
1613
|
+
betaNode->value.b.gateType,
|
1614
|
+
betaNode->value.b.index,
|
1615
|
+
betaNode->value.b.aOffset,
|
1616
|
+
betaNode->value.b.bOffset,
|
1617
|
+
offset);
|
1618
|
+
if (betaNode->value.b.expressionSequence.length != 0) {
|
1619
|
+
printExpressionSequence(tree, &betaNode->value.b.expressionSequence, level);
|
1620
|
+
}
|
1773
1621
|
node *currentNode = &tree->nodePool[betaNode->value.b.nextOffset];
|
1774
1622
|
if (currentNode->type == NODE_ACTION) {
|
1775
|
-
printActionNode(tree, currentNode, level + 1);
|
1623
|
+
printActionNode(tree, currentNode, level + 1, betaNode->value.b.nextOffset);
|
1776
1624
|
} else {
|
1777
|
-
printBetaNode(tree, currentNode, level + 1);
|
1625
|
+
printBetaNode(tree, currentNode, level + 1, betaNode->value.b.nextOffset);
|
1778
1626
|
}
|
1779
1627
|
}
|
1780
1628
|
|
1781
|
-
static void printAlphaNode(ruleset *tree, node *alphaNode, int level) {
|
1629
|
+
static void printAlphaNode(ruleset *tree, node *alphaNode, int level, unsigned int offset) {
|
1782
1630
|
for (int i = 0; i < level; ++ i) {
|
1783
1631
|
printf(" ");
|
1784
1632
|
}
|
1785
1633
|
|
1786
|
-
printf("-> alpha: name %s,
|
1634
|
+
printf("-> alpha: name %s, offset %u\n", &tree->stringPool[alphaNode->nameOffset], offset);
|
1635
|
+
|
1636
|
+
for (int i = 0; i < level; ++ i) {
|
1637
|
+
printf(" ");
|
1638
|
+
}
|
1639
|
+
|
1640
|
+
printSimpleExpression(tree, &alphaNode->value.a.expression, 1, NULL);
|
1641
|
+
|
1642
|
+
printf("\n");
|
1787
1643
|
if (alphaNode->value.a.nextOffset) {
|
1788
1644
|
unsigned int *nextHashset = &tree->nextPool[alphaNode->value.a.nextOffset];
|
1789
1645
|
for (unsigned int entry = 0; entry < NEXT_BUCKET_LENGTH; ++entry) {
|
1790
1646
|
if (nextHashset[entry]) {
|
1791
|
-
printAlphaNode(tree, &tree->nodePool[nextHashset[entry]], level + 1);
|
1647
|
+
printAlphaNode(tree, &tree->nodePool[nextHashset[entry]], level + 1, nextHashset[entry]);
|
1792
1648
|
}
|
1793
1649
|
}
|
1794
1650
|
}
|
@@ -1796,14 +1652,14 @@ static void printAlphaNode(ruleset *tree, node *alphaNode, int level) {
|
|
1796
1652
|
if (alphaNode->value.a.nextListOffset) {
|
1797
1653
|
unsigned int *nextList = &tree->nextPool[alphaNode->value.a.nextListOffset];
|
1798
1654
|
for (unsigned int entry = 0; nextList[entry] != 0; ++entry) {
|
1799
|
-
printAlphaNode(tree, &tree->nodePool[nextList[entry]], level + 1);
|
1655
|
+
printAlphaNode(tree, &tree->nodePool[nextList[entry]], level + 1, nextList[entry]);
|
1800
1656
|
}
|
1801
1657
|
}
|
1802
1658
|
|
1803
1659
|
if (alphaNode->value.a.betaListOffset) {
|
1804
1660
|
unsigned int *betaList = &tree->nextPool[alphaNode->value.a.betaListOffset];
|
1805
1661
|
for (unsigned int entry = 0; betaList[entry] != 0; ++entry) {
|
1806
|
-
printBetaNode(tree, &tree->nodePool[betaList[entry]], level + 1);
|
1662
|
+
printBetaNode(tree, &tree->nodePool[betaList[entry]], level + 1, betaList[entry]);
|
1807
1663
|
}
|
1808
1664
|
}
|
1809
1665
|
}
|
@@ -1818,89 +1674,125 @@ static unsigned int createTree(ruleset *tree, char *rules) {
|
|
1818
1674
|
char *lastName;
|
1819
1675
|
unsigned char type;
|
1820
1676
|
unsigned int hash;
|
1821
|
-
unsigned int result = readNextName(rules,
|
1677
|
+
unsigned int result = readNextName(rules,
|
1678
|
+
&firstName,
|
1679
|
+
&lastName,
|
1680
|
+
&hash);
|
1681
|
+
unsigned int ruleActions[MAX_ACTIONS];
|
1822
1682
|
while (result == PARSE_OK) {
|
1823
|
-
path *betaPath = NULL;
|
1824
1683
|
node *ruleAction;
|
1825
1684
|
unsigned int actionOffset;
|
1826
|
-
|
1827
|
-
|
1828
|
-
|
1829
|
-
}
|
1685
|
+
CHECK_RESULT(storeNode(tree,
|
1686
|
+
&ruleAction,
|
1687
|
+
&actionOffset));
|
1830
1688
|
|
1689
|
+
if (tree->actionCount == MAX_ACTIONS) {
|
1690
|
+
return ERR_RULE_LIMIT_EXCEEDED;
|
1691
|
+
}
|
1692
|
+
|
1831
1693
|
ruleAction->value.c.index = tree->actionCount;
|
1694
|
+
ruleActions[tree->actionCount] = actionOffset;
|
1832
1695
|
++tree->actionCount;
|
1833
1696
|
ruleAction->type = NODE_ACTION;
|
1834
|
-
|
1697
|
+
|
1835
1698
|
// tree->stringPool can change after storing strings
|
1836
1699
|
// need to resolve namespace every time it is used.
|
1837
|
-
|
1838
|
-
|
1839
|
-
|
1840
|
-
|
1841
|
-
#else
|
1842
|
-
char runtimeActionName[namespaceLength + lastName - firstName + 2];
|
1843
|
-
#endif
|
1700
|
+
CHECK_RESULT(storeString(tree,
|
1701
|
+
firstName,
|
1702
|
+
&ruleAction->nameOffset,
|
1703
|
+
lastName - firstName));
|
1844
1704
|
|
1845
|
-
|
1846
|
-
|
1847
|
-
|
1848
|
-
|
1849
|
-
result = storeString(tree, runtimeActionName, &ruleAction->nameOffset, namespaceLength + lastName - firstName + 1);
|
1850
|
-
if (result != RULES_OK) {
|
1851
|
-
return result;
|
1852
|
-
}
|
1853
|
-
|
1854
|
-
readNextValue(lastName, &first, &lastRuleValue, &type);
|
1705
|
+
CHECK_PARSE_RESULT(readNextValue(lastName,
|
1706
|
+
&first,
|
1707
|
+
&lastRuleValue,
|
1708
|
+
&type));
|
1855
1709
|
ruleAction->value.c.priority = 0;
|
1856
1710
|
ruleAction->value.c.count = 0;
|
1857
1711
|
ruleAction->value.c.cap = 0;
|
1858
|
-
getSetting(HASH_PRI,
|
1859
|
-
|
1860
|
-
|
1712
|
+
CHECK_RESULT(getSetting(HASH_PRI,
|
1713
|
+
first,
|
1714
|
+
&ruleAction->value.c.priority));
|
1715
|
+
|
1716
|
+
CHECK_RESULT(getSetting(HASH_COUNT,
|
1717
|
+
first,
|
1718
|
+
&ruleAction->value.c.count));
|
1719
|
+
|
1720
|
+
CHECK_RESULT(getSetting(HASH_CAP,
|
1721
|
+
first,
|
1722
|
+
&ruleAction->value.c.cap));
|
1723
|
+
|
1861
1724
|
if (!ruleAction->value.c.count && !ruleAction->value.c.cap) {
|
1862
1725
|
ruleAction->value.c.count = 1;
|
1863
1726
|
}
|
1864
1727
|
|
1728
|
+
//Ensure action index is assigned based on priority
|
1729
|
+
unsigned int currentIndex = ruleAction->value.c.index;
|
1730
|
+
while (currentIndex) {
|
1731
|
+
node *currentAction = &tree->nodePool[ruleActions[currentIndex]];
|
1732
|
+
node *previousAction = &tree->nodePool[ruleActions[currentIndex - 1]];
|
1733
|
+
if (currentAction->value.c.priority >= previousAction->value.c.priority) {
|
1734
|
+
break;
|
1735
|
+
} else {
|
1736
|
+
unsigned int tempAction = ruleActions[currentIndex];
|
1737
|
+
ruleActions[currentIndex] = ruleActions[currentIndex - 1];
|
1738
|
+
previousAction->value.c.index = currentIndex;
|
1739
|
+
|
1740
|
+
--currentIndex;
|
1741
|
+
|
1742
|
+
ruleActions[currentIndex] = tempAction;
|
1743
|
+
currentAction->value.c.index = currentIndex;
|
1744
|
+
}
|
1745
|
+
}
|
1746
|
+
|
1865
1747
|
unsigned short distinct = 1;
|
1866
|
-
getSetting(HASH_DIST,
|
1867
|
-
|
1748
|
+
CHECK_RESULT(getSetting(HASH_DIST,
|
1749
|
+
first,
|
1750
|
+
&distinct));
|
1751
|
+
|
1752
|
+
result = readNextName(first,
|
1753
|
+
&first,
|
1754
|
+
&last,
|
1755
|
+
&hash);
|
1868
1756
|
while (result == PARSE_OK) {
|
1869
|
-
readNextValue(last,
|
1870
|
-
|
1871
|
-
|
1872
|
-
|
1873
|
-
|
1874
|
-
|
1875
|
-
|
1876
|
-
|
1877
|
-
|
1878
|
-
|
1879
|
-
return result;
|
1757
|
+
CHECK_PARSE_RESULT(readNextValue(last,
|
1758
|
+
&first,
|
1759
|
+
&last,
|
1760
|
+
&type));
|
1761
|
+
if (hash == HASH_ANY || hash == HASH_ALL) {
|
1762
|
+
CHECK_RESULT(createBeta(tree,
|
1763
|
+
first,
|
1764
|
+
(hash == HASH_ALL) ? GATE_AND : GATE_OR,
|
1765
|
+
distinct,
|
1766
|
+
actionOffset));
|
1880
1767
|
}
|
1881
1768
|
|
1882
|
-
result = readNextName(last,
|
1769
|
+
result = readNextName(last,
|
1770
|
+
&first,
|
1771
|
+
&last,
|
1772
|
+
&hash);
|
1883
1773
|
}
|
1884
1774
|
|
1885
|
-
result =
|
1886
|
-
|
1887
|
-
|
1888
|
-
|
1889
|
-
|
1890
|
-
result = readNextName(lastRuleValue, &firstName, &lastName, &hash);
|
1775
|
+
result = readNextName(lastRuleValue,
|
1776
|
+
&firstName,
|
1777
|
+
&lastName,
|
1778
|
+
&hash);
|
1891
1779
|
}
|
1892
1780
|
|
1893
1781
|
#ifdef _PRINT
|
1894
|
-
printAlphaNode(tree,
|
1782
|
+
printAlphaNode(tree,
|
1783
|
+
&tree->nodePool[NODE_M_OFFSET],
|
1784
|
+
0,
|
1785
|
+
NODE_M_OFFSET);
|
1895
1786
|
#endif
|
1896
1787
|
|
1897
1788
|
return RULES_OK;
|
1898
1789
|
}
|
1899
1790
|
|
1900
|
-
unsigned int createRuleset(unsigned int *handle, char *name, char *rules
|
1791
|
+
unsigned int createRuleset(unsigned int *handle, char *name, char *rules) {
|
1901
1792
|
INITIALIZE_ENTRIES;
|
1902
1793
|
|
1903
1794
|
#ifdef _PRINT
|
1795
|
+
printf("%lu\n", sizeof(jsonObject));
|
1904
1796
|
printf("%s\n", rules);
|
1905
1797
|
#endif
|
1906
1798
|
|
@@ -1925,69 +1817,37 @@ unsigned int createRuleset(unsigned int *handle, char *name, char *rules, unsign
|
|
1925
1817
|
tree->nextOffset = 0;
|
1926
1818
|
tree->expressionPool = NULL;
|
1927
1819
|
tree->expressionOffset = 0;
|
1928
|
-
tree->idiomPool = NULL;
|
1929
|
-
tree->idiomOffset = 0;
|
1930
|
-
tree->joinPool = NULL;
|
1931
|
-
tree->joinOffset = 0;
|
1932
1820
|
tree->regexStateMachinePool = NULL;
|
1933
1821
|
tree->regexStateMachineOffset = 0;
|
1822
|
+
tree->betaCount = 0;
|
1823
|
+
tree->connectorCount = 0;
|
1934
1824
|
tree->actionCount = 0;
|
1935
1825
|
tree->bindingsList = NULL;
|
1936
|
-
tree->
|
1937
|
-
tree->
|
1938
|
-
tree->
|
1939
|
-
tree
|
1940
|
-
|
1941
|
-
|
1942
|
-
|
1943
|
-
|
1944
|
-
|
1945
|
-
|
1946
|
-
|
1947
|
-
|
1948
|
-
|
1949
|
-
|
1950
|
-
|
1951
|
-
|
1952
|
-
|
1953
|
-
|
1954
|
-
|
1955
|
-
result = storeAlpha(tree, &newNode, &nodeOffset);
|
1956
|
-
if (result != RULES_OK) {
|
1957
|
-
return result;
|
1958
|
-
}
|
1826
|
+
tree->currentStateIndex = 0;
|
1827
|
+
memset(tree->stateIndex, 0, MAX_STATE_INDEX_LENGTH * sizeof(unsigned int) * 2);
|
1828
|
+
memset(tree->reverseStateIndex, 0, MAX_STATE_INDEX_LENGTH * sizeof(unsigned int));
|
1829
|
+
initStatePool(tree);
|
1830
|
+
|
1831
|
+
CHECK_RESULT(storeString(tree,
|
1832
|
+
name,
|
1833
|
+
&tree->nameOffset,
|
1834
|
+
strlen(name)));
|
1835
|
+
|
1836
|
+
CHECK_RESULT(storeString(tree,
|
1837
|
+
"m",
|
1838
|
+
&stringOffset,
|
1839
|
+
1));
|
1840
|
+
|
1841
|
+
CHECK_RESULT(storeAlpha(tree,
|
1842
|
+
&newNode,
|
1843
|
+
&nodeOffset));
|
1959
1844
|
|
1960
1845
|
newNode->nameOffset = stringOffset;
|
1961
1846
|
newNode->type = NODE_ALPHA;
|
1962
|
-
newNode->value.a.operator = OP_TYPE;
|
1963
|
-
result = storeAlpha(tree, &newNode, &tree->andNodeOffset);
|
1964
|
-
if (result != RULES_OK) {
|
1965
|
-
return result;
|
1966
|
-
}
|
1967
|
-
|
1968
|
-
newNode->nameOffset = 0;
|
1969
|
-
newNode->type = NODE_ALPHA;
|
1970
|
-
newNode->value.a.operator = OP_AND;
|
1971
|
-
result = storeAlpha(tree, &newNode, &tree->orNodeOffset);
|
1972
|
-
if (result != RULES_OK) {
|
1973
|
-
return result;
|
1974
|
-
}
|
1975
|
-
|
1976
|
-
newNode->nameOffset = 0;
|
1977
|
-
newNode->type = NODE_ALPHA;
|
1978
|
-
newNode->value.a.operator = OP_OR;
|
1979
|
-
result = storeAlpha(tree, &newNode, &tree->endNodeOffset);
|
1980
|
-
if (result != RULES_OK) {
|
1981
|
-
return result;
|
1982
|
-
}
|
1983
|
-
|
1984
|
-
newNode->nameOffset = 0;
|
1985
|
-
newNode->type = NODE_ALPHA;
|
1986
|
-
newNode->value.a.operator = OP_END;
|
1847
|
+
newNode->value.a.expression.operator = OP_TYPE;
|
1987
1848
|
|
1988
1849
|
// will use random numbers for state stored event mids
|
1989
1850
|
srand(time(NULL));
|
1990
|
-
|
1991
1851
|
CREATE_HANDLE(tree, handle);
|
1992
1852
|
return createTree(tree, rules);
|
1993
1853
|
}
|
@@ -1996,88 +1856,11 @@ unsigned int deleteRuleset(unsigned int handle) {
|
|
1996
1856
|
ruleset *tree;
|
1997
1857
|
RESOLVE_HANDLE(handle, &tree);
|
1998
1858
|
|
1999
|
-
deleteBindingsList(tree);
|
2000
1859
|
free(tree->nodePool);
|
2001
1860
|
free(tree->nextPool);
|
2002
1861
|
free(tree->stringPool);
|
2003
1862
|
free(tree->expressionPool);
|
2004
|
-
free(tree->
|
2005
|
-
free(tree->joinPool);
|
2006
|
-
free(tree->stateBuckets);
|
2007
|
-
for (unsigned int i = 0; i < tree->stateLength; ++i) {
|
2008
|
-
stateEntry *entry = &tree->state[i];
|
2009
|
-
if (entry->state) {
|
2010
|
-
free(entry->state);
|
2011
|
-
}
|
2012
|
-
|
2013
|
-
if (entry->sid) {
|
2014
|
-
free(entry->sid);
|
2015
|
-
}
|
2016
|
-
}
|
2017
|
-
free(tree->state);
|
2018
|
-
free(tree);
|
2019
|
-
DELETE_HANDLE(handle);
|
2020
|
-
return RULES_OK;
|
2021
|
-
}
|
2022
|
-
|
2023
|
-
unsigned int createClient(unsigned int *handle, char *name, unsigned int stateCaheSize) {
|
2024
|
-
INITIALIZE_ENTRIES;
|
2025
|
-
|
2026
|
-
ruleset *tree = malloc(sizeof(ruleset));
|
2027
|
-
if (!tree) {
|
2028
|
-
return ERR_OUT_OF_MEMORY;
|
2029
|
-
}
|
2030
|
-
|
2031
|
-
tree->stringPool = NULL;
|
2032
|
-
tree->stringPoolLength = 0;
|
2033
|
-
tree->nodePool = NULL;
|
2034
|
-
tree->nodeOffset = 0;
|
2035
|
-
tree->nextPool = NULL;
|
2036
|
-
tree->nextOffset = 0;
|
2037
|
-
tree->expressionPool = NULL;
|
2038
|
-
tree->expressionOffset = 0;
|
2039
|
-
tree->idiomPool = NULL;
|
2040
|
-
tree->idiomOffset = 0;
|
2041
|
-
tree->joinPool = NULL;
|
2042
|
-
tree->joinOffset = 0;
|
2043
|
-
tree->actionCount = 0;
|
2044
|
-
tree->bindingsList = NULL;
|
2045
|
-
tree->stateLength = 0;
|
2046
|
-
tree->state = calloc(stateCaheSize, sizeof(stateEntry));
|
2047
|
-
tree->maxStateLength = stateCaheSize;
|
2048
|
-
tree->stateBucketsLength = stateCaheSize / 4;
|
2049
|
-
tree->stateBuckets = malloc(tree->stateBucketsLength * sizeof(unsigned int));
|
2050
|
-
memset(tree->stateBuckets, 0xFF, tree->stateBucketsLength * sizeof(unsigned int));
|
2051
|
-
tree->lruStateOffset = UNDEFINED_HASH_OFFSET;
|
2052
|
-
tree->mruStateOffset = UNDEFINED_HASH_OFFSET;
|
2053
|
-
|
2054
|
-
unsigned int result = storeString(tree, name, &tree->nameOffset, strlen(name));
|
2055
|
-
if (result != RULES_OK) {
|
2056
|
-
return result;
|
2057
|
-
}
|
2058
|
-
|
2059
|
-
CREATE_HANDLE(tree, handle);
|
2060
|
-
return RULES_OK;
|
2061
|
-
}
|
2062
|
-
|
2063
|
-
unsigned int deleteClient(unsigned int handle) {
|
2064
|
-
ruleset *tree;
|
2065
|
-
RESOLVE_HANDLE(handle, &tree);
|
2066
|
-
|
2067
|
-
deleteBindingsList(tree);
|
2068
|
-
free(tree->stringPool);
|
2069
|
-
free(tree->stateBuckets);
|
2070
|
-
for (unsigned int i = 0; i < tree->stateLength; ++i) {
|
2071
|
-
stateEntry *entry = &tree->state[i];
|
2072
|
-
if (entry->state) {
|
2073
|
-
free(entry->state);
|
2074
|
-
}
|
2075
|
-
|
2076
|
-
if (entry->sid) {
|
2077
|
-
free(entry->sid);
|
2078
|
-
}
|
2079
|
-
}
|
2080
|
-
|
1863
|
+
free(tree->statePool.content);
|
2081
1864
|
free(tree);
|
2082
1865
|
DELETE_HANDLE(handle);
|
2083
1866
|
return RULES_OK;
|