void gcd_api_putParm( GCD_PCB *pcb ) { pcb->api.name = "IIapi_putParms()"; pcb->api.parm.pParm.pp_genParm.gp_callback = gcd_gen_cmpl; pcb->api.parm.pParm.pp_genParm.gp_closure = (PTR)pcb; pcb->api.parm.pParm.pp_stmtHandle = pcb->ccb->api.stmt; pcb->api.parm.pParm.pp_parmCount = pcb->data.data.col_cnt; pcb->api.parm.pParm.pp_parmData = pcb->data.data.data; pcb->api.parm.pParm.pp_moreSegments = pcb->data.data.more_segments; IIapi_putParms( &pcb->api.parm.pParm ); 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; }
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 ); }
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; }