Ejemplo n.º 1
0
void
gcd_api_setDesc( GCD_PCB *pcb )
{
    pcb->api.name = "IIapi_setDescriptor()";
    pcb->api.parm.sDesc.sd_genParm.gp_callback = gcd_gen_cmpl;
    pcb->api.parm.sDesc.sd_genParm.gp_closure = (PTR)pcb;
    pcb->api.parm.sDesc.sd_stmtHandle = pcb->ccb->api.stmt;
    pcb->api.parm.sDesc.sd_descriptorCount = pcb->data.desc.count;
    pcb->api.parm.sDesc.sd_descriptor = pcb->data.desc.desc;

    IIapi_setDescriptor( &pcb->api.parm.sDesc );
    return;
}
int OGRIngresStatement::SendParms()

{
    IIAPI_SETDESCRPARM		setDescrParm;
    IIAPI_PUTPARMPARM		putParmParm;
    IIAPI_DESCRIPTOR    	DescrBuffer;
    IIAPI_DATAVALUE    		DataBuffer;
    IIAPI_WAITPARM	        waitParm = { -1 };

/* -------------------------------------------------------------------- */
/*      Describe the parameter.                                         */
/* -------------------------------------------------------------------- */
    setDescrParm.sd_genParm.gp_callback = NULL;
    setDescrParm.sd_genParm.gp_closure = NULL;
    setDescrParm.sd_stmtHandle = hStmt;
    setDescrParm.sd_descriptorCount = 1;
    setDescrParm.sd_descriptor = ( IIAPI_DESCRIPTOR * )( &DescrBuffer );
 
    setDescrParm.sd_descriptor[0].ds_dataType = eParmType;
    setDescrParm.sd_descriptor[0].ds_nullable = FALSE;
    setDescrParm.sd_descriptor[0].ds_length = (II_UINT2) (nParmLen+2);
    setDescrParm.sd_descriptor[0].ds_precision = 0;
    setDescrParm.sd_descriptor[0].ds_scale = 0;
    setDescrParm.sd_descriptor[0].ds_columnType = IIAPI_COL_QPARM;
    setDescrParm.sd_descriptor[0].ds_columnName = NULL;

    IIapi_setDescriptor( &setDescrParm );
	
    while( setDescrParm.sd_genParm.gp_completed == FALSE )
	IIapi_wait( &waitParm );

    if( setDescrParm.sd_genParm.gp_status != IIAPI_ST_SUCCESS )
    {
        ReportError( &(setDescrParm.sd_genParm), "SendParm()" );

        return FALSE;
    }

/* -------------------------------------------------------------------- */
/*      Send the parameter                                              */
/* -------------------------------------------------------------------- */
    GByte  abyChunk[2000];
    int    nBytesSent = 0;

    putParmParm.pp_genParm.gp_callback = NULL;
    putParmParm.pp_genParm.gp_closure = NULL;
    putParmParm.pp_stmtHandle = hStmt;
    putParmParm.pp_parmCount = 1;

    while( nBytesSent < nParmLen )
    {
        GInt16 nLen = (GInt16) MIN((int)sizeof(abyChunk)-2,nParmLen-nBytesSent);

        // presuming we want machine local order...
        memcpy( abyChunk, &nLen, sizeof(nLen) );
        memcpy( abyChunk+2, pabyParmData + nBytesSent, nLen );
        nBytesSent += nLen;

        putParmParm.pp_parmData = &DataBuffer;
        putParmParm.pp_parmData[0].dv_null = FALSE;
        putParmParm.pp_parmData[0].dv_length = nLen+2;
        putParmParm.pp_parmData[0].dv_value = abyChunk;

	putParmParm.pp_moreSegments = nBytesSent < nParmLen;

	IIapi_putParms( &putParmParm );

	while( putParmParm.pp_genParm.gp_completed == FALSE )
	    IIapi_wait( &waitParm );

	if ( putParmParm.pp_genParm.gp_status != IIAPI_ST_SUCCESS )
        {
            ReportError( &(putParmParm.pp_genParm), "SendParm()" );
            
            return FALSE;
        }
    }

    return TRUE;
}
Ejemplo n.º 3
0
int
main( int argc, char** argv ) 
{
    II_PTR          	connHandle = (II_PTR)NULL;
    II_PTR        	tranHandle = (II_PTR)NULL;
    II_PTR        	stmtHandle = (II_PTR)NULL;
    II_PTR        	cursorID;
    IIAPI_QUERYPARM	queryParm;
    IIAPI_SETDESCRPARM 	setDescrParm;
    IIAPI_PUTPARMPARM	putParmParm;
    IIAPI_GETDESCRPARM	getDescrParm;
    IIAPI_GETCOLPARM	getColParm;
    IIAPI_GETQINFOPARM  getQInfoParm;
    IIAPI_CLOSEPARM     closeParm;
    IIAPI_WAITPARM      waitParm = { -1 };
    IIAPI_DESCRIPTOR	DescrBuffer[ 1 ];
    IIAPI_DATAVALUE	DataBuffer[ 2 ];
    IIAPI_DATAVALUE	CursorBuffer[ 1 ];
    char                var1[33];  
    int			var2;

    if ( argc != 2 )
    {
	printf( "usage: apiscupd [vnode::]dbname[/server_class]\n" );
	exit( 0 );
    }

    IIdemo_init();
    IIdemo_conn(argv[1],&connHandle);
    IIdemo_query(&connHandle, &tranHandle,"create table",createTBLText);
    IIdemo_query(&connHandle, &tranHandle,"prepare insert",prepText);
    IIdemo_insert(&connHandle,&tranHandle);

    /*
    **  Open cursor.
    */
    printf( "apiscupd: open cursor\n");

    queryParm.qy_genParm.gp_callback = NULL;
    queryParm.qy_genParm.gp_closure = NULL;
    queryParm.qy_connHandle = connHandle;
    queryParm.qy_queryType = IIAPI_QT_OPEN;
    queryParm.qy_queryText = openText;
    queryParm.qy_parameters = FALSE;
    queryParm.qy_tranHandle = tranHandle;
    queryParm.qy_stmtHandle = NULL;

    IIapi_query( &queryParm );

    while( queryParm.qy_genParm.gp_completed == FALSE )
	IIapi_wait( &waitParm );

    tranHandle = queryParm.qy_tranHandle;
    stmtHandle = queryParm.qy_stmtHandle;

    /*
    **  Get cursor row descriptor.
    */
    getDescrParm.gd_genParm.gp_callback = NULL;
    getDescrParm.gd_genParm.gp_closure = NULL;
    getDescrParm.gd_stmtHandle = stmtHandle;
    getDescrParm.gd_descriptorCount = 0;
    getDescrParm.gd_descriptor = NULL;

    IIapi_getDescriptor( &getDescrParm );
    
    while( getDescrParm.gd_genParm.gp_completed == FALSE )
	IIapi_wait( &waitParm );

    /*
    **  Position cursor on row.
    */
    getColParm.gc_genParm.gp_callback = NULL;
    getColParm.gc_genParm.gp_closure = NULL;
    getColParm.gc_rowCount = 1;
    getColParm.gc_columnCount = getDescrParm.gd_descriptorCount;
    getColParm.gc_columnData = DataBuffer;

    getColParm.gc_columnData[0].dv_value = var1;
    getColParm.gc_columnData[1].dv_value = &var2;
    getColParm.gc_stmtHandle = stmtHandle;
    getColParm.gc_moreSegments = 0;

    do
    {
	printf( "apiscupd: next row\n" );
	IIapi_getColumns( &getColParm );
        
        while( getColParm.gc_genParm.gp_completed == FALSE )
	    IIapi_wait( &waitParm );

	if ( getColParm.gc_genParm.gp_status >= IIAPI_ST_NO_DATA )
	    break;

	/*
	**  Update using cursor.
	*/
	printf( "apiscupd: update row\n" );

	queryParm.qy_genParm.gp_callback = NULL;
	queryParm.qy_genParm.gp_closure = NULL;
	queryParm.qy_connHandle = connHandle;
	queryParm.qy_queryType = IIAPI_QT_CURSOR_UPDATE;
	queryParm.qy_queryText = updateText;
	queryParm.qy_parameters = TRUE;
	queryParm.qy_tranHandle = tranHandle;
	queryParm.qy_stmtHandle = NULL;

	IIapi_query( &queryParm );

	while( queryParm.qy_genParm.gp_completed == FALSE )
	    IIapi_wait( &waitParm );

	/*
	**  Describe query parameters - cursor handle.
	*/
	setDescrParm.sd_genParm.gp_callback = NULL;
	setDescrParm.sd_genParm.gp_closure = NULL;
	setDescrParm.sd_stmtHandle = queryParm.qy_stmtHandle;
	setDescrParm.sd_descriptorCount = 1;
	setDescrParm.sd_descriptor = DescrBuffer;

	setDescrParm.sd_descriptor[0].ds_dataType = IIAPI_HNDL_TYPE;
	setDescrParm.sd_descriptor[0].ds_nullable = FALSE;
	setDescrParm.sd_descriptor[0].ds_length = sizeof( II_PTR );
	setDescrParm.sd_descriptor[0].ds_precision = 0;
	setDescrParm.sd_descriptor[0].ds_scale = 0;
	setDescrParm.sd_descriptor[0].ds_columnType = IIAPI_COL_SVCPARM;
	setDescrParm.sd_descriptor[0].ds_columnName = NULL;

	IIapi_setDescriptor( &setDescrParm );

	while( setDescrParm.sd_genParm.gp_completed == FALSE )
	    IIapi_wait( &waitParm );

	/*
	**  Send query parameters - cursor handle.
	*/
	putParmParm.pp_genParm.gp_callback = NULL;
	putParmParm.pp_genParm.gp_closure = NULL;
	putParmParm.pp_stmtHandle = queryParm.qy_stmtHandle;
	putParmParm.pp_parmCount = setDescrParm.sd_descriptorCount;
	putParmParm.pp_parmData = CursorBuffer; 
	putParmParm.pp_moreSegments = 0;

	putParmParm.pp_parmData[0].dv_null = FALSE;
	putParmParm.pp_parmData[0].dv_length = sizeof( II_PTR );
	putParmParm.pp_parmData[0].dv_value = (II_PTR)&cursorID;
	cursorID = stmtHandle;

	IIapi_putParms( &putParmParm );

	while( putParmParm.pp_genParm.gp_completed == FALSE )
	    IIapi_wait( &waitParm );

	/*
	**  Get update statement results.
	*/
	getQInfoParm.gq_genParm.gp_callback = NULL;
	getQInfoParm.gq_genParm.gp_closure = NULL;
	getQInfoParm.gq_stmtHandle = queryParm.qy_stmtHandle;

	IIapi_getQueryInfo( &getQInfoParm );

	while( getQInfoParm.gq_genParm.gp_completed == FALSE )
	    IIapi_wait( &waitParm );

	/*
	**  Free update statement resources.
	*/
	closeParm.cl_genParm.gp_callback = NULL;
	closeParm.cl_genParm.gp_closure = NULL;
	closeParm.cl_stmtHandle = queryParm.qy_stmtHandle;

	IIapi_close( &closeParm );

	while( closeParm.cl_genParm.gp_completed == FALSE )
	   IIapi_wait( &waitParm );

    } while( 1 );

    /*
    **  Get cursor fetch results.
    */
    getQInfoParm.gq_genParm.gp_callback = NULL;
    getQInfoParm.gq_genParm.gp_closure = NULL;
    getQInfoParm.gq_stmtHandle = stmtHandle;

    IIapi_getQueryInfo( &getQInfoParm );

    while( getQInfoParm.gq_genParm.gp_completed == FALSE )
         IIapi_wait( &waitParm );

    /*
    **  Free cursor resources.
    */
    printf( "apiscupd: close cursor\n" );

    closeParm.cl_genParm.gp_callback = NULL;
    closeParm.cl_genParm.gp_closure = NULL;
    closeParm.cl_stmtHandle = stmtHandle;

    IIapi_close( &closeParm );

    while( closeParm.cl_genParm.gp_completed == FALSE )
       IIapi_wait( &waitParm );

    IIdemo_rollback(&tranHandle); 
    IIdemo_disconn(&connHandle);
    IIdemo_term();

    return( 0 );
}
Ejemplo n.º 4
0
static 	void
IIdemo_insert( II_PTR *connHandle, II_PTR *tranHandle )
{
    IIAPI_QUERYPARM	queryParm;
    IIAPI_SETDESCRPARM	setDescrParm;
    IIAPI_PUTPARMPARM	putParmParm;
    IIAPI_GETQINFOPARM  getQInfoParm;
    IIAPI_CLOSEPARM	closeParm;
    IIAPI_WAITPARM	waitParm = { -1 };
    IIAPI_DESCRIPTOR	DescrBuffer[ 2 ];
    IIAPI_DATAVALUE	DataBuffer[ 2 ];
    int			row;
    int			i;

    for( row = 0; row < DEMO_TABLE_SIZE; row++ )
    {
	/*
	**  Insert row.
	*/
	printf( "IIdemo_insert: execute insert\n" ); 

	queryParm.qy_connHandle = *connHandle;
	queryParm.qy_queryType = IIAPI_QT_EXEC;
	queryParm.qy_queryText = execText;
	queryParm.qy_parameters = TRUE;
	queryParm.qy_tranHandle = *tranHandle;
	queryParm.qy_stmtHandle = NULL;

	IIapi_query( &queryParm );

        while( queryParm.qy_genParm.gp_completed == FALSE )
	    IIapi_wait( &waitParm );

	*tranHandle =  queryParm.qy_tranHandle;

	/*
	**  Describe query parameters.
	*/
        setDescrParm.sd_genParm.gp_callback = NULL;
      	setDescrParm.sd_genParm.gp_closure = NULL;
  	setDescrParm.sd_stmtHandle = queryParm.qy_stmtHandle;
	setDescrParm.sd_descriptorCount = 2;

        setDescrParm.sd_descriptor = DescrBuffer;
	setDescrParm.sd_descriptor[0].ds_dataType = IIAPI_CHA_TYPE;
	setDescrParm.sd_descriptor[0].ds_nullable = FALSE;
	setDescrParm.sd_descriptor[0].ds_length =
					strlen( insTBLInfo[row].name );
	setDescrParm.sd_descriptor[0].ds_precision = 0;
	setDescrParm.sd_descriptor[0].ds_scale = 0;
	setDescrParm.sd_descriptor[0].ds_columnType = IIAPI_COL_QPARM;
	setDescrParm.sd_descriptor[0].ds_columnName = NULL;

        setDescrParm.sd_descriptor[1].ds_dataType = IIAPI_INT_TYPE;
	setDescrParm.sd_descriptor[1].ds_nullable = FALSE;
        setDescrParm.sd_descriptor[1].ds_length = sizeof( II_INT4 );
        setDescrParm.sd_descriptor[1].ds_precision = 0;
        setDescrParm.sd_descriptor[1].ds_scale = 0;
        setDescrParm.sd_descriptor[1].ds_columnType = IIAPI_COL_QPARM;
        setDescrParm.sd_descriptor[1].ds_columnName = NULL;

 	IIapi_setDescriptor( &setDescrParm );
	
        while( setDescrParm.sd_genParm.gp_completed == FALSE )
	    IIapi_wait( &waitParm );

	/*
	**  Send query parameters.
	*/
	putParmParm.pp_genParm.gp_callback = NULL;
	putParmParm.pp_genParm.gp_closure = NULL;
	putParmParm.pp_stmtHandle = queryParm.qy_stmtHandle;
	putParmParm.pp_parmCount = setDescrParm.sd_descriptorCount;
	putParmParm.pp_moreSegments = 0;

        putParmParm.pp_parmData = DataBuffer;
	putParmParm.pp_parmData[0].dv_null = FALSE;
	putParmParm.pp_parmData[0].dv_length = 
					strlen( insTBLInfo[row].name );
	putParmParm.pp_parmData[0].dv_value = insTBLInfo[row].name;

        putParmParm.pp_parmData[1].dv_null = FALSE;
        putParmParm.pp_parmData[1].dv_length = sizeof( II_INT4 );
        putParmParm.pp_parmData[1].dv_value = &insTBLInfo[row].age;

	IIapi_putParms( &putParmParm );

        while( putParmParm.pp_genParm.gp_completed == FALSE )
	    IIapi_wait( &waitParm );

	/*
	**  Get insert results.
	*/
	getQInfoParm.gq_genParm.gp_callback = NULL;
	getQInfoParm.gq_genParm.gp_closure = NULL;
	getQInfoParm.gq_stmtHandle = queryParm.qy_stmtHandle;

	IIapi_getQueryInfo( &getQInfoParm );

	while( getQInfoParm.gq_genParm.gp_completed == FALSE )
	    IIapi_wait( &waitParm );

	/*
	**  Free statement resources.
	*/
	closeParm.cl_genParm.gp_callback = NULL;
	closeParm.cl_genParm.gp_closure = NULL;
	closeParm.cl_stmtHandle = queryParm.qy_stmtHandle;

	IIapi_close( &closeParm );

	while( closeParm.cl_genParm.gp_completed == FALSE )
	    IIapi_wait( &waitParm );
    }
    
    return;
}
Ejemplo n.º 5
0
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool XEXEC::ingExecParams( void )
{
	IIAPI_SETDESCRPARM		setDescrParm;
	IIAPI_PUTPARMPARM		putParmParm;
	IIAPI_GETDESCRPARM		getDescrParm;
	bool	ok = true;
	static	int	exec_counter = 1;
	static	std::set<int>	buffers;
	char	exec_name[20], exec_text[30];
	exec_counter++;
	int	i;
	int	buffer_id = -1;
	for ( i = 0; i < exec_counter; i++ )
		{if ( buffers.find(i) == buffers.end() )
			{buffer_id = i;
			buffers.insert( buffer_id );
			break;	// FIND UNIQUE UN-USED BUFFER ID
			}
		}
	if ( buffer_id < 0 || buffer_id >= exec_counter )
		{error( 0, "out of buffer IDs" );
		return( false );
		}
	sprintf( exec_name, "e%d", buffer_id );
	sprintf( exec_text, "EXECUTE %s", exec_name );
	queryParm.qy_genParm.gp_callback = NULL;
	queryParm.qy_genParm.gp_closure = NULL;
	queryParm.qy_connHandle = database->getConnHandle();
	queryParm.qy_queryType = IIAPI_QT_QUERY;
	queryParm.qy_queryText = (char *) malloc( query_text.size() + 50 );
	sprintf( queryParm.qy_queryText, "PREPARE %s FROM %s", exec_name,
		query_text.c_str() );
	queryParm.qy_parameters = FALSE;
	queryParm.qy_tranHandle = database->getTranHandle();
	queryParm.qy_stmtHandle = ( II_PTR )NULL;
	IIapi_query( &queryParm );			// INVOKE OPENAPI
	database->setTranHandle( queryParm.qy_tranHandle );
	if ( ! ingGetResult( &queryParm.qy_genParm ) )
		{return( false );
		}
	free( queryParm.qy_queryText );
	if ( ! ingGetDescr( &getDescrParm, queryParm.qy_stmtHandle ) )
		{ingClose();
		return( false );
		}
	if ( getDescrParm.gd_descriptorCount != 0 )
		{error( 0, "number of descriptors is incorrect" );
		ingClose();
		return( false );
		}
    /*
    ** Call IIapi_getQueryInfo()
    ** and process result.
    */
//    IIapi_getQueryInfo( (IIAPI_GETQINFOPARM *) queryParm.qy_stmtHandle );

	if ( ! ingClose() )
		{return( false );
		}

	queryParm.qy_connHandle = database->getConnHandle();
	queryParm.qy_queryType = IIAPI_QT_EXEC;
	queryParm.qy_queryText = (char *) malloc( strlen(exec_text) + 1 );
	strcpy( queryParm.qy_queryText, exec_text );
	queryParm.qy_parameters = (nparam > 0 ) ? TRUE : FALSE;
	queryParm.qy_tranHandle = database->getTranHandle();
	queryParm.qy_stmtHandle = ( II_PTR )NULL;
	IIapi_query( &queryParm );
	database->setTranHandle( queryParm.qy_tranHandle );
	if ( ! ingGetResult( &queryParm.qy_genParm ) )
		{return( false );
		}
	free( queryParm.qy_queryText );
	setDescrParm.sd_genParm.gp_callback = NULL;
      	setDescrParm.sd_genParm.gp_closure = NULL;
  	setDescrParm.sd_stmtHandle = queryParm.qy_stmtHandle;
	setDescrParm.sd_descriptorCount = (II_INT2) nparam;
	setDescrParm.sd_descriptor = ( IIAPI_DESCRIPTOR * )
	    malloc( ( setDescrParm.sd_descriptorCount + 1 ) *
			  sizeof( IIAPI_DESCRIPTOR ) );

	ok = ingDescribeUserParameters( setDescrParm.sd_descriptor );
	if ( ! ok )
		{return( false );
		}
	IIapi_setDescriptor( &setDescrParm );
	if ( ! ingGetResult( &setDescrParm.sd_genParm ) )
		{
//		ingCancel();
		return( false );
		}				// * * * leaks memory
	free( ( II_PTR )setDescrParm.sd_descriptor );
				/* Provide parameters for IIapi_putParms() */
	putParmParm.pp_genParm.gp_callback = NULL;
	putParmParm.pp_genParm.gp_closure = NULL;
	putParmParm.pp_stmtHandle = queryParm.qy_stmtHandle;
	putParmParm.pp_parmCount = 1;
	IIAPI_DATAVALUE		data;
	putParmParm.pp_parmData = (IIAPI_DATAVALUE *) &data;
	ok = ingPutUserParameters( &putParmParm );
	buffers.erase( buffer_id );		// RETURN BUFFER_ID TO POOL
	if ( ! ok )
		{return( false );
		}
	ok = ingGetOutcome();
	return( ok && ingClose() );
}