#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <limits.h>
#include <mysql.h>
#include "kwset.h"
kwset_t fss_set = NULL;
char fss_prepare_init(UDF_INIT * initid, UDF_ARGS * args, char *message)
{
if (args->arg_count != 1) {
strcpy(message, "fss_prepare() requires one argument");
return 1;
}
args->arg_type[0] = STRING_RESULT;
return 0;
}
int fss_prepare_add(UDF_INIT * initid, UDF_ARGS * args, char *is_null,
char *error)
{
kwsincr(fss_set, strdup(args->args[0]), args->lengths[0]);
*is_null = 1;
return 0;
}
void fss_prepare_clear(UDF_INIT * initid, char *is_null, char *error)
{
if(fss_set)
kwsfree(fss_set);
fss_set = kwsalloc(NULL);
}
long long fss_prepare(UDF_INIT * initid, UDF_ARGS * args, char *is_null,
char *error)
{
const char *err = kwsprep(fss_set);
if (err) {
strcpy(error,err);
return 1;
}
*is_null = 0;
return 0;
}
char fss_search_init(UDF_INIT * initd, UDF_ARGS * args, char *message)
{
if (args->arg_count != 1) {
strcpy(message, "fss_search() requires one argument");
return 1;
}
args->arg_type[0] = STRING_RESULT;
if (!fss_set) {
strcpy(message, "Please use fss_prepare() to set needles");
return 1;
}
return 0;
}
long long fss_search(UDF_INIT * initid, UDF_ARGS * args,
char *is_null, char *error)
{
struct kwsmatch m;
bzero(&m, sizeof(m));
if (!fss_set) {
strcpy(error, "Please use fss_prepare() to set needles");
*error=1;
return 0;
}
size_t match_pos = kwsexec(fss_set, args->args[0], args->lengths[0], &m);
if (match_pos == (size_t) - 1) {
return 0;
} else {
return 1;
}
}