Never mind, I was being dumb. I wasn't using the args->lengths array for
binary data, so it was dying on a strlen(args->args[0]) which makes sense.
Thanks anyway.
David Godsey
> So, in theory this should be pretty straight forward to do right? Well
> I'm new to UDF's, so how mysql is passing the data to the UDF is a bit of
> a mystery. I'm hoping someone can help me understand this.
>
> I'm selecting data from a BLOB field like this:
>
> SELECT payload_time,
> SUBSTR(BINARY(frame_data),
> FLOOR(foffset/8)+1,
> CEIL((flength + (foffset %8 ))/8))
> FROM RawMajorFrames
> WHERE raw_major_frame_id=rfid
> INTO ptime,fdata;
>
> You can see that I'm only taking a portion of the string, but it is still
> in raw form.
>
> Now I would like to pass it to my UDF function called toDoubleArray, to
> convert each 8 byte section to a double.
>
> I call the function like this: (you can ignore conv_param)
> SELECT toDoubleArray(fdata,"%1.3E",conv_param) INTO fdata_string;
>
> Well, I get a Lost Connection when the function is called.
> Here is the UDF:
>
> my_bool toDoubleArray_init(UDF_INIT *initid, UDF_ARGS *args, char
> *message)
> {
> if (args->arg_count != 3)
> {
> strcpy(message,"Wrong arguments to toDouble: should be
> toDoubleArray(blob)");
> return 1;
> }
> initid->max_length = strlen(args->args[0])/8 * 128;
> return 0;
>
> }
> char * toDoubleArray(UDF_INIT *initid, UDF_ARGS *args, char *result,
> unsigned long *length,char *is_null,char *error)
> {
> int curr_buf_ptr =0; /* current length of FloatString */
> char * data = args->args[0]; /* just to make it easier to reference the
> string */
> char * f = args->args[1]; /* get the format string */
> char format[15];
>
> sprintf(format,"%s,",f); /* put a comma at the end of format for CSV
> format */
>
> for(int i=0;i<strlen(data);i +=8){
> sprintf(result + curr_buf_ptr,format,*((double *)(data +i)));
> curr_buf_ptr = strlen(result);
> }
> result[curr_buf_ptr -1] = '\0';
> *length = strlen(result);
> return result;
> }
> This should return a comma delimited list of double values in a string
> format (ascii representation).
>
> Like I said, I'm new to UDF's so it is likely I'm not aware of conventions
> to follow that are well known to others.
>
> Any help would be great.
>
> David Godsey
>
>> David Godsey wrote:
>>
>>>>
>>>> I know, I know, sounds like something that should be done in the
>>>> presentation layer, howerver if possible, I would like to provide
>>>> common
>>>> data presentation to multiple presentation layers (written in
>>>> different
>>>> languages).
>>>>
>>>> So is there anyway to return an array in mysql?
>>>
>> Your aware your doing something stupid and want to do it anyway :-(
>>
>> Why not return the values from your user defined mysql function as a
>> (properly quoted) ,comma seperated list. Since almost every application
>> language now has a standard csv file handling library it should be easy
>> to use across diverse display technologies.
>>
>> Urrgh
>>
>> Nigel
>>
>
>
> Accomplishing the impossible means only that the boss will add it to your
> regular duties.
>
> David Godsey
>
Accomplishing the impossible means only that the boss will add it to your
regular duties.
David Godsey
--
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe: http://lists.mysql.com/[EMAIL PROTECTED]