#ifdef STANDARD #include #include #else #include #include #endif #include #include #include // 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 */