/* newzone.c (C)2008 by Jan-Piet Mens.  MySQL UDF */

#include <stdio.h>
#include <string.h>
#include <my_global.h>
#include <my_sys.h>
#include <mysql.h>
#include <m_string.h>

#define TOUCHFILE	"/var/nsd/zones.trig"

static pthread_mutex_t LOCK_zonefile;

/* mysql> CREATE FUNCTION newzone RETURNS INTEGER SONAME "newzone.so";  */

my_bool newzone_init(UDF_INIT *iid, UDF_ARGS *args, char *message)
{
	if (args->arg_count != 1 || args->arg_type[0] != STRING_RESULT) {
		strmov(message,"Need a STRING arg");
		return 1;
	}

	iid->max_length = 21;
	iid->maybe_null = 0;

	pthread_mutex_init(&LOCK_zonefile, MY_MUTEX_INIT_SLOW);
	return 0;
}

void newzone_deinit(UDF_INIT *iid)
{
	pthread_mutex_destroy(&LOCK_zonefile);
}

longlong newzone(UDF_INIT *iid, UDF_ARGS *args, char *isnull, char *error)
{
	uint len;
	char buf[512];
	FILE *fp;

	if (!args->args[0] || !(len = args->lengths[0])) {
		*isnull = 1;
		return 0;
	}

	len = (len >= sizeof(buf)) ? sizeof(buf) - 1 : len;

	memcpy(buf, args->args[0], len);
	buf[len] = 0;

	pthread_mutex_lock(&LOCK_zonefile);

	if ((fp = fopen(TOUCHFILE, "a")) != NULL) {
		fprintf(fp, "%s\n", buf);
		fclose(fp);
	}

	pthread_mutex_unlock(&LOCK_zonefile);
	return 1L;
}

