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

Method makeFunction

src/jrd/ExtEngineManager.cpp:1328–1461  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1326
1327
1328void ExtEngineManager::makeFunction(thread_db* tdbb, CompilerScratch* csb, Jrd::Function* udf,
1329 const MetaName& engine, const string& entryPoint, const string& body)
1330{
1331 string entryPointTrimmed = entryPoint;
1332 entryPointTrimmed.trim();
1333
1334 EngineAttachmentInfo* attInfo = getEngineAttachment(tdbb, engine);
1335 const MetaString& userName = udf->invoker ? udf->invoker->getUserName() : "";
1336 ContextManager<IExternalFunction> ctxManager(tdbb, attInfo, attInfo->adminCharSet,
1337 (udf->getName().package.isEmpty() ?
1338 CallerName(obj_udf, udf->getName().identifier, userName) :
1339 CallerName(obj_package_header, udf->getName().package, userName)));
1340
1341 MemoryPool& pool = *tdbb->getAttachment()->att_pool;
1342
1343 AutoPtr<RoutineMetadata> metadata(FB_NEW_POOL(pool) RoutineMetadata(pool));
1344 metadata->package = udf->getName().package;
1345 metadata->name = udf->getName().identifier;
1346 metadata->entryPoint = entryPointTrimmed;
1347 metadata->body = body;
1348 metadata->inputParameters.assignRefNoIncr(Routine::createMetadata(udf->getInputFields(), true));
1349 metadata->outputParameters.assignRefNoIncr(Routine::createMetadata(udf->getOutputFields(), true));
1350
1351 udf->setInputFormat(Routine::createFormat(pool, metadata->inputParameters, false));
1352 udf->setOutputFormat(Routine::createFormat(pool, metadata->outputParameters, true));
1353
1354 FbLocalStatus status;
1355
1356 RefPtr<IMetadataBuilder> inBuilder(REF_NO_INCR, metadata->inputParameters->getBuilder(&status));
1357 status.check();
1358
1359 RefPtr<IMetadataBuilder> outBuilder(REF_NO_INCR, metadata->outputParameters->getBuilder(&status));
1360 status.check();
1361
1362 IExternalFunction* externalFunction;
1363 RefPtr<IMessageMetadata> extInputParameters, extOutputParameters;
1364
1365 { // scope
1366 EngineCheckout cout(tdbb, FB_FUNCTION, checkoutType(attInfo->engine));
1367
1368 externalFunction = attInfo->engine->makeFunction(&status, attInfo->context, metadata,
1369 inBuilder, outBuilder);
1370
1371 try
1372 {
1373 status.check();
1374
1375 if (!externalFunction)
1376 {
1377 status_exception::raise(
1378 Arg::Gds(isc_eem_func_not_returned) << udf->getName().toString() << engine);
1379 }
1380 }
1381 catch (const Exception&)
1382 {
1383 if (tdbb->getAttachment()->isGbak())
1384 return;
1385 else

Callers

nothing calls this directly

Calls 15

CallerNameClass · 0.85
RoutineMetadataClass · 0.85
checkoutTypeFunction · 0.85
raiseFunction · 0.85
GdsClass · 0.85
IntMessageNodeClass · 0.85
ExtMessageNodeClass · 0.85
InitOutputNodeClass · 0.85
ReceiveNodeClass · 0.85
MessageMoverNodeClass · 0.85
ExtFunctionNodeClass · 0.85
PAR_preparsed_nodeFunction · 0.85

Tested by

no test coverage detected