コード例 #1
0
 internal RecordEnumerable(LogRecordSequence recordSequence,
                           CLFS_CONTEXT_MODE mode,
                           ulong startLsn)
 {
     this.recordSequence = recordSequence;
     this.mode           = mode;
     this.startLsn       = startLsn;
 }
コード例 #2
0
        internal LogLogRecordEnumerator(LogRecordSequence recordSequence,
                                        CLFS_CONTEXT_MODE mode,
                                        ulong startLsn)
        {
            this.recordSequence = recordSequence;
            this.mode           = mode;
            this.startLsn       = startLsn;

            this.syncRoot = new object();
            this.state    = State.BeforeFirst;
        }
コード例 #3
0
        public static bool ReadLogRecordSync(SafeMarshalContext pvMarshal,
                                             [In] ref ulong plsnFirst,
                                             CLFS_CONTEXT_MODE ecxMode,
                                             out byte* ppvReadBuffer,
                                             out int pcbReadBuffer,
                                             out byte peRecordType,
                                             out ulong plsnUndoNext,
                                             out ulong plsnPrevious,
                                             out SafeReadContext ppvReadContext)
        {
            if (!_ReadLogRecord(pvMarshal,
                                ref plsnFirst,
                                ecxMode,
                                out ppvReadBuffer,
                                out pcbReadBuffer,
                                out peRecordType,
                                out plsnUndoNext,
                                out plsnPrevious,
                                out ppvReadContext,
                                null))
            {
                uint errorCode = (uint)Marshal.GetLastWin32Error();
                Utility.CloseInvalidOutSafeHandle(ppvReadContext);
                ppvReadContext = null;
                if (errorCode == Error.ERROR_IO_PENDING)
                {
                    // The CLFS API was called with a NULL overlapped, so the operation should not be asynchronous.
                    // This means that CLFS has a bug, so it is not safe to continue processing.
                    DiagnosticUtility.FailFast("No async in ReadLogRecordSync");
                }
                switch (errorCode)
                {
                    case Error.ERROR_HANDLE_EOF:
                        return false;

                    case Error.ERROR_NOT_FOUND:
                    case Error.ERROR_LOG_START_OF_LOG:
                    case Error.ERROR_LOG_BLOCK_INVALID:
                        throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ArgumentInvalid(SR.Argument_InvalidStartSequenceNumber));

                    case Error.ERROR_LOG_BLOCK_INCOMPLETE:
                    case Error.ERROR_INVALID_HANDLE:
                    case Error.ERROR_ACCESS_DENIED:
                    case Error.ERROR_INVALID_PARAMETER:
                    case Error.ERROR_IO_DEVICE:
                        throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ExceptionForKnownCode(errorCode));

                    default:
                        throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ExceptionForUnknownCode(errorCode));
                }
            }

            return true;
        }
コード例 #4
0
 extern static bool _ReadLogRecord(
     SafeMarshalContext pvMarshal,
     [In] ref ulong plsnFirst,
     CLFS_CONTEXT_MODE ecxMode,
     out byte* ppvReadBuffer,
     out int pcbReadBuffer,
     out byte peRecordType,
     out ulong plsnUndoNext,
     out ulong plsnPrevious,
     out SafeReadContext ppvReadContext,
     NativeOverlapped* pOverlapped);