File : oci-thick-connection_pkg.adb


with
   System,
   --   Ada.Task_Identification,
   --   Ada.Strings,
   OCI.Thread,
   Ada.Strings.Fixed;
--with Text_IO,System.Address_Image; use Text_IO,System;
package body OCI.Thick.Connection_pkg is
   use Lib;
   use type Sword;
   use type Ub4;
   use type OCIHandle;

   procedure Destroy(Object : in out Connection) is

      Rc : Sword;

   H : OCIHandle := Object.Handle;
   begin
      if H/= Empty_Handle then
        Rc := OCILogoff(Svchp => OCISvcCtx(H),
           Errhp => Thread.Error);
--        Put_Line("Connection freed");   
        -- don't check error code after logoff in 8i   
        -- Check_Error(Rc); -- 8i bug
      end if;
   end;

   function Logon(DBName : String; User : String; Password : String) 
      return Connection is
      Rc : Sword;
      H : aliased OCISvcCtx;
   begin
      Rc := OCILogon(Envhp => Thread.Environment,
         Errhp => Thread.Error,
         Svchp => H'access,
         Username => C.To_C(User),
         Uname_Len => User'Length,
         Password => C.To_C(Password),
         Passwd_Len => Password'Length,
         Dbname => C.To_C(DBName),
         Dbname_Len => DBName'Length);
      Check_Error(Rc);
      return (RF.Controlled_Reference with Handle => OCIHandle(H));
   end Logon;

   function Logon(Connect : String) return Connection
         is
      D1,D2 : Natural;
      use Ada.Strings.Fixed,Ada.Strings;
   begin
      D1 := Index(Connect,"/");
      D2 := Index(Connect,"@",Backward);
      if D2=0 then
         return Logon("",
            Connect(Connect'First..D1-1),
            Connect(D1+1..Connect'Last));
      else
         return Logon(
            Connect(D2+1..Connect'Last),
            Connect(Connect'First..D1-1),
            Connect(D1+1..D2-1));
      end if;
   end Logon;

   procedure Logoff(Connect : in out Connection) is
      Result : Connection;
   begin
      Connect := Result;
   end Logoff;

   function Server_Version(Connect : in Connection) 
      return String is
      Buff : aliased Text := (0..511 => c.nul);
      rc : sword := OCIServerVersion (
               hndlp => Connect.Handle, 
               errhp => Thread.Error,
               bufp  => CStr.To_Chars_Ptr(Buff'Unchecked_Access),
               bufsz  => buff'Length-1,
               hndltype => OCI_HTYPE_SVCCTX);
   begin
     Check_Error(rc);
     return C.To_Ada(Buff);
   end Server_Version;

   procedure Commit(Connect : in Connection) is
     rc : sword := OCITransCommit(
          OCISvcCtx(Connect.Handle),Thread.Error);
   begin
     Check_Error(rc);
   end;
   
   procedure Rollback(Connect : in Connection) is
     rc : sword := OCITransRollback(
        OCISvcCtx(Connect.Handle),Thread.Error);
   begin
     Check_Error(rc);
   end;

end OCI.Thick.Connection_pkg;