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!