mirror of
https://github.com/ckaczor/sqltoolsservice.git
synced 2026-02-16 10:58:30 -05:00
Catch Request/Event handler errors at dispatcher level (#1610)
* Catch Request/Event handler errors at dispatcher level * Fix tests * Use Exception overload of SendError * Fix tests
This commit is contained in:
@@ -148,38 +148,31 @@ namespace Microsoft.SqlTools.ServiceLayer.Agent
|
||||
/// </summary>
|
||||
internal async Task HandleAgentJobsRequest(AgentJobsParams parameters, RequestContext<AgentJobsResult> requestContext)
|
||||
{
|
||||
try
|
||||
{
|
||||
var result = new AgentJobsResult();
|
||||
ConnectionInfo connInfo;
|
||||
ConnectionServiceInstance.TryFindConnection(
|
||||
parameters.OwnerUri,
|
||||
out connInfo);
|
||||
var result = new AgentJobsResult();
|
||||
ConnectionInfo connInfo;
|
||||
ConnectionServiceInstance.TryFindConnection(
|
||||
parameters.OwnerUri,
|
||||
out connInfo);
|
||||
|
||||
if (connInfo != null)
|
||||
{
|
||||
var serverConnection = ConnectionService.OpenServerConnection(connInfo);
|
||||
var fetcher = new JobFetcher(serverConnection);
|
||||
var filter = new JobActivityFilter();
|
||||
var jobs = fetcher.FetchJobs(filter);
|
||||
var agentJobs = new List<AgentJobInfo>();
|
||||
if (jobs != null)
|
||||
{
|
||||
foreach (var job in jobs.Values)
|
||||
{
|
||||
agentJobs.Add(AgentUtilities.ConvertToAgentJobInfo(job));
|
||||
}
|
||||
}
|
||||
result.Success = true;
|
||||
result.Jobs = agentJobs.ToArray();
|
||||
serverConnection.SqlConnectionObject.Close();
|
||||
}
|
||||
await requestContext.SendResult(result);
|
||||
}
|
||||
catch (Exception e)
|
||||
if (connInfo != null)
|
||||
{
|
||||
await requestContext.SendError(e);
|
||||
var serverConnection = ConnectionService.OpenServerConnection(connInfo);
|
||||
var fetcher = new JobFetcher(serverConnection);
|
||||
var filter = new JobActivityFilter();
|
||||
var jobs = fetcher.FetchJobs(filter);
|
||||
var agentJobs = new List<AgentJobInfo>();
|
||||
if (jobs != null)
|
||||
{
|
||||
foreach (var job in jobs.Values)
|
||||
{
|
||||
agentJobs.Add(AgentUtilities.ConvertToAgentJobInfo(job));
|
||||
}
|
||||
}
|
||||
result.Success = true;
|
||||
result.Jobs = agentJobs.ToArray();
|
||||
serverConnection.SqlConnectionObject.Close();
|
||||
}
|
||||
await requestContext.SendResult(result);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -187,79 +180,72 @@ namespace Microsoft.SqlTools.ServiceLayer.Agent
|
||||
/// </summary>
|
||||
internal async Task HandleJobHistoryRequest(AgentJobHistoryParams parameters, RequestContext<AgentJobHistoryResult> requestContext)
|
||||
{
|
||||
try
|
||||
var result = new AgentJobHistoryResult();
|
||||
ConnectionInfo connInfo;
|
||||
ConnectionServiceInstance.TryFindConnection(
|
||||
parameters.OwnerUri,
|
||||
out connInfo);
|
||||
if (connInfo != null)
|
||||
{
|
||||
var result = new AgentJobHistoryResult();
|
||||
ConnectionInfo connInfo;
|
||||
ConnectionServiceInstance.TryFindConnection(
|
||||
parameters.OwnerUri,
|
||||
out connInfo);
|
||||
if (connInfo != null)
|
||||
CDataContainer dataContainer = CDataContainer.CreateDataContainer(connInfo, databaseExists: true);
|
||||
var jobServer = dataContainer.Server.JobServer;
|
||||
var jobs = jobServer.Jobs;
|
||||
Tuple<SqlConnectionInfo, DataTable, ServerConnection> tuple = CreateSqlConnection(connInfo, parameters.JobId);
|
||||
SqlConnectionInfo sqlConnInfo = tuple.Item1;
|
||||
DataTable dt = tuple.Item2;
|
||||
ServerConnection connection = tuple.Item3;
|
||||
|
||||
// Send Steps, Alerts and Schedules with job history in background
|
||||
// Add steps to the job if any
|
||||
JobStepCollection steps = jobs[parameters.JobName].JobSteps;
|
||||
var jobSteps = new List<AgentJobStepInfo>();
|
||||
foreach (JobStep step in steps)
|
||||
{
|
||||
CDataContainer dataContainer = CDataContainer.CreateDataContainer(connInfo, databaseExists: true);
|
||||
var jobServer = dataContainer.Server.JobServer;
|
||||
var jobs = jobServer.Jobs;
|
||||
Tuple<SqlConnectionInfo, DataTable, ServerConnection> tuple = CreateSqlConnection(connInfo, parameters.JobId);
|
||||
SqlConnectionInfo sqlConnInfo = tuple.Item1;
|
||||
DataTable dt = tuple.Item2;
|
||||
ServerConnection connection = tuple.Item3;
|
||||
|
||||
// Send Steps, Alerts and Schedules with job history in background
|
||||
// Add steps to the job if any
|
||||
JobStepCollection steps = jobs[parameters.JobName].JobSteps;
|
||||
var jobSteps = new List<AgentJobStepInfo>();
|
||||
foreach (JobStep step in steps)
|
||||
{
|
||||
jobSteps.Add(AgentUtilities.ConvertToAgentJobStepInfo(step, parameters.JobId, parameters.JobName));
|
||||
}
|
||||
result.Steps = jobSteps.ToArray();
|
||||
|
||||
// Add schedules to the job if any
|
||||
JobScheduleCollection schedules = jobs[parameters.JobName].JobSchedules;
|
||||
var jobSchedules = new List<AgentScheduleInfo>();
|
||||
foreach (JobSchedule schedule in schedules)
|
||||
{
|
||||
jobSchedules.Add(AgentUtilities.ConvertToAgentScheduleInfo(schedule));
|
||||
}
|
||||
result.Schedules = jobSchedules.ToArray();
|
||||
|
||||
// Alerts
|
||||
AlertCollection alerts = jobServer.Alerts;
|
||||
var jobAlerts = new List<Alert>();
|
||||
foreach (Alert alert in alerts)
|
||||
{
|
||||
if (alert.JobName == parameters.JobName)
|
||||
{
|
||||
jobAlerts.Add(alert);
|
||||
}
|
||||
}
|
||||
result.Alerts = AgentUtilities.ConvertToAgentAlertInfo(jobAlerts);
|
||||
|
||||
// Add histories
|
||||
int count = dt.Rows.Count;
|
||||
List<AgentJobHistoryInfo> jobHistories = new List<AgentJobHistoryInfo>();
|
||||
if (count > 0)
|
||||
{
|
||||
var job = dt.Rows[0];
|
||||
Guid jobId = (Guid)job[AgentUtilities.UrnJobId];
|
||||
int runStatus = Convert.ToInt32(job[AgentUtilities.UrnRunStatus], System.Globalization.CultureInfo.InvariantCulture);
|
||||
var t = new LogSourceJobHistory(parameters.JobName, sqlConnInfo, null, runStatus, jobId, null);
|
||||
var tlog = t as ILogSource;
|
||||
tlog.Initialize();
|
||||
var logEntries = t.LogEntries;
|
||||
|
||||
// Finally add the job histories
|
||||
jobHistories = AgentUtilities.ConvertToAgentJobHistoryInfo(logEntries, job, steps);
|
||||
result.Histories = jobHistories.ToArray();
|
||||
result.Success = true;
|
||||
tlog.CloseReader();
|
||||
}
|
||||
await requestContext.SendResult(result);
|
||||
jobSteps.Add(AgentUtilities.ConvertToAgentJobStepInfo(step, parameters.JobId, parameters.JobName));
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
await requestContext.SendError(e);
|
||||
result.Steps = jobSteps.ToArray();
|
||||
|
||||
// Add schedules to the job if any
|
||||
JobScheduleCollection schedules = jobs[parameters.JobName].JobSchedules;
|
||||
var jobSchedules = new List<AgentScheduleInfo>();
|
||||
foreach (JobSchedule schedule in schedules)
|
||||
{
|
||||
jobSchedules.Add(AgentUtilities.ConvertToAgentScheduleInfo(schedule));
|
||||
}
|
||||
result.Schedules = jobSchedules.ToArray();
|
||||
|
||||
// Alerts
|
||||
AlertCollection alerts = jobServer.Alerts;
|
||||
var jobAlerts = new List<Alert>();
|
||||
foreach (Alert alert in alerts)
|
||||
{
|
||||
if (alert.JobName == parameters.JobName)
|
||||
{
|
||||
jobAlerts.Add(alert);
|
||||
}
|
||||
}
|
||||
result.Alerts = AgentUtilities.ConvertToAgentAlertInfo(jobAlerts);
|
||||
|
||||
// Add histories
|
||||
int count = dt.Rows.Count;
|
||||
List<AgentJobHistoryInfo> jobHistories = new List<AgentJobHistoryInfo>();
|
||||
if (count > 0)
|
||||
{
|
||||
var job = dt.Rows[0];
|
||||
Guid jobId = (Guid)job[AgentUtilities.UrnJobId];
|
||||
int runStatus = Convert.ToInt32(job[AgentUtilities.UrnRunStatus], System.Globalization.CultureInfo.InvariantCulture);
|
||||
var t = new LogSourceJobHistory(parameters.JobName, sqlConnInfo, null, runStatus, jobId, null);
|
||||
var tlog = t as ILogSource;
|
||||
tlog.Initialize();
|
||||
var logEntries = t.LogEntries;
|
||||
|
||||
// Finally add the job histories
|
||||
jobHistories = AgentUtilities.ConvertToAgentJobHistoryInfo(logEntries, job, steps);
|
||||
result.Histories = jobHistories.ToArray();
|
||||
result.Success = true;
|
||||
tlog.CloseReader();
|
||||
}
|
||||
await requestContext.SendResult(result);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user