comp.lang.ada
 help / color / mirror / Atom feed
* Variable argument list
@ 1998-06-09  0:00 Adrian BY, Hoe
  0 siblings, 0 replies; only message in thread
From: Adrian BY, Hoe @ 1998-06-09  0:00 UTC (permalink / raw)


[-- Attachment #1: Type: text/plain, Size: 4615 bytes --]

I have an Ada package written to interface to a database API which
is,  in C/C++. In the main, I have managed attaching the newdb
(db_handle) to an existing database with success! Then, I tried to
pass
the newdb (db_handle) as a variable arguments list in function
d_start_transaction. An error was raised by the API stating that
invalid
database handle (no active transaction). Under this circumstance, only
a
null or invalid db_handle will raise this error. I have try to count
the
number of arguments passed using Stdarg.Impl.ArgCount (args). It
returns
3 (in this case was newdb'Unchecked_Access & tpb_length &
tpb_address).

I can't figure out what is wrong with my code. It has perfect
compilation and runs well. I am suspecting the newdb'Unchecked_Access
was not passed correctly. Can someone help?

In C/C++ the syntax of isc_start_transaction() is :

ISC_STATUS isc_start_transaction(
ISC_STATUS *status_vector,
        isc_tr_handle *trans_handle,
        short db_handle_count, ...);

where ... is 
        isc_db_handle *db_handle,
        unsigned short tpb_length,
        char *tpb_address,
        [isc_db_handle *db_handle,
        unsigned short tpb_length,
        char *tpb_address ...]);

Of, prior to calling the d_start_transaction function, I have called
the
d_attach_database to obtain the newdb (db_handle) with success. The
db_handle has been passed to other functions as well which return
expected results. I/we can rule out that the db_handle, newdb, was not
assigned properly.

My question is, 

Is the pointer to db_handle of type PVOID (void *, in C/C++) passed
correctly with my implementation: function "&" is new Stdarg.Concat
(Pdb_handle); and Stdarg.Empty & newdb'Unchecked_Access & tpb_length &
tpb_address in d_start_transaction?

Please help!

My code is as below:


--------------------------------------------
with Ada.Unchecked_Conversion;
with Stdarg;
with Interfaces;
with Interfaces.C;
with System;

package database is

   type     Void                       is null record;
   subtype  PVoid                      is System.Address;

   subtype  Long                       is Interfaces.C.Long;
   type     Long_Array                 is array (Natural range <>) of
aliased Long;
   
   subtype  Unsigned_long              is Interfaces.C.Unsigned_Long;
   
   subtype  D_LONG                     is Long;
   subtype  D_UNSIGNED_LONG            is Unsigned_Long;

   subtype  D_STATUS                   is Long;
   type     PD_STATUS                  is access all D_STATUS;
   type     D_STATUS_Array             is array (Natural range <>) of
aliased D_STATUS;

   subtype  db_handle                  is PVoid;
   subtype  tr_handle                  is PVoid;

   type     Pdb_handle                 is access all db_handle;

   ...

   function To_Char is new Ada.Unchecked_Conversion (Integer, Char);

   function "&" is new Stdarg.Concat (Pdb_handle);
   function "&" is new Stdarg.Concat (PChar);
   function "&" is new Stdarg.Concat (Unsigned_Short);
   function "&" is new Stdarg.Concat (Short);

   ...

   function d_start_transaction (status_vector : access D_STATUS;
                                   trans_handle : access tr_handle;
                                   db_handle_count : Short;
                                   args : Stdarg.Arglist :=
Stdarg.Empty) return D_STATUS;

private

   ...

   pragma Import (Cdecl, d_start_transaction,
"isc_start_transaction");

   ...

end database;




-----------------------------------

with Ada.Text_IO; use Ada.Text_IO;
with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;
with Interfaces.C; use Interfaces;
with Stdarg;
with Win32;

with database; use database;

procedure main is
   newdb          : aliased db_handle;
   trans          : aliased tr_handle;
   status         : aliased D_STATUS_Array (0..19);
   sqlcode        : D_LONG;
   temp           : D_STATUS;

   tpb_length     : Unsigned_Short := 0;
   tpb_address    : PChar := NULL;

begin

   ...

   temp := d_start_transaction (status status'First)'Unchecked_Access,
                                  trans'Unchecked_Access,
                                  1,
                                  Stdarg.Empty &
                                  newdb'Unchecked_Access &
                                  tpb_length &
                                  tpb_address);

   ...

end main;


--------------------------------


-- 
BY Hoe                                  byhoe.lexical@technologist.com
VP, R&D (ES/IS Group)                                lexical@tm.net.my
Lexical Integration (M) Sdn Bhd   http://www.angelfire.com/biz/Lexical

[-- Attachment #2: Card for Adrian BY, Hoe --]
[-- Type: text/x-vcard, Size: 301 bytes --]

begin:          vcard
fn:             Adrian BY, Hoe
n:              Hoe;Adrian BY,
org:            Lexical Integration (M) Sdn Bhd
email;internet: byhoe.lexical@technologist.com
title:          VP, R&D (ES/IS Group)
x-mozilla-cpt:  ;0
x-mozilla-html: FALSE
version:        2.1
end:            vcard


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~1998-06-09  0:00 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
1998-06-09  0:00 Variable argument list Adrian BY, Hoe

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox