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

Method buildExternalAccess

src/jrd/Statement.cpp:822–888  ·  view source on GitHub ↗

Recursively walk external dependencies (procedures, triggers) for request to assemble full list of requests it depends on.

Source from the content-addressed store, hash-verified

820// Recursively walk external dependencies (procedures, triggers) for request to assemble full
821// list of requests it depends on.
822void Statement::buildExternalAccess(thread_db* tdbb, ExternalAccessList& list, const MetaName &user)
823{
824 for (ExternalAccess* item = externalList.begin(); item != externalList.end(); ++item)
825 {
826 FB_SIZE_T i;
827
828 // Add externals recursively
829 if (item->exa_action == ExternalAccess::exa_procedure)
830 {
831 jrd_prc* const procedure = MET_lookup_procedure_id(tdbb, item->exa_prc_id, false, false, 0);
832 if (procedure && procedure->getStatement())
833 {
834 item->user = procedure->invoker ? MetaName(procedure->invoker->getUserName()) : user;
835 if (list.find(*item, i))
836 continue;
837 list.insert(i, *item);
838 procedure->getStatement()->buildExternalAccess(tdbb, list, item->user);
839 }
840 }
841 else if (item->exa_action == ExternalAccess::exa_function)
842 {
843 Function* const function = Function::lookup(tdbb, item->exa_fun_id, false, false, 0);
844 if (function && function->getStatement())
845 {
846 item->user = function->invoker ? MetaName(function->invoker->getUserName()) : user;
847 if (list.find(*item, i))
848 continue;
849 list.insert(i, *item);
850 function->getStatement()->buildExternalAccess(tdbb, list, item->user);
851 }
852 }
853 else
854 {
855 jrd_rel* relation = MET_lookup_relation_id(tdbb, item->exa_rel_id, false);
856
857 if (!relation)
858 continue;
859
860 RefPtr<TrigVector> vec1, vec2;
861
862 switch (item->exa_action)
863 {
864 case ExternalAccess::exa_insert:
865 vec1 = relation->rel_pre_store;
866 vec2 = relation->rel_post_store;
867 break;
868 case ExternalAccess::exa_update:
869 vec1 = relation->rel_pre_modify;
870 vec2 = relation->rel_post_modify;
871 break;
872 case ExternalAccess::exa_delete:
873 vec1 = relation->rel_pre_erase;
874 vec2 = relation->rel_post_erase;
875 break;
876 default:
877 continue; // should never happen, silence the compiler
878 }
879

Callers 1

Calls 9

orElseMethod · 0.80
MetaNameClass · 0.70
lookupFunction · 0.50
beginMethod · 0.45
endMethod · 0.45
getStatementMethod · 0.45
getUserNameMethod · 0.45
findMethod · 0.45
insertMethod · 0.45

Tested by

no test coverage detected