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

Class ExtProcedureNode

src/jrd/ExtEngineManager.cpp:373–453  ·  view source on GitHub ↗

External procedure node.

Source from the content-addressed store, hash-verified

371
372 // External procedure node.
373 class ExtProcedureNode : public CompoundStmtNode
374 {
375 public:
376 ExtProcedureNode(MemoryPool& pool, MessageNode* aExtInMessageNode, MessageNode* aExtOutMessageNode,
377 MessageNode* aIntOutMessageNode, const ExtEngineManager::Procedure* aProcedure)
378 : CompoundStmtNode(pool),
379 extInMessageNode(aExtInMessageNode),
380 extOutMessageNode(aExtOutMessageNode),
381 intOutMessageNode(aIntOutMessageNode),
382 procedure(aProcedure)
383 {
384 SuspendNode* suspend = FB_NEW_POOL(pool) SuspendNode(pool);
385 suspend->message = intOutMessageNode;
386 suspend->statement = FB_NEW_POOL(pool) MessageMoverNode(pool,
387 extOutMessageNode, intOutMessageNode, intOutMessageNode);
388
389 statements.add(suspend);
390 statements.add(FB_NEW_POOL(pool) StallNode(pool));
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

Callers 1

makeProcedureMethod · 0.85

Calls

no outgoing calls

Tested by

no test coverage detected