Если вы знакомы с базами данных SQL, то заметите, что в случае базы данных dbm не существует структур таблиц или столбцов. Эти структуры не нужны, т.к. dbm не задает фиксированного размера элементов сохраняемых данных и не требует описания внутренней структуры для них. Библиотека dbm работает с блоками неструктурированных двоичных данных.
Функции доступа dbm
Теперь, когда мы рассказали об основах работы библиотеки dbm, можем поподробнее рассмотреть функции. Далее приведены прототипы основных функций dbm.
#include
DBM *dbm_open(const char* filename, int file_open_flags,
mode_t file_mode);
int dbm_store(DBM *database_descriptor, datum key, datum content,
int store_mode);
datum dbm_fetch(DBM* database descriptor, datum key);
void dbm_close(DBM *database descriptor);
Эта функция применяется для открытия имеющихся баз данных и для создания новых баз данных. Аргумент filename
Остальные параметры такие же, как второй и третий параметры функции open
#define
. Второй аргумент управляет возможностью чтения базы данных, записью в нее или обеими операциями. Если создается новая база данных, флаги должны быть двоичными O_READ
с O_CREAT
, чтобы разрешить создание файлов. Третий аргумент задает начальные права доступа к файлам, которые будут созданы.Функция dbm_open
DBM
. Он применяется во всех последующих обращениях к базе данных. В случае аварийного завершения возвращается (DBM*)0
.Эту функцию применяют для ввода данных в базу данных. Как упоминалось ранее, все данные должны сохраняться с уникальным индексом. Для определения данных, которые вы хотите сохранить, и индекса, используемого для ссылки на них, следует задать два типа datum: один для ссылки на индекс, а другой — на реальные данные. Последний параметр store_mode
dbm_insert
, сохранение завершается аварийно и функция dbm_store
возвращает 1. Если установлено значение параметра dbm_replace
, новые данные заменяют существующие и dbm_store
возвращает 0. При возникновении других ошибок функция dbm_store
возвращает отрицательные числа.Подпрограмма dbm_fetch
dbm_open
и тип datum
, который должен быть задан как указатель на ключ. Тип datum
возвращается, если данные, относящиеся к используемому ключу, найдены в базе данных, возвращаемая структура datum
будет иметь значения dptr
и dsize
, ссылающиеся на возвращенные данные. Если ключ не найден, dptr
будет равен null
.Важно помнить, что функция dbm_fetch
datum
, содержащий указатель на данные. Реальные данные могут находиться в локальной области памяти внутри библиотеки dbm и должны быть скопированы в переменные программы перед дальнейшими вызовами функций dbm.Эта подпрограмма закрывает базу данных, открытую функцией dbm_open
DBM
, возвращенный предшествующим вызовом dbm_open
.А теперь выполните упражнение 7.12.
Познакомившись с основными функциями базы данных dbm, теперь вы знаете, как написать вашу первую программу для работы с dbm (dbm1.c). В этой программе применяется структура, названная test_data
1. Первыми представлены файлы #include
#define
, функция main
и объявление структуры test_data
:#include
#include
#include
#include
#include
/* В некоторых системах вам нужно заменить вышестоящую строку строкой #include
#include
#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() {