Code:
/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / whidbey / netfxsp / 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
- Empty.cs
- TrustLevel.cs
- SingleConverter.cs
- _ContextAwareResult.cs
- TextBounds.cs
- EditCommandColumn.cs
- EndpointAddress.cs
- CheckBoxList.cs
- FunctionDescription.cs
- DetailsViewUpdatedEventArgs.cs
- BitmapCodecInfoInternal.cs
- DocumentSignatureManager.cs
- NavigateEvent.cs
- GeneralTransform3D.cs
- ThaiBuddhistCalendar.cs
- CustomErrorsSectionWrapper.cs
- ChooseAction.cs
- ValidatorUtils.cs
- rsa.cs
- XamlNamespaceHelper.cs
- OracleSqlParser.cs
- SvcMapFileLoader.cs
- AuthenticationManager.cs
- DateTimeOffset.cs
- PropertyEmitterBase.cs
- ComPlusTraceRecord.cs
- TraceHandler.cs
- LocatorManager.cs
- KeyTime.cs
- ColorKeyFrameCollection.cs
- MessageBox.cs
- TimeoutException.cs
- QuaternionAnimationUsingKeyFrames.cs
- SqlLiftIndependentRowExpressions.cs
- unsafeIndexingFilterStream.cs
- SqlRowUpdatingEvent.cs
- ValidationError.cs
- ItemAutomationPeer.cs
- KeyInfo.cs
- EncoderExceptionFallback.cs
- BamlBinaryWriter.cs
- CryptoConfig.cs
- SmtpMail.cs
- PersonalizableAttribute.cs
- MD5Cng.cs
- SqlProfileProvider.cs
- DomainUpDown.cs
- AxHost.cs
- PowerModeChangedEventArgs.cs
- ChtmlPhoneCallAdapter.cs
- Ray3DHitTestResult.cs
- PersonalizationAdministration.cs
- CapabilitiesPattern.cs
- ProviderConnectionPoint.cs
- ExpressionVisitorHelpers.cs
- PhysicalFontFamily.cs
- InfocardInteractiveChannelInitializer.cs
- _NetRes.cs
- PresentationAppDomainManager.cs
- ZipIOLocalFileDataDescriptor.cs
- IconHelper.cs
- MultiAsyncResult.cs
- UIElementPropertyUndoUnit.cs
- CodeExporter.cs
- AssemblyResourceLoader.cs
- LambdaCompiler.Binary.cs
- HttpServerVarsCollection.cs
- CipherData.cs
- Nullable.cs
- RadioButtonFlatAdapter.cs
- DialogWindow.cs
- GroupItemAutomationPeer.cs
- RequestDescription.cs
- EditingCoordinator.cs
- AppSecurityManager.cs
- PerfCounters.cs
- Config.cs
- SystemNetworkInterface.cs
- XmlSchemaCollection.cs
- AssemblyAssociatedContentFileAttribute.cs
- SqlUserDefinedAggregateAttribute.cs
- ManagementPath.cs
- PersonalizationProviderHelper.cs
- XamlRtfConverter.cs
- FileDataSourceCache.cs
- XmlSerializer.cs
- CodeMemberField.cs
- RequestCacheEntry.cs
- LogWriteRestartAreaAsyncResult.cs
- TreeBuilder.cs
- NativeObjectSecurity.cs
- OdbcEnvironment.cs
- TableCell.cs
- TransformValueSerializer.cs
- MethodSet.cs
- RuntimeArgumentHandle.cs
- MatrixKeyFrameCollection.cs
- BaseDataBoundControlDesigner.cs
- mactripleDES.cs
- X509AsymmetricSecurityKey.cs