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

Method makeTrigger

src/jrd/ExtEngineManager.cpp:1607–1703  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1605
1606
1607void 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,

Callers 1

compileMethod · 0.45

Calls 15

CallerNameClass · 0.85
RoutineMetadataClass · 0.85
checkoutTypeFunction · 0.85
raiseFunction · 0.85
GdsClass · 0.85
ExtTriggerNodeClass · 0.85
PAR_preparsed_nodeFunction · 0.85
addItemMethod · 0.80
TriggerClass · 0.70
CompoundStmtNodeClass · 0.70
trimMethod · 0.45
c_strMethod · 0.45

Tested by

no test coverage detected