External trigger node.
| 454 | |
| 455 | // External trigger node. |
| 456 | class ExtTriggerNode final : public TypedNode<StmtNode, StmtNode::TYPE_EXT_TRIGGER> |
| 457 | { |
| 458 | public: |
| 459 | ExtTriggerNode(MemoryPool& pool, const ExtEngineManager::Trigger* aTrigger) |
| 460 | : TypedNode<StmtNode, StmtNode::TYPE_EXT_TRIGGER>(pool), |
| 461 | trigger(aTrigger) |
| 462 | { |
| 463 | } |
| 464 | |
| 465 | string internalPrint(NodePrinter& printer) const |
| 466 | { |
| 467 | StmtNode::internalPrint(printer); |
| 468 | return "ExtTriggerNode"; |
| 469 | } |
| 470 | |
| 471 | void genBlr(DsqlCompilerScratch* /*dsqlScratch*/) |
| 472 | { |
| 473 | } |
| 474 | |
| 475 | ExtTriggerNode* pass1(thread_db* /*tdbb*/, CompilerScratch* /*csb*/) |
| 476 | { |
| 477 | return this; |
| 478 | } |
| 479 | |
| 480 | ExtTriggerNode* pass2(thread_db* /*tdbb*/, CompilerScratch* /*csb*/) |
| 481 | { |
| 482 | return this; |
| 483 | } |
| 484 | |
| 485 | const StmtNode* execute(thread_db* tdbb, Request* request, ExeState* /*exeState*/) const |
| 486 | { |
| 487 | if (request->req_operation == Request::req_evaluate) |
| 488 | { |
| 489 | trigger->execute(tdbb, request, request->req_trigger_action, |
| 490 | getRpb(request, 0), getRpb(request, 1)); |
| 491 | |
| 492 | request->req_operation = Request::req_return; |
| 493 | } |
| 494 | |
| 495 | return parentStmt; |
| 496 | } |
| 497 | |
| 498 | private: |
| 499 | static record_param* getRpb(Request* request, USHORT n) |
| 500 | { |
| 501 | return request->req_rpb.getCount() > n && request->req_rpb[n].rpb_number.isValid() ? |
| 502 | &request->req_rpb[n] : NULL; |
| 503 | } |
| 504 | |
| 505 | |
| 506 | private: |
| 507 | const ExtEngineManager::Trigger* trigger; |
| 508 | }; |
| 509 | } |
| 510 | |
| 511 |