void TraceManager::update_session(const TraceSession& session) { // if this session is already known, nothing to do FB_SIZE_T pos; if (trace_sessions.find(session.ses_id, pos)) { return; } // if this session is not from administrator, it may trace connections // only created by the same user if (!(session.ses_flags & trs_admin)) { if (attachment) { if (!attachment->att_user || attachment->att_user->usr_user_name != session.ses_user) return; } else if (service) { if (session.ses_user != service->getUserName()) return; } else { // failed attachment attempts traced by admin trace only return; } } MasterInterfacePtr master; for (FactoryInfo* info = factories->begin(); info != factories->end(); ++info) { TraceInitInfoImpl attachInfo(session, attachment, filename); LocalStatus status; ITracePlugin* plugin = info->factory->trace_create(&status, &attachInfo); if (plugin) { plugin->addRef(); SessionInfo sesInfo; sesInfo.plugin = plugin; sesInfo.factory_info = info; sesInfo.ses_id = session.ses_id; trace_sessions.add(sesInfo); trace_needs |= info->factory->trace_needs(); } else if (status.getStatus() & IStatus::FB_HAS_ERRORS) { string header; header.printf("Trace plugin %s returned error on call trace_create.", info->name); iscLogStatus(header.c_str(), &status); } } }