Chcę komunikować programy pisane w C++ z bazą danych PostgreSQL. Wybrałem do tego libpqxx. Zainstalowałem PostgreSQL i bibliotekę z repozytorium. System to Linux Mint 17.2. Nie mam pojęcia, jak dodać tę bibliotekę do projektu w Eclipse CDT. Ogólnie jest to pierwsza biblioteka używana w tym IDE.
W twoim przypadku prawdopodobnie pliki nagłówkowe biblioteki są zainstalowane w katalogu /usr/include/pqxx
#includepqxx/pqxx
using namespace pqxx;
i odtąd możesz korzystać z bibloteki w swoim programie.
Ewentualnie jeżeli chciałbyś załączyć do projektu bibliotekę z poza /usr/include/ przechodzisz kolejno zakładki:
ProjectPropeties (rozwijasz) C\C++BuildSettings z listy wybierasz GCC C++ Compiler Includes
w polu Include paths podajesz ścieżkę do plików nagłówkowych np, /usr/include/pqxx
następnie przechodzisz do pozycji GCC C++ LinkerLibraries i w polu Libraries dodajesz nazwę biblioteki np, pqxx
Ostatecznie załączasz plik nagłówkowy do projektu dodając np w pliku main:
#includepqxx
using namespace pqxx;
Drugi sposób jest uniwersalny jeśli chciałbyś korzystać z niestandardowych bibliotek, natomiast jeżeli korzystasz z bibliotek systemowych to ten pierwszy sposób powinien być dla ciebie chyba najbardziej odpowiedni.
Okazało się, że coś źle zainstalowałem. Odinstalowałem wszystko i zainstalowałem jeszcze raz. Teraz znajduje mi już pqxx, ale przy próbie skompilowania testowego kodu, wysypują mi się błędy.
#include <iostream>
#include <pqxx/pqxx>
using namespace std;
using namespace pqxx;
int main(int argc, char* argv[])
{
try{
connection C("dbname=testdb user=postgres password=cohondob \
hostaddr=127.0.0.1 port=5432");
if (C.is_open()) {
cout << "Opened database successfully: " << C.dbname() << endl;
} else {
cout << "Can't open database" << endl;
return 1;
}
C.disconnect ();
}catch (const std::exception &e){
cerr << e.what() << std::endl;
return 1;
}
}
22:57:56 ****Incremental Build of configuration Debug for project test****
make all
Building file: ../src/test.cpp
Invoking: GCC C++ Compiler
g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/test.d" -MT"src/test.d" -o "src/test.o" "../src/test.cpp"
Finished building: ../src/test.cpp
Building target: test
Invoking: GCC C++ Linker
g++ -o "test" ./src/test.o
./src/test.o: In function `main':
/media/WS/EclipseWS/test/Debug/../src/test.cpp:12: undefined reference to `pqxx::connection_base::is_open() const'
/media/WS/EclipseWS/test/Debug/../src/test.cpp:13: undefined reference to `pqxx::connection_base::dbname()'
/media/WS/EclipseWS/test/Debug/../src/test.cpp:18: undefined reference to `pqxx::connection_base::disconnect()'
./src/test.o: In function `pqxx::connect_direct::connect_direct(std::string const&)':
/usr/include/pqxx/connection.hxx:87: undefined reference to `pqxx::connectionpolicy::connectionpolicy(std::string const&)'
/usr/include/pqxx/connection.hxx:87: undefined reference to `vtable for pqxx::connect_direct'
./src/test.o: In function `pqxx::connect_direct::~connect_direct()':
/usr/include/pqxx/connection.hxx:84: undefined reference to `vtable for pqxx::connect_direct'
/usr/include/pqxx/connection.hxx:84: undefined reference to `pqxx::connectionpolicy::~connectionpolicy()'
./src/test.o: In function `pqxx::basic_connection<pqxx::connect_direct>::basic_connection(char const*)':
/usr/include/pqxx/basic_connection.hxx:70: undefined reference to `pqxx::connection_base::connection_base(pqxx::connectionpolicy&)'
/usr/include/pqxx/basic_connection.hxx:71: undefined reference to `pqxx::connection_base::init()'
./src/test.o: In function `pqxx::basic_connection<pqxx::connect_direct>::~basic_connection()':
/usr/include/pqxx/basic_connection.hxx:78: undefined reference to `pqxx::connection_base::close()'
collect2: error: ld returned 1 exit status
make: *** [test] Błąd 1
22:57:56 Build Finished (took 384ms)
Ważne, że jest postęp
W zakładce GCC C++ Linker>>Libraries w oknie Libraries (-l) dopisz pqxx i zapisz zmiany.
Za 3 razem zaczęło działać. Teraz dostaję:
FATAL: password authentication failed for user "postgres"
Ale to oznacza, że działa i sobie poradzę. Dzięki
Opened database successfully: baza_testowa
Jak miło
Chciałbym od razu zacząć kodować, ale trzeba się odwdzięczyć. Co prawda tobie już nie mam jak, ale innym mogę pomóc. Tak więc, przechodząc do rzeczy:
-
Instalacja PostgreSQL:
apt-get install postgresql-9.3
postgresql-client
postgresql-client-9.3
postgresql-client-common
postgresql-common
postgresql-contrib
postgresql-contrib-9.3
Część jest raczej zbędna, ponieważ chyba tylko doprecyzowuje wersję, ale nie zaszkodzi. Dla nowszych wersji analogicznie, wybrałem tę wersję ponieważ była najnowszą w repozytorium. Aktualną wersję można sprawdzić za pomocą:
apt-cache search postgresql
Następnie należy zmodyfikować plik /etc/postgresql/9.3/main/postgresql.conf
gedit /etc/postgresql/9.3/main/postgresql.conf
Szukamy i zmieniamy “listen_addresses”
listen_addresses = 'localhost, 192.168.0.42, 192.168.0.111'
Podobnie postępujemy z " /etc/postgresql/9.3/main/pg_hba.conf". Powinno to wyglądać tak (gdzieś przy końcu pliku):
# IPv4 local connections:
host all all 127.0.0.1/32 md5
Teraz restartujemy serwer PostgreSQL
/etc/init.d/postgresql restart
-
Instalacja libpqxx:
apt-get install libpqxx-4.0
libpqxx-dbg
libpqxx-dev
libpqxx-doc
Tak samo, jak w przypadku PostgreSQL, jest to aktualna wersja dostępna w repozytorium i możemy sprawdzić dostępne wersje za pomocą:
apt-cache search libpqxx
- Używanie w Eclipse:
Jeżeli wszystko przebiegło poprawnie, powinien istnieć katalog “/usr/include/pqxx”, więc powinna wystarczyć dyrektywa:
#include <pqxx/pqxx>
Jeżeli to nie działa, oznacza to, że coś poszło źle. Jeżeli z jakichś powodów katalog znajdowałby się w innym miejscu, można skorzystać z uniwersalnej metody przedstawionej przez @ShadowMan_.
- Pierwsze połączenie:
Dla testu tworzymy “role” (nie wiem, jak to powinno być przetłumaczone
su postgres
psql
CREATE ROLE test_role WITH SUPERUSER CREATEDB LOGIN PASSWORD 'bardzo_tajne_haslo';
CREATE DATABASE baza_testowa OWNER test_role;
Tworzymy nowy projekt i wklejamy do niego kod testowy (przerobiony z przykładowego kodu na tutorialspoint.com :D):
#include iostream
#include pqxx/pqxx
using namespace std;
using namespace pqxx;
int main(int argc, char* argv[])
{
try{
connection C("dbname=baza_testowa user=test_role password=bardzo_tajne_haslo hostaddr=127.0.0.1 port=5432");
if (C.is_open()) {
cout "Opened database successfully: " C.dbname() endl;
} else {
cout "Can't open database" endl;
return 1;
}
C.disconnect ();
}catch (const std::exception e){
cerr e.what() std::endl;
return 1;
}
}
Kompilujemy, uruchamiamy i dostajemy poniższą linijkę i jesteśmy zadowoleni
Opened database successfully: baza_testowa
//czyt. Hello World! :)
-
Możemy jeszcze zainstalować sobie pgAdmin III
apt-get install pgadmin3
Jednak nie będzie on widział naszego serwera. Aby to zmienić, klikamy na ikonkę wtyczki (zwaną także “Zdefiniuj połączenie do serwera”). Następnie wypełniamy formularz.
Nazwa: Test
Host: 127.0.0.1
Port: 5432
Serwis: [pusto]
Serwisowa DB: baza_testowa
Użytkownik: test_role
Hasło: ****************** (bardzo_tajne_haslo :D)
Następnie OK i w drzewku po lewej, w “Serwer Group” powinniśmy znaleźć naszą bazę.