public void UpdateScheduledJobOrder(ScheduledJobOrderRecord record, IDbTransaction transaction)
{
const string QuerySql =
@"SELECT [Number]
FROM [BlueCollarScheduledJob]
WHERE
[ScheduleId] = @ScheduleId
AND [Id] = @Id;
SELECT MAX([Number]) AS [Max]
FROM [BlueCollarScheduledJob]
WHERE
[ScheduleId] = @ScheduleId;";
const string UpdateSql =
@"UPDATE [BlueCollarScheduledJob]
SET
[Number] = @Number
WHERE
[ScheduleId] = @ScheduleId
AND [Id] = @Id;";
const string IncrementSql =
@"UPDATE [BlueCollarScheduledJob]
SET
[Number] = [Number] + 1
WHERE
[ScheduleId] = @ScheduleId
AND [Id] <> @Id
AND [Number] < @Current
AND [Number] >= @Number;";
const string DecrementSql =
@"UPDATE [BlueCollarScheduledJob]
SET
[Number] = [Number] - 1
WHERE
[ScheduleId] = @ScheduleId
AND [Id] <> @Id
AND [Number] > @Current
AND [Number] <= @Number;";
if (record == null)
{
throw new ArgumentNullException("record", "record cannot be null.");
}
long number = record.Number, current, max;
using (var multi = this.connection.QueryMultiple(QuerySql, new { ScheduleId = record.ScheduleId, Id = record.Id }, transaction, null, null))
{
current = multi.Read<long>().FirstOrDefault();
max = multi.Read<long>().FirstOrDefault();
}
if (current > 0)
{
if (number > max)
{
number = max;
}
if (number != current)
{
StringBuilder update = new StringBuilder(UpdateSql);
update.Append("\n\n");
if (number > current)
{
update.Append(DecrementSql);
}
else
{
update.Append(IncrementSql);
}
this.connection.Execute(
update.ToString(),
new
{
ScheduleId = record.ScheduleId,
Id = record.Id,
Current = current,
Number = number
},
transaction,
null,
null);
}
}
}