pg.ddx.io  pgsql-interfaces@postgresql.org mailing list archive  
help / color / mirror / Atom feed
From: Tom Lane <tgl@sss.pgh.pa.us>
To: pgsql-interfaces@postgreSQL.org
To: pgsql-hackers@postgreSQL.org
Subject: Convert PGconn, PGresult to opaque types?
Date: Fri, 21 Aug 1998 10:19:58 -0400
Message-ID: <15281.903709198@sss.pgh.pa.us> (raw)

In last week's episode, I wrote:
> I have dealt with this by splitting libpq-fe.h into two files, leaving
> only exportable information in libpq-fe.h and moving the internals into
> a new file libpq-int.h.  This should solve Ewan's problem and reduce
> application-code namespace pollution in general.
> 
> (If I were really being fascist about this I would've moved the
> definitions of struct pg_conn and friends into libpq-int.h, leaving
> only an opaque "struct pg_conn" declaration to be seen by applications.
> But I'm afraid that that will break too many applications.  Perhaps we
> can take that step in some future release.)

Today I am wondering whether it wouldn't be a good idea to just go ahead
and move those struct declarations into libpq-int.h.  Then a pointer to
PGconn would be truly an opaque type for applications; all they'd see is

	typedef struct pg_conn * PGconn;

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 think it is a real good idea to do this eventually, because it will
help ensure that applications don't assume things they shouldn't about
what is in a PGconn, and it will allow us to modify the PGconn structure
without breaking binary compatibility of applications across libpq
releases.  This is a critical consideration now that libpq is released
as a shared library on Unix and will be available in DLL form for
Windows.  People tend to think that they can update shared libraries
without recompiling the programs that use the libraries.

What occurs to me today is that if we intend to do it eventually, we
may as well do it *now*.  Waiting will just give more programmers the
opportunity to write bad code, I think.  And we are going to break
binary compatibility of libpq in 6.4 anyway --- the contents of PGconn
have changed since last time.  So anyone who's not relying on the
accessor functions is already in trouble.

The downside is that we will probably break at least some applications
at source-code level.  They weren't playing by the rules, but they'll
be annoyed anyway.  (Anyone who's too lazy to fix their code can just
import libpq-int.h instead of libpq-fe.h, but one hopes not too many
people will take that way out.)

I know that both psql and libpgtcl are not playing entirely by the rules,
and will need to be fixed.  I can handle that.  I'm not volunteering
to fix any code outside the distribution, however.

Comments?  Any strong reasons *not* to do this?

			regards, tom lane



view thread (8+ messages)  latest in thread

Message-ID: <15281.903709198@sss.pgh.pa.us>
Permalink:  ../15281.903709198@sss.pgh.pa.us/
Also on:    postgresql.org/message-id/15281.903709198@sss.pgh.pa.us

 · 

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: pgsql-interfaces@postgresql.org
  Cc: tgl@sss.pgh.pa.us, pgsql-hackers@postgreSQL.org
  Subject: Re: Convert PGconn, PGresult to opaque types?
  In-Reply-To: <15281.903709198@sss.pgh.pa.us>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox