"David Godsey" <[EMAIL PROTECTED]> wrote on 03/22/2006 01:21:07 PM:
> I'm in the process of writing my first UDF and would appreciate some
help.
>
> I am pulling data from a table like:
>
> 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;
>
> frame_data is type BLOB. It is raw data collected. The substr will get
> the specific bytes I'm interested in. What I need to do, is if the data
> is <= 8bytes, convert it to a BIGINT, so I can do some masking on the
> data.
>
> So I am writing a UDF to do the job, but I am apparently unfamiliar with
> the Mysql data types and how I can convert them.
>
> In a procedure.
> DECLARE fdata_bigint BIGINT UNSIGNED;
> SELECT BlobToInt(binary(fdata)) INTO fdata_bigint;
>
> my_bool BlobToInt_init( UDF_INIT* initid, UDF_ARGS* args, char* message
)
> {
> if (args->arg_count != 1)
> {
> strcpy(message,"Wrong arguments to BlobToInt; should be
> BlobToInt(blob)");
> return 1;
> }
> return 0;
> }
> longlong BlobToInt( UDF_INIT* initid, UDF_ARGS* args, char* is_null,
char
> *error )
> {
> longlong tmplong = *((longlong*)args->args[0]);
> return tmplong;
> }
>
> I guess I was just assuming I could just cast the data as the type I
want,
> but that doesn't seem to work. The function returns a 0.
>
> Any help would be appreciated.
>
> Accomplishing the impossible means only that the boss will add it to
your
> regular duties.
>
> David Godsey
>
C is not my strongest language but aren't you getting a null-terminated
string as args[0] ? What if you allocated a longlong and byte-copied the
bytes from args[0] into your longlong? Maybe something like...
longlong BlobToInt( UDF_INIT* initid, UDF_ARGS* args, char* is_null, char
*error )
{
char idx, *cArg
longlong tmplong, *plonglong ;
plonglong = &tmplong;
cArg = (args->args[0]);
for(idx=0;idx<8;idx++) {
plonglong[idx]=cArg[idx];
}
return tmplong;
}
Again, I strongly stress that C/C++ is not my best language (I don't use
it nearly enough) but I think you can see what I was trying to do. Other
options: memcpy(), strcpy(), strncpy() etc....
Shawn Green
Database Administrator
Unimin Corporation - Spruce Pine