#ifdef STANDARD
#include <stdio.h>
#include <string.h>
#else
#include <my_global.h>
#include <my_sys.h>
#endif
#include <mysql.h>
#include <m_ctype.h>
#include <m_string.h>		// To get strmov()

#ifdef HAVE_DLOPEN

//*****************************************************************************************
/* These must be right or mysqld will not find the symbol! */

extern "C" {
	my_bool plustwo_init(UDF_INIT *initid, UDF_ARGS *args, char *message);
	long long plustwo(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error);

	my_bool timestwo_init(UDF_INIT *initid, UDF_ARGS *args, char *message);
	long long timestwo(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error);

	my_bool simplesum_init( UDF_INIT* initid, UDF_ARGS* args, char* message );
//	void simplesum_deinit( UDF_INIT* initid );
//	void simplesum_reset( UDF_INIT* initid, UDF_ARGS* args, char* is_null, char *error );
//	void simplesum_add( UDF_INIT* initid, UDF_ARGS* args, char* is_null, char *error );
	double simplesum( UDF_INIT* initid, UDF_ARGS* args, char* is_null, char *error );
}

//*****************************************************************************************

my_bool plustwo_init(UDF_INIT *initid, UDF_ARGS *args, char *message) {
	for (int i = 0; i < args->arg_count; i++) {
		if (args->arg_type[i] != INT_RESULT) {
			strcpy(message, "WRONG ARGUMENT TYPE");
			return 1;
		}
	}
	return 0;
}

long long plustwo(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error) {
	long long val = 0;
	for (int i = 0; i < args->arg_count; i++)
		val += *((long long*) args->args[i]);

	return val + 2;
}

//*****************************************************************************************

my_bool timestwo_init(UDF_INIT *initid, UDF_ARGS *args, char *message) {
	for (int i = 0; i < args->arg_count; i++) {
		if (args->arg_type[i] != INT_RESULT) {
			strcpy(message, "WRONG ARGUMENT TYPE");
			return 1;
		}
	}
	return 0;
}

long long timestwo(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error) {
	long long val = 0;
	for (int i = 0; i < args->arg_count; i++)
		val += *((long long*) args->args[i]);

	return val * 2;
}

//*****************************************************************************************

struct datastore {
	double total;
};

my_bool simplesum_init( UDF_INIT* initid, UDF_ARGS* args, char* message ) {
	for (int i = 0; i < args->arg_count; i++) {
		if (args->arg_type[i] == STRING_RESULT) {
			strcpy(message, "WRONG ARGUMENT TYPE");
			return 1;
		}
	}

	int* x = new int;			//	!!!!!!!!!!!!
	struct datastore* data = new struct datastore;
	data->total = 0;
	initid->ptr = (char*)data;

	return 0;
}
/*
void simplesum_deinit( UDF_INIT* initid ) {
	delete initid->ptr;
}

void simplesum_reset( UDF_INIT* initid, UDF_ARGS* args, char* is_null, char *error ) {
	struct datastore* data = (struct datastore*)initid->ptr;
	data->total = 0;
	simplesum_add( initid, args, is_null, error);
}

void simplesum_add( UDF_INIT* initid, UDF_ARGS* args, char* is_null, char *error ) {
	struct datastore* data = (struct datastore*)initid->ptr;

	for (int i = 0; i < args->arg_count; i++) {
		if (args->arg_type[i] == INT_RESULT)
			data->total += *((double*) args->args[i]);
		else
			data->total -= *((double*) args->args[i]);
	}
}
*/
double simplesum( UDF_INIT* initid, UDF_ARGS* args, char* is_null, char *error ) {
/*	struct datastore* data = (struct datastore*)initid->ptr;
	return (double)data->total;
*/	return 3.14159;
}


#endif /* HAVE_DLOPEN */
