Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / whidbey / NetFXspW7 / ndp / fx / src / DataOracleClient / System / Data / OracleClient / OciLobLocator.cs / 1 / OciLobLocator.cs
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// [....]
//-----------------------------------------------------------------------------
namespace System.Data.OracleClient
{
using System;
using System.Data.Common;
using System.Data.SqlTypes;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Runtime.ConstrainedExecution;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
sealed internal class OciLobLocator {
private OracleConnection _connection; // the connection the lob is attached to
private int _connectionCloseCount; // The close count of the connection; used to decide if we're zombied
private OracleType _lobType; // the underlying data type of the LOB locator
private OciHandle _descriptor; // the lob/file descriptor.
private int _cloneCount; // the number of clones of this object -- used to know when we can close the lob/bfile.
private int _openMode; // zero when not opened, otherwise, it's the value of OracleLobOpenMode
internal OciLobLocator(OracleConnection connection, OracleType lobType) {
_connection = connection;
_connectionCloseCount = connection.CloseCount;
_lobType = lobType;
_cloneCount = 1;
switch (lobType) {
case OracleType.Blob:
case OracleType.Clob:
case OracleType.NClob:
_descriptor = new OciLobDescriptor(connection.ServiceContextHandle);
break;
case OracleType.BFile:
_descriptor = new OciFileDescriptor(connection.ServiceContextHandle);
break;
default:
Debug.Assert(false, "Invalid lobType");
break;
}
}
internal OracleConnection Connection {
get {
return _connection;
}
}
internal bool ConnectionIsClosed {
// returns TRUE when the parent connection object has been closed
get {
return (null == _connection) || (_connectionCloseCount != _connection.CloseCount);
}
}
internal OciErrorHandle ErrorHandle {
// Every OCI call needs an error handle, so make it available
// internally.
get {
return Connection.ErrorHandle;
}
}
internal OciHandle Descriptor {
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
get {
return _descriptor;
}
}
public OracleType LobType {
get {
return _lobType;
}
}
internal OciServiceContextHandle ServiceContextHandle {
// You need to provide the service context handle to things like the
// OCI execute call so a statement handle can be associated with a
// connection. Better make it available internally, then.
get {
return Connection.ServiceContextHandle;
}
}
internal OciLobLocator Clone() {
Interlocked.Increment(ref _cloneCount);
return this;
}
internal void Dispose() {
int cloneCount = Interlocked.Decrement(ref _cloneCount);
if (0 == cloneCount) {
if (0 != _openMode && !ConnectionIsClosed) {
ForceClose();
}
OciHandle.SafeDispose(ref _descriptor);
GC.KeepAlive(this);
_connection = null;
}
}
internal void ForceClose() {
if (0 != _openMode) {
int rc = TracedNativeMethods.OCILobClose(
ServiceContextHandle,
ErrorHandle,
Descriptor
);
if (0 != rc) {
Connection.CheckError(ErrorHandle, rc);
}
_openMode = 0;
}
}
internal void ForceOpen() {
if (0 != _openMode) {
int rc = TracedNativeMethods.OCILobOpen(
ServiceContextHandle,
ErrorHandle,
Descriptor,
(byte)_openMode
);
if (0 != rc) {
_openMode = 0; // failure means we didn't really open it.
Connection.CheckError(ErrorHandle, rc);
}
}
}
internal void Open (OracleLobOpenMode mode) {
OracleLobOpenMode openMode = (OracleLobOpenMode)Interlocked.CompareExchange(ref _openMode, (int)mode, 0);
if (0 == openMode) {
ForceOpen();
}
else if (mode != openMode) {
throw ADP.CannotOpenLobWithDifferentMode(mode, openMode);
}
}
internal static void SafeDispose(ref OciLobLocator locator) {
// Safely disposes of the handle (even if it is already null) and
// then nulls it out.
if (null != locator) {
locator.Dispose();
}
locator = null;
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// [....]
//-----------------------------------------------------------------------------
namespace System.Data.OracleClient
{
using System;
using System.Data.Common;
using System.Data.SqlTypes;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Runtime.ConstrainedExecution;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
sealed internal class OciLobLocator {
private OracleConnection _connection; // the connection the lob is attached to
private int _connectionCloseCount; // The close count of the connection; used to decide if we're zombied
private OracleType _lobType; // the underlying data type of the LOB locator
private OciHandle _descriptor; // the lob/file descriptor.
private int _cloneCount; // the number of clones of this object -- used to know when we can close the lob/bfile.
private int _openMode; // zero when not opened, otherwise, it's the value of OracleLobOpenMode
internal OciLobLocator(OracleConnection connection, OracleType lobType) {
_connection = connection;
_connectionCloseCount = connection.CloseCount;
_lobType = lobType;
_cloneCount = 1;
switch (lobType) {
case OracleType.Blob:
case OracleType.Clob:
case OracleType.NClob:
_descriptor = new OciLobDescriptor(connection.ServiceContextHandle);
break;
case OracleType.BFile:
_descriptor = new OciFileDescriptor(connection.ServiceContextHandle);
break;
default:
Debug.Assert(false, "Invalid lobType");
break;
}
}
internal OracleConnection Connection {
get {
return _connection;
}
}
internal bool ConnectionIsClosed {
// returns TRUE when the parent connection object has been closed
get {
return (null == _connection) || (_connectionCloseCount != _connection.CloseCount);
}
}
internal OciErrorHandle ErrorHandle {
// Every OCI call needs an error handle, so make it available
// internally.
get {
return Connection.ErrorHandle;
}
}
internal OciHandle Descriptor {
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
get {
return _descriptor;
}
}
public OracleType LobType {
get {
return _lobType;
}
}
internal OciServiceContextHandle ServiceContextHandle {
// You need to provide the service context handle to things like the
// OCI execute call so a statement handle can be associated with a
// connection. Better make it available internally, then.
get {
return Connection.ServiceContextHandle;
}
}
internal OciLobLocator Clone() {
Interlocked.Increment(ref _cloneCount);
return this;
}
internal void Dispose() {
int cloneCount = Interlocked.Decrement(ref _cloneCount);
if (0 == cloneCount) {
if (0 != _openMode && !ConnectionIsClosed) {
ForceClose();
}
OciHandle.SafeDispose(ref _descriptor);
GC.KeepAlive(this);
_connection = null;
}
}
internal void ForceClose() {
if (0 != _openMode) {
int rc = TracedNativeMethods.OCILobClose(
ServiceContextHandle,
ErrorHandle,
Descriptor
);
if (0 != rc) {
Connection.CheckError(ErrorHandle, rc);
}
_openMode = 0;
}
}
internal void ForceOpen() {
if (0 != _openMode) {
int rc = TracedNativeMethods.OCILobOpen(
ServiceContextHandle,
ErrorHandle,
Descriptor,
(byte)_openMode
);
if (0 != rc) {
_openMode = 0; // failure means we didn't really open it.
Connection.CheckError(ErrorHandle, rc);
}
}
}
internal void Open (OracleLobOpenMode mode) {
OracleLobOpenMode openMode = (OracleLobOpenMode)Interlocked.CompareExchange(ref _openMode, (int)mode, 0);
if (0 == openMode) {
ForceOpen();
}
else if (mode != openMode) {
throw ADP.CannotOpenLobWithDifferentMode(mode, openMode);
}
}
internal static void SafeDispose(ref OciLobLocator locator) {
// Safely disposes of the handle (even if it is already null) and
// then nulls it out.
if (null != locator) {
locator.Dispose();
}
locator = null;
}
}
}
// 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
- ObjectPersistData.cs
- DurationConverter.cs
- DeviceFilterEditorDialog.cs
- XmlILAnnotation.cs
- DataServiceQueryOfT.cs
- XamlToRtfWriter.cs
- BitmapMetadata.cs
- WebPartZoneBase.cs
- Panel.cs
- EventLogPermissionEntry.cs
- HtmlTableRow.cs
- ObjectReaderCompiler.cs
- StateRuntime.cs
- RegexWorker.cs
- BackgroundFormatInfo.cs
- ObjectItemAssemblyLoader.cs
- ConnectionManagementSection.cs
- IsolatedStorageFile.cs
- VirtualPathProvider.cs
- DataErrorValidationRule.cs
- EntityDataSourceViewSchema.cs
- FrameworkReadOnlyPropertyMetadata.cs
- ServicePointManager.cs
- OdbcHandle.cs
- SchemaTableOptionalColumn.cs
- InvariantComparer.cs
- NestPullup.cs
- ClassHandlersStore.cs
- VisualTreeUtils.cs
- shaperfactory.cs
- IndexerHelper.cs
- PointLight.cs
- CloudCollection.cs
- CngUIPolicy.cs
- ProtectedConfiguration.cs
- KeyboardDevice.cs
- PrinterResolution.cs
- BindingOperations.cs
- PipelineDeploymentState.cs
- HttpCapabilitiesSectionHandler.cs
- UnsignedPublishLicense.cs
- ObjectParameterCollection.cs
- BindUriHelper.cs
- SecurityDocument.cs
- XmlMtomWriter.cs
- EntityDataSourceDesigner.cs
- PersonalizationEntry.cs
- DataSourceXmlTextReader.cs
- NonPrimarySelectionGlyph.cs
- CultureSpecificStringDictionary.cs
- FlowLayoutSettings.cs
- MachineKeySection.cs
- RepeaterItemEventArgs.cs
- CalendarButtonAutomationPeer.cs
- ModelVisual3D.cs
- RecommendedAsConfigurableAttribute.cs
- SymDocumentType.cs
- HttpListenerRequestTraceRecord.cs
- UnaryExpressionHelper.cs
- EFDataModelProvider.cs
- ProfileSettings.cs
- HttpPostedFile.cs
- ContainerVisual.cs
- ImageIndexConverter.cs
- ListViewInsertedEventArgs.cs
- DataSourceCacheDurationConverter.cs
- VirtualPathUtility.cs
- EntityDataSourceWizardForm.cs
- ControlAdapter.cs
- Inline.cs
- Stream.cs
- DataServiceQueryContinuation.cs
- validationstate.cs
- DbCommandTree.cs
- WorkflowCompensationBehavior.cs
- ContainerParaClient.cs
- WebBrowserSiteBase.cs
- BindValidationContext.cs
- StsCommunicationException.cs
- BoundConstants.cs
- SystemIcmpV4Statistics.cs
- SequenceNumber.cs
- RegexRunnerFactory.cs
- MailAddressParser.cs
- SharedStatics.cs
- SkipStoryboardToFill.cs
- EncryptedPackage.cs
- ProjectedSlot.cs
- ListControl.cs
- CodeExporter.cs
- UriParserTemplates.cs
- ConditionBrowserDialog.cs
- SortAction.cs
- ObjectListSelectEventArgs.cs
- AuthenticationModulesSection.cs
- ExtentJoinTreeNode.cs
- CompilerGlobalScopeAttribute.cs
- CultureTableRecord.cs
- DynamicResourceExtension.cs
- InitializeCorrelation.cs