Операционная система ЗОСРВ «Нейтрино» > Руководство разработчика > Программные интерфейсы общего назначения > Прикладные библиотеки и технологии > Библиотека менеджера QDB > Статьи и обзоры > Пример работы с QDB



Пример работы с QDB

Пример кода приложения, взаимодействующего с QDB

В этой статье:

Подключение к базе данных
Выполнение SQL оператора
Получение результата запроса
Использование результата
Отключение от сервера
Пример

Клиентское приложение QDB выполняет следующие основные действия:

  1. Подключается к базе данных с помощью функции qdb_connect()
  2. Создает запрос к базе данных:
    1. Выполняет оператор над базой данных с помощью функции qdb_statement().
    2. Считывает результаты, возвращаемые оператором (при их наличии), с помощью функции qdb_getresult().
    3. Использует результаты с помощью функции qdb_cell().
    4. Освобождает результаты с помощью функции qdb_freeresult().
    5. Выполняет операторы и использует их результаты, повторяя вышеперечисленные действия необходимое количество раз.
  3. Закрывает подключение к базе данных с помощью функции qdb_disconnect()

Подключение к базе данных

Чтобы подключиться к базе данных, необходимо указать ее имя и получить дескриптор с помощью клиентской библиотеки qdb.

qdb_hdl_t *dbhandle; /* дескриптор базы данных QDB */
dbhandle = qdb_connect( "/dev/qdb/customerdb", 0 );
if ( dbhandle == NULL )
{
fprintf( stderr, "Connect failed: %d\n", errno );
}


Note: Два потока могут совместно использовать подключение к базе данных, если их работа синхронизирована, либо каждый поток создает собственное подключение с помощью функции qdb_connect().

Выполнение SQL оператора

Для выполнения операторов над базой данных QDB необходимо знать и соблюдать синтаксис SQL, который поддерживается службой QDB и описан в главе Справочник по командам SQL. Разумеется, перед выполнением операторов требуется подключиться к базе данных (см. раздел "Подключение к базе данных").

В следующем примере выполняется запрос к базе данных:

int rc;
qdb_hdl_t *dbhandle;
rc = qdb_statement( dbhandle, "SELECT * FROM customers;" );
if ( rc == -1 )
{
char *errmsg = qdb_geterrmsg( dbhandle );
fprintf( stderr, "QDB Error: %s\n", errmsg );
}

Важно использовать управляющие символы во всех строках, которые передаются в функцию qdb_statement(). Например, запрос:

SELECT lastname FROM customerdb WHERE lastname='O'Neil';

некорректен, поскольку в условии WHERE указана строка 'O', а лишние символы Neil\' нарушают его синтаксис. Корректная форма этого запроса выглядит следующим образом:

SELECT lastname FROM customerdb WHERE lastname='O''Neil';

Первая одиночная кавычка (\') играет роль управляющего символа, который включает в строку вторую одиночную кавычку.

Получение результата запроса

Одни запросы возвращают результаты, в то время как другие — нет. Например, операторы UPDATE, INSERT или DELETE всегда возвращают нулевое количество строк. При выполнении оператора SELECT количество строк, которые соответствуют запросу, не известно заранее, поэтому рекомендуется определять его с помощью функции qdb_statement().


Note: Тем не менее, допустимо вызывать функцию qdb_getresult() для операторов, которые не возвращают ни одной строки. Более того, иногда невозможно получить результат другим способом. Если при открытии подключения был установлен флаг QDB_CONN_STMT_ASYNC, функция qdb_statement() завершается раньше, чем оператор. При использовании сложных операторов это может приводить к отложенным ошибкам.

Для отладки приложения можно отображать полученный результат в stdout с помощью функции qdb_printmsg( stdout, result, QDB_FORMAT_SIMPLE ).

Пример получения результатов операции:

qdb_result_t *result;
/* результат ранее выполненного оператора */
result = qdb_getresult( dbhandle );

Поскольку память для хранения результатов выделяется при выполнении оператора над базой данных, во избежание утечек необходимо освобождать структуру результатов с помощью функции qdb_freeresult(), как показано далее в этой главе. Никогда не вызывайте функцию free() самостоятельно.

Использование результата

Результат представляет собой блок памяти, который содержит описание всех элементов и хранящихся в них данных. Следующие функции позволяют с легкостью использовать результат:

Имя функции Применение
qdb_columns() Возвращает количество столбцов.
qdb_rows() Возвращает количество столбцов. Если результат пуст, количество столбцов равно 0.
qdb_cell_type() Возвращает тип данных элемента (QDB_INTEGER, QDB_REAL, QDB_TEXT, QDB_BLOB, QDB_NULL).
qdb_column_name() Считывает имя столбца из схемы базы данных.
qdb_cell() Возвращает данные элемента в виде void *, который можно приводить к подходящему типу.
qdb_column_index() Определяет номер столбца по имени.
qdb_cell_length() Возвращает длину данных элемента.
qdb_printmsg() Печатает содержимое результата (полезно при отладке).

Отключение от сервера

Следующий код закрывает подключение к базе данных по окончании работы с ней:

qdb_disconnect( dbhandle );

Пример

#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <qdb/qdb.h>
/* Эта программа подключается к базе данных и выполняет операторы INSERT и SELECT.
*
* База данных имеет устройство с именем /dev/qdb/customerdb и следующую схему:
* CREATE TABLE customers( customerid INTEGER PRIMARY KEY AUTOINCREMENT,
* firstname TEXT,
* lastname TEXT ); */
int main( int argc, char **argv )
{
int rc;
qdb_hdl_t *hdl;
qdb_result_t *res;
char *errmsg;
/* Подключение к базе данных */
hdl = qdb_connect( "/dev/qdb/customerdb", 0 );
if ( hdl == NULL )
{
fprintf( stderr, "Error connecting to database: %s\n", strerror( errno ) );
return EXIT_FAILURE;
}
/* Вставка строки в базу данных с помощью оператора INSERT */
rc = qdb_statement( hdl, "INSERT INTO customers(firstname, lastname) VALUES('Dan', 'Cardamore');" );
if ( rc == -1 )
{
errmsg = qdb_geterrmsg( hdl );
fprintf( stderr, "Error executing INSERT statement: %s\n", errmsg );
return EXIT_FAILURE;
}
/* Выбор одной строки базы данных с помощью оператора SELECT - этот оператор объединяет имя
* и фамилию в полное имя */
rc = qdb_statement( hdl, "SELECT firstname || ' ' || lastname AS fullname FROM customers LIMIT 1;" );
if ( rc == -1 )
{
errmsg = qdb_geterrmsg( hdl );
fprintf( stderr, "Error executing SELECT statement: %s\n", errmsg );
return EXIT_FAILURE;
}
res = qdb_getresult( hdl ); /* получение результата */
if ( res == NULL )
{
fprintf( stderr, "Error getting result: %s\n", strerror( errno ) );
return EXIT_FAILURE;
}
if ( qdb_rows( res ) == 1 )
printf( "Got a customer's full name: %s\n", (char *)qdb_cell( res, 0, 0 ) );
else
printf( "No customers in the database!\n" );
/* Освобождение результата */
qdb_freeresult( res );
/* Отключение от сервера */
qdb_disconnect( hdl );
return EXIT_SUCCESS;
}




Предыдущий раздел: перейти