25.2.1. Открытие файла qdbm
Библиотечная функция dpopen()
используется для открытия файлов базы данных.
#include <depot.h>
DB * dpopen(const char * filename, int omode, int bnum);
Первый аргумент представляет имя файла, который будет использоваться для базы данных[176]. Аргумент omode
определяет способ доступа к файлу, и должен иметь одно из двух значений: DP_OREADER
и DP_OWRITER
, в зависимости от того, какой вид доступа к базе данных необходим программе — для чтения или для записи. По умолчанию база данных блокируется, чтобы разрешить нескольким программам доступ для чтения или одной программе доступ для записи. Если приложению не нужна блокировка, производимая qdbm
, то DP_ONOLCK
может быть объединен с omode
битовым 'ИЛИ'.
Когда приложения создают новые базы данных, они должны также использовать битовое 'ИЛИ' с DP_CREAT
для отправки qdbm
запроса на создание нового файла, если он еще не был создан. Флаг DP_OTRUNC
сигнализирует о том, что первоначальное содержимое filename
будет удалено и заменено пустой базой данных.
Последний параметр функции dpopen()
, bnum
, сообщает qdbm
о том, сколько сегментов памяти нужно задействовать в хеш-массиве. Чем меньшим будет значение этого параметра, тем меньший размер будет иметь база данных; чем больше будет его значение, тем быстрее она будет работать благодаря сокращению количества конфликтных ситуаций в хеш-памяти. В документации к qdbm
рекомендуется, чтобы это значение составляло от половины до величины, в четыре раза большей от того количества элементов, которые, предположительно, будет иметь база данных[177]. Если вы не уверены, какое следует использовать значение, можно присвоить нулевое значение, которое является значением по умолчанию[178].
Функция dpopen()
возвращает указатель на структуру DEPOT
, который передается остальным функциям Depot
. В случае возникновения ошибки функция dpopen()
возвращает NULL
и устанавливает dpecode
.
25.2.2. Закрытие базы данных
Чтобы закрыть файлы базы данных, используйте функцию dpclose()
.
int dpclose(DEPOT * depot);
Функция dpclose()
возвращает нулевое значение после успешного закрытия файлов и ненулевое — при сбое, который может произойти из-за невозможности очистки данных из буферов базы данных. Ниже показан пример программы, которая открывает файл базы данных в текущем каталоге и сразу же закрывает его.
1: /* qdbmsimple.c */
2:
3: #include <depot.h>
4: #include <errno.h>
5: #include <fcntl.h>
6: #include <stdio.h>
7:
8: int main(void) {
9: DEPOT * dp;
10:
11: dp = dpopen('test.db', DP_OWRITER | DP_OCREAT, 0);
12: if (!dp) {
13: printf('ошибка: %s
', dperrmsg(dpecode));
14: return 1;
15: }
16:
17: dpclose(dp);
18:
19: return 0;
20: }
25.2.3. Получение файлового дескриптора
Помимо возможности использования автоматической блокировки, которую предлагает qdbm
, в некоторых программах потребуется изменять их собственную схему блокировки. Для этой цели qdbm
обеспечивает доступ к файловому дескриптору, который ссылается на базу данных.
int dpfdesc(DEPOT * depot);
Эта функция возвращает файловый дескриптор базы данных depqt
[179].
25.2.4. Синхронизация базы данных
qdbm
кэширует данные в оперативной памяти для ускорения доступа к базе данных, а ядро Linux кэширует записи на диске, чтобы свести к минимуму задержку между вызовами функции write()
. Чтобы база данных, хранящаяся на диске, оставалась согласованной с буферизированными структурами, приложение может осуществлять ее синхронизацию. В процессе синхронизации базы данных qdbm очищает все ее внутренние буферы и вызывает функцию fsync()
для файлового дескриптора.
int dpsync(DEPOT * depot);
25.3. Чтение записей
Прочитать записи в базе данных можно двумя способами: посредством поиска записи по ее ключу и путем чтения последовательных пар 'ключ-значение'.