На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела C/C++: Базы данных
Модераторы: B.V.
  
    > Почему mysqlне видит функции инициализации udf?
      Я разработал DLLв которой три udf вот код
      ExpandedWrap disabled
        #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 не работает корректно и не возвращает конкатенацию строк а валит сервер?Как мне доостичь корректности ее работы?
        Проблема с функцией sumstring возможно связана с тем, что при копировании аргументов в result, вы используете memcpy, которая копирует только размер указателя, а не содержимое. Вместо этого вы можете использовать функцию strcpy для копирования строк.

        Что касается проблемы с регистрацией функции returnString, вы можете проверить, была ли функция правильно экспортирована из DLL, используя утилиту dumpbin. Вы можете выполнить команду dumpbin /EXPORTS Probamysqludf.dll для просмотра всех экспортированных функций. Убедитесь, что функция returnString_init экспортирована и имеет правильное имя.

        Кроме того, убедитесь, что вы используете правильную версию MySQL и правильный компилятор, который совместим с версией MySQL, которую вы используете.

        Чтобы исправить проблему с функцией sumstring, вы можете использовать следующий код вместо вашего:

        ExpandedWrap disabled
          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, вычислит правильную длину результата и вернет его.
        1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0287 ]   [ 15 queries used ]   [ Generated: 14.06.25, 21:36 GMT ]