durable_rules 0.34.57 → 2.00.001
Sign up to get free protection for your applications and to get access to all the features.
- 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);
|