| 882 | |
| 883 | |
| 884 | ExtEngineManager::Trigger::Trigger(thread_db* tdbb, MemoryPool& pool, CompilerScratch* csb, |
| 885 | ExtEngineManager* aExtManager, IExternalEngine* aEngine, RoutineMetadata* aMetadata, |
| 886 | IExternalTrigger* aTrigger, const Jrd::Trigger* aTrg) |
| 887 | : ExtRoutine(tdbb, aExtManager, aEngine, aMetadata), |
| 888 | computedStatements(pool), |
| 889 | trigger(aTrigger), |
| 890 | trg(aTrg), |
| 891 | fieldsPos(pool), |
| 892 | varDecls(pool), |
| 893 | computedCount(0) |
| 894 | { |
| 895 | jrd_rel* relation = trg->relation; |
| 896 | |
| 897 | if (relation) |
| 898 | { |
| 899 | GenericMap<Left<MetaName, USHORT> > fieldsMap; |
| 900 | |
| 901 | for (FB_SIZE_T i = 0; i < relation->rel_fields->count(); ++i) |
| 902 | { |
| 903 | jrd_fld* field = (*relation->rel_fields)[i]; |
| 904 | |
| 905 | if (field) |
| 906 | fieldsMap.put(field->fld_name, (USHORT) i); |
| 907 | } |
| 908 | |
| 909 | format = Routine::createFormat(pool, metadata->triggerFields, false); |
| 910 | |
| 911 | FbLocalStatus status; |
| 912 | |
| 913 | for (unsigned i = 0; i < format->fmt_count / 2u; ++i) |
| 914 | { |
| 915 | const char* fieldName = metadata->triggerFields->getField(&status, i); |
| 916 | status.check(); |
| 917 | |
| 918 | USHORT pos; |
| 919 | |
| 920 | if (!fieldsMap.get(fieldName, pos)) |
| 921 | fb_assert(false); |
| 922 | else |
| 923 | fieldsPos.add(pos); |
| 924 | } |
| 925 | |
| 926 | setupComputedFields(tdbb, pool, csb); |
| 927 | } |
| 928 | } |
| 929 | |
| 930 | |
| 931 | ExtEngineManager::Trigger::~Trigger() |