| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239 |
- //
- // OciLobLocator.cs
- //
- // Part of managed C#/.NET library System.Data.OracleClient.dll
- //
- // Part of the Mono class libraries at
- // mcs/class/System.Data.OracleClient/System.Data.OracleClient.Oci
- //
- // Assembly: System.Data.OracleClient.dll
- // Namespace: System.Data.OracleClient.Oci
- //
- // Author:
- // Tim Coleman <[email protected]>
- //
- // Copyright (C) Tim Coleman, 2003
- //
- using System;
- using System.Data.OracleClient;
- using System.Runtime.InteropServices;
- namespace System.Data.OracleClient.Oci {
- internal sealed class OciLobLocator : OciDescriptorHandle, IDisposable
- {
- #region Fields
- bool disposed = false;
- OciErrorHandle errorHandle;
- OciServiceHandle service;
- OciDataType type;
- #endregion // Fields
- #region Constructors
- public OciLobLocator (OciHandle parent, IntPtr handle)
- : base (OciHandleType.LobLocator, parent, handle)
- {
- }
- #endregion // Constructors
- #region Properties
- public OciErrorHandle ErrorHandle {
- get { return errorHandle; }
- set { errorHandle = value; }
- }
- public OciServiceHandle Service {
- get { return service; }
- set { service = value; }
- }
- public OciDataType LobType {
- get { return type; }
- set { type = value; }
- }
-
- #endregion // Properties
- #region Methods
- public void BeginBatch (OracleLobOpenMode mode)
- {
- int status = 0;
- status = OciCalls.OCILobOpen (Service,
- ErrorHandle,
- Handle,
- (byte) mode);
- if (status != 0) {
- OciErrorInfo info = ErrorHandle.HandleError ();
- throw new OracleException (info.ErrorCode, info.ErrorMessage);
- }
- }
- public uint Copy (OciLobLocator destination, uint amount, uint destinationOffset, uint sourceOffset)
- {
- OciCalls.OCILobCopy (Service,
- ErrorHandle,
- destination,
- Handle,
- amount,
- destinationOffset,
- sourceOffset);
- return amount;
- }
- protected override void Dispose (bool disposing)
- {
- if (!disposed) {
- disposed = true;
- base.Dispose ();
- }
- }
- public void EndBatch ()
- {
- int status = 0;
- status = OciCalls.OCILobClose (Service, ErrorHandle, this);
- if (status != 0) {
- OciErrorInfo info = ErrorHandle.HandleError ();
- throw new OracleException (info.ErrorCode, info.ErrorMessage);
- }
- }
- public uint Erase (uint offset, uint amount)
- {
- int status = 0;
- uint output = amount;
- status = OciCalls.OCILobErase (Service,
- ErrorHandle,
- this,
- ref output,
- (uint) offset);
- if (status != 0) {
- OciErrorInfo info = ErrorHandle.HandleError ();
- throw new OracleException (info.ErrorCode, info.ErrorMessage);
- }
- return output;
- }
- public int GetChunkSize ()
- {
- int status = 0;
- uint output;
- status = OciCalls.OCILobGetChunkSize (Service,
- ErrorHandle,
- this,
- out output);
- if (status != 0) {
- OciErrorInfo info = ErrorHandle.HandleError ();
- throw new OracleException (info.ErrorCode, info.ErrorMessage);
- }
- return (int) output;
- }
- public long GetLength (bool binary)
- {
- int status = 0;
- uint output;
- status = OciCalls.OCILobGetLength (Service,
- ErrorHandle,
- this,
- out output);
- if (status != 0) {
- OciErrorInfo info = ErrorHandle.HandleError ();
- throw new OracleException (info.ErrorCode, info.ErrorMessage);
- }
- if (!binary)
- output *= 2;
- return (long) output;
- }
- public int Read (byte[] buffer, uint offset, uint count, bool binary)
- {
- int status = 0;
- uint amount = count;
- // Character types are UTF-16, so amount of characters is 1/2
- // the amount of bytes
- if (!binary)
- amount /= 2;
- status = OciCalls.OCILobRead (Service,
- ErrorHandle,
- this,
- ref amount,
- offset,
- buffer,
- count,
- IntPtr.Zero,
- IntPtr.Zero,
- 1000, // OCI_UCS2ID
- 0); // Ignored if csid is specified as above
- if (status != 0) {
- OciErrorInfo info = ErrorHandle.HandleError ();
- throw new OracleException (info.ErrorCode, info.ErrorMessage);
- }
- return (int) amount;
- }
- public void Trim (uint newlen)
- {
- int status = 0;
- status = OciCalls.OCILobTrim (Service,
- ErrorHandle,
- this,
- newlen);
- if (status != 0) {
- OciErrorInfo info = ErrorHandle.HandleError ();
- throw new OracleException (info.ErrorCode, info.ErrorMessage);
- }
- }
- public int Write (byte[] buffer, uint offset, uint count, OracleType type)
- {
- int status = 0;
- uint amount = count;
- if (type == OracleType.Clob)
- amount /= 2;
- status = OciCalls.OCILobWrite (Service,
- ErrorHandle,
- this,
- ref amount,
- offset,
- buffer,
- count,
- 0, // OCI_ONE_PIECE
- IntPtr.Zero,
- IntPtr.Zero,
- 1000, // OCI_UCS2ID
- 0);
- if (status != 0) {
- OciErrorInfo info = ErrorHandle.HandleError ();
- throw new OracleException (info.ErrorCode, info.ErrorMessage);
- }
- return (int) amount;
- }
- #endregion // Methods
- }
- }
|