Re: [Vala] Creating bindings for Oracle OCI



I'm sorry to keep pestering.. but if I omit the asterick, nothing
changes.. it still aborts.. What I did get to work, sorta, was to omit
the 'out'.. initially I got the error 'error: use of possibly unassigned
local variable `errbuf'' which I got around by declaring errbuf as
'string errbuf = ""'.. now, the buffer is filled, but with only 7
characters of the error:

ORA-121

which should be:

ORA-12154: TNS:could not resolve the connect identifier specified

Which I can get if I change the bufsiz arg from '(int)sizeof(string)' to
512.. but I then it's worse as I also get:

*** glibc detected *** ./x: free(): invalid next size (fast):
0x0000000000688510 ***

Which I presume is because I'm freeing more memory than the string
actually occupies? (I assume this is true, because if I change it to 16,
I get more of the message returned, without the error.. but I can't go
anywhere near the 66 chars needed.. not even 33)

The thing I don't understand is that the docs say if buffsiz isn't big
enough, OCIErrorGet will return null.. so, I'm lead to believe that
oracle is getting a big enough buffer, but somehow string is truncating
it? Should I not be using string?


On Wed, 2009-06-17 at 13:24 +0200, Jiří Zárevúcky wrote:
You have problem with pointers, again. ;) Once you add "out", it's not
a pointer anymore as far as Vala is concerned, so you have to omit the
asterisk. You are essentially replacing it.

2009/6/17 Shawn Ferris <shawn ferris gmail com>:
Ooops.. Resending, didn't realize this didn't go to the list.. my
apologies.

On Tue, 2009-06-16 at 21:44 -0600, Shawn Ferris wrote:
Man.. I'm so close I can smell it.. I actually have the bindings working
to the point were I am fetching a value from a table. Unfortunately, the
way it sits, I'm stuck with ints alone.. as soon as I try to return a
string, the code aborts.. there's actually two cases where the results
are the same and I'm assuming the fix for one will fix the other, so
I'll ask for help on the easier one. In this case, it's the ErrorGet
function defined as:

sword OCIErrorGet ( void      *hndlp,
                  ub4        recordno,
                  OraText       *sqlstate,
                  ub4        *errcodep,
                  OraText       *bufp,
                  ub4        bufsiz,
                  ub4        type );

My vapi definition:

  [CCode (cname = "OCIErrorGet")]
  public int ErrorGet (
    Error*       error,
    int          record,
    out string*  sqlstate,
    out int*     errcode,
    out string*  buffer,
    int          buffersz,
    HType        type
  );

And a C example:

  text errbuf[512];
  OCIErrorGet ((dvoid *) errhp, (ub4) 1, (text *) NULL, &errcode,
            errbuf, (ub4) sizeof(errbuf), (ub4) OCI_HTYPE_ERROR);

If I leave off errbuf (which should be the physical message string
assoctiate to errcode) everything works fine. EG:

    int*    errno;
    OCI.ErrorGet ( err, 1, null, out errno, null, 0, HType.ERROR);
    stdout.printf("Error - ORA-%5.5d (%s)\n", (int)errno, action);

I absolutely get the right error code (i can force which error I gen)
but as soon as I try to touch errbuf the program aborts.. I can not for
the life of me find the correct way to do this. Can someone point me in
the right direction? And then, I'll warn you that I'll have at least one
more email.. but more critique and style.. I'm assuming I haven't
followed the vala way, but I'm more interested in getting it to work and
addressing style later.

Thanks for the help!
SMF


_______________________________________________
Vala-list mailing list
Vala-list gnome org
http://mail.gnome.org/mailman/listinfo/vala-list





[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]