Re: doubts in Illustra
Posted in 1997
Topics: Stored Procedures & SPL, Server Administration
Hi Uday,
Below is a C function that returns a set of composite (I'm using Release
3.1 on NT 3.5.1).
For some strange reason, the function mi_make_composite_value is in the
TimeSeries datablade instead of the supplied server library - anybody
got any idea why?
I also tried to make an aggregate returning a set as you wanted, but I
also got an Internal Error
All the best,
Rob
/*
** mi_make_composite_value declaration taken from
** MI_HOME/extend/timeseries/lib/tseries.h
*/
mi_composite MI_PROC_EXPORT mi_make_composite_value
ARGS((MI_CONNECTION MI_FAR *conn, char MI_FAR *typename, char MI_FAR *
MI_FAR values [], mi_boolean MI_FAR *nulls));
mi_composite returnset (mi_integer istart, MI_FPARAM *fparam)
{
typedef struct _IntText IntText;
struct _IntText {
mi_integer i;
mi_text *t;
IntText *next;
};
IntText *SetStart, *ptr, *last;
char buff[80];
MI_CONNECTION *conn;
mi_composite node;
mi_boolean nulls[2];
char *values[2];
int i;
switch (fparam->fp_request) {
case SET_INIT: SetStart = NULL;
for (i=istart; i > 0; i--) {
sprintf(buff, "This is %d", i);
ptr = (IntText
*)mi_dalloc(sizeof(IntText), PER_COMMAND);
ptr->i = i;
ptr->t = mi_string_to_text(buff);
ptr->next = NULL;
if (SetStart == NULL) {
SetStart = ptr;
} else {
last->next = ptr;
}
last = ptr;
}
MI_FP_SETFUNCSTATE(fparam, SetStart);
break;
case SET_RETONE:
ptr = MI_FP_FUNCSTATE(fparam);
if (ptr == NULL) {
MI_FP_SETISDONE(fparam, MI_TRUE);
} else {
values[0] = (char *)(ptr->i);
values[1] = (char *)(ptr->t);
nulls[0] = nulls[1] = MI_FALSE;
conn = mi_open(DBNAME, NULL, NULL);
node = mi_make_composite_value (conn,
"inttext",
values, nulls);
mi_close(conn);
MI_FP_SETFUNCSTATE(fparam, ptr->next);
mi_free( (char *) ptr->t );
mi_free( (char *) ptr);
}
break;
}
return node;
}
/*
** Dummy functions for Aggregate
*/
DllExport mi_integer aggstart (MI_FPARAM *fparam)
{
return 1;
}
DllExport mi_integer aggiter (mi_integer aggstate, mi_integer ival,
MI_FPARAM *fparam)
{
return 5;
}
==================SQL=========================================
create type inttext (i integer, t text);
create function returnset(integer)
returns setof(inttext)as external name '/intra/release/intra.dll'
language c;
select * from returnset(3);
/*
** Attempt to create aggregate
*/
create function aggstartreturns integer
as external name '/intra/release/intra.dll'
language c;
create function aggiter(integer, integer)returns integer
as external name '/intra/release/intra.dll'
language c;
create aggregate agg(init = aggstart(),
iter = aggiter(integer, integer),
final = returnset(integer));
create table tmp(i integer);
insert into tmp values (5);
select * from (select unique agg(i) from tmp);
udayakumar srinivasan wrote:
>
> I am using a Illustra(research copy) for a study. I have been having a
> truly frustrating experience writing C functions. I would greatly
> appreciate it if someone could answer these questions
>
> 1) Can a C function return a Set of composite types in illustra ?
> 2) Can a aggregate C function return a Set ?
>
> Even the simplest code for the above cases gives me a internal error with
> no further feedback.
>
> Thanks,
> Srinivasan Udayakumar (Uday)
> Graduate Student, Ohio State University
>
>