Привіт усім. В даній статті, ми розглянемо метод взаємодії програми написаній на С/С++ разом з всесвітньо відомою СУБД PostgreSQL.

Історія і опис

Так само як велика кількість ключових і одних із найпопулярніших проектів з відкритим кодом, PostgreSQL започаткувався у Каліфорнійському Університеті при Берклі (University of California at Barkeley — UCB). Саме так, це саме там, де підтримують операційну систему BSD, на яку опирається більшість мережі Інтернет. Якщо Ви активний користувач мережі Інтернет, Ви також являєтесь, в певній мірі, і користувачем ОС FreeBSD, або ж її дочірніх операційних систем, яка б ОС не була встановлена на Вашому персональному комп'ютері. PostgreSQL, оригінальна назва — Postgres, була створена при UCB, професором у галузі комп'ютерних наук, Міхаельом Стоунбрейкером (Michael Stonebraker), який став технічним директором корпорації Informix. Стоунбрейкер заснував Postgres у 1986, як проект-продовження до його попередника Ingres, власниками якої являються Computer Associates. Ім'я Postgres, являється грою слів у відношенні до попередника (тобто “після Ingres” - Post-gres). Ingres розроблялася з 1977 до 1985, як навчальний проект для вивчення систем керування даними у відповідності до класичної теорії RDBMS-систем. Postgres, яка розроблялася між 1986 і 1994, була проектом, який мав розпочати нову групу у концепції систем баз даних, досліджуючи галузь “об'єктно-орієнтованих” технологій. Informix була купленою корпорацією IBM у 2001 році за один мільярд доларів США. Стоунбрейкер і його студенти-випускники активно розробляли Postgres вісім років. Під час розробки, у Postgres впровадили правила, процедури, розширювані типи разом з індексами і об'єктно-реляційною концепцією. Пізніше, Postgres була комерціалізованою у вигляді Illustra, яка була купленою корпорацією Informix і інтегрованою у її систему Universal Server. У 1995 році, два студента кандидати з лабораторії Стоунбрейкера, Ендрю Ю (Andrew Yu) і Джолі Чен (Jolly Chen), замінили мову запитів Postgres`POSTQUEL на розширену SQL. Вони перейменували систему на Postgres95. У 1996 році, Postgres95 перемістився з академічних кіл і розпочала своє нове життя у світі програм з відкритим кодом, коли група спрямованих розробників, які не відносяться до Університету Берклі, побачили потенціал системи і присвятили своє життя для її поточного розроблення. PostgreSQL являється потужною об'єктно-реляційною системою керування базою даних з відкритим кодом. Вона активно розробляється і підтримується більше п'ятнадцяти років, завдяки чому отримала надійну архітектуру і репутацію надійної системи. PostgreSQL працює на найпопулярніших ОС до складу яких входять ҐНУ/Лінукс, Юнікс (AIX, BSD, HP-UX, SGI IRIX, Mac OS X, Solaris, Tru64) і Windows. Вона повністю сумісна з ACID, повністю підтримує зовнішні ключі (foreign keys), об'єднання (joins), представлення (views), тригери (trigers), і процедури на багатьох мовах. PostgreSQL підтримує більшість типів даних з стандарту SQL:2008, до складу яких входить INTEGER, NUMERIC, BOOLEAN, CHAR, VARCHAR, DATE, INTERVAL і TIMESTAMP. Вона також підтримує зберігання великих бінарних об'єктів, які можуть являтися зображеннями, звуковими файлами або відео. Окрім цього, ви можете створювати власні типи даних. PostgreSQL постачає велику кількість рідних програмних інтерфейсів для C/C++, Java, PHP, .Net, Perl, Python, Ruby, Tcl, ODBC і інші. В загальному, PostgreSQL являється СКБД комерційного рівня. Вона використовується наступними, відомими нам, комерційними організаціями: Apple, Fujitsu, Cisco, Sun Microsystems, Skype і іншими, а також великою кількістю університетів з США і Росії, і державними установами багатьох інших країн. Усю документацію і саму СКБД, Ви можете знайти на офіційному сайті програми www.postgresql.org.

Створення локальної бази даних.

Перш ніж взаємодіяти з чимось, необхідно це щось мати, або ж щоб воно десь існувало. Тому спочатку ми повинні встановити PostgreSQL і створити локальну базу даних. Для встановлення PostgreSQL на похідних від ОС Debian (Ubuntu, Mint), в командному інтерпретаторі необхідно ввести наступну команду:
sudo apt-get install postgresql
Після виконання даної команди, на моєму ПК були встановлені сервер PostgreSQL, libpq (бібліотека для взаємодії С/C++ програм з PostgreSQL) і psq — командний клієнт до PostgreSQL. Ви також можете встановити віконний інтерфейс (себто GUI pgadmin3) до бази виконуючи команду:
sudo apt-get install pgadmin3
Користувачі ОС Windows можуть встановити бінарні файли даної СКБД, або ж зібрати її вручну використовуючи Windows SDK (про те, як це зробити, прочитайте документацію з завантаженого джерельного коду PostgreSQL). Бінарні файли можна отримати з офіційного сайту. Після встановлення СКБД, необхідно створити базу даних. Для цього ми підключаємось до локального кластера PostgreSQL, i створюємо базу даних “pgtestdb” за допомогою команди:
sudo -u postgres psql
create database pgtestdb ;
\c pgtestdb
create table testtable (id serial, value text) ;
insert into testtable (value) VALUES ('Один') ;
insert into testtable (value) VALUES ('Два') ;
insert into testtable (value) VALUES ('Три') ;
insert into testtable (value) VALUES ('Чотири') ;
Першою командою, ми запускаємо на виконання командний інтерпретатор psql, в якому можна створювати усі необхідні об'єкти (бази даних, таблиці і т.д.). Друга команда створює нову базу даних “pgtestdb”, і наступною командою ми підключаємось до неї (відповідник команди “USE” у SQL). Четверта команда створює таблицю “testtable” з двома полями: id (тип поля “serial” - поле, з автоматичним збільшенням цілого числа починаючи від 1, при кожному додаванні нового запису) і value (текстове поле довільної довжини). Наступні команди після “create table” створюють чотири нові записи в таблиці “testtable”. Тепер, ми можемо підключатись до локального кластера.

Підключення до кластера PostgreSQL через libpq

Розглянемо наступну програму на С++.
#include <iostream> /* I/O */
#include <string> /* string */
#include <libpq-fe.h> /* функції для PostgreSQL */
using namespace std ; /* використовуємо простір імен std */

/* головна функція програми */
int main (int argc, char** argv) 
{
    /* дескриптор підключення PostgreSQL  */
    PGconn * connection ; 
    
    /* інформація про підключення */
    string conn_info = "user=postgres password=MyBigSecret "
                       "dbname=pgtestdb port=5432 host=localhost" ;
                       
    /* буфер повідомлення про помилку */
    string err_msg ;
    
    /* виводимо повідомлення про спробу підключення */
    cout << "trying to connect to database\n" ;
    
    /* підключення і створення новго дескриптору */
    connection = PQconnectdb(conn_info.c_str()) ;
    
    /* перевіряємо, чи все в порядку */
    if (PQstatus(connection)!=CONNECTION_OK)
    {
        /* якщо виникли проблеми - виводимо повідомлення */
        err_msg = PQerrorMessage (connection) ; 
        cout << "Fail to connect to database: " << err_msg << endl ;
        
        /* і завершуємо виконання програми */
        return 0 ;
    }
    
    cout << "Connected\n" ;
    
    /* змінна-дескриптор виконання запиту */
    PGresult * result ;
    
    /* змінна, яка містить наш запит до бази */
    string squery = "SELECT * FROM testtable ;" ;
    
    /* виконуємо SQL-запит */
    result = PQexec (connection, squery.c_str()) ;
    
    /* перевіряємо чи все в порядку */
    if (PQresultStatus(result)!=PGRES_COMMAND_OK && 
        PQresultStatus(result)!=PGRES_TUPLES_OK)
    {
        /* якщо сталась помилка отримуємо текст помилки */
        err_msg = PQerrorMessage (connection) ;
        /* виводимо її на екран*/
        cout << "Fail to execute SQL query:" << err_msg << endl ;
        
        /* завершуємо виконання програми */
        return 0 ;
    }
    
    /* виводимо повідомлення про те, що наступні дані - це */
    /* результат виконання запиту */
    cout << "Table rows:\n" ;
    
    /* виводимо дані полів відділяючи їх символом "|" */
    for (unsigned int iter=0; iter<PQntuples(result); ++iter)
    {
        for (unsigned int jter=0; jter<PQnfields(result); ++jter)
        {
            cout << PQgetvalue (result, iter, jter) << "|" ;
        }
        
        /* новий рядок відділяє записи */
        cout << endl ;
    }
    
    /* виводимо повідомлення про закриття підключення до PostgreSQL */
    cout << "Closing connection\n" ;
    
    /* очищаємо дескриптор виконання запиту і його дані */
    PQclear (result) ;
    
    /* закриваємо підключення до СКБД */
    PQfinish (connection) ;
 
    /* завершуємо виконання програми */   
    return 0 ;
}
Після компілювання і виконання даної програми, ми можемо отримати наступний результат: pgsql_sample_result
Категорії: