a575963da9
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
256 lines
5.3 KiB
C#
256 lines
5.3 KiB
C#
//
|
|
// 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 <tim@timcoleman.com>
|
|
//
|
|
// 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;
|
|
OciEnvironmentHandle environment;
|
|
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; }
|
|
}
|
|
|
|
public OciEnvironmentHandle Environment {
|
|
get { return environment; }
|
|
set { environment = 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;
|
|
byte csfrm = 0;
|
|
|
|
// Character types are UTF-16, so amount of characters is 1/2
|
|
// the amount of bytes
|
|
if (!binary) {
|
|
amount /= 2;
|
|
status = OciCalls.OCILobCharSetForm (environment,
|
|
ErrorHandle,
|
|
this,
|
|
out csfrm);
|
|
if (status != 0) {
|
|
OciErrorInfo info = ErrorHandle.HandleError ();
|
|
throw new OracleException (info.ErrorCode, info.ErrorMessage);
|
|
}
|
|
}
|
|
|
|
status = OciCalls.OCILobRead (Service,
|
|
ErrorHandle,
|
|
this,
|
|
ref amount,
|
|
offset,
|
|
buffer,
|
|
count,
|
|
IntPtr.Zero,
|
|
IntPtr.Zero,
|
|
1000, // OCI_UCS2ID
|
|
csfrm);
|
|
|
|
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
|
|
}
|
|
}
|