Пример кода приложения, взаимодействующего с QDB
В этой статье:
Клиентское приложение QDB выполняет следующие основные действия:
Чтобы подключиться к базе данных, необходимо указать ее имя и получить дескриптор с помощью клиентской библиотеки qdb.
qdb_hdl_t *dbhandle; /* дескриптор базы данных QDB */dbhandle = qdb_connect( "/dev/qdb/customerdb", 0 );if ( dbhandle == NULL ){fprintf( stderr, "Connect failed: %d\n", errno );}
![]() | Два потока могут совместно использовать подключение к базе данных, если их работа синхронизирована, либо каждый поток создает собственное подключение с помощью функции qdb_connect(). |
Для выполнения операторов над базой данных 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().
![]() | Тем не менее, допустимо вызывать функцию 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 ) );elseprintf( "No customers in the database!\n" );/* Освобождение результата */qdb_freeresult( res );/* Отключение от сервера */qdb_disconnect( hdl );return EXIT_SUCCESS;}
Предыдущий раздел: перейти