Re: Using freetds in Windows

"Andrew H. Wakefield" <[email protected]>
Newsgroups gmane.comp.db.tds.freetds
Message-ID <1263140852.2396.21.camel@uwake-laptop>
Freddy, you may have already partially answered my next question -- I
downloaded the "nightly snapshot" yesterday and tried to cross-compile
for Windows. It failed during the make, using the settings that worked
successfully for freetds-0.82. IIRC, the error had something to do with
types.h inclusion.

But that brings up a question about cross-compiling. I'm not sure I'm
doing it right! Here is how I have successfully cross-compiled
freetds-0.82 for Windows. I'm doing this on Ubuntu 9.10 platform:

// edit the configure script -- for some reason, it will not configure
successfully unless
// I force the cross_compiling flag

sed ‘s,cross_compiling=no,cross_compiling=yes,’ -i configure

// build in a separate subdirectory for msw version

cd build/msw 

// configuration options were adopted from the settings in
mingw-cross-env-2.10; I have tried
// some other variations without success, but I am not sure of the
implications of some of these

../../configure –prefix=/usr/i586-mingw32msvc –host=i586-mingw32msvc
--disable-rpath \
–disable-dependency-tracking –disable-shared –enable-static
--enable-libiconv –with-tdsver=8.0 

make
sudo make install

This produces a tsql.exe that does connect to the SQL server ... if I
specify the host and port!

Note that mingw-cross-env-2.10 also changes out wsock32 for ws2_32 -- I
have tried it both ways, and can't tell that there is any difference??

I could use a primer on the "proper" way to cross compile for windows.

Thanks,

Andy Wakefield
[email protected] 

On Sun, 2010-01-10 at 14:27 +0100, Frediano Ziglio wrote:

> 2010/1/9 James K. Lowden <[email protected]>:
> > James K. Lowden wrote:
> >> It's not
> >> a complete answer because (among other reasons) the db-lib error handler
> >> won't get the correct error string.
> >
> > Hi Freddy,
> >
> > A question for you on this topic.
> >
> > tdserror() assumes errnum can be converted to a string with strerror(3).
> > On Windows that's not true; for winsock errors strerror(3) returns
> > "Unknown error".  Somehow, we need to pass the Win32 error string
> > (returned from tds_prwsaerror()) to the client libraries.  But how?
> >
> 
> The problem is that in Windows C errors (from errno) and system errors
> (from GetLastError/WSAGetLastError or returned from APIs depending on
> API set!) are not compatible! Errors we detect are from errno and
> sockets. However there is no way to distinguish. In dblib structure we
> have a simply oserr (and also in TDSSOCKET but currently is used only
> for socket error that is systems errors). strerror works for C errors
> but not for sockets. System errors messages can be read using
> FormatMessage API (not that straight but I have example codes).
> Currently I added a macro for sock_strerror so it's easier to
> distinguish between strerror and sock_strerror.
> 
> > The db-lib call stack is:
> >
> > connect(2) (e.g.)
> > tdserror(TDSCONTEXT, TDSSOCKET, msgno, oserr)
> > _dblib_handle_err_message(TDSCONTEXT, TDSSOCKET, TDSMESSAGE)
> > dbperror (DBPROCESS, msgno, oserr)
> >
> > I don't want to change the interface to dbperror() or tdserror() just for
> > Win32.
> >
> > My suggestion: add
> >
> >        char * winsock_errstr
> >
> 
> I don't like this... perhaps would be better to understand if is a
> socket error from tds error code.
> 
> > to TDSSOCKET.  Normally it's NULL.  If libtds detects a win32 socket
> > error, it looks up the const static string with tds_prwsaerror() and
> > stores the pointer in winsock_errstr.  When dbperror() calls the client
> > handler, it examines that pointer.  If not NULL, it passes it to the
> > client handler instead of calling strerror(3).  To avoid confusion,
> > dbperror() sets the pointer to NULL after the handler returns.
> >
> > I think this would work with the other client libraries, too.  What do you
> > think?
> >
> 
> Looking at windows constants I would use a trick and an unique error
> number. C errors in windows are very few (the higher constant is 80
> but is not used by FreeTDS) while socket errors are usually higher
> than 10000. Perhaps we could define a tds_strerror that take this
> constants and output a string. (see
> http://msdn.microsoft.com/en-us/library/t3ayayh1%28VS.80%29.aspx and
> http://msdn.microsoft.com/en-us/library/ms740668%28VS.85%29.aspx).
> 
> Another problem is thread safety. strerror is not thread safe, it
> would be better to use strerror_r if available. Under Windows for C
> errors there is _sys_nerrs and _sys_errlist.
> 
> > BTW, I'm working on updates to the UG for 0.92.
> >
> 
> Good! I saw you committed patch for defncopy and Windows, it was one
> of patches I had on my list (you sent me defncopy.c many time ago but
> got no time to check it). I saw some strange include in defncopy like
> replacements.win32.hacked.h, win32.microsoft directory. Also there is
> a strange types.h inclusion in src/tds/token.c... quite strange,
> tds_get_varint_size should be defined in data.c (which include
> types.h), this breaks my cross Windows compile. Also I got a double
> definition cause you added a strncasecmp in include/replacements.h.
> Perhaps should be placed in defncopy.c (like strcasecmp define?).
> 
> Did you see my initial patch for forbid instance and port
> specification on freetds.conf?? I attach it.
> 
> > Regards,
> >
> > --jkl
> >
> 
> freddy77
> _______________________________________________
> FreeTDS mailing list
> [email protected]
> http://lists.ibiblio.org/mailman/listinfo/freetds
_______________________________________________
FreeTDS mailing list
[email protected]
http://lists.ibiblio.org/mailman/listinfo/freetds
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.