Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / WCF / Log / System / IO / Log / SimpleFileLog.cs / 1305376 / SimpleFileLog.cs
//------------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
//-----------------------------------------------------------------------------
namespace System.IO.Log
{
using System;
using System.Runtime.InteropServices;
using System.Runtime.InteropServices.ComTypes;
internal class SimpleFileLog
{
SmuggledIUnknown smuggledLog;
internal SimpleFileLog(string absolutePath, int size)
{
// Open the log.
// First, we try to open an existing log-- if that doesn't
// work, we create a new one.
//
bool loaded = false;
ILog log = (ILog)new SimpleFileBasedLog();
try
{
if (File.Exists(absolutePath))
{
try
{
IPersistFile ipf = (IPersistFile)log;
ipf.Load(absolutePath, (int)STGM.ReadWrite);
loaded = true;
}
catch (FileNotFoundException)
{
// File not found, create a new one.
}
}
if (!loaded)
{
// File does not exist. Attempt to create a new one,
// with the specified size.
//
IFileBasedLogInit logInit = (IFileBasedLogInit)log;
logInit.InitNew(absolutePath, size);
}
log.SetAccessPolicyHint(RECORD_READING_POLICY.RANDOM);
this.smuggledLog = new SmuggledIUnknown(log);
}
catch (COMException exception)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ConvertKnownException(exception));
}
catch(FileNotFoundException)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentException(SR.GetString(SR.Argument_FileNameInvalid)));
}
finally
{
SafeRelease(log);
}
}
static void SafeRelease(object obj)
{
if (obj != null)
{
Marshal.FinalReleaseComObject(obj);
}
}
internal void Close()
{
if(!this.smuggledLog.IsInvalid)
{
ILog log = (ILog)(this.smuggledLog.Smuggle());
try
{
this.smuggledLog.Close();
}
catch (COMException exception)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ConvertKnownException(exception));
}
finally
{
SafeRelease(log);
}
}
}
internal void TruncatePrefix(SequenceNumber seqNumber)
{
if(this.smuggledLog.IsInvalid)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ObjectDisposed());
}
ILog log = (ILog)(this.smuggledLog.Smuggle());
try
{
log.TruncatePrefix(seqNumber.High);
}
catch (COMException exception)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ConvertKnownException(exception));
}
finally
{
SafeRelease(log);
}
}
internal void Force(SequenceNumber seqNumber)
{
if(this.smuggledLog.IsInvalid)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ObjectDisposed());
}
ILog log = (ILog)(this.smuggledLog.Smuggle());
try
{
log.Force(seqNumber.High);
}
catch (COMException exception)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ConvertKnownException(exception));
}
finally
{
SafeRelease(log);
}
}
internal void GetLogLimits(out SequenceNumber first, out SequenceNumber last)
{
ulong lsnfirst = 0;
ulong lsnlast = 0;
if(this.smuggledLog.IsInvalid)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ObjectDisposed());
}
ILog log = (ILog)(this.smuggledLog.Smuggle());
try
{
log.GetLogLimits(out lsnfirst, out lsnlast);
}
catch (COMException exception)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ConvertKnownException(exception));
}
finally
{
SafeRelease(log);
}
first = new SequenceNumber(lsnfirst);
last = new SequenceNumber(lsnlast);
}
internal SequenceNumber AppendRecord(UnmanagedBlob[] data, bool fForceNow)
{
ulong recordLsn = 0;
if(this.smuggledLog.IsInvalid)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ObjectDisposed());
}
ILog log = (ILog)(this.smuggledLog.Smuggle());
try
{
// Due to WinSE 184096 bug, we always do force flush as a work around. Ignoring fForceNow value...
// If force flush is not done, the user will be able to read stale records after calling TruncatePrefix and
// the base lsn will not be updated to reflect the new lsn in TruncatePrefix call.
// This is a temporary work around fix and if txflog issue is fixed at a later date, we need to have a QFE
// to use the user passed in fForceNow flag value to support buffering of log records.
// Related Bugs:
// WinSE: 184096
// Windows OS: 1729140
// MB: 57586 52216
log.AppendRecord(data,
data.Length,
true,
out recordLsn);
}
catch (COMException exception)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ConvertKnownException(exception));
}
finally
{
SafeRelease(log);
}
return new SequenceNumber(recordLsn);
}
internal void ReadRecord(SequenceNumber seqNumtoRead, out byte[] record, out int recordSize, out SequenceNumber previous, out SequenceNumber next)
{
ulong prevLsn = 0;
ulong nextLsn = 0;
record = null;
recordSize = 0;
if(this.smuggledLog.IsInvalid)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ObjectDisposed());
}
ILog log = (ILog)(this.smuggledLog.Smuggle());
try
{
CoTaskMemHandle pData = null;
try
{
log.ReadRecord(seqNumtoRead.High,
out prevLsn,
out nextLsn,
out pData,
out recordSize);
record = new byte[recordSize];
Marshal.Copy(pData.DangerousGetHandle(),
record,
0,
recordSize);
}
catch (COMException exception)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ConvertKnownException(exception));
}
finally
{
if (pData != null && !pData.IsInvalid) pData.Close();
}
}
finally
{
SafeRelease(log);
}
previous = new SequenceNumber(prevLsn);
next = new SequenceNumber(nextLsn);
}
internal void ReadRecordPrefix(SequenceNumber seqNumtoRead, out byte[] record, ref int cbData, out int recordSize, out SequenceNumber previous, out SequenceNumber next)
{
ulong prevLsn = 0;
ulong nextLsn = 0;
record = null;
recordSize = 0;
if(this.smuggledLog.IsInvalid)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ObjectDisposed());
}
ILog log = (ILog)(this.smuggledLog.Smuggle());
try
{
record = new byte[cbData];
log.ReadRecordPrefix(seqNumtoRead.High,
out prevLsn,
out nextLsn,
record,
ref cbData,
out recordSize);
}
catch (COMException exception)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ConvertKnownException(exception));
}
finally
{
SafeRelease(log);
}
previous = new SequenceNumber(prevLsn);
next = new SequenceNumber(nextLsn);
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
//------------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
//-----------------------------------------------------------------------------
namespace System.IO.Log
{
using System;
using System.Runtime.InteropServices;
using System.Runtime.InteropServices.ComTypes;
internal class SimpleFileLog
{
SmuggledIUnknown smuggledLog;
internal SimpleFileLog(string absolutePath, int size)
{
// Open the log.
// First, we try to open an existing log-- if that doesn't
// work, we create a new one.
//
bool loaded = false;
ILog log = (ILog)new SimpleFileBasedLog();
try
{
if (File.Exists(absolutePath))
{
try
{
IPersistFile ipf = (IPersistFile)log;
ipf.Load(absolutePath, (int)STGM.ReadWrite);
loaded = true;
}
catch (FileNotFoundException)
{
// File not found, create a new one.
}
}
if (!loaded)
{
// File does not exist. Attempt to create a new one,
// with the specified size.
//
IFileBasedLogInit logInit = (IFileBasedLogInit)log;
logInit.InitNew(absolutePath, size);
}
log.SetAccessPolicyHint(RECORD_READING_POLICY.RANDOM);
this.smuggledLog = new SmuggledIUnknown(log);
}
catch (COMException exception)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ConvertKnownException(exception));
}
catch(FileNotFoundException)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentException(SR.GetString(SR.Argument_FileNameInvalid)));
}
finally
{
SafeRelease(log);
}
}
static void SafeRelease(object obj)
{
if (obj != null)
{
Marshal.FinalReleaseComObject(obj);
}
}
internal void Close()
{
if(!this.smuggledLog.IsInvalid)
{
ILog log = (ILog)(this.smuggledLog.Smuggle());
try
{
this.smuggledLog.Close();
}
catch (COMException exception)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ConvertKnownException(exception));
}
finally
{
SafeRelease(log);
}
}
}
internal void TruncatePrefix(SequenceNumber seqNumber)
{
if(this.smuggledLog.IsInvalid)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ObjectDisposed());
}
ILog log = (ILog)(this.smuggledLog.Smuggle());
try
{
log.TruncatePrefix(seqNumber.High);
}
catch (COMException exception)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ConvertKnownException(exception));
}
finally
{
SafeRelease(log);
}
}
internal void Force(SequenceNumber seqNumber)
{
if(this.smuggledLog.IsInvalid)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ObjectDisposed());
}
ILog log = (ILog)(this.smuggledLog.Smuggle());
try
{
log.Force(seqNumber.High);
}
catch (COMException exception)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ConvertKnownException(exception));
}
finally
{
SafeRelease(log);
}
}
internal void GetLogLimits(out SequenceNumber first, out SequenceNumber last)
{
ulong lsnfirst = 0;
ulong lsnlast = 0;
if(this.smuggledLog.IsInvalid)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ObjectDisposed());
}
ILog log = (ILog)(this.smuggledLog.Smuggle());
try
{
log.GetLogLimits(out lsnfirst, out lsnlast);
}
catch (COMException exception)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ConvertKnownException(exception));
}
finally
{
SafeRelease(log);
}
first = new SequenceNumber(lsnfirst);
last = new SequenceNumber(lsnlast);
}
internal SequenceNumber AppendRecord(UnmanagedBlob[] data, bool fForceNow)
{
ulong recordLsn = 0;
if(this.smuggledLog.IsInvalid)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ObjectDisposed());
}
ILog log = (ILog)(this.smuggledLog.Smuggle());
try
{
// Due to WinSE 184096 bug, we always do force flush as a work around. Ignoring fForceNow value...
// If force flush is not done, the user will be able to read stale records after calling TruncatePrefix and
// the base lsn will not be updated to reflect the new lsn in TruncatePrefix call.
// This is a temporary work around fix and if txflog issue is fixed at a later date, we need to have a QFE
// to use the user passed in fForceNow flag value to support buffering of log records.
// Related Bugs:
// WinSE: 184096
// Windows OS: 1729140
// MB: 57586 52216
log.AppendRecord(data,
data.Length,
true,
out recordLsn);
}
catch (COMException exception)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ConvertKnownException(exception));
}
finally
{
SafeRelease(log);
}
return new SequenceNumber(recordLsn);
}
internal void ReadRecord(SequenceNumber seqNumtoRead, out byte[] record, out int recordSize, out SequenceNumber previous, out SequenceNumber next)
{
ulong prevLsn = 0;
ulong nextLsn = 0;
record = null;
recordSize = 0;
if(this.smuggledLog.IsInvalid)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ObjectDisposed());
}
ILog log = (ILog)(this.smuggledLog.Smuggle());
try
{
CoTaskMemHandle pData = null;
try
{
log.ReadRecord(seqNumtoRead.High,
out prevLsn,
out nextLsn,
out pData,
out recordSize);
record = new byte[recordSize];
Marshal.Copy(pData.DangerousGetHandle(),
record,
0,
recordSize);
}
catch (COMException exception)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ConvertKnownException(exception));
}
finally
{
if (pData != null && !pData.IsInvalid) pData.Close();
}
}
finally
{
SafeRelease(log);
}
previous = new SequenceNumber(prevLsn);
next = new SequenceNumber(nextLsn);
}
internal void ReadRecordPrefix(SequenceNumber seqNumtoRead, out byte[] record, ref int cbData, out int recordSize, out SequenceNumber previous, out SequenceNumber next)
{
ulong prevLsn = 0;
ulong nextLsn = 0;
record = null;
recordSize = 0;
if(this.smuggledLog.IsInvalid)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ObjectDisposed());
}
ILog log = (ILog)(this.smuggledLog.Smuggle());
try
{
record = new byte[cbData];
log.ReadRecordPrefix(seqNumtoRead.High,
out prevLsn,
out nextLsn,
record,
ref cbData,
out recordSize);
}
catch (COMException exception)
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.ConvertKnownException(exception));
}
finally
{
SafeRelease(log);
}
previous = new SequenceNumber(prevLsn);
next = new SequenceNumber(nextLsn);
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- ScrollItemProviderWrapper.cs
- TypeConverterValueSerializer.cs
- CodeNamespace.cs
- ScriptControlManager.cs
- EnumerationRangeValidationUtil.cs
- ScriptResourceDefinition.cs
- GC.cs
- AssociationSetEnd.cs
- FileLoadException.cs
- MultipartContentParser.cs
- NamedPipeTransportSecurityElement.cs
- codemethodreferenceexpression.cs
- XmlText.cs
- SectionInformation.cs
- TemplateManager.cs
- DesignerDataTable.cs
- WorkflowHostingResponseContext.cs
- SafeTokenHandle.cs
- CloseCryptoHandleRequest.cs
- TrackingServices.cs
- TempEnvironment.cs
- StrongNameIdentityPermission.cs
- CompilerCollection.cs
- XmlLanguageConverter.cs
- CustomExpressionEventArgs.cs
- ServiceDocumentFormatter.cs
- controlskin.cs
- TypeBrowser.xaml.cs
- Timer.cs
- StylusDevice.cs
- ItemMap.cs
- JpegBitmapEncoder.cs
- XamlRtfConverter.cs
- UnsafeNativeMethods.cs
- PreviewPrintController.cs
- Transform3DGroup.cs
- BaseDataList.cs
- DocumentApplication.cs
- DynamicILGenerator.cs
- ReferenceEqualityComparer.cs
- DataList.cs
- GlobalAllocSafeHandle.cs
- SettingsBindableAttribute.cs
- ControlDesigner.cs
- IsolatedStorage.cs
- MimePart.cs
- ActivityStateRecord.cs
- RectAnimationBase.cs
- sqlstateclientmanager.cs
- TaskExceptionHolder.cs
- NativeMethods.cs
- JsonStringDataContract.cs
- AppSettings.cs
- PageStatePersister.cs
- TemplatedMailWebEventProvider.cs
- XmlSchemaSubstitutionGroup.cs
- ResourceExpressionEditor.cs
- DataGridViewAutoSizeModeEventArgs.cs
- DSASignatureFormatter.cs
- ProxyWebPart.cs
- RuntimeConfigurationRecord.cs
- UnicastIPAddressInformationCollection.cs
- InvalidDataException.cs
- OleDbMetaDataFactory.cs
- JournalNavigationScope.cs
- StreamGeometry.cs
- Hex.cs
- WindowsListView.cs
- XmlTextReader.cs
- OdbcException.cs
- FactoryRecord.cs
- UxThemeWrapper.cs
- RoutedUICommand.cs
- InlineObject.cs
- dbenumerator.cs
- SourceFileBuildProvider.cs
- ReturnValue.cs
- DocumentScope.cs
- DrawingVisualDrawingContext.cs
- HMACSHA512.cs
- NetworkInformationPermission.cs
- TextReader.cs
- RenderData.cs
- TerminateDesigner.cs
- WindowsSysHeader.cs
- PropertyEmitter.cs
- RightsController.cs
- RoutedEventConverter.cs
- validationstate.cs
- CellNormalizer.cs
- VisualStyleInformation.cs
- ToolStripDesignerAvailabilityAttribute.cs
- DiscoveryClientDocuments.cs
- SmiSettersStream.cs
- CodeAccessSecurityEngine.cs
- HuffmanTree.cs
- CryptoApi.cs
- CompositeDataBoundControl.cs
- TextInfo.cs
- SafeEventHandle.cs