Recursively walk external dependencies (procedures, triggers) for request to assemble full list of requests it depends on.
| 820 | // Recursively walk external dependencies (procedures, triggers) for request to assemble full |
| 821 | // list of requests it depends on. |
| 822 | void 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 |
no test coverage detected