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

Method execute

src/jrd/ExtEngineManager.cpp:393–446  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

391 }
392
393 virtual const StmtNode* execute(thread_db* tdbb, Request* request, ExeState* exeState) const
394 {
395 impure_state* const impure = request->getImpure<impure_state>(impureOffset);
396 ExtEngineManager::ResultSet*& resultSet = request->req_ext_resultset;
397 UCHAR* extInMsg = extInMessageNode ? request->getImpure<UCHAR>(extInMessageNode->impureOffset) : NULL;
398 UCHAR* extOutMsg = extOutMessageNode ? request->getImpure<UCHAR>(extOutMessageNode->impureOffset) : NULL;
399 UCHAR* intOutMsg = intOutMessageNode ? request->getImpure<UCHAR>(intOutMessageNode->impureOffset) : NULL;
400 SSHORT* eof = intOutMsg ?
401 (SSHORT*) (intOutMsg + (IPTR) intOutMessageNode->format->fmt_desc.back().dsc_address) : NULL;
402
403 switch (request->req_operation)
404 {
405 case Request::req_evaluate:
406 impure->sta_state = 0;
407 *eof = 0;
408
409 fb_assert(!resultSet);
410 resultSet = procedure->open(tdbb, extInMsg, extOutMsg);
411
412 if (!resultSet)
413 break;
414 // fall into
415
416 case Request::req_proceed:
417 case Request::req_sync:
418 *eof = 0;
419 if (resultSet)
420 {
421 if (resultSet->fetch(tdbb) && (request->req_flags & req_proc_fetch))
422 *eof = -1;
423 else
424 {
425 delete resultSet;
426 resultSet = NULL;
427 }
428 }
429
430 impure->sta_state = 0; // suspend node
431
432 if (!*eof)
433 request->req_operation = Request::req_return;
434 else
435 request->req_operation = Request::req_sync;
436
437 break;
438
439 case Request::req_unwind:
440 delete resultSet;
441 resultSet = NULL;
442 break;
443 }
444
445 return CompoundStmtNode::execute(tdbb, request, exeState);
446 }
447
448 private:
449 MessageNode* extInMessageNode;

Callers

nothing calls this directly

Calls 4

executeFunction · 0.85
backMethod · 0.45
openMethod · 0.45
fetchMethod · 0.45

Tested by

no test coverage detected