To acquire the includes etc, download and install the MySQL source.
You need to customize the header called mysql_version.h according to your version of MySQL:
#ifndef _mysql_version_h #define _mysql_version_h #ifdef _CUSTOMCONFIG_ #include#else #define PROTOCOL_VERSION 5 #define MYSQL_SERVER_VERSION "5.0.77" #define MYSQL_BASE_VERSION "mysqld-5.0" #define MYSQL_SERVER_SUFFIX_DEF "" #define FRM_VER 0 #define MYSQL_VERSION_ID 0 #define MYSQL_PORT 3306 #define MYSQL_PORT_DEFAULT 3306 #define MYSQL_UNIX_ADDR "/tmp/mysql.sock" #define MYSQL_CONFIG_NAME "my" #define MYSQL_COMPILATION_COMMENT "" #endif /* _CUSTOMCONFIG_ */ #ifndef LICENSE #define LICENSE GPL #endif /* LICENSE */ #endif /* _mysql_version_h */
Now you can include mysql.h to your C-file, and start coding your UDF, I've coded a simple function for reversing a string, code:
#include <stdlib.h> #include <stdio.h> #include <string.h> typedef unsigned long long ulonglong; typedef long long longlong; #include <mysql.h> #include <ctype.h> my_bool Inverse_init( UDF_INIT* initid, UDF_ARGS* args, char* message ); void Inverse_deinit( UDF_INIT* initid ); char* Inverse( UDF_INIT* initid, UDF_ARGS* args, char* result, unsigned long* length, char* is_null, char* error ); my_bool Inverse_init( UDF_INIT* initid, UDF_ARGS* args, char* message ) { if ( ( args->arg_count != 1 ) || ( args->arg_type[0] != STRING_RESULT ) ) { strcpy( message, "Wrong argument type" ); return 1; } return 0; } void Inverse_deinit( UDF_INIT* initid ) { } char* Inverse( UDF_INIT* initid, UDF_ARGS* args, char* result, unsigned long* length, char* is_null, char* error ) { const char* arg = args->args[0]; (*length) = strlen( arg ); int i; for ( i = (*length); i >= 0; i-- ) { result[(*length) - i - 1] = arg[i]; } return result; }
I have not made this code to be compatible with Unicode, but I intend to make a post in the near future, explaining Unicode.
We need to compile this, so let's fire up our CentOS and go the the directory where we saved the C-File(save it in your MySQL source directory somewhere), and compile using the following command:
gcc -shared -o filenamehere.so filenamehere.c -I ../include/
Obviously you want to customize the include directory parameter to lead to the include directory, from the directory where your file is, the include directories is: */mysqlsource/include/
So now that we have the shared object(.so) file, we can go ahead and put it in the following directory: */usr/lib/
then restart our mysqld service:
service mysqld restart
You can now load up your SQLyog, and define your newly created function using:
CREATE FUNCTION Inverse RETURNS STRING SONAME 'filenamehere.so'
And now your UDF is ready for use!
Nice posting :)
SvarSlet