BlueCollar.SQLiteRepository.UpdateScheduledJobOrder C# (CSharp) Method

UpdateScheduledJobOrder() public method

Updates the scheduled job's order number.
public UpdateScheduledJobOrder ( ScheduledJobOrderRecord record, IDbTransaction transaction ) : void
record ScheduledJobOrderRecord The scheduled job order record identifying the scheduled job to update.
transaction IDbTransaction The transaction to use, if applicable.
return void
        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);
                }
            }
        }