Installing And Configuring PostgreSQL And Libpqxx On Ubuntu
Installation
To install the packages needed (including the postgres server [1], client and libpqxx), enter the following at a prompt:
sudo apt-get install postgresql postgresql-contrib libpqxx-4.0 libpq-dev libpqxx-dev
Database Configuration
This process was found on the Ubuntu Documentation site [2].
Edit the /etc/postgresql/9.5/main/postgresql.conf file, changing:
#listen_addresses = 'localhost'
to:
listen_addresses = '*'
Next, change the psql password of the 'postgres' user, entering the following at a prompt:
sudo -u postgres psql template1 template1=# ALTER USER postgres with encrypted password 'your_password';
Next, edit the /etc/postgresql/9.1/main/pg_hba.conf file, changing:
local all postgres peer
to:
local all postgres md5
Next, restart the PostreSQL service, entering the following at a prompt:
sudo systemctl restart postgresql.service
Creating a Database for Testing
Enter the following command at a prompt, afterwards providing the password for the postgres user configured earlier, to create a new database called 'db_test':
sudo -u postgres psql db_test
Here I create a new table containing the ids, names and populations of provinces, with a single row:
create table provinces (id INT, name VARCHAR(20), population INT); insert into provinces (id, name, population) values (1, 'alberta', 24);
Connector Application Source Code
An example of interaction with the afore created database using libpqxx is shown below, implemented within a main.cpp file. The implementation was conducted referencing source found on the libpqxx site [3] (under the 'Example' section). To successfully run the sample, manually replace 'PASSWORD' with the password given to the postgres user configured above:
#include <iostream> #include <string> #include <cassert> #include <pqxx/pqxx> int main() { pqxx::connection c("dbname=db_test user=postgres password=PASSWORD"); c.prepare("create", "INSERT INTO provinces (id, name, population) \ VALUES ($1, $2, $3)"); c.prepare("read_by_id", "SELECT * FROM provinces WHERE id = $1"); c.prepare("read_by_name", "SELECT * FROM provinces WHERE name = $1"); c.prepare("update_by_id", "UPDATE provinces SET population = population + 1 \ WHERE id = $1"); c.prepare("delete_by_id", "DELETE FROM provinces WHERE id = $1"); { pqxx::work txn(c); pqxx::result res; int test_id = 9999; std::string test_name = "test name"; int test_population = 50; // --- Create --- { txn.prepared("create")(test_id)(test_name)(test_population) .exec(); res = txn.prepared("read_by_id")(test_id).exec(); if (res.size() == 0) { std::cerr << "No records with name " << test_name << ", were found." << std::endl; return -1; } int province_id = res[0][0].as<int>(); assert(province_id == test_id); std::string province_name = res[0][1].as<std::string>(); assert(province_name.compare(test_name) == 0); int province_population = res[0][2].as<int>(); assert(province_population == test_population); std::cout << "Province #" << province_id << ", has name: " << province_name << ", and population: " << province_population << std::endl; } // --- Update --- { std::cout << "Updating province with id: " << test_id << std::endl; txn.prepared("update_by_id")(test_id).exec(); res = txn.prepared("read_by_id")(test_id).exec(); int province_population = res[0][2].as<int>(); assert(province_population == test_population + 1); } // --- Delete --- { txn.prepared("delete_by_id")(test_id).exec(); res = txn.prepared("read_by_id")(test_id).exec(); assert(res.size() == 0); } txn.commit(); } }
Compilation may be accomplished by invoking the following at a prompt:
g++ main.cpp -lpqxx -lpq
A copy of the source is available here.
Sources
[1] https://www.digitalocean.com/community/tutorials/how-to-install-and-use-postgresql-on-ubuntu-12-04, "How To Install and Use PostgreSQL on Ubuntu 12.04", 2016. [Accessed: 27-Aug-2016].
[2] https://help.ubuntu.com/stable/serverguide/postgresql.html, "PostgreSQL", 2016. [Accessed: 27-Aug-2016].
[3] http://pqxx.org/development/libpqxx/wiki, "C++ connector for PostgreSQL", 2016. [Accessed: 27-Aug-2016].