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/state.h
CHANGED
@@ -1,34 +1,77 @@
|
|
1
1
|
|
2
|
+
#include <time.h>
|
3
|
+
|
2
4
|
#define HASH_ID 926444256
|
3
5
|
#define HASH_SID 3593476751
|
4
6
|
#define UNDEFINED_INDEX 0xFFFFFFFF
|
5
|
-
#define MAX_NAME_LENGTH 256
|
6
7
|
#define SID_BUFFER_LENGTH 2
|
7
8
|
#define ID_BUFFER_LENGTH 22
|
8
|
-
#define UNDEFINED_HASH_OFFSET 0xFFFFFFFF
|
9
9
|
|
10
|
-
#define
|
11
|
-
#define
|
10
|
+
#define MESSAGE_TYPE_EVENT 0
|
11
|
+
#define MESSAGE_TYPE_FACT 1
|
12
|
+
|
13
|
+
#define UNDEFINED_HASH_OFFSET 0
|
14
|
+
#define MAX_OBJECT_PROPERTIES 32
|
15
|
+
#define MAX_MESSAGE_FRAMES 16
|
16
|
+
#define MAX_MESSAGE_INDEX_LENGTH 512
|
17
|
+
#define MAX_LEFT_FRAME_INDEX_LENGTH 512
|
18
|
+
#define MAX_RIGHT_FRAME_INDEX_LENGTH 512
|
19
|
+
#define MAX_LOCATION_INDEX_LENGTH 16
|
20
|
+
|
21
|
+
#define LEFT_FRAME 0
|
22
|
+
#define RIGHT_FRAME 1
|
23
|
+
#define A_FRAME 2
|
24
|
+
#define B_FRAME 3
|
25
|
+
#define ACTION_FRAME 4
|
26
|
+
|
27
|
+
#define STATE_LEASE_TIME 30
|
28
|
+
|
29
|
+
#define MESSAGE_NODE(state, offset) &((messageNode *)state->messagePool.content)[offset]
|
30
|
+
|
31
|
+
#define RIGHT_FRAME_NODE(state, index, offset) &((rightFrameNode *)state->betaState[index].rightFramePool.content)[offset]
|
32
|
+
|
33
|
+
#define LEFT_FRAME_NODE(state, index, offset) &((leftFrameNode *)state->betaState[index].leftFramePool.content)[offset]
|
34
|
+
|
35
|
+
#define A_FRAME_NODE(state, index, offset) &((leftFrameNode *)state->connectorState[index].aFramePool.content)[offset]
|
36
|
+
|
37
|
+
#define B_FRAME_NODE(state, index, offset) &((leftFrameNode *)state->connectorState[index].bFramePool.content)[offset]
|
12
38
|
|
13
|
-
#define
|
39
|
+
#define ACTION_FRAME_NODE(state, index, offset) &((leftFrameNode *)state->actionState[index].resultPool.content)[offset]
|
40
|
+
|
41
|
+
#define RESULT_FRAME(actionNode, offset) &((leftFrameNode *)actionNode->resultPool.content)[offset];
|
42
|
+
|
43
|
+
#define STATE_NODE(tree, offset) &((stateNode *)((ruleset *)tree)->statePool.content)[offset]
|
44
|
+
|
45
|
+
#define LOCATION_NODE(message, offset) &((locationNode *)message->locationPool.content)[offset]
|
46
|
+
|
47
|
+
|
48
|
+
// defined in rete.h
|
49
|
+
struct node;
|
50
|
+
|
51
|
+
typedef struct pool {
|
52
|
+
void *content;
|
53
|
+
unsigned int freeOffset;
|
54
|
+
unsigned int contentLength;
|
55
|
+
unsigned int count;
|
56
|
+
} pool;
|
14
57
|
|
15
58
|
typedef struct jsonProperty {
|
16
59
|
unsigned int hash;
|
17
60
|
unsigned char type;
|
18
|
-
unsigned
|
19
|
-
char *valueString;
|
61
|
+
unsigned short valueOffset;
|
20
62
|
unsigned short valueLength;
|
21
|
-
char name[MAX_NAME_LENGTH];
|
22
|
-
unsigned short nameLength;
|
23
63
|
union {
|
24
64
|
long i;
|
25
65
|
double d;
|
26
66
|
unsigned char b;
|
67
|
+
char *s;
|
27
68
|
} value;
|
28
69
|
} jsonProperty;
|
29
70
|
|
30
71
|
typedef struct jsonObject {
|
72
|
+
char *content;
|
31
73
|
jsonProperty properties[MAX_OBJECT_PROPERTIES];
|
74
|
+
unsigned short propertyIndex[MAX_OBJECT_PROPERTIES];
|
32
75
|
unsigned char propertiesLength;
|
33
76
|
unsigned int idIndex;
|
34
77
|
unsigned int sidIndex;
|
@@ -36,28 +79,120 @@ typedef struct jsonObject {
|
|
36
79
|
char idBuffer[ID_BUFFER_LENGTH];
|
37
80
|
} jsonObject;
|
38
81
|
|
39
|
-
typedef struct
|
40
|
-
unsigned
|
41
|
-
unsigned int
|
42
|
-
unsigned int
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
82
|
+
typedef struct frameLocation {
|
83
|
+
unsigned char frameType;
|
84
|
+
unsigned int nodeIndex;
|
85
|
+
unsigned int frameOffset;
|
86
|
+
} frameLocation;
|
87
|
+
|
88
|
+
typedef struct locationNode {
|
89
|
+
unsigned int prevOffset;
|
90
|
+
unsigned int nextOffset;
|
91
|
+
unsigned int hash;
|
92
|
+
frameLocation location;
|
93
|
+
unsigned char isActive;
|
94
|
+
} locationNode;
|
95
|
+
|
96
|
+
typedef struct messageNode {
|
97
|
+
unsigned int prevOffset;
|
98
|
+
unsigned int nextOffset;
|
99
|
+
unsigned int hash;
|
100
|
+
unsigned char isActive;
|
101
|
+
unsigned char messageType;
|
102
|
+
pool locationPool;
|
103
|
+
unsigned int locationIndex[MAX_LOCATION_INDEX_LENGTH * 2];
|
48
104
|
jsonObject jo;
|
49
|
-
}
|
105
|
+
} messageNode;
|
106
|
+
|
107
|
+
typedef struct messageFrame {
|
108
|
+
unsigned int hash;
|
109
|
+
unsigned int nameOffset;
|
110
|
+
unsigned int messageNodeOffset;
|
111
|
+
} messageFrame;
|
112
|
+
|
113
|
+
typedef struct leftFrameNode {
|
114
|
+
unsigned int prevOffset;
|
115
|
+
unsigned int nextOffset;
|
116
|
+
unsigned int nameOffset;
|
117
|
+
unsigned int hash;
|
118
|
+
unsigned char isActive;
|
119
|
+
unsigned char isDispatching;
|
120
|
+
unsigned short messageCount;
|
121
|
+
unsigned short reverseIndex[MAX_MESSAGE_FRAMES];
|
122
|
+
messageFrame messages[MAX_MESSAGE_FRAMES];
|
123
|
+
} leftFrameNode;
|
124
|
+
|
125
|
+
typedef struct rightFrameNode {
|
126
|
+
unsigned int prevOffset;
|
127
|
+
unsigned int nextOffset;
|
128
|
+
unsigned int hash;
|
129
|
+
unsigned char isActive;
|
130
|
+
unsigned int messageOffset;
|
131
|
+
} rightFrameNode;
|
132
|
+
|
133
|
+
typedef struct actionStateNode {
|
134
|
+
struct node *reteNode;
|
135
|
+
pool resultPool;
|
136
|
+
unsigned int resultIndex[2];
|
137
|
+
} actionStateNode;
|
138
|
+
|
139
|
+
typedef struct connectorStateNode {
|
140
|
+
struct node *reteNode;
|
141
|
+
pool aFramePool;
|
142
|
+
unsigned int aFrameIndex[2];
|
143
|
+
pool bFramePool;
|
144
|
+
unsigned int bFrameIndex[2];
|
145
|
+
} connectorStateNode;
|
146
|
+
|
147
|
+
typedef struct betaStateNode {
|
148
|
+
struct node *reteNode;
|
149
|
+
pool leftFramePool;
|
150
|
+
unsigned int leftFrameIndex[MAX_LEFT_FRAME_INDEX_LENGTH * 2];
|
151
|
+
pool rightFramePool;
|
152
|
+
unsigned int rightFrameIndex[MAX_RIGHT_FRAME_INDEX_LENGTH * 2];
|
153
|
+
} betaStateNode;
|
154
|
+
|
155
|
+
typedef struct actionContext {
|
156
|
+
unsigned int actionStateIndex;
|
157
|
+
unsigned int resultCount;
|
158
|
+
unsigned int resultFrameOffset;
|
159
|
+
char *messages;
|
160
|
+
char *stateFact;
|
161
|
+
} actionContext;
|
162
|
+
|
163
|
+
typedef struct stateNode {
|
164
|
+
char *sid;
|
165
|
+
time_t lockExpireTime;
|
166
|
+
unsigned int offset;
|
167
|
+
unsigned int prevOffset;
|
168
|
+
unsigned int nextOffset;
|
169
|
+
unsigned int factOffset;
|
170
|
+
unsigned int hash;
|
171
|
+
unsigned char isActive;
|
172
|
+
pool messagePool;
|
173
|
+
unsigned int messageIndex[MAX_MESSAGE_INDEX_LENGTH * 2];
|
174
|
+
betaStateNode *betaState;
|
175
|
+
actionStateNode *actionState;
|
176
|
+
connectorStateNode *connectorState;
|
177
|
+
actionContext context;
|
178
|
+
} stateNode;
|
179
|
+
|
50
180
|
|
51
181
|
unsigned int fnv1Hash32(char *str, unsigned int len);
|
52
182
|
|
53
|
-
|
183
|
+
unsigned int getObjectProperty(jsonObject *jo,
|
184
|
+
unsigned int hash,
|
185
|
+
jsonProperty **property);
|
54
186
|
|
55
|
-
unsigned int
|
187
|
+
unsigned int setObjectProperty(jsonObject *jo,
|
188
|
+
unsigned int hash,
|
189
|
+
unsigned char type,
|
190
|
+
unsigned short valueOffset,
|
191
|
+
unsigned short valueLength);
|
56
192
|
|
57
193
|
unsigned int constructObject(char *root,
|
58
194
|
char *parentName,
|
59
195
|
char *object,
|
60
|
-
char layout,
|
61
196
|
char generateId,
|
62
197
|
jsonObject *jo,
|
63
198
|
char **next);
|
@@ -66,14 +201,153 @@ unsigned int resolveBinding(void *tree,
|
|
66
201
|
char *sid,
|
67
202
|
void **rulesBinding);
|
68
203
|
|
69
|
-
unsigned int fetchStateProperty(void *tree,
|
70
|
-
char *sid,
|
71
|
-
unsigned int propertyHash,
|
72
|
-
unsigned int maxTime,
|
73
|
-
unsigned char ignoreStaleState,
|
74
|
-
char **state,
|
75
|
-
jsonProperty **property);
|
76
204
|
|
77
|
-
unsigned int
|
205
|
+
unsigned int getHash(char *sid, char *key);
|
206
|
+
|
207
|
+
unsigned int initStatePool(void *tree);
|
208
|
+
|
209
|
+
unsigned int addFrameLocation(stateNode *state,
|
210
|
+
frameLocation location,
|
211
|
+
unsigned int messageNodeOffset);
|
212
|
+
|
213
|
+
unsigned int deleteFrameLocation(stateNode *state,
|
214
|
+
unsigned int messageNodeOffset,
|
215
|
+
frameLocation location);
|
216
|
+
|
217
|
+
|
218
|
+
unsigned int deleteMessageFromFrame(unsigned int messageNodeOffset,
|
219
|
+
leftFrameNode *frame);
|
220
|
+
|
221
|
+
unsigned int getMessageFromFrame(stateNode *state,
|
222
|
+
messageFrame *messages,
|
223
|
+
unsigned int hash,
|
224
|
+
jsonObject **message);
|
225
|
+
|
226
|
+
unsigned int setMessageInFrame(leftFrameNode *node,
|
227
|
+
unsigned int nameOffset,
|
228
|
+
unsigned int hash,
|
229
|
+
unsigned int messageNodeOffset);
|
230
|
+
|
231
|
+
unsigned int getLastLeftFrame(stateNode *state,
|
232
|
+
unsigned int index,
|
233
|
+
unsigned int hash,
|
234
|
+
frameLocation *location,
|
235
|
+
leftFrameNode **node);
|
236
|
+
|
237
|
+
unsigned int setLeftFrame(stateNode *state,
|
238
|
+
unsigned int hash,
|
239
|
+
frameLocation location);
|
240
|
+
|
241
|
+
|
242
|
+
unsigned int deleteLeftFrame(stateNode *state,
|
243
|
+
frameLocation location);
|
244
|
+
|
245
|
+
unsigned int createLeftFrame(stateNode *state,
|
246
|
+
struct node *reteNode,
|
247
|
+
leftFrameNode *oldNode,
|
248
|
+
leftFrameNode **newNode,
|
249
|
+
frameLocation *newLocation);
|
250
|
+
|
251
|
+
unsigned int getLastConnectorFrame(stateNode *state,
|
252
|
+
unsigned int frameType,
|
253
|
+
unsigned int index,
|
254
|
+
unsigned int *valueOffset,
|
255
|
+
leftFrameNode **node);
|
256
|
+
|
257
|
+
unsigned int setConnectorFrame(stateNode *state,
|
258
|
+
unsigned int frameType,
|
259
|
+
frameLocation location);
|
260
|
+
|
261
|
+
|
262
|
+
unsigned int deleteConnectorFrame(stateNode *state,
|
263
|
+
unsigned int frameType,
|
264
|
+
frameLocation location);
|
265
|
+
|
266
|
+
unsigned int createConnectorFrame(stateNode *state,
|
267
|
+
unsigned int frameType,
|
268
|
+
struct node *reteNode,
|
269
|
+
leftFrameNode *oldNode,
|
270
|
+
leftFrameNode **newNode,
|
271
|
+
frameLocation *newLocation);
|
272
|
+
|
273
|
+
unsigned int getLastRightFrame(stateNode *state,
|
274
|
+
unsigned int index,
|
275
|
+
unsigned int hash,
|
276
|
+
rightFrameNode **node);
|
277
|
+
|
278
|
+
unsigned int setRightFrame(stateNode *state,
|
279
|
+
unsigned int hash,
|
280
|
+
frameLocation location);
|
281
|
+
|
282
|
+
unsigned int deleteRightFrame(stateNode *state,
|
283
|
+
frameLocation location);
|
284
|
+
|
285
|
+
unsigned int createRightFrame(stateNode *state,
|
286
|
+
struct node *reteNode,
|
287
|
+
rightFrameNode **node,
|
288
|
+
frameLocation *location);
|
289
|
+
|
290
|
+
unsigned int getActionFrame(stateNode *state,
|
291
|
+
frameLocation resultLocation,
|
292
|
+
leftFrameNode **resultNode);
|
293
|
+
|
294
|
+
unsigned int setActionFrame(stateNode *state,
|
295
|
+
frameLocation location);
|
296
|
+
|
297
|
+
|
298
|
+
unsigned int deleteActionFrame(stateNode *state,
|
299
|
+
frameLocation location);
|
300
|
+
|
301
|
+
unsigned int deleteDispatchingActionFrame(stateNode *state,
|
302
|
+
frameLocation location);
|
303
|
+
|
304
|
+
unsigned int createActionFrame(stateNode *state,
|
305
|
+
struct node *reteNode,
|
306
|
+
leftFrameNode *oldNode,
|
307
|
+
leftFrameNode **newNode,
|
308
|
+
frameLocation *newLocation);
|
309
|
+
|
310
|
+
unsigned int deleteMessage(stateNode *state,
|
311
|
+
unsigned int messageNodeOffset);
|
312
|
+
|
313
|
+
unsigned int getMessage(stateNode *state,
|
314
|
+
char *mid,
|
315
|
+
unsigned int *valueOffset);
|
316
|
+
|
317
|
+
unsigned int storeMessage(stateNode *state,
|
318
|
+
char *mid,
|
319
|
+
jsonObject *message,
|
320
|
+
unsigned char messageType,
|
321
|
+
unsigned int *valueOffset);
|
322
|
+
|
323
|
+
unsigned int ensureStateNode(void *tree,
|
78
324
|
char *sid,
|
79
|
-
unsigned
|
325
|
+
unsigned char *isNew,
|
326
|
+
stateNode **state);
|
327
|
+
|
328
|
+
unsigned int serializeResult(void *tree,
|
329
|
+
stateNode *state,
|
330
|
+
actionStateNode *actionNode,
|
331
|
+
unsigned int count,
|
332
|
+
char **result);
|
333
|
+
|
334
|
+
unsigned int serializeState(stateNode *state,
|
335
|
+
char **stateFact);
|
336
|
+
|
337
|
+
unsigned int getNextResultInState(void *tree,
|
338
|
+
stateNode *state,
|
339
|
+
unsigned int *actionStateIndex,
|
340
|
+
unsigned int *resultCount,
|
341
|
+
unsigned int *resultFrameOffset,
|
342
|
+
actionStateNode **resultAction);
|
343
|
+
|
344
|
+
unsigned int getNextResult(void *tree,
|
345
|
+
time_t currentTime,
|
346
|
+
stateNode **resultState,
|
347
|
+
unsigned int *actionStateIndex,
|
348
|
+
unsigned int *resultCount,
|
349
|
+
unsigned int *resultFrameOffset,
|
350
|
+
actionStateNode **resultAction);
|
351
|
+
|
352
|
+
|
353
|
+
|
data/src/rulesrb/extconf.rb
CHANGED
@@ -4,7 +4,6 @@ RbConfig::MAKEFILE_CONFIG['CC'] = ENV['CC'] if ENV['CC']
|
|
4
4
|
|
5
5
|
rules_include = File.join(File.dirname(__FILE__), %w{.. .. src rules})
|
6
6
|
rules_lib = File.join(File.dirname(__FILE__), %w{.. .. src rules})
|
7
|
-
hiredis_lib = File.join(File.dirname(__FILE__), %w{.. .. deps hiredis})
|
8
7
|
|
9
8
|
RbConfig::CONFIG['configure_args'] =~ /with-make-prog\=(\w+)/
|
10
9
|
make_program = $1 || ENV['make']
|
@@ -17,12 +16,6 @@ else
|
|
17
16
|
'make'
|
18
17
|
end
|
19
18
|
|
20
|
-
# Make sure hiredis is built...
|
21
|
-
Dir.chdir(hiredis_lib) do
|
22
|
-
success = system("#{make_program} static")
|
23
|
-
raise "Building hiredis failed" if !success
|
24
|
-
end
|
25
|
-
|
26
19
|
# Make sure rules is built...
|
27
20
|
Dir.chdir(rules_lib) do
|
28
21
|
success = system("#{make_program} static")
|
@@ -31,7 +24,7 @@ end
|
|
31
24
|
|
32
25
|
# Statically link to hiredis (mkmf can't do this for us)
|
33
26
|
$CFLAGS << " -I#{rules_lib} "
|
34
|
-
$LDFLAGS << " -L#{rules_lib} -
|
27
|
+
$LDFLAGS << " -L#{rules_lib} -lrules"
|
35
28
|
|
36
29
|
have_func("rb_thread_fd_select")
|
37
30
|
create_makefile('src/rulesrb/rules')
|
data/src/rulesrb/rules.c
CHANGED
@@ -3,12 +3,12 @@
|
|
3
3
|
|
4
4
|
VALUE rulesModule = Qnil;
|
5
5
|
|
6
|
-
static VALUE rbCreateRuleset(VALUE self, VALUE name, VALUE rules
|
6
|
+
static VALUE rbCreateRuleset(VALUE self, VALUE name, VALUE rules) {
|
7
7
|
Check_Type(name, T_STRING);
|
8
8
|
Check_Type(rules, T_STRING);
|
9
9
|
|
10
|
-
|
11
|
-
unsigned int result = createRuleset(&output, RSTRING_PTR(name), RSTRING_PTR(rules)
|
10
|
+
unsigned int output = 0;
|
11
|
+
unsigned int result = createRuleset(&output, RSTRING_PTR(name), RSTRING_PTR(rules));
|
12
12
|
if (result != RULES_OK) {
|
13
13
|
if (result == ERR_OUT_OF_MEMORY) {
|
14
14
|
rb_raise(rb_eNoMemError, "Out of memory");
|
@@ -35,110 +35,17 @@ static VALUE rbDeleteRuleset(VALUE self, VALUE handle) {
|
|
35
35
|
return Qnil;
|
36
36
|
}
|
37
37
|
|
38
|
-
static VALUE rbCreateClient(VALUE self, VALUE name, VALUE stateCacheSize) {
|
39
|
-
Check_Type(name, T_STRING);
|
40
|
-
Check_Type(stateCacheSize, T_FIXNUM);
|
41
|
-
|
42
|
-
void *output = NULL;
|
43
|
-
unsigned int result = createClient(&output, RSTRING_PTR(name), FIX2INT(stateCacheSize));
|
44
|
-
if (result != RULES_OK) {
|
45
|
-
if (result == ERR_OUT_OF_MEMORY) {
|
46
|
-
rb_raise(rb_eNoMemError, "Out of memory");
|
47
|
-
} else {
|
48
|
-
rb_raise(rb_eException, "Could not create client, error code: %d", result);
|
49
|
-
}
|
50
|
-
}
|
51
|
-
|
52
|
-
return INT2FIX(output);
|
53
|
-
}
|
54
|
-
|
55
|
-
static VALUE rbDeleteClient(VALUE self, VALUE handle) {
|
56
|
-
Check_Type(handle, T_FIXNUM);
|
57
|
-
|
58
|
-
unsigned int result = deleteClient((void *)FIX2LONG(handle));
|
59
|
-
if (result != RULES_OK) {
|
60
|
-
if (result == ERR_OUT_OF_MEMORY) {
|
61
|
-
rb_raise(rb_eNoMemError, "Out of memory");
|
62
|
-
} else {
|
63
|
-
rb_raise(rb_eException, "Could not delete client, error code: %d", result);
|
64
|
-
}
|
65
|
-
}
|
66
|
-
|
67
|
-
return Qnil;
|
68
|
-
}
|
69
|
-
|
70
|
-
static VALUE rbBindRuleset(VALUE self, VALUE handle, VALUE host, VALUE port, VALUE password, VALUE db) {
|
71
|
-
Check_Type(handle, T_FIXNUM);
|
72
|
-
Check_Type(host, T_STRING);
|
73
|
-
Check_Type(port, T_FIXNUM);
|
74
|
-
Check_Type(db, T_FIXNUM);
|
75
|
-
|
76
|
-
unsigned int result;
|
77
|
-
if (TYPE(password) == T_STRING) {
|
78
|
-
result = bindRuleset(FIX2INT(handle), RSTRING_PTR(host), FIX2INT(port), RSTRING_PTR(password), FIX2INT(db));
|
79
|
-
} else if (TYPE(password) == T_NIL) {
|
80
|
-
result = bindRuleset(FIX2INT(handle), RSTRING_PTR(host), FIX2INT(port), NULL, FIX2INT(db));
|
81
|
-
} else {
|
82
|
-
rb_raise(rb_eTypeError, "Wrong argument type for password");
|
83
|
-
}
|
84
|
-
|
85
|
-
if (result != RULES_OK) {
|
86
|
-
if (result == ERR_OUT_OF_MEMORY) {
|
87
|
-
rb_raise(rb_eNoMemError, "Out of memory");
|
88
|
-
} else {
|
89
|
-
rb_raise(rb_eException, "Could not create connection, error code: %d", result);
|
90
|
-
}
|
91
|
-
}
|
92
|
-
|
93
|
-
return Qnil;
|
94
|
-
}
|
95
|
-
|
96
|
-
static VALUE rbComplete(VALUE self, VALUE rulesBinding, VALUE replyCount) {
|
97
|
-
Check_Type(rulesBinding, T_FIXNUM);
|
98
|
-
Check_Type(replyCount, T_FIXNUM);
|
99
|
-
|
100
|
-
unsigned int result = complete((void *)FIX2LONG(rulesBinding), FIX2LONG(replyCount));
|
101
|
-
if (result != RULES_OK) {
|
102
|
-
if (result == ERR_OUT_OF_MEMORY) {
|
103
|
-
rb_raise(rb_eNoMemError, "Out of memory");
|
104
|
-
} else {
|
105
|
-
rb_raise(rb_eException, "Could not complete action, error code: %d", result);
|
106
|
-
}
|
107
|
-
}
|
108
|
-
|
109
|
-
return Qnil;
|
110
|
-
}
|
111
|
-
|
112
|
-
static VALUE rbStartAssertEvent(VALUE self, VALUE handle, VALUE event) {
|
113
|
-
Check_Type(handle, T_FIXNUM);
|
114
|
-
Check_Type(event, T_STRING);
|
115
|
-
|
116
|
-
unsigned int replyCount;
|
117
|
-
void *rulesBinding = NULL;
|
118
|
-
unsigned int result = startAssertEvent(FIX2INT(handle), RSTRING_PTR(event), &rulesBinding, &replyCount);
|
119
|
-
if (result == RULES_OK || result == ERR_EVENT_NOT_HANDLED) {
|
120
|
-
VALUE output = rb_ary_new();
|
121
|
-
rb_ary_push(output, INT2FIX(rulesBinding));
|
122
|
-
rb_ary_push(output, INT2FIX(replyCount));
|
123
|
-
return output;
|
124
|
-
} else {
|
125
|
-
if (result == ERR_OUT_OF_MEMORY) {
|
126
|
-
rb_raise(rb_eNoMemError, "Out of memory");
|
127
|
-
} else {
|
128
|
-
rb_raise(rb_eException, "Could not assert event, error code: %d", result);
|
129
|
-
}
|
130
|
-
}
|
131
|
-
|
132
|
-
return Qnil;
|
133
|
-
}
|
134
|
-
|
135
38
|
static VALUE rbAssertEvent(VALUE self, VALUE handle, VALUE event) {
|
136
39
|
Check_Type(handle, T_FIXNUM);
|
137
40
|
Check_Type(event, T_STRING);
|
138
41
|
|
139
|
-
unsigned int
|
42
|
+
unsigned int stateOffset;
|
43
|
+
unsigned int result = assertEvent(FIX2INT(handle), RSTRING_PTR(event), &stateOffset);
|
140
44
|
if (result == RULES_OK || result == ERR_EVENT_NOT_HANDLED || result == ERR_EVENT_OBSERVED) {
|
141
|
-
|
45
|
+
VALUE output = rb_ary_new();
|
46
|
+
rb_ary_push(output, INT2FIX(result));
|
47
|
+
rb_ary_push(output, INT2FIX(stateOffset));
|
48
|
+
return output;
|
142
49
|
} else {
|
143
50
|
if (result == ERR_OUT_OF_MEMORY) {
|
144
51
|
rb_raise(rb_eNoMemError, "Out of memory");
|
@@ -150,100 +57,23 @@ static VALUE rbAssertEvent(VALUE self, VALUE handle, VALUE event) {
|
|
150
57
|
return Qnil;
|
151
58
|
}
|
152
59
|
|
153
|
-
static VALUE rbQueueAssertEvent(VALUE self, VALUE handle, VALUE sid, VALUE destination, VALUE event) {
|
154
|
-
Check_Type(handle, T_FIXNUM);
|
155
|
-
Check_Type(sid, T_STRING);
|
156
|
-
Check_Type(destination, T_STRING);
|
157
|
-
Check_Type(event, T_STRING);
|
158
|
-
|
159
|
-
unsigned int result = queueMessage(FIX2INT(handle), QUEUE_ASSERT_EVENT, RSTRING_PTR(sid), RSTRING_PTR(destination), RSTRING_PTR(event));
|
160
|
-
if (result != RULES_OK) {
|
161
|
-
if (result == ERR_OUT_OF_MEMORY) {
|
162
|
-
rb_raise(rb_eNoMemError, "Out of memory");
|
163
|
-
} else {
|
164
|
-
rb_raise(rb_eException, "Could not queue assert event, error code: %d", result);
|
165
|
-
}
|
166
|
-
}
|
167
|
-
|
168
|
-
return Qnil;
|
169
|
-
}
|
170
|
-
|
171
|
-
static VALUE rbStartAssertEvents(VALUE self, VALUE handle, VALUE events) {
|
172
|
-
Check_Type(handle, T_FIXNUM);
|
173
|
-
Check_Type(events, T_STRING);
|
174
|
-
|
175
|
-
unsigned int replyCount;
|
176
|
-
void *rulesBinding = NULL;
|
177
|
-
unsigned int result = startAssertEvents(FIX2INT(handle), RSTRING_PTR(events), &rulesBinding, &replyCount);
|
178
|
-
if (result == RULES_OK || result == ERR_EVENT_NOT_HANDLED) {
|
179
|
-
VALUE output = rb_ary_new();
|
180
|
-
rb_ary_push(output, INT2FIX(rulesBinding));
|
181
|
-
rb_ary_push(output, INT2FIX(replyCount));
|
182
|
-
return output;
|
183
|
-
} else {
|
184
|
-
if (result == ERR_OUT_OF_MEMORY) {
|
185
|
-
rb_raise(rb_eNoMemError, "Out of memory");
|
186
|
-
} else {
|
187
|
-
rb_raise(rb_eException, "Could not assert events, error code: %d", result);
|
188
|
-
}
|
189
|
-
}
|
190
|
-
|
191
|
-
return Qnil;
|
192
|
-
}
|
193
60
|
|
194
61
|
static VALUE rbAssertEvents(VALUE self, VALUE handle, VALUE events) {
|
195
62
|
Check_Type(handle, T_FIXNUM);
|
196
63
|
Check_Type(events, T_STRING);
|
197
64
|
|
198
|
-
unsigned int
|
65
|
+
unsigned int stateOffset;
|
66
|
+
unsigned int result = assertEvents(FIX2INT(handle), RSTRING_PTR(events), &stateOffset);
|
199
67
|
if (result == RULES_OK || result == ERR_EVENT_NOT_HANDLED || result == ERR_EVENT_OBSERVED) {
|
200
|
-
return INT2FIX(result);
|
201
|
-
} else {
|
202
|
-
if (result == ERR_OUT_OF_MEMORY) {
|
203
|
-
rb_raise(rb_eNoMemError, "Out of memory");
|
204
|
-
} else {
|
205
|
-
rb_raise(rb_eException, "Could not assert events, error code: %d", result);
|
206
|
-
}
|
207
|
-
}
|
208
|
-
|
209
|
-
return Qnil;
|
210
|
-
}
|
211
|
-
|
212
|
-
static VALUE rbRetractEvent(VALUE self, VALUE handle, VALUE event) {
|
213
|
-
Check_Type(handle, T_FIXNUM);
|
214
|
-
Check_Type(event, T_STRING);
|
215
|
-
|
216
|
-
unsigned int result = retractEvent(FIX2INT(handle), RSTRING_PTR(event));
|
217
|
-
if (result == RULES_OK || result == ERR_EVENT_NOT_HANDLED || result == ERR_EVENT_OBSERVED) {
|
218
|
-
return INT2FIX(result);
|
219
|
-
} else {
|
220
|
-
if (result == ERR_OUT_OF_MEMORY) {
|
221
|
-
rb_raise(rb_eNoMemError, "Out of memory");
|
222
|
-
} else {
|
223
|
-
rb_raise(rb_eException, "Could not retract event, error code: %d", result);
|
224
|
-
}
|
225
|
-
}
|
226
|
-
|
227
|
-
return Qnil;
|
228
|
-
}
|
229
|
-
|
230
|
-
static VALUE rbStartAssertFact(VALUE self, VALUE handle, VALUE fact) {
|
231
|
-
Check_Type(handle, T_FIXNUM);
|
232
|
-
Check_Type(fact, T_STRING);
|
233
|
-
|
234
|
-
unsigned int replyCount;
|
235
|
-
void *rulesBinding = NULL;
|
236
|
-
unsigned int result = startAssertFact(FIX2INT(handle), RSTRING_PTR(fact), &rulesBinding, &replyCount);
|
237
|
-
if (result == RULES_OK || result == ERR_EVENT_NOT_HANDLED) {
|
238
68
|
VALUE output = rb_ary_new();
|
239
|
-
rb_ary_push(output, INT2FIX(
|
240
|
-
rb_ary_push(output, INT2FIX(
|
241
|
-
return output;
|
69
|
+
rb_ary_push(output, INT2FIX(result));
|
70
|
+
rb_ary_push(output, INT2FIX(stateOffset));
|
71
|
+
return output;
|
242
72
|
} else {
|
243
73
|
if (result == ERR_OUT_OF_MEMORY) {
|
244
74
|
rb_raise(rb_eNoMemError, "Out of memory");
|
245
75
|
} else {
|
246
|
-
rb_raise(rb_eException, "Could not assert
|
76
|
+
rb_raise(rb_eException, "Could not assert events, error code: %d", result);
|
247
77
|
}
|
248
78
|
}
|
249
79
|
|
@@ -254,55 +84,18 @@ static VALUE rbAssertFact(VALUE self, VALUE handle, VALUE fact) {
|
|
254
84
|
Check_Type(handle, T_FIXNUM);
|
255
85
|
Check_Type(fact, T_STRING);
|
256
86
|
|
257
|
-
unsigned int
|
87
|
+
unsigned int stateOffset;
|
88
|
+
unsigned int result = assertFact(FIX2INT(handle), RSTRING_PTR(fact), &stateOffset);
|
258
89
|
if (result == RULES_OK || result == ERR_EVENT_NOT_HANDLED || result == ERR_EVENT_OBSERVED) {
|
259
|
-
return INT2FIX(result);
|
260
|
-
} else {
|
261
|
-
if (result == ERR_OUT_OF_MEMORY) {
|
262
|
-
rb_raise(rb_eNoMemError, "Out of memory");
|
263
|
-
} else {
|
264
|
-
rb_raise(rb_eException, "Could not assert fact, error code: %d", result);
|
265
|
-
}
|
266
|
-
}
|
267
|
-
|
268
|
-
return Qnil;
|
269
|
-
}
|
270
|
-
|
271
|
-
static VALUE rbQueueAssertFact(VALUE self, VALUE handle, VALUE sid, VALUE destination, VALUE event) {
|
272
|
-
Check_Type(handle, T_FIXNUM);
|
273
|
-
Check_Type(sid, T_STRING);
|
274
|
-
Check_Type(destination, T_STRING);
|
275
|
-
Check_Type(event, T_STRING);
|
276
|
-
|
277
|
-
unsigned int result = queueMessage(FIX2INT(handle), QUEUE_ASSERT_FACT, RSTRING_PTR(sid), RSTRING_PTR(destination), RSTRING_PTR(event));
|
278
|
-
if (result != RULES_OK) {
|
279
|
-
if (result == ERR_OUT_OF_MEMORY) {
|
280
|
-
rb_raise(rb_eNoMemError, "Out of memory");
|
281
|
-
} else {
|
282
|
-
rb_raise(rb_eException, "Could not queue assert fact, error code: %d", result);
|
283
|
-
}
|
284
|
-
}
|
285
|
-
|
286
|
-
return Qnil;
|
287
|
-
}
|
288
|
-
|
289
|
-
static VALUE rbStartAssertFacts(VALUE self, VALUE handle, VALUE facts) {
|
290
|
-
Check_Type(handle, T_FIXNUM);
|
291
|
-
Check_Type(facts, T_STRING);
|
292
|
-
|
293
|
-
unsigned int replyCount;
|
294
|
-
void *rulesBinding = NULL;
|
295
|
-
unsigned int result = startAssertFacts(FIX2INT(handle), RSTRING_PTR(facts), &rulesBinding, &replyCount);
|
296
|
-
if (result == RULES_OK || result == ERR_EVENT_NOT_HANDLED) {
|
297
90
|
VALUE output = rb_ary_new();
|
298
|
-
rb_ary_push(output, INT2FIX(
|
299
|
-
rb_ary_push(output, INT2FIX(
|
300
|
-
return output;
|
91
|
+
rb_ary_push(output, INT2FIX(result));
|
92
|
+
rb_ary_push(output, INT2FIX(stateOffset));
|
93
|
+
return output;
|
301
94
|
} else {
|
302
95
|
if (result == ERR_OUT_OF_MEMORY) {
|
303
96
|
rb_raise(rb_eNoMemError, "Out of memory");
|
304
97
|
} else {
|
305
|
-
rb_raise(rb_eException, "Could not assert
|
98
|
+
rb_raise(rb_eException, "Could not assert fact, error code: %d", result);
|
306
99
|
}
|
307
100
|
}
|
308
101
|
|
@@ -313,37 +106,18 @@ static VALUE rbAssertFacts(VALUE self, VALUE handle, VALUE facts) {
|
|
313
106
|
Check_Type(handle, T_FIXNUM);
|
314
107
|
Check_Type(facts, T_STRING);
|
315
108
|
|
316
|
-
unsigned int
|
109
|
+
unsigned int stateOffset;
|
110
|
+
unsigned int result = assertFacts(FIX2INT(handle), RSTRING_PTR(facts), &stateOffset);
|
317
111
|
if (result == RULES_OK || result == ERR_EVENT_NOT_HANDLED || result == ERR_EVENT_OBSERVED) {
|
318
|
-
return INT2FIX(result);
|
319
|
-
} else {
|
320
|
-
if (result == ERR_OUT_OF_MEMORY) {
|
321
|
-
rb_raise(rb_eNoMemError, "Out of memory");
|
322
|
-
} else {
|
323
|
-
rb_raise(rb_eException, "Could not assert facts, error code: %d", result);
|
324
|
-
}
|
325
|
-
}
|
326
|
-
|
327
|
-
return Qnil;
|
328
|
-
}
|
329
|
-
|
330
|
-
static VALUE rbStartRetractFact(VALUE self, VALUE handle, VALUE fact) {
|
331
|
-
Check_Type(handle, T_FIXNUM);
|
332
|
-
Check_Type(fact, T_STRING);
|
333
|
-
|
334
|
-
unsigned int replyCount;
|
335
|
-
void *rulesBinding = NULL;
|
336
|
-
unsigned int result = startRetractFact(FIX2INT(handle), RSTRING_PTR(fact), &rulesBinding, &replyCount);
|
337
|
-
if (result == RULES_OK || result == ERR_EVENT_NOT_HANDLED) {
|
338
112
|
VALUE output = rb_ary_new();
|
339
|
-
rb_ary_push(output, INT2FIX(
|
340
|
-
rb_ary_push(output, INT2FIX(
|
341
|
-
return output;
|
113
|
+
rb_ary_push(output, INT2FIX(result));
|
114
|
+
rb_ary_push(output, INT2FIX(stateOffset));
|
115
|
+
return output;
|
342
116
|
} else {
|
343
117
|
if (result == ERR_OUT_OF_MEMORY) {
|
344
118
|
rb_raise(rb_eNoMemError, "Out of memory");
|
345
119
|
} else {
|
346
|
-
rb_raise(rb_eException, "Could not
|
120
|
+
rb_raise(rb_eException, "Could not assert facts, error code: %d", result);
|
347
121
|
}
|
348
122
|
}
|
349
123
|
|
@@ -354,9 +128,13 @@ static VALUE rbRetractFact(VALUE self, VALUE handle, VALUE fact) {
|
|
354
128
|
Check_Type(handle, T_FIXNUM);
|
355
129
|
Check_Type(fact, T_STRING);
|
356
130
|
|
357
|
-
unsigned int
|
131
|
+
unsigned int stateOffset;
|
132
|
+
unsigned int result = retractFact(FIX2INT(handle), RSTRING_PTR(fact), &stateOffset);
|
358
133
|
if (result == RULES_OK || result == ERR_EVENT_NOT_HANDLED || result == ERR_EVENT_OBSERVED) {
|
359
|
-
|
134
|
+
VALUE output = rb_ary_new();
|
135
|
+
rb_ary_push(output, INT2FIX(result));
|
136
|
+
rb_ary_push(output, INT2FIX(stateOffset));
|
137
|
+
return output;
|
360
138
|
} else {
|
361
139
|
if (result == ERR_OUT_OF_MEMORY) {
|
362
140
|
rb_raise(rb_eNoMemError, "Out of memory");
|
@@ -368,36 +146,17 @@ static VALUE rbRetractFact(VALUE self, VALUE handle, VALUE fact) {
|
|
368
146
|
return Qnil;
|
369
147
|
}
|
370
148
|
|
371
|
-
static VALUE
|
372
|
-
Check_Type(handle, T_FIXNUM);
|
373
|
-
Check_Type(sid, T_STRING);
|
374
|
-
Check_Type(destination, T_STRING);
|
375
|
-
Check_Type(event, T_STRING);
|
376
|
-
|
377
|
-
unsigned int result = queueMessage(FIX2INT(handle), QUEUE_RETRACT_FACT, RSTRING_PTR(sid), RSTRING_PTR(destination), RSTRING_PTR(event));
|
378
|
-
if (result != RULES_OK) {
|
379
|
-
if (result == ERR_OUT_OF_MEMORY) {
|
380
|
-
rb_raise(rb_eNoMemError, "Out of memory");
|
381
|
-
} else {
|
382
|
-
rb_raise(rb_eException, "Could not queue retract fact, error code: %d", result);
|
383
|
-
}
|
384
|
-
}
|
385
|
-
|
386
|
-
return Qnil;
|
387
|
-
}
|
388
|
-
|
389
|
-
static VALUE rbStartRetractFacts(VALUE self, VALUE handle, VALUE facts) {
|
149
|
+
static VALUE rbRetractFacts(VALUE self, VALUE handle, VALUE facts) {
|
390
150
|
Check_Type(handle, T_FIXNUM);
|
391
151
|
Check_Type(facts, T_STRING);
|
392
152
|
|
393
|
-
unsigned int
|
394
|
-
|
395
|
-
|
396
|
-
if (result == RULES_OK || result == ERR_EVENT_NOT_HANDLED) {
|
153
|
+
unsigned int stateOffset;
|
154
|
+
unsigned int result = retractFacts(FIX2INT(handle), RSTRING_PTR(facts), &stateOffset);
|
155
|
+
if (result == RULES_OK || result == ERR_EVENT_NOT_HANDLED || result == ERR_EVENT_OBSERVED) {
|
397
156
|
VALUE output = rb_ary_new();
|
398
|
-
rb_ary_push(output, INT2FIX(
|
399
|
-
rb_ary_push(output, INT2FIX(
|
400
|
-
return output;
|
157
|
+
rb_ary_push(output, INT2FIX(result));
|
158
|
+
rb_ary_push(output, INT2FIX(stateOffset));
|
159
|
+
return output;
|
401
160
|
} else {
|
402
161
|
if (result == ERR_OUT_OF_MEMORY) {
|
403
162
|
rb_raise(rb_eNoMemError, "Out of memory");
|
@@ -409,30 +168,14 @@ static VALUE rbStartRetractFacts(VALUE self, VALUE handle, VALUE facts) {
|
|
409
168
|
return Qnil;
|
410
169
|
}
|
411
170
|
|
412
|
-
static VALUE
|
171
|
+
static VALUE rbUpdateState(VALUE self, VALUE handle, VALUE state) {
|
413
172
|
Check_Type(handle, T_FIXNUM);
|
414
|
-
Check_Type(facts, T_STRING);
|
415
|
-
|
416
|
-
unsigned int result = retractFacts(FIX2INT(handle), RSTRING_PTR(facts));
|
417
|
-
if (result != RULES_OK) {
|
418
|
-
if (result == ERR_OUT_OF_MEMORY) {
|
419
|
-
rb_raise(rb_eNoMemError, "Out of memory");
|
420
|
-
} else {
|
421
|
-
rb_raise(rb_eException, "Could not retract facts, error code: %d", result);
|
422
|
-
}
|
423
|
-
}
|
424
|
-
|
425
|
-
return Qnil;
|
426
|
-
}
|
427
|
-
|
428
|
-
static VALUE rbAssertState(VALUE self, VALUE handle, VALUE sid, VALUE state) {
|
429
|
-
Check_Type(handle, T_FIXNUM);
|
430
|
-
Check_Type(sid, T_STRING);
|
431
173
|
Check_Type(state, T_STRING);
|
432
174
|
|
433
|
-
unsigned int
|
175
|
+
unsigned int stateOffset;
|
176
|
+
unsigned int result = updateState(FIX2INT(handle), RSTRING_PTR(state), &stateOffset);
|
434
177
|
if (result == RULES_OK || result == ERR_EVENT_NOT_HANDLED || result == ERR_EVENT_OBSERVED) {
|
435
|
-
return INT2FIX(
|
178
|
+
return INT2FIX(stateOffset);
|
436
179
|
} else {
|
437
180
|
if (result == ERR_OUT_OF_MEMORY) {
|
438
181
|
rb_raise(rb_eNoMemError, "Out of memory");
|
@@ -444,38 +187,13 @@ static VALUE rbAssertState(VALUE self, VALUE handle, VALUE sid, VALUE state) {
|
|
444
187
|
return Qnil;
|
445
188
|
}
|
446
189
|
|
447
|
-
static VALUE rbStartUpdateState(VALUE self, VALUE handle, VALUE actionHandle, VALUE state) {
|
448
|
-
Check_Type(handle, T_FIXNUM);
|
449
|
-
Check_Type(actionHandle, T_FIXNUM);
|
450
|
-
Check_Type(state, T_STRING);
|
451
|
-
|
452
|
-
unsigned int replyCount;
|
453
|
-
void *rulesBinding = NULL;
|
454
|
-
unsigned int result = startUpdateState(FIX2INT(handle), (void *)FIX2LONG(actionHandle), RSTRING_PTR(state), &rulesBinding, &replyCount);
|
455
|
-
if (result == RULES_OK || result == ERR_EVENT_NOT_HANDLED) {
|
456
|
-
VALUE output = rb_ary_new();
|
457
|
-
rb_ary_push(output, INT2FIX(rulesBinding));
|
458
|
-
rb_ary_push(output, INT2FIX(replyCount));
|
459
|
-
return output;
|
460
|
-
} else {
|
461
|
-
if (result == ERR_OUT_OF_MEMORY) {
|
462
|
-
rb_raise(rb_eNoMemError, "Out of memory");
|
463
|
-
} else {
|
464
|
-
rb_raise(rb_eException, "Could not start update state, error code: %d", result);
|
465
|
-
}
|
466
|
-
}
|
467
|
-
|
468
|
-
return Qnil;
|
469
|
-
}
|
470
|
-
|
471
190
|
static VALUE rbStartAction(VALUE self, VALUE handle) {
|
472
191
|
Check_Type(handle, T_FIXNUM);
|
473
192
|
|
474
193
|
char *state;
|
475
194
|
char *messages;
|
476
|
-
|
477
|
-
|
478
|
-
unsigned int result = startAction(FIX2INT(handle), &state, &messages, &actionHandle, &actionBinding);
|
195
|
+
unsigned int stateOffset;
|
196
|
+
unsigned int result = startAction(FIX2INT(handle), &state, &messages, &stateOffset);
|
479
197
|
if (result == ERR_NO_ACTION_AVAILABLE) {
|
480
198
|
return Qnil;
|
481
199
|
} else if (result != RULES_OK) {
|
@@ -489,35 +207,39 @@ static VALUE rbStartAction(VALUE self, VALUE handle) {
|
|
489
207
|
VALUE output = rb_ary_new();
|
490
208
|
rb_ary_push(output, rb_str_new2(state));
|
491
209
|
rb_ary_push(output, rb_str_new2(messages));
|
492
|
-
rb_ary_push(output, INT2FIX(
|
493
|
-
rb_ary_push(output, INT2FIX(actionBinding));
|
210
|
+
rb_ary_push(output, INT2FIX(stateOffset));
|
494
211
|
return output;
|
495
212
|
}
|
496
213
|
|
497
|
-
static VALUE
|
214
|
+
static VALUE rbStartActionForState(VALUE self, VALUE handle, VALUE stateOffset) {
|
498
215
|
Check_Type(handle, T_FIXNUM);
|
499
|
-
Check_Type(
|
500
|
-
Check_Type(state, T_STRING);
|
216
|
+
Check_Type(stateOffset, T_FIXNUM);
|
501
217
|
|
502
|
-
|
503
|
-
|
218
|
+
char *state;
|
219
|
+
char *messages;
|
220
|
+
unsigned int result = startActionForState(FIX2INT(handle), FIX2INT(stateOffset), &state, &messages);
|
221
|
+
if (result == ERR_NO_ACTION_AVAILABLE) {
|
222
|
+
return Qnil;
|
223
|
+
} else if (result != RULES_OK) {
|
504
224
|
if (result == ERR_OUT_OF_MEMORY) {
|
505
225
|
rb_raise(rb_eNoMemError, "Out of memory");
|
506
226
|
} else {
|
507
|
-
rb_raise(rb_eException, "Could not
|
227
|
+
rb_raise(rb_eException, "Could not start action, error code: %d", result);
|
508
228
|
}
|
509
229
|
}
|
510
230
|
|
511
|
-
|
231
|
+
VALUE output = rb_ary_new();
|
232
|
+
rb_ary_push(output, rb_str_new2(state));
|
233
|
+
rb_ary_push(output, rb_str_new2(messages));
|
234
|
+
return output;
|
512
235
|
}
|
513
236
|
|
514
|
-
static VALUE rbCompleteAndStartAction(VALUE self, VALUE handle, VALUE
|
237
|
+
static VALUE rbCompleteAndStartAction(VALUE self, VALUE handle, VALUE stateOffset) {
|
515
238
|
Check_Type(handle, T_FIXNUM);
|
516
|
-
Check_Type(
|
517
|
-
Check_Type(actionHandle, T_FIXNUM);
|
239
|
+
Check_Type(stateOffset, T_FIXNUM);
|
518
240
|
|
519
241
|
char *messages;
|
520
|
-
unsigned int result = completeAndStartAction(FIX2INT(handle),
|
242
|
+
unsigned int result = completeAndStartAction(FIX2INT(handle), FIX2INT(stateOffset), &messages);
|
521
243
|
if (result == ERR_NO_ACTION_AVAILABLE) {
|
522
244
|
return Qnil;
|
523
245
|
} else if (result != RULES_OK) {
|
@@ -531,12 +253,11 @@ static VALUE rbCompleteAndStartAction(VALUE self, VALUE handle, VALUE expectedRe
|
|
531
253
|
return rb_str_new2(messages);
|
532
254
|
}
|
533
255
|
|
534
|
-
|
535
|
-
static VALUE rbAbandonAction(VALUE self, VALUE handle, VALUE actionHandle) {
|
256
|
+
static VALUE rbAbandonAction(VALUE self, VALUE handle, VALUE stateOffset) {
|
536
257
|
Check_Type(handle, T_FIXNUM);
|
537
|
-
Check_Type(
|
258
|
+
Check_Type(stateOffset, T_FIXNUM);
|
538
259
|
|
539
|
-
unsigned int result = abandonAction(FIX2INT(handle), (
|
260
|
+
unsigned int result = abandonAction(FIX2INT(handle), FIX2INT(stateOffset));
|
540
261
|
if (result != RULES_OK) {
|
541
262
|
if (result == ERR_OUT_OF_MEMORY) {
|
542
263
|
rb_raise(rb_eNoMemError, "Out of memory");
|
@@ -588,11 +309,7 @@ static VALUE rbAssertTimers(VALUE self, VALUE handle) {
|
|
588
309
|
Check_Type(handle, T_FIXNUM);
|
589
310
|
|
590
311
|
unsigned int result = assertTimers(FIX2INT(handle));
|
591
|
-
if (result
|
592
|
-
return INT2FIX(1);
|
593
|
-
} else if (result == ERR_NO_TIMERS_AVAILABLE) {
|
594
|
-
return INT2FIX(0);
|
595
|
-
} else {
|
312
|
+
if (result != RULES_OK) {
|
596
313
|
if (result == ERR_OUT_OF_MEMORY) {
|
597
314
|
rb_raise(rb_eNoMemError, "Out of memory");
|
598
315
|
} else {
|
@@ -656,33 +373,18 @@ static VALUE rbRenewActionLease(VALUE self, VALUE handle, VALUE sid) {
|
|
656
373
|
|
657
374
|
void Init_rules() {
|
658
375
|
rulesModule = rb_define_module("Rules");
|
659
|
-
rb_define_singleton_method(rulesModule, "create_ruleset", rbCreateRuleset,
|
376
|
+
rb_define_singleton_method(rulesModule, "create_ruleset", rbCreateRuleset, 2);
|
660
377
|
rb_define_singleton_method(rulesModule, "delete_ruleset", rbDeleteRuleset, 1);
|
661
|
-
rb_define_singleton_method(rulesModule, "create_client", rbCreateClient, 2);
|
662
|
-
rb_define_singleton_method(rulesModule, "delete_client", rbDeleteClient, 1);
|
663
|
-
rb_define_singleton_method(rulesModule, "bind_ruleset", rbBindRuleset, 5);
|
664
|
-
rb_define_singleton_method(rulesModule, "complete", rbComplete, 2);
|
665
378
|
rb_define_singleton_method(rulesModule, "assert_event", rbAssertEvent, 2);
|
666
|
-
rb_define_singleton_method(rulesModule, "queue_assert_event", rbQueueAssertEvent, 4);
|
667
|
-
rb_define_singleton_method(rulesModule, "start_assert_event", rbStartAssertEvent, 2);
|
668
379
|
rb_define_singleton_method(rulesModule, "assert_events", rbAssertEvents, 2);
|
669
|
-
rb_define_singleton_method(rulesModule, "start_assert_events", rbStartAssertEvents, 2);
|
670
|
-
rb_define_singleton_method(rulesModule, "retract_event", rbRetractEvent, 2);
|
671
|
-
rb_define_singleton_method(rulesModule, "start_assert_fact", rbStartAssertFact, 2);
|
672
380
|
rb_define_singleton_method(rulesModule, "assert_fact", rbAssertFact, 2);
|
673
|
-
rb_define_singleton_method(rulesModule, "queue_assert_fact", rbQueueAssertFact, 4);
|
674
|
-
rb_define_singleton_method(rulesModule, "start_assert_facts", rbStartAssertFacts, 2);
|
675
381
|
rb_define_singleton_method(rulesModule, "assert_facts", rbAssertFacts, 2);
|
676
|
-
rb_define_singleton_method(rulesModule, "start_retract_fact", rbStartRetractFact, 2);
|
677
382
|
rb_define_singleton_method(rulesModule, "retract_fact", rbRetractFact, 2);
|
678
|
-
rb_define_singleton_method(rulesModule, "queue_retract_fact", rbQueueRetractFact, 4);
|
679
|
-
rb_define_singleton_method(rulesModule, "start_retract_facts", rbStartRetractFacts, 2);
|
680
383
|
rb_define_singleton_method(rulesModule, "retract_facts", rbRetractFacts, 2);
|
681
|
-
rb_define_singleton_method(rulesModule, "
|
682
|
-
rb_define_singleton_method(rulesModule, "start_update_state", rbStartUpdateState, 3);
|
384
|
+
rb_define_singleton_method(rulesModule, "update_state", rbUpdateState, 2);
|
683
385
|
rb_define_singleton_method(rulesModule, "start_action", rbStartAction, 1);
|
684
|
-
rb_define_singleton_method(rulesModule, "
|
685
|
-
rb_define_singleton_method(rulesModule, "complete_and_start_action", rbCompleteAndStartAction,
|
386
|
+
rb_define_singleton_method(rulesModule, "start_action_for_state", rbStartActionForState, 2);
|
387
|
+
rb_define_singleton_method(rulesModule, "complete_and_start_action", rbCompleteAndStartAction, 2);
|
686
388
|
rb_define_singleton_method(rulesModule, "abandon_action", rbAbandonAction, 2);
|
687
389
|
rb_define_singleton_method(rulesModule, "start_timer", rbStartTimer, 5);
|
688
390
|
rb_define_singleton_method(rulesModule, "cancel_timer", rbCancelTimer, 3);
|