Berkeley DB ist eine Datenbank-Bibliothek für Linux, Windows, BSD UNIX, Solaris, Mac OS/X (…) und unterstützt diverse Programmiersprachen (C, C++, Java, Perl, Python, PHP, Tcl, Ruby, etc.). Berkeley DB wird von vielen Applikationen benutzt. Die mir darunter bekanntesten sind: KDevelop, Postfix und Subversion [1].
Die Installation hat mir einige Probleme bereitet, deshalb möchte ich hier kurz erläutern, wie man sich die aktuelle Version unter Linux (Ubuntu 9.04) installiert und ein Programm kompiliert. Diese Anleitung ist nur als Einstieg gedacht. Man sollte auf jeden Fall auch noch die Dokumentation von Oracle lesen. Es gibt für einige Programmiersprachen noch ausführliche Anleitungen, wie man die Datenbank in das eigene Programm einbinden kann [2].
Zuerst läd man sich die passende Version von der Oracle Homepage herunter: http://www.oracle.com/technology/software/products/berkeley-db/index.html in meinem Fall war das Berkeley DB 4.7.25.tar.gz, with AES encryption (13M)
Dann muss diese Datei entpackt werden:
tar xfvz db-4.7.25.tar.gz
nun wechselt man in das Verzeichnis db-4.7.25/build_unix konfiguriert, kompiliert und installiert die Bibliothek mit
cd db-4.7.25/build_unix
../dist/configure --enable-cxx
make -j
sudo make install
Was jetzt noch wichtig ist, ist dem Linker mit zuteilen, wo er die neue Bibliothek finden kann. Dafür sucht man in der Installationsausgabe die Zeile Libraries have been installed in: /usr/local/BerkeleyDB.4.7/lib und kopiert den Pfad.
Anschließend öffnet man mit einem beliebigen Editor (in meinem Fall vi) die Datei /etc/ld.so.conf:
sudo vi /etc/ld.so.conf
und fügt den Pfad ein. Sobald man den Linker aktualisiert hat ist die Installation abgeschlossen:
sudo ldconfig
Nun erstellen wir schnell ein erstes Programm:
Noch ein kurzes Wort zur Warnung: Das folgende Programm ist nicht vollständig. Normalerweise würde man erstens ein eher objektorientiertes Konzept wählen (eine eigene Klasse erstellen). Außerdem sind Fehler noch nicht abgefangen. Diese Dinge habe ich der Übersicht halber weggelassen.
#include <cstring> #include <db_cxx.h> #define BUF 100 int main() { Db db(NULL,0); db.open(NULL, // Transaction Pointer "my_db.db", // Dateiname der neuen Datenbank NULL, // Optionaler logischer Datenbank Name DB_BTREE, // Datenbank Zugriffsmethode DB_CREATE, // Flags 0); // Datei Modus 0 = default // Dinge die wird in die Datenbank speichern möchten float money = 123.45; char describtion[BUF] = "HelloWorld" ; // Erstelle Objekte Dbt key( &money, sizeof(float) ); Dbt data( &describtion, BUF ); // Eintragen in die Datenbank - Duplikate nicht überschreiben int ret = db.put(NULL, &key, &data, DB_NOOVERWRITE ); if( ret == DB_KEYEXIST ) { std::cout < < "Schlüssel exisitert bereits" << std::endl; } db.sync(0); // Syncronisiere Datenbank (schreibe in Datei) // Erstelle Objekte für die Suche Dbt searchKey, searchData; float searchTerm = 123.45; // Suchterm - der gleiche wie oben // Setze Attribute für Suchobjekt searchKey.set_size( sizeof(float) ); searchKey.set_data( &searchTerm ); // Puffer für das Ergebnis char result[BUF]; searchData.set_data( result ); searchData.set_ulen(BUF+1); // Größe des benutzerspez. Buffers searchData.set_flags(DB_DBT_USERMEM); // Eigentliche Suche ret = db.get(NULL, &searchKey, &searchData, 0); if( ret == DB_NOTFOUND ) { std::cout << "nicht gefunden" << std::endl; } else { std::cout << "gefunden: " << result << std::endl; } }
Das ganze wird nun kompiliert und schon hat man seine erste Berkeley DB Anwendung.
g++ main.cpp -o dbApp -ldb_cxx-4.7 -I /usr/local/BerkeleyDB.4.7/include/ -L /usr/local/BerkeleyDB.4.7/lib/
Links:
Weiterführende Literatur (Amazon):