SOURCES: unixODBC-types.patch - do it the riht way using SIZEOF_LONG

Jakub Bogusz qboosh w pld-linux.org
Pią, 8 Paź 2004, 20:35:32 CEST


On Fri, Oct 08, 2004 at 07:40:11PM +0200, havner wrote:
> On Fri, Oct 08, 2004 at 10:54:46AM +0200, Jakub Bogusz wrote:
> > On Sun, Oct 03, 2004 at 01:39:00AM +0000, havner wrote:
> > > Author: havner                       Date: Sun Oct  3 01:39:00 2004 GMT
> > > Module: SOURCES                       Tag: HEAD
> > > ---- Log message:
> > > - do it the riht way using SIZEOF_LONG
> > > 
> > > ---- Files affected:
> > > SOURCES:
> > >    unixODBC-types.patch (1.1 -> 1.2) 
> > > 
> > > ---- Diffs:
> > > 
> > > ================================================================
> > > Index: SOURCES/unixODBC-types.patch
> > > diff -u SOURCES/unixODBC-types.patch:1.1 SOURCES/unixODBC-types.patch:1.2
> > > --- SOURCES/unixODBC-types.patch:1.1	Sat Oct  2 23:14:42 2004
> > > +++ SOURCES/unixODBC-types.patch	Sun Oct  3 01:38:54 2004
> > > @@ -1,15 +1,19 @@
> > >  diff -ur unixODBC-2.2.9.orig/include/sqltypes.h unixODBC-2.2.9/include/sqltypes.h
> > >  --- unixODBC-2.2.9.orig/include/sqltypes.h	2004-06-25 19:01:15.000000000 +0200
> > > -+++ unixODBC-2.2.9/include/sqltypes.h	2004-10-03 00:51:29.842492392 +0200
> > > -@@ -256,9 +256,9 @@
> > > ++++ unixODBC-2.2.9/include/sqltypes.h	2004-10-03 03:35:55.969613088 +0200
> > > +@@ -256,9 +256,14 @@
> > >   typedef signed short int        SWORD;
> > >   typedef unsigned short int      UWORD;
> > >   typedef unsigned int            UINT;
> > > --typedef signed long             SLONG;
> > > ++#if (SIZEOF_LONG == 4)
> > > + typedef signed long             SLONG;
> > > +-typedef signed short            SSHORT;
> > > + typedef unsigned long           ULONG;
> > > ++#else
> > >  +typedef signed int              SLONG;
> > > - typedef signed short            SSHORT;
> > > --typedef unsigned long           ULONG;
> > >  +typedef unsigned int            ULONG;
> > > ++#endif
> > > ++typedef signed short            SSHORT;
> > >   typedef unsigned short          USHORT;
> > >   typedef double                  SDOUBLE;
> > >   typedef double            		LDOUBLE;
> > 
> > Skąd informacja, że SLONG/ULONG w API/ABI ODBC mają być 32-bitowe?
> > Jest to w jakiejś specyfikacji ODBC?
> > 
> > Druga rzecz, to taka zmiana wymaga zmiany SONAME na 64-bitowych
> > architekturach ze względu na binarną niekompatybilność.
> 
> Tak wymaga tego Firebird. W naglowku jest wyraznie napisane, ze
> wymuszaja 32bit na 64bit architekturach. I przy takim ODBC nie budowal
> sie php (includowal oba, i byl konfikt typow) Spytalem arekm co z tym
> zrobic. Powiedzial, ze chyba najlepiej wymusic to w ODBC, zeby bylo
> calkowicie jednolite. Nie mam pewnosci jak powinno byc, ale nikt inny
> nie chcial tego poprawic.

Firebird nie jest tu żadnym wyznacznikiem, bo nie dostarcza API ODBC(?),
więc jest to tylko konflikt nazw typów używanych do różnych rzeczy - do
rozwiązania w inny sposób (pewnie jakimiś hackami z #define).
mikmod też używa 32-bitowych typów o nazwach [SU]LONG, a ma jeszcze
mniej wspólnego z ODBC.

Jak to w unixODBC (i libiodbc) powinno być, to zależy do czego służy,
czy jest używane lokalnie czy zdalnie itd. - trzeba by pośledzić.
Czy to mają być typy odpowiadające danym typom C, czy zawsze o tym samym
rozmiarze (ale od tego jest UDWORD i SDWORD).

Nie wiem czy jest do tego jakaś specyfikacja uwzględniająca konwencję
LP64 - bo z tego co słyszałem Win64 używa LLP64, więc ma 32-bitowego
longa.

Tutaj znalazłem jakieś uwagi dot. 64-bitowego ODBC - jest parę zmian,
ale SLONG i ULONG jest zawsze longiem.

http://www-numi.fnal.gov/offline_software/external_pkgs/Linux2.4-GCC_3_2/include/sqltypes.h

Zmieniając tak sobie sqltypes.h dostajemy binarną niekompatybilność
w ramach bibliotek ODBC z innymi dystrybucjami na 64-bitowego Linuksa
oraz ze wszystkimi naszymi binarkami budowanym na ODBC przed tą zmianą.


-- 
Jakub Bogusz    http://cyber.cs.net.pl/~qboosh/




Więcej informacji o liście dyskusyjnej pld-devel-pl