<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=433717&amp;view=findpost&amp;p=3888886</guid>
        <pubDate>Thu, 30 Mar 2023 19:27:14 +0000</pubDate>
        <title>Почему mysqlне видит функции инициализации udf?</title>
        <link>https://forum.sources.ru/index.php?showtopic=433717&amp;view=findpost&amp;p=3888886</link>
        <description><![CDATA[MaIron: Проблема с функцией sumstring возможно связана с тем, что при копировании аргументов в result, вы используете memcpy, которая копирует только размер указателя, а не содержимое. Вместо этого вы можете использовать функцию strcpy для копирования строк.<br>
<br>
Что касается проблемы с регистрацией функции returnString, вы можете проверить, была ли функция правильно экспортирована из DLL, используя утилиту dumpbin. Вы можете выполнить команду dumpbin /EXPORTS Probamysqludf.dll для просмотра всех экспортированных функций. Убедитесь, что функция returnString_init экспортирована и имеет правильное имя.<br>
<br>
Кроме того, убедитесь, что вы используете правильную версию MySQL и правильный компилятор, который совместим с версией MySQL, которую вы используете.<br>
<br>
Чтобы исправить проблему с функцией sumstring, вы можете использовать следующий код вместо вашего:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">extern &quot;C&quot; _declspec(dllexport) char* sumstring(UDF_INIT *initid, UDF_ARGS *args,</div><div class="code_line">&nbsp;&nbsp; &nbsp;char *result, unsigned long *length, char *is_null, char *error) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;*is_null = 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;initid-&#62;max_length = args-&#62;lengths[0] + args-&#62;lengths[1];</div><div class="code_line">&nbsp;&nbsp; &nbsp;initid-&#62;maybe_null = 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;memcpy(result, args-&#62;args[0], args-&#62;lengths[0]);</div><div class="code_line">&nbsp;&nbsp; &nbsp;memcpy(result + args-&#62;lengths[0], args-&#62;args[1], args-&#62;lengths[1]);</div><div class="code_line">&nbsp;&nbsp; &nbsp;*length = args-&#62;lengths[0] + args-&#62;lengths[1];</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;return result;</div><div class="code_line">}</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
<br>
Этот код скопирует содержимое обоих аргументов в result, вычислит правильную длину результата и вернет его.]]></description>
        <author>MaIron</author>
        <category>C/C++: Базы данных</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=433717&amp;view=findpost&amp;p=3888059</guid>
        <pubDate>Fri, 17 Mar 2023 07:54:17 +0000</pubDate>
        <title>Почему mysqlне видит функции инициализации udf?</title>
        <link>https://forum.sources.ru/index.php?showtopic=433717&amp;view=findpost&amp;p=3888059</link>
        <description><![CDATA[izumov: Я разработал DLLв которой три  udf вот код <br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#include&#60;WinSock2.h&#62;</div><div class="code_line">#include&#60;mysql.h&#62;</div><div class="code_line">#include&quot;pch.h&quot;</div><div class="code_line">#include&#60;udf_registration_types.h&#62;</div><div class="code_line">using namespace std;</div><div class="code_line">extern &quot;C&quot; _declspec(dllexport) int yougo_init(UDF_INIT*initid, UDF_ARGS*, char*) </div><div class="code_line">{ </div><div class="code_line">&nbsp;&nbsp; &nbsp;initid-&#62;maybe_null = 1; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;initid-&#62;decimals = 2; &nbsp; &nbsp; // We want 2 decimals in the result </div><div class="code_line">&nbsp;&nbsp; &nbsp;initid-&#62;max_length = 6; &nbsp; // &nbsp;3 digits + . + 2 decimals */</div><div class="code_line">&nbsp;&nbsp; &nbsp;return 0; }</div><div class="code_line">extern &quot;C&quot; _declspec(dllexport) int &nbsp;yougo_deinit(UDF_INIT*) { return 0; }</div><div class="code_line">extern &quot;C&quot; _declspec(dllexport) double yougo(UDF_INIT*, UDF_ARGS* args, char*message) { return 3.14; }</div><div class="code_line">extern &quot;C&quot; _declspec(dllexport) char &nbsp;*sumstring(UDF_INIT *initid, UDF_ARGS *args,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;char *result, unsigned long long *length,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;char *is_null, char *error) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;*is_null = 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;initid-&#62;max_length = 128;</div><div class="code_line">&nbsp;&nbsp; &nbsp;initid-&#62;maybe_null = 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;memcpy(result, args-&#62;args[0], sizeof(args-&#62;args[0]));</div><div class="code_line">&nbsp;&nbsp; &nbsp;memcpy(result, args-&#62;args[1], sizeof(args-&#62;args[1]));</div><div class="code_line">&nbsp;&nbsp; &nbsp;*length = strlen(result);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; return result;}</div><div class="code_line">extern &quot;C&quot; _declspec(dllexport) int &nbsp;sumstring_init(UDF_INIT * initid, UDF_ARGS*args, char*message) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;args-&#62;arg_count != 2)</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;memcpy(message, &quot;wrong number of arguments: requires two arguments&quot;,60);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return 1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;if ((args-&#62;arg_type[0] != STRING_RESULT) || (args-&#62;arg_type[1] != STRING_RESULT))</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;memcpy(message, &quot;wrong argument type: requires an STRING and a STRING&quot;,60);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return 1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;initid-&#62;max_length = 128; initid-&#62;maybe_null = 0; return 0; }</div><div class="code_line">extern &quot;C&quot; _declspec(dllexport) int &nbsp;sunstring_deinit(UDF_INIT*ininitid) { return 0; }</div><div class="code_line">&nbsp;</div><div class="code_line">//extern &quot;C&quot; int yougo_init(UDF_INIT*, UDF_ARGS*args, char*message){return 0;}</div><div class="code_line">//extern &nbsp;&quot;C&quot; int yougo_deinit(UDF_INIT*) {return 0 ; }</div><div class="code_line">//extern&quot;C&quot; double yougo(UDF_INIT*, UDF_ARGS*, char*, unsigned long*, char*, char*) { return 0.0; }</div><div class="code_line">extern &quot;C&quot; int returnString_init(UDF_INIT * initid, UDF_ARGS * args,</div><div class="code_line">&nbsp;&nbsp; &nbsp;char* message)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;/* &nbsp;if ((args-&#62;arg_count != 1) || (args-&#62;arg_type[0] != STRING_RESULT))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;strcpy(message, &quot;Wrong argument type.&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return 1;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}*/</div><div class="code_line">&nbsp;&nbsp; &nbsp;initid-&#62;max_length = 128;</div><div class="code_line">&nbsp;&nbsp; &nbsp;return 0;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">extern &quot;C&quot; _declspec(dllexport) char* returnString(UDF_INIT * initid, UDF_ARGS * args,</div><div class="code_line">&nbsp;&nbsp; &nbsp;char* result, unsigned long long* length,</div><div class="code_line">&nbsp;&nbsp; &nbsp;char* is_null, char* error) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;*is_null = 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;initid-&#62;max_length = 128;</div><div class="code_line">&nbsp;&nbsp; &nbsp;initid-&#62;maybe_null = 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;memcpy(result, &quot;privet&quot;, 6);</div><div class="code_line">&nbsp;&nbsp; &nbsp;// &nbsp;result = &quot;privet&quot;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// &nbsp;sprintf(result, &quot;%s%s&quot;, args-&#62;args[0], args-&#62;args[1]);</div><div class="code_line">&nbsp;&nbsp; &nbsp;*length = strlen(result);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;return result;}</div></ol></div></div></div></div><br>
Функция yougo регистрируется и работает корректно выводит результат 3.14.Функция sumstring ругистрируется но при попытке ее взова в workbench командой select sumstring(&quot;a&quot;,&quot;b&quot;)не возвращает результат а завершается аварийно с кодом ошибки Error2013 и с падением сервера.Функция returnString не регистрируется при попытке ее регистррации после копирования DLL в папку plugin Комвндой CREATE FUNCTION returnString RETURNS string SONAME<br>
&quot;Probamysqludf.dll&quot;;Получаю сообщение в workbench Error Code: 1127. Can&#39;t find symbol &#39;returnString_init&#39; in library.Почему mysql<br>
не видит эту функцию хотя в DLL она объявлена?Чо надо сделать чтобы функция была зарегистрирована?Почему udf не работает корректно и не возвращает конкатенацию строк а валит сервер?Как мне доостичь корректности ее работы?]]></description>
        <author>izumov</author>
        <category>C/C++: Базы данных</category>
      </item>
	
      </channel>
      </rss>
	