little endian emulation (Was: BIGENDIAN)

Paul Schaap paul.schaap at dingoblue.com.au
Thu Jul 12 20:23:08 EDT 2001


Brian,

> I've added a config option 'emulate little endian' (boolean option,
> accepts yes/on, on/off, true/false or 1/0) for the freetds.conf
> file.  Using TDS 7 will automatically cause this to be set.

I recompiled after altering the source as it wouldn't compile, are my
changes in line with what was meant ? :-
diff -urN freetds/src/tds/login.c freetdsfix/src/tds/login.c
--- freetds/src/tds/login.c     Fri Jul 13 08:29:10 2001
+++ freetdsfix/src/tds/login.c  Sat Jul 14 00:46:52 2001
@@ -187,8 +187,8 @@
                retval = 0;
                retval = select(tds->s + 1, NULL, &fds, NULL,
&selecttimeout);
                /* patch from Kostya Ivanov <kostya at warmcat.excom.spb.su> */
-               if (retcode < 0 && errno == EINTR)
-                       retcode = 0;
+               if (retval < 0 && errno == EINTR)
+                       retval = 0;
                /* end patch */
 
                now = time (NULL);
diff -urN freetds/src/tds/token.c freetdsfix/src/tds/token.c
--- freetds/src/tds/token.c     Fri Jul 13 08:29:11 2001
+++ freetdsfix/src/tds/token.c  Fri Jul 13 23:57:26 2001
@@ -923,11 +923,11 @@
                        }
                        if (tds->emul_little_endian) {
                                switch(curcol->column_type) {
-                                       case SYBINT:
-                                               (*(TDS_INT *)dest) =
TDS_BYTE_SWAP32(*(TDS_INT *)dest)
+                                       case SYBINT4:
+                                               (*(TDS_INT *)dest) =
TDS_BYTE_SWAP32(*(TDS_INT *)dest);
                                                break;
-                                       case SYBSMALLINT:
-                                               (*(TDS_SMALLINT *)dest) =
TDS_BYTE_SWAP16(*(TDS_SMALLINT *)dest)
+                                       case SYBINT2:
+                                               (*(TDS_SMALLINT *)dest) =
TDS_BYTE_SWAP16(*(TDS_SMALLINT *)dest);
                                                break;
                                }
                        }

I then compiled and with TDSVER unset it did 4.2 calls and got the correct
values. With TDSVER=70 it got wrong values, should have been 85114 but got
2051801344. (I'm not using a freetds.conf at all, right?)



> 
> Theoretically this will allow big endian clients to appear to the server
> as little endian, thus putting an end to the perpetual stream of microsoft
> bugs affecting big end clients.

:-( darn they make your life interesting.

> 
> It's not complete yet, but Paul if you can test TDS 7 on Linux PPC, int
> and smallint types *should* return correctly now. Let me know.

Are you Sure you don't want an account on my external machine to help make
the test cycle shorter, I have even a simple script to
cvs->recompile->install in one go to make it easy.


> 
> Brian
> 
> On Thu, 12 Jul 2001, Mark J. Lilback wrote:

Mark, thanks for your input ! Your efforts with SQL on Mac are legenedary,
Respect !

> 
> > At 7:13 AM -0400 7/12/01, Brian Bruns wrote:
> > >Mark,
> > >
> > >Is this limited to an MS-SQL server? It seems to be the date problem all
> > >over again.  I'm thinking that we will support a 'emulate little endian'
> > >mode for big end machines that will be used with TDS 7 and for big end
> > >machines connecting to broken versions of SQL Server.  Which version is
> > >the server that exhibits this behaviour?
> > 
> > This is with SQL Server 7, pre SP3. I've conditionalized my code so 
> > that once a connection is open, I query the server to get what 
> > version it is("master.dbo.xp_msver ProductVersion"). If it is less 
> > than 961, I set dbproc->tds_socket->broken_dates to 1, otherwise i 
> > set it to 0. (Since SP3 fixes the bigendian date problem.)
> > 
> > I'm compiling freetds into a plugin for MacSQL Monitor, a generic 
> > database tool. Because I need a lot of specific data not provided by 
> > any of the apis, the plugin is hard-coded for SQL Server only. That's
> > all I've tested against, too.
> > 
> > For this patch, it might be possible to detect if it is necessary. 
> > It's been a while since I was debugging this, but I believe you'll 
> > get a completely impossible message code if the data isn't swapped 
> > properly (I think it is negative, but I'd have to check). The test 
> > could be if bigendian and if (rc < 0).
> > 
> > 
> >

CHEERS
Poorly



More information about the FreeTDS mailing list