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 / OracleBFile.cs / 1 / OracleBFile.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.CompilerServices; using System.Runtime.InteropServices; using System.Text; //--------------------------------------------------------------------- // OracleBFile // // This class is derived from the OracleLob type class, and implements // the additional methods necessary to support Oracle's BFILE internal // data type. Note that Oracle does not allow writing to a BFILE data // type. // sealed public class OracleBFile : Stream, ICloneable, INullable, IDisposable { private OracleLob _lob; private string _fileName; private string _directoryAlias; static public new readonly OracleBFile Null = new OracleBFile(); // (internal) Construct a null lob internal OracleBFile() { _lob = OracleLob.Null; } // (internal) Construct from a data reader buffer internal OracleBFile(OciLobLocator lobLocator) { _lob = new OracleLob(lobLocator); } // (internal) Construct from an existing BFile object (copy constructor) internal OracleBFile(OracleBFile bfile) { this._lob = (OracleLob)bfile._lob.Clone(); this._fileName = bfile._fileName; this._directoryAlias = bfile._directoryAlias; } public override bool CanRead { get { if (IsNull) { return true; } return !IsDisposed; } } public override bool CanSeek { get { if (IsNull) { return true; } return !IsDisposed; } } public override bool CanWrite { get { return false; } } public OracleConnection Connection { get { AssertInternalLobIsValid(); return _lob.Connection; } } internal OciHandle Descriptor { get { return LobLocator.Descriptor; } } public string DirectoryName { // // DEVNOTE: OCI doesn't provide a simple API to get the name from the alias, but you could // execute the SQL Query: // // select directory_path from all_directories where directory_name = 'directoryAlias' // // And you would get the name. It isn't clear if directory aliases are unique across // all users, however. get { AssertInternalLobIsValid(); if (IsNull) { return String.Empty; } if (null == _directoryAlias) { GetNames(); } return _directoryAlias; } } public bool FileExists { get { AssertInternalLobIsValid(); if (IsNull) { return false; } _lob.AssertConnectionIsOpen(); int flag; int rc = TracedNativeMethods.OCILobFileExists( ServiceContextHandle, ErrorHandle, Descriptor, out flag ); if (0 != rc) { Connection.CheckError(ErrorHandle, rc); } return (flag != 0); } } public string FileName { get { AssertInternalLobIsValid(); if (IsNull) { return String.Empty; } if (null == _fileName) { GetNames(); } return _fileName; } } internal OciErrorHandle ErrorHandle { get { Debug.Assert(null != _lob, "_lob is null?"); return _lob.ErrorHandle; } } private bool IsDisposed { get { return (null == _lob); } } public bool IsNull { get { return (OracleLob.Null == _lob); } } public override long Length { get { AssertInternalLobIsValid(); if (IsNull) { return 0; } long value = _lob.Length; return value; } } internal OciLobLocator LobLocator { get { return _lob.LobLocator; } } public override long Position { get { AssertInternalLobIsValid(); if (IsNull) { return 0; } return _lob.Position; } set { AssertInternalLobIsValid(); if (!IsNull) { _lob.Position = value; } } } internal OciServiceContextHandle ServiceContextHandle { get { Debug.Assert(null != _lob, "_lob is null?"); return _lob.ServiceContextHandle; } } public object Value { get { AssertInternalLobIsValid(); if (IsNull) { return DBNull.Value; } EnsureLobIsOpened(); object value = _lob.Value; return value; } } internal void AssertInternalLobIsValid() { if (IsDisposed) { throw ADP.ObjectDisposed("OracleBFile"); } } public object Clone() { OracleBFile clone = new OracleBFile(this); return clone; } public long CopyTo (OracleLob destination) { // Copies the entire lob to a compatible lob, starting at the beginning of the target array. return CopyTo (0, destination, 0, Length); } public long CopyTo (OracleLob destination, long destinationOffset) { // Copies the entire lob to a compatible lob, starting at the specified offset of the target array. return CopyTo (0, destination, destinationOffset, Length); } public long CopyTo (long sourceOffset, OracleLob destination, long destinationOffset, long amount) { // Copies a range of elements from the lob to a compatible lob, starting at the specified index of the target array. AssertInternalLobIsValid(); if (null == destination) { throw ADP.ArgumentNull("destination"); } if (destination.IsNull) { throw ADP.LobWriteInvalidOnNull(); } if (_lob.IsNull) { return 0; } _lob.AssertConnectionIsOpen(); _lob.AssertAmountIsValid(amount, "amount"); _lob.AssertAmountIsValid(sourceOffset, "sourceOffset"); _lob.AssertAmountIsValid(destinationOffset, "destinationOffset"); _lob.AssertTransactionExists(); int rc; long dataCount = Math.Min(Length - sourceOffset, amount); long dstOffset = destinationOffset + 1; // Oracle is 1 based, we are zero based. long srcOffset = sourceOffset + 1; // Oracle is 1 based, we are zero based. if (0 >= dataCount) { return 0; } rc = TracedNativeMethods.OCILobLoadFromFile( ServiceContextHandle, ErrorHandle, destination.Descriptor, Descriptor, (UInt32)dataCount, (UInt32)dstOffset, (UInt32)srcOffset ); if (0 != rc) Connection.CheckError(ErrorHandle, rc); // DEVNOTE: Oracle must not do partial copies, because their API doesn't tell you how many bytes were copied. return dataCount; } protected override void Dispose(bool disposing) { if (disposing) { OracleLob lob = _lob; if (null != lob) { lob.Close(); } } _lob = null; _fileName = null; _directoryAlias = null; base.Dispose(disposing); } private void EnsureLobIsOpened() { LobLocator.Open(OracleLobOpenMode.ReadOnly); } public override void Flush () {} private const short MaxDirectoryAliasChars = 30; private const short MaxFileAliasChars = 255; internal void GetNames() { _lob.AssertConnectionIsOpen(); short charSize = (short)((Connection.EnvironmentHandle.IsUnicode) ? 2 : 1); ushort directoryAliasLength = checked((ushort)(MaxDirectoryAliasChars * charSize)); int fileOffset = directoryAliasLength; ushort fileAliasLength = checked((ushort)(MaxFileAliasChars * charSize)); NativeBuffer buffer = Connection.GetScratchBuffer(directoryAliasLength + fileAliasLength); bool mustRelease = false; RuntimeHelpers.PrepareConstrainedRegions(); try { buffer.DangerousAddRef(ref mustRelease); int rc = TracedNativeMethods.OCILobFileGetName( Connection.EnvironmentHandle, ErrorHandle, Descriptor, buffer.DangerousGetDataPtr(), ref directoryAliasLength, buffer.DangerousGetDataPtr(fileOffset), ref fileAliasLength ); if (0 != rc) { Connection.CheckError(ErrorHandle, rc); } _directoryAlias = Connection.GetString(buffer.ReadBytes(0, directoryAliasLength)); _fileName = Connection.GetString(buffer.ReadBytes(fileOffset, fileAliasLength)); } finally { if (mustRelease) { buffer.DangerousRelease(); } } } public override int Read (byte[] buffer, int offset, int count) { AssertInternalLobIsValid(); if (!IsNull) { EnsureLobIsOpened(); } int result = _lob.Read(buffer, offset, count); return result; } public override long Seek (long offset, SeekOrigin origin) { AssertInternalLobIsValid(); long result = _lob.Seek(offset, origin); return result; } public void SetFileName (string directory, string file) { AssertInternalLobIsValid(); if (!IsNull) { _lob.AssertConnectionIsOpen(); _lob.AssertTransactionExists(); OciFileDescriptor bfileDescriptor = (OciFileDescriptor)(LobLocator.Descriptor); if (null != bfileDescriptor) { LobLocator.ForceClose(); // MDAC 86200: must be closed or the ForceOpen below will leak opens... int rc = TracedNativeMethods.OCILobFileSetName( Connection.EnvironmentHandle, ErrorHandle, bfileDescriptor, directory, file ); if (0 != rc) { Connection.CheckError(ErrorHandle, rc); } LobLocator.ForceOpen(); // SetFileName automatically closes the BFILE on the server, we reopen it _fileName = null; _directoryAlias = null; try { _lob.Position = 0; } catch (Exception e) { if (!ADP.IsCatchableExceptionType(e)) { throw; } // MDAC 86202 - If the file that they specified doesn't exist, // we'll get an ORA-22888 error, when we try and set the // position. We just eat the error because they'll get it // soon enough, and they don't expect it when they set the file // name. } } } } public override void SetLength (long value) { AssertInternalLobIsValid(); throw ADP.ReadOnlyLob(); } public override void Write (byte[] buffer, int offset, int count) { AssertInternalLobIsValid(); throw ADP.ReadOnlyLob(); } } } // 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.CompilerServices; using System.Runtime.InteropServices; using System.Text; //--------------------------------------------------------------------- // OracleBFile // // This class is derived from the OracleLob type class, and implements // the additional methods necessary to support Oracle's BFILE internal // data type. Note that Oracle does not allow writing to a BFILE data // type. // sealed public class OracleBFile : Stream, ICloneable, INullable, IDisposable { private OracleLob _lob; private string _fileName; private string _directoryAlias; static public new readonly OracleBFile Null = new OracleBFile(); // (internal) Construct a null lob internal OracleBFile() { _lob = OracleLob.Null; } // (internal) Construct from a data reader buffer internal OracleBFile(OciLobLocator lobLocator) { _lob = new OracleLob(lobLocator); } // (internal) Construct from an existing BFile object (copy constructor) internal OracleBFile(OracleBFile bfile) { this._lob = (OracleLob)bfile._lob.Clone(); this._fileName = bfile._fileName; this._directoryAlias = bfile._directoryAlias; } public override bool CanRead { get { if (IsNull) { return true; } return !IsDisposed; } } public override bool CanSeek { get { if (IsNull) { return true; } return !IsDisposed; } } public override bool CanWrite { get { return false; } } public OracleConnection Connection { get { AssertInternalLobIsValid(); return _lob.Connection; } } internal OciHandle Descriptor { get { return LobLocator.Descriptor; } } public string DirectoryName { // // DEVNOTE: OCI doesn't provide a simple API to get the name from the alias, but you could // execute the SQL Query: // // select directory_path from all_directories where directory_name = 'directoryAlias' // // And you would get the name. It isn't clear if directory aliases are unique across // all users, however. get { AssertInternalLobIsValid(); if (IsNull) { return String.Empty; } if (null == _directoryAlias) { GetNames(); } return _directoryAlias; } } public bool FileExists { get { AssertInternalLobIsValid(); if (IsNull) { return false; } _lob.AssertConnectionIsOpen(); int flag; int rc = TracedNativeMethods.OCILobFileExists( ServiceContextHandle, ErrorHandle, Descriptor, out flag ); if (0 != rc) { Connection.CheckError(ErrorHandle, rc); } return (flag != 0); } } public string FileName { get { AssertInternalLobIsValid(); if (IsNull) { return String.Empty; } if (null == _fileName) { GetNames(); } return _fileName; } } internal OciErrorHandle ErrorHandle { get { Debug.Assert(null != _lob, "_lob is null?"); return _lob.ErrorHandle; } } private bool IsDisposed { get { return (null == _lob); } } public bool IsNull { get { return (OracleLob.Null == _lob); } } public override long Length { get { AssertInternalLobIsValid(); if (IsNull) { return 0; } long value = _lob.Length; return value; } } internal OciLobLocator LobLocator { get { return _lob.LobLocator; } } public override long Position { get { AssertInternalLobIsValid(); if (IsNull) { return 0; } return _lob.Position; } set { AssertInternalLobIsValid(); if (!IsNull) { _lob.Position = value; } } } internal OciServiceContextHandle ServiceContextHandle { get { Debug.Assert(null != _lob, "_lob is null?"); return _lob.ServiceContextHandle; } } public object Value { get { AssertInternalLobIsValid(); if (IsNull) { return DBNull.Value; } EnsureLobIsOpened(); object value = _lob.Value; return value; } } internal void AssertInternalLobIsValid() { if (IsDisposed) { throw ADP.ObjectDisposed("OracleBFile"); } } public object Clone() { OracleBFile clone = new OracleBFile(this); return clone; } public long CopyTo (OracleLob destination) { // Copies the entire lob to a compatible lob, starting at the beginning of the target array. return CopyTo (0, destination, 0, Length); } public long CopyTo (OracleLob destination, long destinationOffset) { // Copies the entire lob to a compatible lob, starting at the specified offset of the target array. return CopyTo (0, destination, destinationOffset, Length); } public long CopyTo (long sourceOffset, OracleLob destination, long destinationOffset, long amount) { // Copies a range of elements from the lob to a compatible lob, starting at the specified index of the target array. AssertInternalLobIsValid(); if (null == destination) { throw ADP.ArgumentNull("destination"); } if (destination.IsNull) { throw ADP.LobWriteInvalidOnNull(); } if (_lob.IsNull) { return 0; } _lob.AssertConnectionIsOpen(); _lob.AssertAmountIsValid(amount, "amount"); _lob.AssertAmountIsValid(sourceOffset, "sourceOffset"); _lob.AssertAmountIsValid(destinationOffset, "destinationOffset"); _lob.AssertTransactionExists(); int rc; long dataCount = Math.Min(Length - sourceOffset, amount); long dstOffset = destinationOffset + 1; // Oracle is 1 based, we are zero based. long srcOffset = sourceOffset + 1; // Oracle is 1 based, we are zero based. if (0 >= dataCount) { return 0; } rc = TracedNativeMethods.OCILobLoadFromFile( ServiceContextHandle, ErrorHandle, destination.Descriptor, Descriptor, (UInt32)dataCount, (UInt32)dstOffset, (UInt32)srcOffset ); if (0 != rc) Connection.CheckError(ErrorHandle, rc); // DEVNOTE: Oracle must not do partial copies, because their API doesn't tell you how many bytes were copied. return dataCount; } protected override void Dispose(bool disposing) { if (disposing) { OracleLob lob = _lob; if (null != lob) { lob.Close(); } } _lob = null; _fileName = null; _directoryAlias = null; base.Dispose(disposing); } private void EnsureLobIsOpened() { LobLocator.Open(OracleLobOpenMode.ReadOnly); } public override void Flush () {} private const short MaxDirectoryAliasChars = 30; private const short MaxFileAliasChars = 255; internal void GetNames() { _lob.AssertConnectionIsOpen(); short charSize = (short)((Connection.EnvironmentHandle.IsUnicode) ? 2 : 1); ushort directoryAliasLength = checked((ushort)(MaxDirectoryAliasChars * charSize)); int fileOffset = directoryAliasLength; ushort fileAliasLength = checked((ushort)(MaxFileAliasChars * charSize)); NativeBuffer buffer = Connection.GetScratchBuffer(directoryAliasLength + fileAliasLength); bool mustRelease = false; RuntimeHelpers.PrepareConstrainedRegions(); try { buffer.DangerousAddRef(ref mustRelease); int rc = TracedNativeMethods.OCILobFileGetName( Connection.EnvironmentHandle, ErrorHandle, Descriptor, buffer.DangerousGetDataPtr(), ref directoryAliasLength, buffer.DangerousGetDataPtr(fileOffset), ref fileAliasLength ); if (0 != rc) { Connection.CheckError(ErrorHandle, rc); } _directoryAlias = Connection.GetString(buffer.ReadBytes(0, directoryAliasLength)); _fileName = Connection.GetString(buffer.ReadBytes(fileOffset, fileAliasLength)); } finally { if (mustRelease) { buffer.DangerousRelease(); } } } public override int Read (byte[] buffer, int offset, int count) { AssertInternalLobIsValid(); if (!IsNull) { EnsureLobIsOpened(); } int result = _lob.Read(buffer, offset, count); return result; } public override long Seek (long offset, SeekOrigin origin) { AssertInternalLobIsValid(); long result = _lob.Seek(offset, origin); return result; } public void SetFileName (string directory, string file) { AssertInternalLobIsValid(); if (!IsNull) { _lob.AssertConnectionIsOpen(); _lob.AssertTransactionExists(); OciFileDescriptor bfileDescriptor = (OciFileDescriptor)(LobLocator.Descriptor); if (null != bfileDescriptor) { LobLocator.ForceClose(); // MDAC 86200: must be closed or the ForceOpen below will leak opens... int rc = TracedNativeMethods.OCILobFileSetName( Connection.EnvironmentHandle, ErrorHandle, bfileDescriptor, directory, file ); if (0 != rc) { Connection.CheckError(ErrorHandle, rc); } LobLocator.ForceOpen(); // SetFileName automatically closes the BFILE on the server, we reopen it _fileName = null; _directoryAlias = null; try { _lob.Position = 0; } catch (Exception e) { if (!ADP.IsCatchableExceptionType(e)) { throw; } // MDAC 86202 - If the file that they specified doesn't exist, // we'll get an ORA-22888 error, when we try and set the // position. We just eat the error because they'll get it // soon enough, and they don't expect it when they set the file // name. } } } } public override void SetLength (long value) { AssertInternalLobIsValid(); throw ADP.ReadOnlyLob(); } public override void Write (byte[] buffer, int offset, int count) { AssertInternalLobIsValid(); throw ADP.ReadOnlyLob(); } } } // 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
- SqlFactory.cs
- PropertyToken.cs
- ImplicitInputBrush.cs
- SqlTypesSchemaImporter.cs
- TableLayoutPanelCellPosition.cs
- LabelLiteral.cs
- InnerItemCollectionView.cs
- RawStylusInput.cs
- ZipIOLocalFileDataDescriptor.cs
- IndentTextWriter.cs
- SimpleColumnProvider.cs
- TemplatedMailWebEventProvider.cs
- FaultCode.cs
- WebBrowser.cs
- BigIntegerStorage.cs
- EntityDataSourceDataSelectionPanel.designer.cs
- ConfigurationHandlersInstallComponent.cs
- XhtmlBasicLinkAdapter.cs
- TextElementAutomationPeer.cs
- ValidationSummary.cs
- Clause.cs
- TemplatePartAttribute.cs
- KeyValueSerializer.cs
- MouseGesture.cs
- ZipIOLocalFileDataDescriptor.cs
- ScriptingAuthenticationServiceSection.cs
- BaseTypeViewSchema.cs
- COMException.cs
- DocumentSchemaValidator.cs
- NativeMethods.cs
- XmlDataCollection.cs
- TransformValueSerializer.cs
- CompleteWizardStep.cs
- MultipleCopiesCollection.cs
- SessionStateItemCollection.cs
- ManipulationCompletedEventArgs.cs
- InstanceValue.cs
- ValidatingReaderNodeData.cs
- SymmetricKey.cs
- HttpCookieCollection.cs
- XmlSerializationReader.cs
- SafeArrayTypeMismatchException.cs
- AttributeUsageAttribute.cs
- CalendarKeyboardHelper.cs
- SecureEnvironment.cs
- XmlSchemaAttribute.cs
- SetterTriggerConditionValueConverter.cs
- DragEventArgs.cs
- SymLanguageType.cs
- DataSetViewSchema.cs
- CodeRegionDirective.cs
- TransformedBitmap.cs
- HttpException.cs
- ToolStripRenderer.cs
- XmlBufferReader.cs
- ObjectFactoryCodeDomTreeGenerator.cs
- ArrangedElement.cs
- FixedSOMPageElement.cs
- SiteMapNodeItemEventArgs.cs
- RuleSettings.cs
- MimePart.cs
- AstTree.cs
- RegularExpressionValidator.cs
- EventManager.cs
- TwoPhaseCommitProxy.cs
- ItemTypeToolStripMenuItem.cs
- FactoryMaker.cs
- ChildTable.cs
- HttpContextBase.cs
- CacheChildrenQuery.cs
- NavigationPropertyEmitter.cs
- InputBuffer.cs
- SyndicationDeserializer.cs
- CachingHintValidation.cs
- MetaForeignKeyColumn.cs
- SmiEventStream.cs
- DataBindingExpressionBuilder.cs
- EntityType.cs
- GetLedgerRequest.cs
- ConnectionManagementSection.cs
- EncoderParameters.cs
- ColorConverter.cs
- ResolveNameEventArgs.cs
- XmlArrayItemAttribute.cs
- SqlEnums.cs
- WrapPanel.cs
- AlternateViewCollection.cs
- SystemPens.cs
- EmissiveMaterial.cs
- EndOfStreamException.cs
- SymLanguageVendor.cs
- XmlElement.cs
- AssemblyBuilder.cs
- ComPlusServiceLoader.cs
- EventProviderWriter.cs
- ToolStripPanelCell.cs
- ToolboxItem.cs
- PropertyGridEditorPart.cs
- DataControlFieldCell.cs
- TextEditor.cs