
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.75] |
![]() |
|
Сообщ.
#1
,
|
|
|
Я разработал DLLв которой три udf вот код
![]() ![]() #include<WinSock2.h> #include<mysql.h> #include"pch.h" #include<udf_registration_types.h> using namespace std; extern "C" _declspec(dllexport) int yougo_init(UDF_INIT*initid, UDF_ARGS*, char*) { initid->maybe_null = 1; initid->decimals = 2; // We want 2 decimals in the result initid->max_length = 6; // 3 digits + . + 2 decimals */ return 0; } extern "C" _declspec(dllexport) int yougo_deinit(UDF_INIT*) { return 0; } extern "C" _declspec(dllexport) double yougo(UDF_INIT*, UDF_ARGS* args, char*message) { return 3.14; } extern "C" _declspec(dllexport) char *sumstring(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long long *length, char *is_null, char *error) { *is_null = 0; initid->max_length = 128; initid->maybe_null = 0; memcpy(result, args->args[0], sizeof(args->args[0])); memcpy(result, args->args[1], sizeof(args->args[1])); *length = strlen(result); return result;} extern "C" _declspec(dllexport) int sumstring_init(UDF_INIT * initid, UDF_ARGS*args, char*message) { if ( args->arg_count != 2) { memcpy(message, "wrong number of arguments: requires two arguments",60); return 1; } if ((args->arg_type[0] != STRING_RESULT) || (args->arg_type[1] != STRING_RESULT)) { memcpy(message, "wrong argument type: requires an STRING and a STRING",60); return 1; } initid->max_length = 128; initid->maybe_null = 0; return 0; } extern "C" _declspec(dllexport) int sunstring_deinit(UDF_INIT*ininitid) { return 0; } //extern "C" int yougo_init(UDF_INIT*, UDF_ARGS*args, char*message){return 0;} //extern "C" int yougo_deinit(UDF_INIT*) {return 0 ; } //extern"C" double yougo(UDF_INIT*, UDF_ARGS*, char*, unsigned long*, char*, char*) { return 0.0; } extern "C" int returnString_init(UDF_INIT * initid, UDF_ARGS * args, char* message) { /* if ((args->arg_count != 1) || (args->arg_type[0] != STRING_RESULT)) { strcpy(message, "Wrong argument type."); return 1; }*/ initid->max_length = 128; return 0; } extern "C" _declspec(dllexport) char* returnString(UDF_INIT * initid, UDF_ARGS * args, char* result, unsigned long long* length, char* is_null, char* error) { *is_null = 0; initid->max_length = 128; initid->maybe_null = 0; memcpy(result, "privet", 6); // result = "privet"; // sprintf(result, "%s%s", args->args[0], args->args[1]); *length = strlen(result); return result;} Функция yougo регистрируется и работает корректно выводит результат 3.14.Функция sumstring ругистрируется но при попытке ее взова в workbench командой select sumstring("a","b")не возвращает результат а завершается аварийно с кодом ошибки Error2013 и с падением сервера.Функция returnString не регистрируется при попытке ее регистррации после копирования DLL в папку plugin Комвндой CREATE FUNCTION returnString RETURNS string SONAME "Probamysqludf.dll";Получаю сообщение в workbench Error Code: 1127. Can't find symbol 'returnString_init' in library.Почему mysql не видит эту функцию хотя в DLL она объявлена?Чо надо сделать чтобы функция была зарегистрирована?Почему udf не работает корректно и не возвращает конкатенацию строк а валит сервер?Как мне доостичь корректности ее работы? |
Сообщ.
#2
,
|
|
|
Проблема с функцией sumstring возможно связана с тем, что при копировании аргументов в result, вы используете memcpy, которая копирует только размер указателя, а не содержимое. Вместо этого вы можете использовать функцию strcpy для копирования строк.
Что касается проблемы с регистрацией функции returnString, вы можете проверить, была ли функция правильно экспортирована из DLL, используя утилиту dumpbin. Вы можете выполнить команду dumpbin /EXPORTS Probamysqludf.dll для просмотра всех экспортированных функций. Убедитесь, что функция returnString_init экспортирована и имеет правильное имя. Кроме того, убедитесь, что вы используете правильную версию MySQL и правильный компилятор, который совместим с версией MySQL, которую вы используете. Чтобы исправить проблему с функцией sumstring, вы можете использовать следующий код вместо вашего: ![]() ![]() extern "C" _declspec(dllexport) char* sumstring(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *length, char *is_null, char *error) { *is_null = 0; initid->max_length = args->lengths[0] + args->lengths[1]; initid->maybe_null = 0; memcpy(result, args->args[0], args->lengths[0]); memcpy(result + args->lengths[0], args->args[1], args->lengths[1]); *length = args->lengths[0] + args->lengths[1]; return result; } Этот код скопирует содержимое обоих аргументов в result, вычислит правильную длину результата и вернет его. |