TracePlugin* FB_CARG TraceFactoryImpl::trace_create(Firebird::IStatus* status, TraceInitInfo* initInfo) { Firebird::MasterInterfacePtr master; const char* dbname = NULL; try { master->upgradeInterface(initInfo, FB_TRACE_INIT_INFO_VERSION, upInfo); dbname = initInfo->getDatabaseName(); if (!dbname) dbname = ""; TracePluginConfig config; TraceCfgReader::readTraceConfiguration(initInfo->getConfigText(), dbname, config); TraceDatabaseConnection* connection = initInfo->getConnection(); if (connection) master->upgradeInterface(connection, FB_TRACE_CONNECTION_VERSION, upInfo); if (!config.enabled || (config.connection_id && connection && (connection->getConnectionID() != SLONG(config.connection_id)))) { return NULL; // Plugin is not needed, no error happened. } Firebird::AutoPtr<TraceLogWriter, Firebird::SimpleRelease<TraceLogWriter> > logWriter(initInfo->getLogWriter()); if (logWriter) config.log_filename = ""; return new TracePluginImpl(config, initInfo); // Everything is ok, we created a plugin } catch (Firebird::Exception& ex) { // put error into trace log TraceLogWriter* logWriter = initInfo->getLogWriter(); if (logWriter) { master->upgradeInterface(logWriter, FB_TRACE_LOG_WRITER_VERSION, upInfo); const char* strEx = TracePluginImpl::marshal_exception(ex); Firebird::string err; if (dbname) err.printf("Error creating trace session for database \"%s\":\n%s\n", dbname, strEx); else err.printf("Error creating trace session for service manager attachment:\n%s\n", strEx); logWriter->write(err.c_str(), err.length()); logWriter->release(); } else ex.stuffException(status); } return NULL; }