From: | Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> |
---|---|
To: | Goran Thyni <goran(at)bildbasen(dot)se> |
Cc: | pgsql-interfaces(at)postgreSQL(dot)org, pgsql-hackers(at)postgreSQL(dot)org |
Subject: | Re: [INTERFACES] Re: [HACKERS] Convert PGconn, PGresult to opaque types? |
Date: | 1998-08-24 14:22:35 |
Message-ID: | 23263.903968555@sss.pgh.pa.us |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers pgsql-interfaces |
Goran Thyni <goran(at)bildbasen(dot)se> writes:
> Bruce Momjian wrote:
>>>> Basically this would force applications to use the accessor functions
>>>> as recommended in the documentation, and not touch fields of a PGconn
>>>> object directly. (Ditto for PGresult.)
>>
>> I am scared about external stuff like php. If they use it, and we
>> release something that doesn't work with their stuff, we are cooked
>> until they upgrade.
But if they are using any direct references to fields of the PGconn
struct, their stuff *already* won't work with 6.4. Admittedly it'd
most likely only take a recompile to fix, and not code changes
(however trivial). But if they'd been using only the documented API,
ie using the accessor functions and not directly touching the struct,
then a new shared library or DLL could be plopped right in without even
a recompile of calling applications.
Is the PHP source code available? It wouldn't take much work to check
whether it will compile without a definition for struct pg_conn.
> I think Tom is aiming for thread-safeness which can't be done as long as
> external stuff insists on accessing global structs inside libpq.
This is not a thread-safeness issue, it's an issue of being able to
promise binary compatibility across versions. Before the days of shared
libraries, source-code compatibility across versions was Good Enough,
because users had to rebuild their apps anyway to drop in a new version
of a library. Nowadays, people who don't even *have* the source of an
app still expect that they can shove in a new version of a shared library
that the app depends on. And that's a good thing, if it fixes some bugs
or adds new features; but it only works if the library's API is fully
binary compatible across releases. Hiding all but the simplest, most
stable structs is a necessary restriction if you hope to achieve that.
I made the wrong choice on this years ago with libjpeg (in self-defense,
that was before anyone had heard of shared libraries for Unix): I
exposed as part of the library's API a large parameter struct that I
knew would need to change with every new library version. At the time
it didn't seem like a problem, but I've learned to regret it. I see
people complaining all the time that their apps compiled against
libjpeg v6a stop working when they drop in v6b instead. Learn
from my bad example ;-)
Basically my feeling is that we will want to do this eventually, and
the pain level can only get worse the longer we put it off.
regards, tom lane
From | Date | Subject | |
---|---|---|---|
Next Message | John Reynolds | 1998-08-24 14:25:32 | subscribe |
Previous Message | Bruce Momjian | 1998-08-24 14:19:32 | Re: [HACKERS] initdb problem |
From | Date | Subject | |
---|---|---|---|
Next Message | Byron Nikolaidis | 1998-08-24 14:29:48 | Re: [INTERFACES] iodbc interface on Unix |
Previous Message | Eric Marsden | 1998-08-24 13:40:25 | Re: [INTERFACES] JDBC Connection |