MCPcopy Create free account
hub / github.com/FirebirdSQL/firebird / MessageMoverNode

Class MessageMoverNode

src/jrd/ExtEngineManager.cpp:279–338  ·  view source on GitHub ↗

Move parameters from a message to another, validating theirs values.

Source from the content-addressed store, hash-verified

277
278 // Move parameters from a message to another, validating theirs values.
279 class MessageMoverNode : public CompoundStmtNode
280 {
281 public:
282 MessageMoverNode(MemoryPool& pool, MessageNode* fromMessage, MessageNode* toMessage,
283 MessageNode* aCheckMessageEof = nullptr)
284 : CompoundStmtNode(pool),
285 checkMessageEof(aCheckMessageEof)
286 {
287 // Iterate over the format items, except the EOF item.
288 for (USHORT i = 0; i < (fromMessage->format->fmt_count / 2) * 2; i += 2)
289 {
290 ParameterNode* flag = FB_NEW_POOL(pool) ParameterNode(pool);
291 flag->messageNumber = fromMessage->messageNumber;
292 flag->message = fromMessage;
293 flag->argNumber = i + 1;
294
295 ParameterNode* param = FB_NEW_POOL(pool) ParameterNode(pool);
296 param->messageNumber = fromMessage->messageNumber;
297 param->message = fromMessage;
298 param->argNumber = i;
299 param->argFlag = flag;
300
301 AssignmentNode* assign = FB_NEW_POOL(pool) AssignmentNode(pool);
302 assign->asgnFrom = param;
303 statements.add(assign);
304
305 flag = FB_NEW_POOL(pool) ParameterNode(pool);
306 flag->messageNumber = toMessage->messageNumber;
307 flag->message = toMessage;
308 flag->argNumber = i + 1;
309
310 param = FB_NEW_POOL(pool) ParameterNode(pool);
311 param->messageNumber = toMessage->messageNumber;
312 param->message = toMessage;
313 param->argNumber = i;
314 param->argFlag = flag;
315
316 assign->asgnTo = param;
317 }
318 }
319
320 const StmtNode* execute(thread_db* tdbb, Request* request, ExeState* exeState) const override
321 {
322 if (checkMessageEof &&
323 request->req_operation == Request::req_evaluate &&
324 (request->req_flags & req_proc_select))
325 {
326 const auto msg = request->getImpure<UCHAR>(checkMessageEof->impureOffset);
327 const auto eof = (SSHORT*) (msg + (IPTR) checkMessageEof->format->fmt_desc.back().dsc_address);
328
329 if (!*eof)
330 request->req_operation = Request::req_return;
331 }
332
333 return CompoundStmtNode::execute(tdbb, request, exeState);
334 }
335
336 private:

Callers 3

ExtProcedureNodeMethod · 0.85
makeFunctionMethod · 0.85
makeProcedureMethod · 0.85

Calls

no outgoing calls

Tested by

no test coverage detected