| 1326 | |
| 1327 | |
| 1328 | void 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 |
nothing calls this directly
no test coverage detected