Brogram - MySQL UDF to check if STR1 contains all words from STR2
Should have done this in app code, but where is the fun in that
#ifdef STANDARD
/* STANDARD is defined, don't use any mysql functions */
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#ifdef __WIN__
typedef unsigned __int64 ulonglong;/* Microsofts 64 bit types */
typedef __int64 longlong;
#else
typedef unsigned long long ulonglong;
typedef long long longlong;
#endif /*__WIN__*/
#else
#include <my_global.h>
#include <my_sys.h>
#if defined(MYSQL_SERVER)
#include <m_string.h>/* To get strmov() */
#else
/* when compiled as standalone */
#include <string.h>
#define strmov(a,b) stpcpy(a,b)
#define bzero(a,b) memset(a,0,b)
#define memcpy_fixed(a,b,c) memcpy(a,b,c)
#endif
#endif
#include <mysql.h>
#include <ctype.h>
#ifdef HAVE_DLOPEN
#if !defined(HAVE_GETHOSTBYADDR_R) || !defined(HAVE_SOLARIS_STYLE_GETHOST)
static pthread_mutex_t LOCK_hostname;
#endif
char *trim(char *str);
my_bool str_match_init(UDF_INIT *initid, UDF_ARGS *args, char *message);
double str_match(UDF_INIT *initid, UDF_ARGS *args,
__attribute__ ((unused)) char *result,
unsigned long *length,
__attribute__ ((unused)) char *is_null,
__attribute__ ((unused)) char *error);
void str_match_deinit(UDF_INIT *initid);
my_bool str_match_init(UDF_INIT *initid, UDF_ARGS *args, char *message){
if (args->arg_count != 2)
{
strncpy(message,
"two arguments must be supplied: str_match('text','matching string').",
MYSQL_ERRMSG_SIZE);
return 1;
}
args->arg_type[0] = STRING_RESULT;
args->arg_type[1] = STRING_RESULT;
return 0;
}
double str_match(UDF_INIT *initid, UDF_ARGS *args,
__attribute__ ((unused)) char *result,
unsigned long *length,
__attribute__ ((unused)) char *is_null,
__attribute__ ((unused)) char *error){
//Split the second string using strtok
char * pch;
int match = 1;
char *trimm;
pch = strtok (args->args[1]," ");
while (pch != NULL)
{
//pch contains the token, trim it and match with large string
trimm = trim(pch);
if((trimm!=0 && pch!= 0) &&NULL == strstr(args->args[0],trimm)){
match = 0;
break;
}
pch = strtok (NULL, " ");
}
if(match == 1)
return 1;
else
return 0;
}
char *trim(char *str)
{
size_t len = 0;
char *frontp = str - 1;
char *endp = NULL;
if( str == NULL )
return NULL;
if( str[0] == '\0' )
return str;
len = strlen(str);
endp = str + len;
while( isspace(*(++frontp)) );
while( isspace(*(--endp)) && endp != frontp );
if( str + len - 1 != endp )
*(endp + 1) = '\0';
else if( frontp != str && endp == frontp )
*str = '\0';
endp = str;
if( frontp != str )
{
while( *frontp ) *endp++ = *frontp++;
*endp = '\0';
}
return str;
}
void str_match_deinit(UDF_INIT *initid)
{
}
#endif /* HAVE_DLOPEN */
More here http://dev.mysql.com/doc/refman/5.1/en/adding-functions.html
Written by Ashwin
Related protips
Have a fresh tip? Share with Coderwall community!
Post
Post a tip
Best
#Mysql
Authors
Sponsored by #native_company# — Learn More
#native_title#
#native_desc#