Re: ECGP - varchar in struct? - Mailing list pgsql-interfaces

From William West
Subject Re: ECGP - varchar in struct?
Date
Msg-id OF4448F465.F8B0E353-ON85256C12.00687BCF@com
Whole thread Raw
In response to ECGP - varchar in struct?  ("William West" <wwest@csc.com>)
Responses Re: ECGP - varchar in struct?
List pgsql-interfaces
>> As a PostgreSQL 'newbie', I am not sure if it is more
>> work to fix ecpg or to re-write how the application
>> does things. I see it is a 'yacc' unit that handles the
>> re-writing that ecpg now does, but I do not know
>> 'yacc-ese' and do not know what else would be involved
>> to fix ecpg to work like PRO-C?

> Yes, it's quite some work. :-) But if you volunteer I gladly accept
> patches. :-)

The 'encapsulated C' approach would require few changes to
Pro-C based application, and would make it easier to support
both Oracle and PostgreSQL from the same code-base, if ecpg
had a capabilities closer to Pro-C's.

But I am leery of the time it would take for me to continue with
that more general and portable approach (first upgrade ecpg and
then port the application) ... so I have sort of decided to convert
to using the libpq (or maybe libpqeasy + libpq) instead ... at
least then it is only one project (albeit much bigger than at
first expected).

Perhaps later, when I have mastered the libpq interface,
I'll reconsider taking you up on that, since the 'encapsulated'
approach really would be better from a maintenance point of view :-)

>> - Did I miss something here?

> Yes, at first you can list you struct definition inside the declare
> section and it will work nicely.

I need for the struct to define a shape and to be able to
*separately* instantiate instances (or arrays-of-instances)
of that shape.

As I understand it, a DECLARE section will instantiate an
instance of the struct each time I INCLUDE it in a compile unit,
and I am not sure how I would declare a multiple-rows array?

To clarify what I am faced with:

The existing application has many different structs, each of
which has members for the columns affected by any of a
number of different realtime message-driven update accesses.

That is, there are a couple of dozen different messages, each
needing to revise different columns of the tables defined
(one of which has in excess of 60 columns). There are also
'update all' messages that need to INSERT or UPDATE into *all*
columns of the 60+ columns table.

Each message is backed by a struct that has storage shapes
for the column(s) to be updated by that message. The
functions that perform message data-to-struct (or
data-from-struct) operations are in different compile
units than are the functions that issue the SQL operations
that exchange data with the database.

The application currently does pass-by-reference operations
among many functions across many separate compile units. Of
course, every compile unit having to DECLARE the struct will
give each compile unit its own *instance* of the struct and
won't allow the application to do the SQL to load/ unload
the struct from/to the database in one function in one compile
unit and then pass by reference to/ from other functions in
other compile units (as the application currently does).


In addition, the application processes some messages that work with
many rows from a given table all at once. Being unable to separate 'row
shapes' (struct layouts) from instantiation thereof (DECLARE thereof)
appears
to make it difficult or impossible to instantiate front-end space for
arrays-of-rows.

It also appears to make it impossible to have ecpg issue SELECTS/ INSERTS/
UPDATES that affect many rows as well as columns with each front-end to
back-end SQL exchange (each EXEC SQL) ... something that the present
application does a *lot* of and that - at least with Oracle - gives an
order of
magnitude performance improvement.

It appears to me that the libpq layer front-end to back-end interface
is able to pass an open-ended number of columns and rows per PQexec()
call ... that the problem would be a vectoring/ mapping definition capable
of
properly delivering PQgetvalue() returns into stuct members.

That is why, unless I am still missing something, I am inclined to convert
to
a direct-to-libpq interface (or maybe a hybrid of libpgeasy  plus libpq).
Does
that seem reasonable, given the present organization of the application?



pgsql-interfaces by date:

Previous
From: Michael Meskes
Date:
Subject: Re: ECGP - varchar in struct?
Next
From: g.hintermayer@inode.at (Gerhard Hintermayer)
Date:
Subject: libpgtcl modifications