Esempio n. 1
0
        public IAsyncResult BeginAppend(
            IList <ArraySegment <byte> > data,
            SequenceNumber userRecord,
            SequenceNumber previousRecord,
            RecordAppendOptions recordAppendOptions,
            ReservationCollection reservations,
            AsyncCallback callback,
            object state)
        {
            long totalRecordSize;
            LogReservationCollection lrc;

            if ((this.store.Access & FileAccess.Write) == 0)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.NotSupported(SR.NotSupported_ReadOnly));
            }

            if (recordAppendOptions > (RecordAppendOptions.ForceAppend | RecordAppendOptions.ForceFlush) ||
                recordAppendOptions < RecordAppendOptions.None)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ArgumentOutOfRange("recordAppendOptions"));
            }

            this.store.ValidateSequenceNumber(
                ref userRecord,
                SequenceNumberConstraint.Arbitrary,
                "userRecord");
            this.store.ValidateSequenceNumber(
                ref previousRecord,
                SequenceNumberConstraint.Arbitrary,
                "previousRecord");

            totalRecordSize = ValidateData(data);
            lrc             = ValidateReservationCollection(reservations);

            EnsureMarshalContext();

            LogAppendAsyncResult result = new LogAppendAsyncResult(this,
                                                                   callback,
                                                                   state);

            result.Data                  = data;
            result.TotalRecordSize       = totalRecordSize;
            result.UserLsn               = userRecord.High;
            result.PreviousLsn           = previousRecord.High;
            result.RecordAppendOptions   = recordAppendOptions;
            result.ReservationCollection = lrc;

            result.Start();

            return(result);
        }