Чтение онлайн

на главную - закладки

Жанры

Основы программирования в Linux
Шрифт:

 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 {

 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
, откройте вашу тестовую базу данных для чтения и записи, создав ее при необходимости:

 dbm_ptr = dbm_open(TEST_DB_FILE, O_RDWR | O_CREAT, 0666);

 if (!dbm_ptr) {

fprintf (stderr, "Failed to open database\n");

exit(EXIT_FAILURE);

 }

4. Теперь добавьте данные в структуру

items_to_store
:

 memset(items_to_store, '\0', sizeof(items_to_store));

 strcpy(items_to_store[0].misc_chars, "First! ");

 items_to_store[0].any_integer = 47;

 strcpy(items_to_store[0].more_chars, "foo");

 strcpy(items_to_store[1].misc_chars, "bar");

 items_to_store[1].any_integer = 13;

 strcpy(items_to_store[1].more_chars, "unlucky? ");

 strcpy(items_to_store[2].misc_chars, "Third");

 items_to_store[2].any_integer = 3;

 strcpy(items_to_store[2].more_chars, "baz");

5. Для каждого элемента необходимо сформировать ключ для будущих ссылок в виде первой буквы каждой строки и целого числа. Этот ключ затем будет обозначен

key_datum
, когда
data_datum
сошлется на элемент
items_to_store
. Далее вы сохраняете данные в базе данных:

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

Дневники 1930-1931

Пришвин Михаил Михайлович
Документальная литература:
биографии и мемуары
4.75
рейтинг книги
Дневники 1930-1931

Последний из Братства. Бессмертный Меч

Кондратюк Глеб
5. Последний из Братства
Фантастика:
фэнтези
рпг
5.00
рейтинг книги
Последний из Братства. Бессмертный Меч

Серебряная колдунья

Саммерс Элла
2. Династия Феникс
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Серебряная колдунья

Системный разведчик. Инфильтрация. Дилогия

Юрич Валерий
Системный разведчик
Фантастика:
боевая фантастика
рпг
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Системный разведчик. Инфильтрация. Дилогия

"Избранные историко-биографические романы". Компиляция. Книги 1-10

Джордж Маргарет
Проза:
историческая проза
5.00
рейтинг книги
Избранные историко-биографические романы. Компиляция. Книги 1-10

Интернет-журнал "Домашняя лаборатория", 2008 №2

Журнал «Домашняя лаборатория»
Дом и Семья:
хобби и ремесла
сделай сам
5.00
рейтинг книги
Интернет-журнал Домашняя лаборатория, 2008 №2

Те, кто внизу. Донья Барбара. Сеньор Президент

Астуриас Мигель Анхель
133. Библиотека всемирной литературы
Проза:
классическая проза
5.50
рейтинг книги
Те, кто внизу. Донья Барбара. Сеньор Президент

Deus vult

Рокотов Алексей
3. Путь князя
Фантастика:
фэнтези
рпг
попаданцы
5.00
рейтинг книги
Deus vult

Егерь. Прилив. Книга 10

Скиба Николай
10. Зверолов
Фантастика:
рпг
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Егерь. Прилив. Книга 10

Шайтан Иван 6

Тен Эдуард
6. Шайтан Иван
Фантастика:
попаданцы
альтернативная история
историческое фэнтези
7.43
рейтинг книги
Шайтан Иван 6

Чудесный переплет. Часть 1

Малиновская Оксана Васильевна
Фантастика:
юмористическая фантастика
5.00
рейтинг книги
Чудесный переплет. Часть 1

История россии 1917–2009

Вдовин Александр Иванович
Научно-образовательная:
история
6.25
рейтинг книги
История россии 1917–2009

"Фантастика 2024-68". Компиляция. Книги 1-22

Фролов Андрей
Фантастика 2024. Компиляция
Фантастика:
фэнтези
боевая фантастика
космическая фантастика
попаданцы
альтернативная история
рпг
5.00
рейтинг книги
Фантастика 2024-68. Компиляция. Книги 1-22

Трилогия «Двуединый»

Сазанов Владимир Валерьевич
Фантастика:
фэнтези
6.12
рейтинг книги
Трилогия «Двуединый»