示例#1
0
        public Boolean TryGetLatest(ChargingReservation_Id Id,
                                    out ChargingReservation LatestReservation)
        {
            if (InternalData.TryGetValue(Id, out ChargingReservationCollection ReservationCollection))
            {
                LatestReservation = ReservationCollection.LastOrDefault();
                return(true);
            }

            LatestReservation = null;
            return(false);
        }
示例#2
0
 /// <summary>
 /// Reserves and appends a set of records.
 /// </summary>
 /// <param name="sequence">The log record sequence.</param>
 /// <param name="data">Byte array segments that will be concatenated and appended as the record.</param>
 /// <param name="newBaseSeqNum">The new base sequence number. The specified sequence number must be greater than or equal to the current base sequence number.</param>
 /// <param name="reservationCollection">The reservation collection to make reservations in.</param>
 /// <returns>The sequence number of the appended log record.</returns>
 public static Task <SequenceNumber> WriteRestartArea(
     this LogRecordSequence sequence,
     IList <ArraySegment <byte> > data,
     SequenceNumber newBaseSeqNum,
     ReservationCollection reservationCollection)
 {
     return
         (Task.Factory.FromAsync(
              (callback, state) =>
              ((LogRecordSequence)state).BeginWriteRestartArea(
                  data,
                  newBaseSeqNum,
                  reservationCollection,
                  callback,
                  state),
              sequence.EndWriteRestartArea,
              sequence));
 }
示例#3
0
 public static Task <SequenceNumber> AppendAsync(
     this LogRecordSequence sequence,
     IList <ArraySegment <byte> > data,
     SequenceNumber userRecord,
     SequenceNumber previousRecord,
     RecordAppendOptions recordAppendOptions,
     ReservationCollection reservationCollection)
 {
     return
         (Task.Factory.FromAsync(
              (callback, state) =>
              ((LogRecordSequence)state).BeginAppend(
                  data,
                  userRecord,
                  previousRecord,
                  recordAppendOptions,
                  reservationCollection,
                  callback,
                  state),
              sequence.EndAppend,
              sequence));
 }
 public static Task<SequenceNumber> AppendAsync(
     this LogRecordSequence sequence,
     IList<ArraySegment<byte>> data,
     SequenceNumber userRecord,
     SequenceNumber previousRecord,
     RecordAppendOptions recordAppendOptions,
     ReservationCollection reservationCollection)
 {
     return
         Task.Factory.FromAsync(
             (callback, state) =>
             ((LogRecordSequence)state).BeginAppend(
                 data,
                 userRecord,
                 previousRecord,
                 recordAppendOptions,
                 reservationCollection,
                 callback,
                 state),
             sequence.EndAppend,
             sequence);
 }
示例#5
0
        public SequenceNumber WriteRestartArea(
            IList<ArraySegment<byte>> data,
            SequenceNumber newBaseSeqNum,
            ReservationCollection reservations)
        {
            long size = 0;

            if (data == null)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ArgumentNull("data"));
            }

            if (reservations == null)
                return WriteRestartArea(data, newBaseSeqNum);

            FileReservationCollection reservationCollection = reservations as FileReservationCollection;

            if (reservationCollection == null || !reservationCollection.IsMyCollection(this))
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ArgumentInvalid(SR.LogRecSeq_InvalidReservationCollection));
            }

            for (int i = 0; i < data.Count; i++)
            {
                size = checked(size + data[i].Count);
            }
            long reservation = reservationCollection.GetBestMatchingReservation(size);

            if (reservation < 0)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ReservationNotFound());
            }

            bool throwing = true;
            try
            {
                SequenceNumber returnValue = WriteRestartArea(data, newBaseSeqNum);
                throwing = false;
                return returnValue;
            }
            finally
            {
                if (throwing)
                {
                    reservationCollection.Add(reservation);
                }
            }
        }
示例#6
0
 public SequenceNumber WriteRestartArea(
     ArraySegment<byte> data,
     SequenceNumber newBaseSeqNum,
     ReservationCollection reservations)
 {
     return WriteRestartArea(new ArraySegment<byte>[] { data },
                             newBaseSeqNum,
                             reservations);
 }
示例#7
0
        public SequenceNumber ReserveAndAppend(
            IList<ArraySegment<byte>> data,
            SequenceNumber nextUndoRecord,
            SequenceNumber previousRecord,
            RecordAppendOptions recordAppendOptions,
            ReservationCollection reservationCollection,
            params long[] reservations)
        {

            if (reservationCollection == null)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ArgumentNull("reservationCollection"));
            }

            if (reservations == null)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ArgumentNull("reservations"));
            }

            FileReservationCollection fileResCollection = null;

            fileResCollection = reservationCollection as FileReservationCollection;
            if (fileResCollection == null || !fileResCollection.IsMyCollection(this))
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ArgumentInvalid(SR.LogRecSeq_InvalidReservationCollection));
            }

            foreach (long reservationSize in reservations)
            {
                if (reservationSize < 0)
                    throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ArgumentOutOfRange("reservations"));
            }

            foreach (long reservationSize in reservations)
            {
                fileResCollection.Add(reservationSize);
            }

            bool throwing = true;
            try
            {
                SequenceNumber returnValue = Append(data, nextUndoRecord, previousRecord, recordAppendOptions);
                throwing = false;
                return returnValue;
            }
            finally
            {
                if (throwing && fileResCollection != null)
                {
                    foreach (long reservationSize in reservations)
                    {
                        fileResCollection.Remove(reservationSize);
                    }
                }
            }
        }
示例#8
0
 public SequenceNumber ReserveAndAppend(
     ArraySegment<byte> data,
     SequenceNumber nextUndoRecord,
     SequenceNumber previousRecord,
     RecordAppendOptions recordAppendOptions,
     ReservationCollection reservationCollection,
     params long[] reservations)
 {
     return ReserveAndAppend(new ArraySegment<byte>[] { data },
                             nextUndoRecord,
                             previousRecord,
                             recordAppendOptions,
                             reservationCollection,
                             reservations);
 }
示例#9
0
 public IAsyncResult BeginWriteRestartArea(
     IList<ArraySegment<byte>> data,
     SequenceNumber newBaseSeqNum,
     ReservationCollection reservation,
     AsyncCallback callback,
     object state)
 {
     SequenceNumber result = WriteRestartArea(data, newBaseSeqNum, reservation);
     return new FileRecordSequenceCompletedAsyncResult(result, callback, state, Work.WriteRestartArea);
 }
示例#10
0
 public IAsyncResult BeginWriteRestartArea(
     ArraySegment<byte> data,
     SequenceNumber newBaseSeqNum,
     ReservationCollection reservation,
     AsyncCallback callback,
     object state)
 {
     return BeginWriteRestartArea(new ArraySegment<byte>[] { data },
                                  newBaseSeqNum,
                                  reservation,
                                  callback,
                                  state);
 }
示例#11
0
        public IAsyncResult BeginReserveAndAppend(
            IList<ArraySegment<byte>> data,
            SequenceNumber nextUndoRecord,
            SequenceNumber previousRecord,
            RecordAppendOptions recordAppendOptions,
            ReservationCollection reservationCollection,
            long[] reservations,
            AsyncCallback callback,
            object state)
        {
            SequenceNumber result = ReserveAndAppend(data,
                                                      nextUndoRecord,
                                                      previousRecord,
                                                      recordAppendOptions,
                                                      reservationCollection,
                                                      reservations);

            return new FileRecordSequenceCompletedAsyncResult(result, callback, state, Work.ReserveAndAppend);
        }
示例#12
0
 public IAsyncResult BeginReserveAndAppend(
     ArraySegment<byte> data,
     SequenceNumber nextUndoRecord,
     SequenceNumber previousRecord,
     RecordAppendOptions recordAppendOptions,
     ReservationCollection reservationCollection,
     long[] reservations,
     AsyncCallback callback,
     object state)
 {
     return BeginReserveAndAppend(new ArraySegment<byte>[] { data },
                                  nextUndoRecord,
                                  previousRecord,
                                  recordAppendOptions,
                                  reservationCollection,
                                  reservations,
                                  callback,
                                  state);
 }
示例#13
0
        public SequenceNumber Append(
            IList<ArraySegment<byte>> data,
            SequenceNumber nextUndoRecord,
            SequenceNumber previousRecord,
            RecordAppendOptions recordAppendOptions,
            ReservationCollection reservations)
        {
            int size = 0;

            if (reservations == null)
            {
                return Append(data, nextUndoRecord, previousRecord, recordAppendOptions);
            }

            if (data == null)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ArgumentNull("data"));
            }

            FileReservationCollection reservationCollection = reservations as FileReservationCollection;

            if (reservationCollection == null || !reservationCollection.IsMyCollection(this))
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ArgumentInvalid(SR.LogRecSeq_InvalidReservationCollection));
            }

            for (int i = 0; i < data.Count; i++)
            {
                size += data[i].Count;
            }

            long reservation = reservationCollection.GetBestMatchingReservation(size);

            if (reservation < 0)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ReservationNotFound());
            }

            bool throwing = true;
            try
            {
                SequenceNumber returnValue = this.Append(data, nextUndoRecord, previousRecord, recordAppendOptions);
                throwing = false;
                return returnValue;
            }
            finally
            {
                if (throwing)
                {
                    reservationCollection.Add(reservation);
                }
            }
        }
 /// <summary>
 /// Reserves and appends a set of records.
 /// </summary>
 /// <param name="sequence">The log record sequence.</param>
 /// <param name="data">Byte array segments that will be concatenated and appended as the record.</param>
 /// <param name="newBaseSeqNum">The new base sequence number. The specified sequence number must be greater than or equal to the current base sequence number.</param>
 /// <param name="reservationCollection">The reservation collection to make reservations in.</param>
 /// <returns>The sequence number of the appended log record.</returns>
 public static Task<SequenceNumber> WriteRestartArea(
     this LogRecordSequence sequence,
     IList<ArraySegment<byte>> data,
     SequenceNumber newBaseSeqNum,
     ReservationCollection reservationCollection)
 {
     return
         Task.Factory.FromAsync(
             (callback, state) =>
             ((LogRecordSequence)state).BeginWriteRestartArea(
                 data,
                 newBaseSeqNum,
                 reservationCollection,
                 callback,
                 state),
             sequence.EndWriteRestartArea,
             sequence);
 }