Short story:
I need two new functions in the Server Programming Interface (SPI) when
mapping an ExecutionPlan to a Java prepared statement (pljava project).

Long story:
My problem is that once a plan is prepared and I want to execute it, I send
an array of java objects for the arguments. The SPI_cursor_open/SPI_execp of
course expects the arguments to be Datum's and the mapper must convert java
objects. Knowing the Oid of each type, this is not a problem. Those are
hidden in the opaque execution plan (a void*). I'm all in favor of data
hiding and reluctant to use spi_priv.h so I propose that you add the
following two functions:

/*
* Returns the number of arguments for the prepared plan.
*/
int SPI_getargcount(void* plan)
{
    if (plan == NULL)
    {
        SPI_result = SPI_ERROR_ARGUMENT;
        return -1;
    }
    return ((_SPI_plan*)plan)->nargs;
}

/*
* Returns the Oid representing the type id for argument at argIndex. First
* parameter is at index zero.
*/
Oid SPI_getargtypeid(void* plan, int argIndex)
    {
    if (plan == NULL || argIndex < 0 || argIndex >=
((_SPI_plan*)plan)->nargs)
    {
        SPI_result = SPI_ERROR_ARGUMENT;
        return InvalidOid;
    }
    return ((_SPI_plan*)plan)->argtypes[argIndex];
}

Regards,

Thomas Hallgren



Mon, 12 Jan 2004 15:59:39 +0100
"Thomas Hallgren" <thhal@mailblocks.com>
Request for additional SPI functions.

This seems like a reasonable request.  Care to submit a patch?

---------------------------------------------------------------------------

Thomas Hallgren wrote:
> Short story:
> I need two new functions in the Server Programming Interface (SPI) when
> mapping an ExecutionPlan to a Java prepared statement (pljava project).
> 
> Long story:
> My problem is that once a plan is prepared and I want to execute it, I send
> an array of java objects for the arguments. The SPI_cursor_open/SPI_execp of
> course expects the arguments to be Datum's and the mapper must convert java
> objects. Knowing the Oid of each type, this is not a problem. Those are
> hidden in the opaque execution plan (a void*). I'm all in favor of data
> hiding and reluctant to use spi_priv.h so I propose that you add the
> following two functions:
> 
> /*
> * Returns the number of arguments for the prepared plan.
> */
> int SPI_getargcount(void* plan)
> {
>     if (plan == NULL)
>     {
>         SPI_result = SPI_ERROR_ARGUMENT;
>         return -1;
>     }
>     return ((_SPI_plan*)plan)->nargs;
> }
> 
> /*
> * Returns the Oid representing the type id for argument at argIndex. First
> * parameter is at index zero.
> */
> Oid SPI_getargtypeid(void* plan, int argIndex)
>     {
>     if (plan == NULL || argIndex < 0 || argIndex >=
> ((_SPI_plan*)plan)->nargs)
>     {
>         SPI_result = SPI_ERROR_ARGUMENT;
>         return InvalidOid;
>     }
>     return ((_SPI_plan*)plan)->argtypes[argIndex];
> }
> 
> Regards,
> 
> Thomas Hallgren
> 
> 
> 
> ---------------------------(end of broadcast)---------------------------
> TIP 6: Have you searched our list archives?
> 
>                http://archives.postgresql.org
> 

-- 
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073

Wed, 11 Feb 2004 17:00:05 -0500 (EST)
Bruce Momjian <pgman@candle.pha.pa.us>
Re: Request for additional SPI functions.
I will submit a patch. As soon as I have read the developers FAQ and learned
how this is done :-)

B.T.W. I needed one additional function. Do you think I should submit it
too? This function copies some behavior found in the SPI_cursor_open. If
submitted, I'd suggest that the SPI_cursor_open calls this method to verify
the plan.

/*
 * Returns true if the plan contains exactly one command
 * and that command originates from normal SELECT (i.e.
 * not a SELECT ... INTO). In essence, the result indicates
 * if the command can be used with SPI_cursor_open or not.
 *
 * Parameters
 *    plan A plan previously prepared using SPI_prepare
 */
bool SPI_is_cursor_plan(void* plan)
{
 List* qtlist;
 _SPI_plan* spiplan = (_SPI_plan*)plan;
 if (spiplan == NULL)
 {
  SPI_result = SPI_ERROR_ARGUMENT;
  return false;
 }

 qtlist = spiplan->qtlist;
 if(length(spiplan->ptlist) == 1 && length(qtlist) == 1)
 {
  Query* queryTree = (Query*)lfirst((List*)lfirst(qtlist));
  if(queryTree->commandType == CMD_SELECT && queryTree->into == NULL)
   return true;
 }
 return false;
}

Regards,
Thomas Hallgren

----- Original Message ----- 
From: "Bruce Momjian" <pgman@candle.pha.pa.us>
To: "Thomas Hallgren" <thhal@mailblocks.com>
Cc: <pgsql-hackers@postgresql.org>
Sent: Wednesday, February 11, 2004 23:00
Subject: Re: [HACKERS] Request for additional SPI functions.


>
> This seems like a reasonable request.  Care to submit a patch?
>
> --------------------------------------------------------------------------
-
>
> Thomas Hallgren wrote:
> > Short story:
> > I need two new functions in the Server Programming Interface (SPI) when
> > mapping an ExecutionPlan to a Java prepared statement (pljava project).
> >
> > Long story:
> > My problem is that once a plan is prepared and I want to execute it, I
send
> > an array of java objects for the arguments. The
SPI_cursor_open/SPI_execp of
> > course expects the arguments to be Datum's and the mapper must convert
java
> > objects. Knowing the Oid of each type, this is not a problem. Those are
> > hidden in the opaque execution plan (a void*). I'm all in favor of data
> > hiding and reluctant to use spi_priv.h so I propose that you add the
> > following two functions:
> >
> > /*
> > * Returns the number of arguments for the prepared plan.
> > */
> > int SPI_getargcount(void* plan)
> > {
> >     if (plan == NULL)
> >     {
> >         SPI_result = SPI_ERROR_ARGUMENT;
> >         return -1;
> >     }
> >     return ((_SPI_plan*)plan)->nargs;
> > }
> >
> > /*
> > * Returns the Oid representing the type id for argument at argIndex.
First
> > * parameter is at index zero.
> > */
> > Oid SPI_getargtypeid(void* plan, int argIndex)
> >     {
> >     if (plan == NULL || argIndex < 0 || argIndex >=
> > ((_SPI_plan*)plan)->nargs)
> >     {
> >         SPI_result = SPI_ERROR_ARGUMENT;
> >         return InvalidOid;
> >     }
> >     return ((_SPI_plan*)plan)->argtypes[argIndex];
> > }
> >
> > Regards,
> >
> > Thomas Hallgren
> >
> >
> >
> > ---------------------------(end of broadcast)---------------------------
> > TIP 6: Have you searched our list archives?
> >
> >                http://archives.postgresql.org
> >
>
> -- 
>   Bruce Momjian                        |  http://candle.pha.pa.us
>   pgman@candle.pha.pa.us               |  (610) 359-1001
>   +  If your life is a hard drive,     |  13 Roberts Road
>   +  Christ can be your backup.        |  Newtown Square, Pennsylvania
19073
>


Thu, 12 Feb 2004 08:55:21 +0100
"Thomas Hallgren" <thhal@mailblocks.com>
Re: Request for additional SPI functions.
Thomas Hallgren wrote:
> I will submit a patch. As soon as I have read the developers FAQ and learned
> how this is done :-)
> 
> B.T.W. I needed one additional function. Do you think I should submit it
> too? This function copies some behavior found in the SPI_cursor_open. If
> submitted, I'd suggest that the SPI_cursor_open calls this method to verify
> the plan.

Sure, add that one too.

-- 
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073

Thu, 12 Feb 2004 09:42:10 -0500 (EST)
Bruce Momjian <pgman@candle.pha.pa.us>
Re: Request for additional SPI functions.