2009-04-08 5 views
1

Es gibt eine Erklärung in der MySQL-Docs (http://dev.mysql.com/doc/refman/5.0/en/adding-udf.html) verwenden, das mich stört ist:Schreiben einer MySQL UDF C++ STL-Funktionalität

„Ein UDF enthält Code, der Teil des laufenden Servers wird, so dass, wenn Sie schreib eine UDF, werden Sie von irgendwelchen und alle Beschränkungen gebunden, die sonst zu schreiben Server-Code anwenden. zum Beispiel Sie Probleme haben, wenn Sie Funktionen zu verwenden, aus der libstdC++ Bibliothek. "

Warum es versuchen kann problematisch sein ms, wenn Sie C++ - Standardbibliotheksfunktionen verwenden, um eine UDF zu schreiben?
Bedeutet das, dass ich dazu verdammt bin, einfaches altes C zu benutzen, um meine UDFs zu schreiben? (Bitte nein sagen)

Antwort

0

Keine Kenntnis von libstdC++, aber gehen durch das "Beispiel" -Bit, was bedeutet, dass diese Warnung auf mehr als libstdC++ anwendbar ist Ich würde vorschlagen, dass dies bedeutet, vorsichtig zu sein von Standardbibliotheken im Allgemeinen da sie Dinge erstellen können, die in einer UDF-Umgebung nicht funktionieren würden.

Zum Beispiel (graben zurück zu C) strtok behält einen lokalen Zustand zwischen den Aufrufen, was bedeutet, dass Sie seine Verwendung serialisieren müssen oder Gesicht Korruption seiner Ergebnisse, wenn Sie versucht, es an zwei verschiedenen Strings zur gleichen Zeit zu arbeiten. Daher würde strtok in einer Umgebung wie einer UDF nicht funktionieren, in der Sie nicht kontrollieren können, wo und wann die Funktion aufgerufen wird.

Also würde ich sagen, dass alles, was in einer Multithread-Umgebung nicht funktionieren würde, vermieden werden sollte.

Aber beachten Sie, dass das obige rein auf meiner Spekulation basiert, und nicht in der Realität basiert.

+0

Oh, so ist das Problem Thread-Sicherheit. Jetzt haben die Dinge mehr Sinn. Ich erinnere mich, dass STL einige Probleme bei der Verwendung von Threads hatte. – GetFree

2

Insbesondere Ihre UDF darf keine C++ - Ausnahmen ausgelöst werden. Alle Ausnahmen müssen abgefangen werden, bevor sie von Ihrem UDF zurückgegeben werden. Dies erfordert in der Regel try/catch um jede der UDF, die in C++ - Code geht, einschließlich einer "catch (...)" -Klausel, wenn Sie besonders paranoid sind.