Skip to Content.
Sympa Menu

freetds - Re: [freetds] FreeTDS dbwillconvert discrepancy

freetds AT lists.ibiblio.org

Subject: FreeTDS Development Group

List archive

Chronological Thread  
  • From: Joe Losco <joe AT sqpuv.com>
  • To: FreeTDS Development Group <freetds AT lists.ibiblio.org>
  • Subject: Re: [freetds] FreeTDS dbwillconvert discrepancy
  • Date: Sun, 30 Nov 2008 10:46:53 -0500


James K. Lowden wrote:
Joe Losco wrote:
My problem that I've narrowed it down to is with this stub of code
if (SYBCHAR != pcol->type) { pcol->size = dbwillconvert(pcol->type, SYBCHAR);
}

I've placed "printf("name:%s type:%d size:%d\n", pcol->name, pcol->type, pcol->size);" around this piece of code so that I can see the before and after effects. In the command line pure C application dbwillconvert returns the size of the would be data converted to the correct type. This then lets the memory be allocated properly in the later calloc that uses pcol->size+1, as well as everything else to work as intended.

Yes, that's my code.
db-lib as specified and implemented by the vendors offers no way to
discover the printed length of a non-character value. FreeTDS extends
dbwillconvert() to do that: instead of a simple boolean, it returns the
number of bytes needed for a character representation. I'm sorry it's not
better documented. :-(

No problem at all, I was just confused by the documentation that I had found later.
However, in the Objective C/GUI version it appears to return a Bool. It

seems to return 1 if it is convertable and 0 if it is not. This obviously messes up the rest of the allocations in the sample resulting in truncation and overflow errors.

My first instinct was to wonder if in fact you're linking to FreeTDS and
not one of the vendor libraries, or perhaps to a version prior to 0.82. I
assume none of those is the case.
I am linking to a compiled framework however it is the same framework for both the C and the Obj-C version.
My second guess is to wonder if Objective C is looking at the header file
(or something like that), interpreting each nonzero return code as "true",
and returning only 0 or 1. Is there glue code that allows Objective C to
call a C library? Is there some preprocessing that gets done to make C
functions available to it?
This is probably what is happening as it makes the most sense. No glue code is needed. Obj-C can directly call all C programs and all C code is valid Obj-C code. But what you said about Obj-C interpreting any non zero value as true makes the most sense to me. What I wonder then is there something I can do to make this work without having to change the FreeTDS headers (because I would assue a type change would be a recompile and change to the actual library? I am relatively new to C and ObjC, so I'm not too experienced in this department.
I then looked into this farther and found http://www.freetds.org/reference/a00275.html#ga24 which from what I can tell is that the desired effect of that function is to return the bool.

Ouch. Yes. I'll update that. Thanks for pointing it out.
No problem, glad I could help, and thanks for the feedback :)

Joe





Archive powered by MHonArc 2.6.24.

Top of Page