datum dbm_fetch(DBM* database descriptor, datum key);
void dbm_close(DBM *database descriptor);
dbm_open
Эта функция применяется для открытия имеющихся баз данных и для создания новых баз данных. Аргумент
filename
— имя файла базы данных без расширения dir или pag.
Остальные параметры такие же, как второй и третий параметры функции
open
, с которой вы встречались в главе 3. Вы можете использовать те же директивы
#define
.
Второй аргумент управляет возможностью чтения базы данных, записью в нее или обеими операциями. Если создается новая база данных, флаги должны быть двоичными
O_READ
с
O_CREAT
, чтобы разрешить создание файлов. Третий аргумент задает начальные права доступа к файлам, которые будут созданы.
Функция
dbm_open
возвращает указатель на тип
DBM
. Он применяется во всех последующих обращениях к базе данных. В случае аварийного завершения возвращается
(DBM*)0
.
dbm_store
Эту функцию применяют для ввода данных в базу данных. Как упоминалось ранее, все данные должны сохраняться с уникальным индексом. Для определения данных, которые вы хотите сохранить, и индекса, используемого для ссылки на них, следует задать два типа datum: один для ссылки на индекс, а другой — на реальные данные. Последний параметр
store_mode
управляет действиями, совершаемыми при попытке сохранить какие-либо данные с применением ключа, который уже существует. Если установлено значение параметра
dbm_insert
, сохранение завершается аварийно и функция
dbm_store
возвращает 1. Если установлено значение параметра
dbm_replace
, новые данные заменяют существующие и
dbm_store
возвращает 0. При возникновении других ошибок функция
dbm_store
возвращает отрицательные числа.
dbm_fetch
Подпрограмма
dbm_fetch
применяется для извлечения данных из базы данных. Она принимает в качестве параметра указатель dbm, возвращенный предшествующим вызовом функции
dbm_open
и тип
datum
, который должен быть задан как указатель на ключ. Тип
datum
возвращается, если данные, относящиеся к используемому ключу, найдены в базе данных, возвращаемая структура
datum
будет иметь значения
dptr
и
dsize
, ссылающиеся на возвращенные данные. Если ключ не найден,
dptr
будет равен
null
.
Примечание
Важно помнить, что функция
dbm_fetch
возвращает только параметр типа
datum
, содержащий указатель на данные. Реальные данные могут находиться в локальной области памяти внутри библиотеки dbm и должны быть скопированы в переменные программы перед дальнейшими вызовами функций dbm.
dbm_close
Эта подпрограмма закрывает базу данных, открытую функцией
dbm_open
, и должна получить указатель
DBM
, возвращенный предшествующим вызовом
dbm_open
.
А теперь выполните упражнение 7.12.
Упражнение 7.12. Простая база данных dbm
Познакомившись с основными функциями базы данных dbm, теперь вы знаете, как написать вашу первую программу для работы с dbm (dbm1.c). В этой программе применяется структура, названная
test_data
.
1. Первыми представлены файлы
#include
, директивы
#define
, функция
main
и объявление структуры
test_data
:
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <ndbm.h>
/*
В некоторых системах вам нужно заменить вышестоящую строку строкой #include <gdbm-ndbm.h>*/
#include <string.h>
#define TEST_DB_FILE "/tmp/dbm1_test"
#define ITEMS_USED 3
struct test_data {
char misc_chars[15];
int any_integer;
char more_chars[21];
};
int main {
2. В функции
main
задайте элементы структур
items_to_store
и
items_received
, строку
key
и типы
datum
:
struct test_data items_to_store[ITEMS_USED];
struct test_data item_retrieved;
char key_to_use[20];
int i, result;
datum key_datum;
datum data_datum;
DBM *dbm_ptr;
3. Объявив указатель на структуру типа
DBM
, откройте вашу тестовую базу данных для чтения и записи, создав ее при необходимости:
5. Для каждого элемента необходимо сформировать ключ для будущих ссылок в виде первой буквы каждой строки и целого числа. Этот ключ затем будет обозначен