Обсуждение: RE: [INTERFACES] The problem between libpq and libpgtcl for WIN32

Поиск
Список
Период
Сортировка

RE: [INTERFACES] The problem between libpq and libpgtcl for WIN32

От
"Hiroshi Inoue"
Дата:
Hi all.

               Hiroki Kataoka wrote
> Hello all.
>
> > -----Original Message-----
> > From: owner-pgsql-interfaces@postgreSQL.org
> > [mailto:owner-pgsql-interfaces@postgreSQL.org]On Behalf Of Hiroshi Inoue
> > Subject: [INTERFACES] The problem between libpq and libpgtcl for WIN32
> >
> >
> >   The treatment of pgresStatus[] in libpq must be changed ?
> >
> > In case of Windows,global data interface between dll's is
> > different from UNIX.
> > If fact,libpgtcl references global data pgresStatus[] in libpq
> > and  pg_result -status command does not work properly for
> > Windows.
> >
> > I think it is preferable to use function interfaces than gobal
> > data references.
> >
> > Any ideas ?
>
>   I solved this problem by the change in the following.
>
> ======== cut here ========
> *** libpq-fe.h.dist     Tue Oct  6 23:16:48 1998
> - --- libpq-fe.h  Tue Dec 15 03:52:34 1998
> ***************
> *** 50,56 ****
> - --- 50,60 ----
>         } ExecStatusType;
>
>   /* String descriptions of the ExecStatusTypes */
> + #ifdef WIN32
> +       __declspec(dllimport) const char * const pgresStatus[];
> + #else
>         extern const char * const pgresStatus[];
> + #endif
>
>   /* PGconn encapsulates a connection to the backend.
>    * The contents of this struct are not supposed to be known to
> applications.
> *** libpqdll.def.dist   Tue Oct  6 23:05:02 1998
> - --- libpqdll.def        Tue Dec 15 03:52:44 1998
> ***************
> *** 63,68 ****
>         lo_unlink               @ 60
>         lo_import               @ 61
>         lo_export               @ 62
> !       pgresStatus             @ 63
>         PQmblen                 @ 64
>         PQresultErrorMessage    @ 65
> - --- 63,68 ----
>         lo_unlink               @ 60
>         lo_import               @ 61
>         lo_export               @ 62
> !       pgresStatus             @ 63 DATA
>         PQmblen                 @ 64
>         PQresultErrorMessage    @ 65
> ======== cut here ========
>
>   "pg_result -status" operates correctly by this method. Moreover, it is
> thought that this method is easy because the change part is in libpq.
>

 The word _declspec(dllimport) is Microsoft-specific and other compilers
 can't handle this keyword ?

 Magnus,  libpq for WIN32 is only for Microsoft Visual C++ ?
 (Seems makefiles win32.mak are for Microsoft Visual C++).


 For this problem,Tom Lane wrote

> But it seems reasonable to add a corresponding function call, say
>
>    const char * PQresStatus (ExecStatusType status);
>
> and change libpgtcl to use that instead.  We could even deprecate

 I agree with him because I don't like global data references.

 But the way Hiroki proposed has a advantage that binaries(libpq,libpgtcl)
 are invariant except the dll's for WIN32.

 Thanks.

Hiroshi Inoue
Inoue@tpf.co.jp



RE: [INTERFACES] The problem between libpq and libpgtcl for WIN32

От
"Hiroki Kataoka"
Дата:
Hello all.

> -----Original Message-----
> From: Hiroshi Inoue [mailto:Inoue@tpf.co.jp]
>
> Hi all.
>
    ::
>
>  The word _declspec(dllimport) is Microsoft-specific and other compilers
>  can't handle this keyword ?
>
>  Magnus,  libpq for WIN32 is only for Microsoft Visual C++ ?
>  (Seems makefiles win32.mak are for Microsoft Visual C++).

  I think that the source code assumes Microsoft Visual C++ is used at the
compilation time of libpq. But it is general at using libpq from another
application.

>  For this problem,Tom Lane wrote
>
> > But it seems reasonable to add a corresponding function call, say
> >
> >    const char * PQresStatus (ExecStatusType status);
> >
> > and change libpgtcl to use that instead.  We could even deprecate
>
>  I agree with him because I don't like global data references.

  I agree with the addition of PQresStatus API.

>  But the way Hiroki proposed has a advantage that binaries(libpq,libpgtcl)
>  are invariant except the dll's for WIN32.

  I prepared another different method though looked like.  But, I think that
this method does not depend on MS VC++.  I want someone to try in the
environments other than MS VC++.

======== cut here ========
*** libpq-fe.h.dist     Tue Oct  6 23:16:48 1998
--- libpq-fe.h  Mon Dec 21 22:42:58 1998
***************
*** 50,56 ****
--- 50,61 ----
        } ExecStatusType;

  /* String descriptions of the ExecStatusTypes */
+ #ifdef WIN32
+       extern const char * const (* _imp_pgresStatus)[];
+ #define pgresStatus (* _imp_pgresStatus)
+ #else
        extern const char * const pgresStatus[];
+ #endif

  /* PGconn encapsulates a connection to the backend.
   * The contents of this struct are not supposed to be known to
applications.
*** libpqdll.def.dist   Tue Oct  6 23:05:02 1998
--- libpqdll.def        Mon Dec 21 22:38:06 1998
***************
*** 63,68 ****
        lo_unlink               @ 60
        lo_import               @ 61
        lo_export               @ 62
!       pgresStatus             @ 63
        PQmblen                 @ 64
        PQresultErrorMessage    @ 65
--- 63,68 ----
        lo_unlink               @ 60
        lo_import               @ 61
        lo_export               @ 62
!       pgresStatus             @ 63 DATA
        PQmblen                 @ 64
        PQresultErrorMessage    @ 65
======== cut here ========

  I do not think that my idea is final.  However, I think that we can port
the code of UNIX easily to the environment of WIN32 in this method.

  Thank you.

--
Hiroki Kataoka
kataoka@interwiz.koganei.tokyo.jp