Projekt in Arbeit - dynamisches, hochperformantes Blog in C auf Basis der Berkeley DB



  • Hallo zusammen,
    nachdem auf meine letzte Anfrage hier sehr gutes und freundliches Feedback bekommen habe, möchte ich die Gelegenheit nutzen, um mein momentanes Projekt vorzustellen.

    Zu mir: Diplomand in einem IT-Nahen Unternehmen. In meinem Studium habe ich querbeet von C über Perl, Java und .NET Grundlagen der Programmierung kennen gelernt. - trotzdem könnten einige Codefragmente jedoch aus den Augen eines Profis desaströs aussehen 🙂 ; irgendwo habe ich mal gehört, dass man Programmieren nur durch Programmieren lernen kann - es handelt sich dabei also um mein erstes größeres C-Projekt.

    Die Idee (erstmals hier http://forum.ubuntuusers.de/topic/projektidee-hochperformantes-blog-in-c-unter-/ beschrieben):

    Fefe hat in seinem Blog (http://blog.fefe.de) gezeigt, dass ein in C geschriebener Blog dauerhaft funktioniert. Aus persönlichem Interesse möchte ich das auch einmal probieren. Ziel ist also, ein Blog in C zu schreiben. Als Datenbankgrundlage soll dabei die hochperformante Berkeley DB von Oracle dienen, welche ein C-API besitzt. Besonderheit: Es können lediglich Hashes, also Key und Wert abgespeichert werden.

    Programm:
    2-Dateien (beides Programme):
    Datei 1 ließt in der 1. Version des Blogs ein Argument (string) ein, welches später einmal den Text des Blogs darstellt. Ein Datum wird selbstständig im Format yyyy-mm-dd-hh🇲🇲ss als Key erzeugt. Key und Eintrag werden in die DB geschrieben.
    Datei 2 ließt die letzten 10 Einträge der DB aus und gibt diese als HTML aus. Ein Knopf "alles anzeigen" zeigt alle Einträge an.

    OS: Ubuntu Linux mit installierter Berkeley DB

    Kritik ist hier ausdrücklich erwünscht. Dabei ist mir weniger wichtig, ob dieses Projekt irgendwann einmal sinnvoll eingesetzt werden kann, sondern wie eine Realisierung unter Performanz- und Sicherheitstechnischen gesichtspunkten am sinnvollsten umgesetzt werden kann.

    Beste Grüße

    Jan



  • Hier der Quelltext zu Programm 1:

    //use
    //gcc test.c -o test -I /usr/local/BerkeleyDB.5.1/include/ -L /usr/local/BerkeleyDB.5.1/lib/ -ldb -Wl,-rpath=/usr/local/BerkeleyDB.5.1/lib
    //install sudo apt-get install libdb4.8-dev if there are errors
    
    #include <stdio.h>
    #include <db.h>
    #include <string.h>
    #include <time.h>
    
    int write_into_blog(char *argv_entry);
    
    void main(int argc, char *argv[]){
      if (argc == 2){
        if (write_into_blog(argv[1]) != 0){
          printf(":( - An error occured. return of write_into_blog != 0\n");
        }
      }
    
    }
    
    int write_into_blog(char *argv_entry){
    
      /*==================== OPEN DB ====================*/
      //define variables
      DB *dbp;
      u_int32_t flags = DB_CREATE; // opening-method of the DB
      int ret;
      DBT key, data;
    
      ret = db_create(&dbp, NULL, 0); //open database structure
      if (ret != 0)
        printf(":( - ERROR while db_create\n");
    
      ret = dbp->open(dbp, NULL, "testdtb.db", NULL, DB_BTREE, flags, 0); //open database r/w
      if (ret != 0)
        printf(":( - ERROR while dbp->open\n");
    
      /*==================== GENERATE TIMESTRING ====================*/
      //yyyy-mm-dd-hh-mm-ss\0 => char[19]
      struct tm *ptime;
      time_t mytime;
      time( &mytime );
      ptime = localtime( &mytime );
      char timestamp[19];
      sprintf(timestamp, "%04d-%02d-%02d-%02d:%02d:%02d", ptime->tm_year + 1900, ptime->tm_mon, ptime->tm_mday, ptime->tm_hour, ptime->tm_min, ptime->tm_sec); 
    
      /*==================== WRITE INTO DB ====================*/
    
      //define variables
      char *date = timestamp;
      char *entry = argv_entry;
    
      //zero out DBTs before using them
      memset(&key, 0, sizeof(DBT));
      memset(&data, 0, sizeof(DBT));
    
      key.data = date;
      key.size = strlen(date) + 1;
    
      data.data = entry;
      data.size = strlen(entry) + 1;
    
      ret = dbp->put(dbp, NULL, &key, &data, DB_NOOVERWRITE); //write
      if(ret == DB_KEYEXIST)
        printf(":( - The key --- %s --- already exists.\n", date);
    
      /*==================== CLOSE DB ====================*/
      if(dbp != NULL)
        dbp->close(dbp, 0);
    
      return 0;
    }
    
    /*
        This program is free software: you can redistribute it and/or modify
        it under the terms of the GNU General Public License as published by
        the Free Software Foundation, either version 3 of the License, or
        (at your option) any later version.
    
        This program is distributed in the hope that it will be useful,
        but WITHOUT ANY WARRANTY; without even the implied warranty of
        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        GNU General Public License for more details.
    
        You should have received a copy of the GNU General Public License
        along with this program.  If not, see <http://www.gnu.org/licenses/>.
    */
    

    Kompiliert habe ich das ganze mit dem leicht zu merkenden Kommando:

    gcc test.c -o test -I /usr/local/BerkeleyDB.5.1/include/ -L /usr/local/BerkeleyDB.5.1/lib/ -ldb -Wl,-rpath=/usr/local/BerkeleyDB.5.1/lib
    

    Die Berkeley DB habe ich zuvor von der Oracle Website heruntergeladen und erfolgreich kompiliert.

    Kritik ist wie immer ausdrücklich erwünscht. Bei Fragen stehe ich selbstverständlich gerne zur Verfügung.

    Beste Grüße

    Jan



  • void main ist kein ANSI C
    bei Fehler besser auch die Funktion verlassen inkl. alles bisher korrekt initialiserte/allokierte wieder freigeben
    es muss "tm_mon + 1" sein
    char [19] ist zu klein
    gleichzeitige Verwendung von /* und // Kommentaren
    #include "db.h" statt #include <db.h> zur besseren Unterscheidung von Standardheadern
    main-Fehlerprüfung sollte !=2 testen
    ...


Anmelden zum Antworten