#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;
    }
}