File : oci-thick.adb
with
Ada.Exceptions,
System,
OCI.Thread;
--with Text_IO,System.Address_Image; use Text_IO,System;
package body Oci.Thick is
use Lib;
use type Sword;
use type Ub4;
use type OCIHandle;
use Ada.Exceptions;
-- Local utilities
procedure Check_Error(
Code : Sword;
Handle : OCIHandle;
Htype : Integer)
is
Errcodep : aliased Sb4 := 0;
Bufp : aliased C.Char_Array := (0..512=> C.nul);
Rc : Sword;
begin
case Code is
when OCI_ERROR => Rc := OCIErrorGet(Hndlp => Handle,
Errcodep => Errcodep'access,
Bufp => CStr.To_Chars_Ptr(Bufp'Unchecked_Access),
Bufsiz => Bufp'Length-1,
Htype => UB4(Htype));
if Rc=OCI_SUCCESS then
Raise_Exception(LIB_ERROR'Identity,C.To_Ada(Bufp));
else
Raise_Exception(LIB_ERROR'Identity,
"Error code:"&Sword'Image(Code)&Ascii.Lf&
"Return error code:"&Sword'Image(Rc)&Ascii.Lf&
"Output error code:"&Sb4'Image(Errcodep));
end if;
when OCI_INVALID_HANDLE => raise INVALID_HANDLE;
--Later when OCI_SUCCESS => null;
when others => null;
end case;
end Check_Error;
procedure Check_Error(
Code : Sword) is
begin
Check_Error(Code,OCIHandle(Thread.Error),
OCI_HTYPE_ERROR);
end Check_Error;
function Alloc_Handle(Parent : OCIEnv; Htype : Ub4) return OCIHandle
is
Result : aliased OCIHandle := Empty_Handle;
Rc : Sword := OCIHandleAlloc(Parenth => OCIHandle(Parent),
Hndlpp => Result'access,
Htype => Htype);
begin
if Rc/=OCI_SUCCESS then
raise INVALID_HANDLE;
end if;
return Result;
end;
procedure Free(H : OCIHandle; HType : Ub4) is
Rc : Sword;
begin
if H=Empty_Handle then
return;
end if;
RC := OCIHandleFree(H, HType);
if Rc/=OCI_SUCCESS then
raise INVALID_HANDLE;
end if;
end Free;
-- Base_Variable
procedure Clear_Value(Var : in out Base_Variable'Class) is
begin
Var.Indicator := Null_Indicator;
end;
function Is_Null(Var : Base_Variable'Class) return Boolean is
use type Sb2;
begin
if Var.Define=OCIDefine(Empty_Handle)
and Var.Bind=OCIBind(Empty_Handle) then
raise NOT_ATTACHED;
end if;
return Var.Indicator = Null_Indicator;
end;
-- OCIDate
function To_String(From : OCIDate; Format : String) return String
is
Buff : aliased Text := (0..C."+"(Format'Length,64)=> C.nul);
Len : aliased Ub4 := Buff'Length-1;
Rc : Sword := OCIDateToText (
Err => Thread.Error,
Date => From,
Fmt => C.To_C(Format),
Fmt_Length => Format'Length,
Lang_Name => 0,
Lang_Length => 0,
Buf_Size => Len'access,
Buf => CStr.To_Chars_Ptr(Buff'Unchecked_Access));
begin
Check_Error(Rc);
return C.To_Ada(Buff,False)(1..Integer(Len));
end To_String;
function SysDate return OCIDate is
Result : aliased OCIDate;
Rc : Sword := OCIDateSysDate (Err => Thread.Error
,
Date => Result'access);
begin
Check_Error(Rc);
return Result;
end SysDate;
function Handle(ref : Handle_REference'Class) return OCIHandle is
begin
return ref.Handle;
end;
end Oci.Thick