7 messages in com.mysql.lists.mysqlRe: Is there anyway to return an array?| From | Sent On | Attachments |
|---|---|---|
| David Godsey | 24 Mar 2006 09:55 | |
| SGr...@unimin.com | 24 Mar 2006 14:54 | |
| Peter Brawley | 25 Mar 2006 05:51 | |
| nigel wood | 25 Mar 2006 06:10 | |
| David Godsey | 29 Mar 2006 09:06 | |
| David Godsey | 31 Mar 2006 08:38 | |
| David Godsey | 31 Mar 2006 10:10 |
| Subject: | Re: Is there anyway to return an array?![]() |
|---|---|
| From: | David Godsey (mys...@godseyfamily.com) |
| Date: | 03/31/2006 08:38:48 AM |
| List: | com.mysql.lists.mysql |
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




