Re: libpq and prepared statements progress for 8.0 - Mailing list pgsql-hackers

From Dann Corbit
Subject Re: libpq and prepared statements progress for 8.0
Date
Msg-id D425483C2C5C9F49B5B7A41F8944154705549B@postal.corporate.connx.com
Whole thread Raw
In response to libpq and prepared statements progress for 8.0  ("Greg Sabino Mullane" <greg@turnstep.com>)
List pgsql-hackers
> -----Original Message-----
> From: gsstark@mit.edu [mailto:gsstark@mit.edu]
> Sent: Wednesday, September 15, 2004 11:34 AM
> To: Tom Lane
> Cc: Dann Corbit; Greg Stark; Merlin Moncure;
> pgsql-hackers@postgresql.org
> Subject: Re: [HACKERS] libpq and prepared statements progress for 8.0
>
>
>
> Tom Lane <tgl@sss.pgh.pa.us> writes:
>
> > "Dann Corbit" <DCorbit@connx.com> writes:
> > > What about using ECPG as an interface for drivers?
> >
> > What for?  It's not a substitute for libpq --- it sits on top of
> > libpq, or did last I checked anyway.  And it's designed around a
> > preprocessor that seems fairly useless for a driver.
>
> As it happens DBD::Oracle does use Oracle's precompiler. But
> it's more of a hindrance than a help. It basically has to
> define and implement its own API which is compiled with
> Pro*C. Then the rest of the codebase can ignore the
> precompiler and use that interface.
>
> Precompilers are really old school. There's not much point to
> using them except in legacy applications that need them. They
> offer no advantage over a programmatic API, and lots of
> disadvantages. You have to learn a new language, you're one
> step further removed from the resulting code, and heaven help
> you if your compiler version doesn't match what the
> precompiler was tested with. Nevermind actually trying to use
> it from another language entirely.

The nice thing about using the SQL precompiler was that it was very
simple.

A total of 15 interfaces needed to be defined:
PROCEDURE PREPARE_STMT
PROCEDURE DESCRIBE_SELECT
PROCEDURE DESCRIBE_PARM
PROCEDURE EXECUTE_STMT
PROCEDURE EXECUTE_IMMEDIATE
PROCEDURE DECLARE_CURSOR
PROCEDURE DECLARE_LIST_CURSOR
PROCEDURE DECLARE_CURSOR_READ_ONLY
PROCEDURE DECLARE_LIST_CURSOR_READ_ONLY
PROCEDURE DECLARE_CURSOR_INSERT_ONLY
PROCEDURE DECLARE_LIST_CURSOR_INSERT_ONLY
PROCEDURE OPEN_CURSOR
PROCEDURE FETCH_ROW
PROCEDURE CLOSE_CURSOR
PROCEDURE RELEASE_STMT

And each one was only a few lines (the entire SQLMOD file, including
comments is 5695 bytes long).
A C++ wrapper was written around these statements, and the C++ wrapper
is what is used from the applications that exercise the underlying
SQLMOD interface.

It was also considerably FASTER than using the C API directly.  This is
probably due to Rdb being ANCIENT technology, and quite possibly the C
API is written over top of SQLMOD rather than the other way around.

At any rate, it is very simple to write a generic interface using a
precompiler.

However, if the PostgreSQL precompiler is not reentrant, it is a waste
of time.  My thought was that ECPG might deliver the missing
functionality needed by the Perl interface.  Since ECPG sits on top of
libpq, and libpq seems to lack some needed feature, it seems highly
unlikely that it can provide what is missing.


pgsql-hackers by date:

Previous
From: Greg Stark
Date:
Subject: Re: libpq and prepared statements progress for 8.0
Next
From: "Jim C. Nasby"
Date:
Subject: 'TID index'