| 1605 | |
| 1606 | |
| 1607 | void ExtEngineManager::makeTrigger(thread_db* tdbb, CompilerScratch* csb, Jrd::Trigger* trg, |
| 1608 | const MetaName& engine, const string& entryPoint, const string& body, |
| 1609 | unsigned type) |
| 1610 | { |
| 1611 | string entryPointTrimmed = entryPoint; |
| 1612 | entryPointTrimmed.trim(); |
| 1613 | |
| 1614 | EngineAttachmentInfo* attInfo = getEngineAttachment(tdbb, engine); |
| 1615 | const MetaString& userName = trg->ssDefiner.specified && trg->ssDefiner.value ? trg->owner.c_str() : ""; |
| 1616 | ContextManager<IExternalTrigger> ctxManager(tdbb, attInfo, attInfo->adminCharSet, |
| 1617 | CallerName(obj_trigger, trg->name, userName)); |
| 1618 | |
| 1619 | MemoryPool& pool = *tdbb->getAttachment()->att_pool; |
| 1620 | |
| 1621 | AutoPtr<RoutineMetadata> metadata(FB_NEW_POOL(pool) RoutineMetadata(pool)); |
| 1622 | metadata->name = trg->name; |
| 1623 | metadata->entryPoint = entryPointTrimmed; |
| 1624 | metadata->body = body; |
| 1625 | metadata->triggerType = type; |
| 1626 | |
| 1627 | jrd_rel* relation = trg->relation; |
| 1628 | |
| 1629 | if (relation) |
| 1630 | { |
| 1631 | metadata->triggerTable = relation->rel_name; |
| 1632 | |
| 1633 | MsgMetadata* fieldsMsg = FB_NEW MsgMetadata; |
| 1634 | metadata->triggerFields = fieldsMsg; |
| 1635 | |
| 1636 | Format* relFormat = relation->rel_current_format; |
| 1637 | |
| 1638 | for (FB_SIZE_T i = 0; i < relation->rel_fields->count(); ++i) |
| 1639 | { |
| 1640 | jrd_fld* field = (*relation->rel_fields)[i]; |
| 1641 | if (field) |
| 1642 | { |
| 1643 | dsc d(relFormat->fmt_desc[i]); |
| 1644 | fieldsMsg->addItem(field->fld_name, !field->fld_not_null, d); |
| 1645 | } |
| 1646 | } |
| 1647 | } |
| 1648 | |
| 1649 | FbLocalStatus status; |
| 1650 | |
| 1651 | RefPtr<IMetadataBuilder> fieldsBuilder(REF_NO_INCR, relation ? |
| 1652 | metadata->triggerFields->getBuilder(&status) : NULL); |
| 1653 | if (relation) |
| 1654 | { |
| 1655 | status.check(); |
| 1656 | } |
| 1657 | |
| 1658 | IExternalTrigger* externalTrigger; |
| 1659 | |
| 1660 | { // scope |
| 1661 | EngineCheckout cout(tdbb, FB_FUNCTION, checkoutType(attInfo->engine)); |
| 1662 | |
| 1663 | FbLocalStatus status; |
| 1664 | externalTrigger = attInfo->engine->makeTrigger(&status, attInfo->context, metadata, |
no test coverage detected