Tom: C++ API für MySQL

Hello,

ich sitze jetzt seit Tagen an einer eigenen kleinen CPP-API für MySQL, basierend auf der C-API.

Das ist ja auch alles ganz spannend, aber leider klappt es nicht so, wie ich mir das wünsche.

Es gibt immer den Fehler:

Error in my_thread_global_end(): 2 threads didn't exit

und zwar noch nachdem das Testprogramm eigentlich beendet ist.
Nun habe ich in Google bereits hunderte von Seiten durch.
Die einzige hoffnungsvolle war http://bugs.mysql.com/bug.php?id=25621

Die meisten anderen Treffer vermuten den Fehler in PHP, was ich hier aber überhaupt nicht benutze, also vollkommen ausschließen kann ;-)

Aus dem Link und der mysql.h entnahm ich, dass man

mysql_thread_init()

und

mysql_thread_end()

benutzen solle. Leider nützt das nichts, zumal mysql_thread_init() eine '0' zurückgibt (Datentyp ist my_bool, was ein char ist).

Das ist alles wenig erquicklig. Da fehlt mir einfach eine entscheidene Information, die ich nicht finden kann ;-((

Liebe Grüße aus Syburg bei Dortmund

Tom vom Berg

--
Nur selber lernen macht schlau
http://bergpost.annerschbarrich.de
  1. Hello,

    Das ist alles wenig erquicklig.

    Also, ich bin mir ziemlich sicher, dass ich "erquicklich" gedacht und geschrieben hatte.
    Verarscht mich mein Firefox? Das kommt in der letzten Zeit öfter vor, dass ich nach dem Absenden erst die merkwürdige Schreibweise sehe und denke: hoppla.

    Liebe Grüße aus Syburg bei Dortmund

    Tom vom Berg

    --
    Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
  2. Hello,

    Nachtrag: Als IDE benutze ich z. Zt. Visual C++ 6.0, also etwas Antiquiertes. Könnte es daran liegen?

    Liebe Grüße aus Syburg bei Dortmund

    Tom vom Berg

    --
    Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
  3. Tach,

    Aus dem Link und der mysql.h entnahm ich, dass man
        mysql_thread_end()
    benutzen solle.

    rufst du das Threadende auch für jeden gestarteten Thread auf? mysql_thread_init() is automatically called by my_init(), which itself is automatically called by mysql_init(), mysql_library_init(), mysql_server_init(), and mysql_connect().

    Leider nützt das nichts, zumal mysql_thread_init() eine '0' zurückgibt (Datentyp ist my_bool, was ein char ist).

    0 ist üblicherweise der Rückgabewert für "kein Fehler".

    mfg
    Woodfighter

    1. Hello Jens,

      der Fehler steckte ganz woanders.

      Wenn MySQL in der API Listen zurückgibt (z.B. vom Typ MYSQL_ROW), enthalten nicht gefüllte Felder immer NULL, d.h., dass es den Speicherbereich zum Listenelement (ASCII-Z-String) gar nicht erst gibt, sondern bereits in der Liste Ende ist...

      Das war von mir falsch implementiert, also nicht berücksichtigt. Nun geht es wunderbar.

      Es scheint auch in etlichen anderen Implementationen falsch zu sein. Leider kann man da ja nicht überall hineinsehen. Ich habe allerdings hunderte von Seiten mit ähnlichen Fehlermeldungen gefunden. Der Fehler steckt dann aber definitiv nicht in der Applikation von PHP, sondern in der C-API bzw. darauf aufsetzenden C++-API.

      Liebe Grüße aus Syburg bei Dortmund

      Tom vom Berg

      --
      Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de
      1. Hello Jens,

        April, April. Der Fehler mit

        Error in my_thread_global_end(): 2 threads didn't exit

        ist noch nicht weg.
        Nur, wenn jman die Release-Version erzeugt, wird am Ende nichts mehr angezeigt. Die lahmarschige Beendigung des Programmes deutet aber darauf hin, dass der Fehelr trotzdem vorhanden ist.

        Nun habe ich inzwischen ca. 450 Webseiten durch. Die meisten vermuten die Fehler aber in PHP oder ähnlichen Runtimes. Ich gehe davon aus, dass es ein Fehler in der libmysql.lib und der mysql.dll ist.

        Auch Andere haben diesen fehler dort lokalisiert:
           http://www.pfp.de/doku/ppl/ppl-6.1.0/documentation/html/PPL6History.html

        PHP scheint eine bugfreie Lib/DLL dafür zu haben, denn einige Threads deuteten darauf hin, dass nach einem Austausch der Fehler für PHP beseitigt war.

        Nun ist die Frage, wie ich die am geschicktesten ausgetauscht bekomme.

        Liebe Grüße aus Syburg bei Dortmund

        Tom vom Berg

        --
        Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
        1. Hallo Tom,

          Dir ist schon klar, dass Dir hier niemand ohne Beispielcode helfen kann?

          Und ohne folgende Infos vermutlich auch nicht:

          - Welcher Compiler?
           - Welche Toolchain?
           - Welches Betriebssystem?
           - Welche Systembibliothek / welche Header?
           - Welche MySQL-Client-Version?
           - Welche Compileroptionen?
           - Welche Linkeroptionen?

          Viele Grüße,
          Christian

          1. Hello,

            Dir ist schon klar, dass Dir hier niemand ohne Beispielcode helfen kann?

            Nicht wirklich, denn der Fehler taucht so häufig auf (siehe Google), dass vielleicht der einfache Ausstausch der libmysql.lib oder der mysql.dll tun würde. Ok, dafür muss man wissen, welche ich hier benutzte.
            Ich wede also versuche, die qualifizierten Fragen so gut es geht zu beantworten.

            Und ohne folgende Infos vermutlich auch nicht:

            • Welcher Compiler?

            Visual C++ 6.0

            • Welche Toolchain?

            *mmh* die eingebaute?  Wie kann ich die feststellen?

            • Welches Betriebssystem?

            Windows XP Pro

            • Welche Systembibliothek / welche Header?
            • Welche MySQL-Client-Version?

            Die letzten von MySQL für MySQL Server 5.0 bereitgestellten
                 Kann ich da irgendwie die Version abfragen?

            • Welche Compileroptionen?

            keine besonderen

            • Welche Linkeroptionen?

            keine besonderen

            Das Problemchen ist wohl bestens geeigent, was über C/C++ sowie die verwendeten IDEs dazuzulernen...

            Ich müsste es vielleicht mal mit einem neueren Visual Studio ausprobieren, aber in den vielen Berichten, die man in Google finden kann, taucht der Fehler da trotzdem auf.

            Die Fehlermelung kommt auch nur, wenn man die Debug-Version erzeugt. Bei der Release-Version dauert die Programmbeendigung eben nur sehr lange. Der Fehler wird also ebenfalls vorhanden sein.

            Mit MinGW/gcc auf Windows habe ich die API leider bisher gar nicht zum Laufen gebracht. Dort gibt es Probleme mit doppelten Deklarationen. Das kommt dann später aber noch an die Reihe. Eins nach zwei  anderen.

            Liebe Grüße aus Syburg bei Dortmund

            Tom vom Berg

            --
            Nur selber lernen macht schlau
            http://bergpost.annerschbarrich.de
            1. Hallo Tom,

              Dir ist schon klar, dass Dir hier niemand ohne Beispielcode helfen kann?
              Nicht wirklich,

              Tja, dann eben nicht...

              Viele Grüße,
              Christian

              1. Hello,

                Dir ist schon klar, dass Dir hier niemand ohne Beispielcode helfen kann?
                Nicht wirklich,

                Tja, dann eben nicht...

                Ach schade, dass Du nicht helfen kannst.

                Liebe Grüße aus Syburg bei Dortmund

                Tom vom Berg

                --
                Nur selber lernen macht schlau
                http://bergpost.annerschbarrich.de
                1. Hallo,

                  Dir ist schon klar, dass Dir hier niemand ohne Beispielcode helfen kann?
                  Nicht wirklich,

                  Tja, dann eben nicht...

                  Ach schade, dass Du nicht helfen kannst.

                  Naja, es ist eher so, dass Du Dir nicht helfen lassen _willst_.

                  Es verwendet so viele Software die MySQL-Client-Libs, dass ich mir kaum vorstellen könnte, dass ein derart offensichtlicher Bug, wie Du ihn beschreibst, so lange ungefixt bliebe. Also ist es viel wahrscheinlicher, dass Du (und vmtl. auch eine Menge anderer Anfänger, wenn Google so viele treffer liefert) etwas falsch machen. Ist ja nicht schlimm, passiert jedem.

                  Nur ohne Deinen Code habe ich keine Möglichkeit das nachzuvollziehen. Ich habe schließlich keine Lust, mich in die MySQL-Client-API einzuarbeiten, ein Beispielprogramm zu schreiben, nur, um dann festzustellen, dass es bei mir problemlos funktioniert und es Dir dann zu posten, Du dann siehst, dass es damit funktioniert, Dir dann aber nicht klar ist, warum es mit Deinem Code nicht funktioniert, Du dann doch Deinen Code postest und ich mir dann die Mühe umsonst gemacht habe, für einige Zeit ein Beispielprogramm zu schreiben, weil wenn Du gleich Beispielcode gepostet hättest, ich den sofort hätte auseinandernehmen können.

                  Viele Grüße,
                  Christian

                  1. Hello,

                    Naja, es ist eher so, dass Du Dir nicht helfen lassen _willst_.

                    Es verwendet so viele Software die MySQL-Client-Libs, dass ich mir kaum vorstellen könnte, dass ein derart offensichtlicher Bug, wie Du ihn beschreibst, so lange ungefixt bliebe. Also ist es viel wahrscheinlicher, dass Du (und vmtl. auch eine Menge anderer Anfänger, wenn Google so viele treffer liefert) etwas falsch machen. Ist ja nicht schlimm, passiert jedem.

                    Das mit dem Anfängerproblem hatte ich ja auch erst vermutet. Ich war ja schon ganz happy, einen eigenen Fehler drin zu haben, weil ich dachte, dass es nach dessen Beseitigung nun läuft. Das war nun leider nicht so.

                    Aber es sind bei Google auch eine riesige Menge von Treffern dabei, die das Problem bei der Anwendung von PHP oder den mysql-Tools usw. beschreiben, also der Nutzung einer fertigen Lösung. Und das könnte dann mMn durchaus auch auf ein anderes Problem hindeuten.

                    Tipp doch einfach mal in Google den Text ein:

                    "Error in my_thread_global_end():"

                    Kostet Dich eine halbe Minute. Nur um zu sehen, wie vielfältig die Meldungen sind.

                    Soll ich Dir hier den Quellcode posten? Das bringt doch sicher nur etwas, wenn du das antiquierte Visual C++ auch noch zur Verfügung hast. Ich werde nachher besser das Projekt als Zip-Datei auf den Server legen. Das geht hier jetzt nicht. Es wird später Nachmittag werden.

                    Wäre schon genial, noch Aufschluss über die Fehlerursache zu finden.

                    Liebe Grüße aus Syburg bei Dortmund

                    Tom vom Berg

                    --
                    Nur selber lernen macht schlau
                    http://bergpost.annerschbarrich.de
                    1. Hello,

                      es ist etwas später geworden, weil ich erst noch dioe Version testen wollte, die auf dem College-Rechner läuft. Auf meinem eigenen läuft sie nicht, obwohl ich dieselbe MySQL-Installation inclusive der libmysql.lib und libmysql.dll benutzt habe.

                      VC++ 6.0 ist auch Dasselbe.
                      WinXP könnte es Unterschiede geben.

                      http://selfhtml.bitworks.de/cpp/mysql/TS_mysqlDll_20081001c.rar

                      Wenn die mysql-API-Teile auch benötigt werden, liefere ich die noch nach.

                      Liebe Grüße aus Syburg bei Dortmund

                      Tom vom Berg

                      --
                      Nur selber lernen macht schlau
                      http://bergpost.annerschbarrich.de
                      1. Hallo Tom,

                        http://selfhtml.bitworks.de/cpp/mysql/TS_mysqlDll_20081001c.rar

                        Nunja, alleine vom Lesen des Sources kann man sehen, dass das nicht richtig funktionieren kann. Lies Dir doch bitte nochmal die Einleitung zur Verwendung der MySQL-C-API durch:

                        http://dev.mysql.com/doc/refman/5.1/en/c-api-function-overview.html
                        (unter der Tabelle, der Fließtext)

                        Dort steht ganz klar:

                        1. Du musst als *erstes* die komplette MySQL-Lib initialisieren, in dem
                            Du mysql_library_init() aufrufst (*einmalig* im ganzen Prozess, *vor*
                            jeder anderen Verwendung von MySQL)

                        2. Dann kannst Du erst sinnvoll MySQL-Verbindungsobjekte erstellen und
                            irgendwann auch wieder schließen.

                        3. Am Ende vom ganzen Programm rufst Du mysql_library_end() auf.

                        mysql_library_init() wird von Dir in keinem einzigen Sourcefile verwendet.

                        Viele Grüße,
                        Christian

                        1. Hello Christian,

                          ganz herzlichen Dank für deine Mühe mit der Untersuchung der Angelegenheit.
                          Die Tipps werde ich nun nochmal genauestens befolgen und dann testen, was rauskommt.

                          Diese eigene API ist auch nur noch eine sehr abgespeckte und verbastelte geblieben, denn nachdem es nicht so funktionieren wollte, sie es sollte, habe ich die mesiten Methoden wieder entsorgt.

                          Vielleicht wird dann doch noch was draus *freu*

                          Ich hatte diese Seite im MySQL-Handbuch einfach übersehen. Und meine beiden Mitstreiter haben sie auch nicht gesehen. Da waren wir wohl richtig blind!

                          Liebe Grüße aus Syburg bei Dortmund

                          Tom vom Berg

                          --
                          Nur selber lernen macht schlau
                          http://bergpost.annerschbarrich.de
                          1. Hello,

                            ich habe es eben nur auf die Schnelle ausprobiert und die Funktionsaufrufe in Konstruktor und Destruktor eingesetzt, neu kompiliert, aber es scheint nicht die Lösung zu sein.

                            Daran werde ich wohl noch etwas länger knabbern. Morgen vergleiche ich erst nochmal die MySQL-Libraries von meinem und dem anderen Rechner. Vielleicht haben sie ja doch unterschiedliche Versionen. Sie wurden schließlich zu unterschiedlichen Zeiten heruntergeladen von MySQL.

                            Liebe Grüße aus Syburg bei Dortmund

                            Tom vom Berg

                            --
                            Nur selber lernen macht schlau
                            http://bergpost.annerschbarrich.de
                            1. Hallo Tom,

                              Ich habe nochmal etwas recherchiert und bin auf Bug #37226 gestoßen.

                              Das Problem scheint also in 5.0.70 (wird noch veröffentlicht werden) und in 5.1.28 (ist schon veröffentlicht, halt Entwicklerversion) beseitigt zu sein.

                              Viele Grüße,
                              Christian

                              1. Hello Christian,

                                Ich habe nochmal etwas recherchiert und bin auf Bug #37226 gestoßen.

                                Das Problem scheint also in 5.0.70 (wird noch veröffentlicht werden) und in 5.1.28 (ist schon veröffentlicht, halt Entwicklerversion) beseitigt zu sein.

                                Ich habe die beiden DLLs verglichen, also die hier im College (MySQL-Campus-Edition, 2.035.712 Bytes) und die auf meinem Rechner (neuer Download, 2.068.480 Bytes). Sie unterscheiden sich. Die Version im College war also nicht von der MySQL-Seite heruntergeladen, wie ursprünglich angenommen.

                                Kann also sein, dass die Campusversion älter ist und den Bug deshalb noch nicht hatte. So ging es für mich auch aus vielen Internet-Postings hervor.

                                Muss ich also mal sehen, ob ich entweder die alte benutze, oder versuche, die von Dir erwähnte neuere Version zu ergattern. Steht die schon irgendwo bereit?

                                Liebe Grüße aus Syburg bei Dortmund

                                Tom vom Berg

                                --
                                Nur selber lernen macht schlau
                                http://bergpost.annerschbarrich.de