Вход/Регистрация
Основы программирования в Linux
вернуться

Мэтью Нейл

Шрифт:
Примечание

В некоторых реализациях эти два файла объединены, и создается один новый файл.

Если вы знакомы с базами данных SQL, то заметите, что в случае базы данных dbm не существует структур таблиц или столбцов. Эти структуры не нужны, т.к. dbm не задает фиксированного размера элементов сохраняемых данных и не требует описания внутренней структуры для них. Библиотека dbm работает с блоками неструктурированных двоичных данных.

Функции доступа dbm

Теперь, когда мы рассказали об основах работы библиотеки dbm, можем поподробнее рассмотреть функции. Далее приведены прототипы основных функций dbm.

#include <ndbm.h>

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);

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 {

  • Читать дальше
  • 1
  • ...
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: