tntnet 2.1 Datenbank zugriff



  • Leider habe ich ein Problem mit dem Zugriff auf Sqlite oder mysql mit tntnet.
    Ich komme bei der Zeile 9 nicht weiter.
    Sobald die Zeile, in welcher Form auch immer, im Code ist, zeigt mir tntnet im Browser:
    "Error not found" an.
    Hier mal der Code:

    <%pre>
    #include <tntdb/connection.h>
    #include <tntdb/connect.h>
    </%pre>
    <%config>
    </%config>
    <%request scope="global">
    tntdb::Connection myConn = tntdb::connect("mysql:db=tnttestdb;user=root;passwd=secret");
    </%request>
    <%args>
    </%args>
    <%session>
    </%session>
    <%cpp>
    </%cpp>
    <html>
     <head>
      <title>tnttest</title>
      <link rel="stylesheet" href="/media/jquery.mobile-1.1.0.css" />
      <script type="text/javascript" src="/media/jquery.js"></script>
      <script type="text/javascript" src="/media/jquery.mobile-1.1.0.js"></script>
     </head>
     <body>
      <h1>tnttest</h1>
    % for (unsigned n = 0; n < 5; ++n) {
    Speed yeah <$n$> <br>
    % }
     </body>
    </html>
    

    Vorsorglich ein Entschuldigung, wenn ich im falschen Bereich gekommen bin und
    ich programmiere sonst mit Python kenne mich mit C++ nur oberflächlich aus.

    Grüße
    Drache



  • Hast Du die tntdb-Bibliothek dazu gelinkt? Also -ltntdb dem Linker übergeben? Mach mal "ldd -r" auf Deine so. Möglicherweise hast Du nicht aufgelöste Symbole.



  • tntnet_ schrieb:

    Hast Du die tntdb-Bibliothek dazu gelinkt? Also -ltntdb dem Linker übergeben? Mach mal "ldd -r" auf Deine so. Möglicherweise hast Du nicht aufgelöste Symbole.

    Danke für deine schnelle Antwort !
    Mein Makefile habe ich so geändert:
    ....
    LDFLAGS+=-shared -L/usr/local/lib -ltntnet -lcxxtools -ltntdb
    ....
    ich hoffe das war so gemeint.
    ldd -r gibt zumindes keine Fehler aus, wobei ich überhaubt nich weiß was die
    ausgibt wenn alles OK ist 😕
    Hier ein kleiner Abschnitt:

    linux-vdso.so.1 =>  (0x00007fff809ff000)
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fce3d945000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fce3d72f000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fce3d371000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fce3d077000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fce3de73000)
    undefined symbol: _ZN3tnt16ComponentFactory11doConfigureERKNS_9TntconfigE	(./tnttest.so)
    undefined symbol: _ZN3tnt16ComponentFactory6createERKNS_9CompidentERKNS_9UrlmapperERNS_10ComploaderE	(./tnttest.so)
    

    von den undefined symbol kommen noch ca. 15 Stück.

    cxxtools,tntnet,tntdb hab ich von der Website vor ein paar tagen geladen
    kompiliert und installiert wie im quick start beschrieben.

    Danke
    Drache



  • Das war erst mal richtig korrigiert.

    Und in der Ausgabe von ldd sehen wir das Problem. Irgendwie fehlt die Referenz auf die libraries.

    Bei der Ausgabe von ldd -r muss eine Zeile "libcxxtools.so.8.0.0 => /usr/local/lib/libcxxtools.so.8.0.0" oder ähnlich und für libtntnet und libtntdb äquivalent raus kommen. Und es dürfen keine undefined symbols vor kommen. Ansonsten kann tntnet die Library nicht laden.

    Kannst Du die Linker-Zeile zeigen? Vielleicht kann ich da was erkennen.



  • Hallo tntnet_

    make
    /usr/local/bin/ecppc   -o tnttest.cpp tnttest.ecpp
    g++ -I/usr/local/include -fPIC -O2   -c -o tnttest.o tnttest.cpp
    g++ -o tnttest.so -shared -L/usr/local/lib -ltntnet -lcxxtools -ltntdb tnttest.o
    rm tnttest.cpp
    

    ich hoffe das ist die linker zeile.

    hier noch die tntnet.conf

    MapUrl      ^/$   tnttest@tnttest
    MapUrl      ^/index.html   tnttest@tnttest
    MapUrl ^/(.*) static@tntnet /home/drache/tnttest/$1
    MapUrl      ^/([^.]+)(\..+)?   $1@tnttest
    Listen              "" 8000
    PropertyFile        tntnet.properties
    
    $ cxxtools-config --cxxflags
      -I/usr/local/include
    
    $ cxxtools-config --libs
      -L/usr/local/lib -lcxxtools
    

    Danke für deine Hilfe,
    Drache



  • Das sieht eigentlich gut aus. Momentan fehlt mir die Idee. Kannst Du heute Abend mal im Freenode irc Kanal #tntnet vorbei schauen. Da können wir mal genauer untersuchen, was das Problem ist. Da findest Du mich unter dem Nick "tntnet".



  • Sollte jemand das gleiche Problem haben:
    im Makefile die Zeile LDFLAGS auf:

    LDFLAGS+=-o tnttest.so tnttest.o -shared -L/usr/local/lib -ltntnet -lcxxtools -ltntdb
    

    ändern (ohne Gewähr, funktioniert zumindest bei meinem Ubuntu 12.04,tnttest noch ersetzen)

    Ich muss ziemlich umdenken von dem wie ich es bisher kannte, deswegen
    hier ein unvollständiges Beispiel der Datenbankfelder in HTML.
    Anregungen nehme ich gerne hingegen:

    <%pre>
    #include <tntdb/connection.h>
    #include <tntdb/connect.h>
    #include <tntdb/row.h>
    #include <tntdb/statement.h>
    #include <tntdb/result.h>
    </%pre>
    <%args>
    int id = 1;
    </%args>
    <%request scope="global">
    tntdb::Connection myConn = tntdb::connect("sqlite:newsdb.db");
    </%request>
    <%session>
    <%cpp>
    tntdb::Result result = myConn.select("select id, title from article");
    </%cpp>
    <!DOCTYPE html>
    <html>
        <head>
            <title>starttnt</title>
            <meta name="viewport" content="width=device-width, initial-scale=1">
            <link rel="stylesheet" href="http://code.jquery.com/mobile/1.1.0/jquery.mobile-1.1.0.min.css" />
            <script src="http://code.jquery.com/jquery-1.7.1.min.js"></script>
            <script src="http://code.jquery.com/mobile/1.1.0/jquery.mobile-1.1.0.min.js"></script>
        </head>
        <body>
            <div data-role="page">
    
                <div data-role="header">
                    <h1>Seiten Titel</h1>
                </div><!-- /header -->
    
                <div data-role="content">
                    <{
                    for (tntdb::Result::const_iterator i = result.begin(); i != result.end(); ++i){
                    tntdb::Row row = *i;
                    }>
                    Datensatz id  ??????  <br>
                    % }
                    --------------------------------------------------------------------------------<br>
    
                    <%cpp>
    
                    tntdb::Statement stmt = myConn.prepareCached(
                    "select title, ctime, long_text"
                    "  from article"
                    " where id = :id");
    
                    stmt.set("id", id);
    
                    tntdb::Row row = stmt.selectRow();
                    std::string title;
                    std::string time;
                    std::string longtext;
                    row[0].get(title);
                    row[1].get(time);
                    row[2].get(longtext);
    
                    </%cpp>
                    <$title$> <br>
                    <$time$> <br>
                    <$longtext$> <br>
    
                </div><!-- /content -->
    
                <div data-role="footer">
                    <h4>Seiten Fuss</h4>
                </div><!-- /footer -->
            </div><!-- /page -->
    
        </body>
    </html>
    

    Hat zufällig noch jemand lust sich in tntweb einzuarbeiten ?
    Für mich wären neben Datenbankzugriffen noch Basic-Auth, und Ajax mit json
    wichtig kennen zu lernen.

    Übrigens die Leute von tntnet sind wirklich nett.
    Haben sich für meine Problemchen ganz schön viel Zeit genommen.
    Vielen dank auch von der Stelle nochmal.

    Drache



  • Wenn noch jemand mitmachen mag:

    https://bitbucket.org/PDrache/startnt

    Zur Zeit arbeite ich an eine Python integration.

    Drache


Anmelden zum Antworten