i want to create a monetdb function to help write my astronomical binary processing result into database,this function will load the binary result from memory directly into monetdb to save time, so i defined a UDF binaryCopy() ,
svom.c
int binaryCopy(str columnname, str buffer, int count)
{
mvc *sql = NULL;
sql_table *tmatch = NULL;
/*BATs in which the data of the columns of the output table will be stored*/
BAT *tmatch_column = NULL;
BUN nr_rows;
/* pointer to the tail of above BAT, which is just a normal C-array */
lng *tmatch_column_lng_t = NULL;
flt *tmatch_column_flt_t = NULL;
/*_bind_table is just a wrapper that tries to see if it can find the table
match_table under three default schemas*/
if(!(tmatch = _bind_table(sql, NULL, "testtable")))
//return sql_message("42S02!BINARYLOAD():no such table test");
return 0;
//nr_match = 20000;
nr_rows = count;
/*
create BATs for all columns of the output table 'tmatch'
*/
if(strcmp(columnname,"starid")==0 || strcmp(columnname,"crossid")==0 ||strcmp(columnname,"catid")==0 ) {
tmatch_column = BATnew(TYPE_void, TYPE_lng,nr_rows);
}else {
tmatch_column = BATnew(TYPE_void,TYPE_flt,nr_rows);
}
/*
now tmatch_starid_t points to the first element of the BAT's tails
*/
tmatch_column_lng_t = (lng*)Tloc(tmatch_column,BUNfirst(tmatch_column));
/*
now we can write data into the BAT tail
*/
if((strcmp(columnname,"starid")==0) || (strcmp(columnname,"crossid")==0) ||(strcmp(columnname,"catid")==0) ) {
memcpy(tmatch_column_lng_t,buffer,nr_rows*sizeof(lng)); //is it right to write binary data into BAT???
}else {
memcpy(tmatch_column_flt_t, buffer, nr_rows*sizeof(flt));
}
/* Set proper properties for all BATs */
BATsetcount(tmatch_column,nr_rows);
BATseqbase(tmatch_column,0);
/*
sorted:1, column is sorted in ascending order
*/
tmatch_column->tsorted = 0;
/*
if the tail is reverse sorted.
*/
tmatch_column->trevsorted = 0;
/*
if the tail contains NIL values
*/
tmatch_column->T->nil = 0;
/*
if the tail doesn't contain NIL values
*/
tmatch_column->T->nonil = 0;
/*
if the values in the tail are unique.Since BATkey only works with BAT heads,
* BATmirror is used to switch the head and tail of the BATs
*/
if(strcmp(columnname,"starid")==0) {
BATkey(BATmirror(tmatch_column),1); //only starid is 1
}else {
BATkey(BATmirror(tmatch_column),0);
}
/*
finally, append the result BATs to the result table
* ignore errors, since we are finishing
*/
_append_bat(sql,tmatch,columnname,tmatch_column);
/*
The BATs now contain the data for the columns of the output tables,
* append_bat registers in the system where to find the BAT for those columns.
*/
/*
To avoid memory leak, BAT reference counter must be decreased after use.
* That can be done using BBPunfix.
*/
if(tmatch_column) BBPunfix(tmatch_column->batCacheid);
return 1; //success
}
Thanks!