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

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

Жанры

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

 for (i = 0; i < ITEMS_USED; i++) {

sprintf(key_to_use, "%c%c%d",

items_to_store[i].misc_chars[0], items_to_store[i].more_chars[0], items_to_store[i].any_integer);

key_datum.dptr = (void*)key_to_use;

key_datum.dsize = strlen(key to_use);

data_datum.dptr = (void*)&items_to_store[i];

data_datum.dsize = sizeof(struct.test_data);

result = dbm_store(dbm_ptr, key_datum, data_datum, DBM_REPLACE);

if (result != 0) {

fprintf(stderr, "dbm_store failed on key %s\n", key_to_use);

exit(2);

}

 }

6. Далее посмотрите, сможете ли вы извлечь эти новые данные, и в заключение следует закрыть базу данных:

 sprintf(key_to_use, "bu%d", 13);

 key_datum.dptr = key_to_use;

 key_datum.dsize = strlen(key_to_use);

 data_datum = dbm_fetch(dbm_ptr, key_datum);

 if (data_datum.dptr) {

printf("Data retrieved\n");

memcpy(&item_retrieved, data_datum.dptr, data_datum.dsize);

printf("Retrieved item — %s %d %s\n", item_retrieved.misc_chars,

item_retrieved.any_integer, item_retrieved.more_chars);

 } else {

printf("No data found for key %s\n", key_to_use);

 }

 dbm_close(dbm_ptr);

 exit(EXIT_SUCCESS);

}

Когда вы откомпилируете и выполните программу, вывод будет следующим:

$ gcc -о dbm1 -I/usr/include/gdtm dbm1.с -lgdbm

$ ./dbm1

Data retrieved

Retrieved item — bar 13 unlucky?

Вы получите приведенный вывод, если база данных gdbm установлена в режиме совместимости. Если компиляция не прошла, возможно, вам придется изменить директиву

include
, как показано в файле, для использования заголовочного файла gdbm-ndbm.h вместо файла ndbm.h и задать в строке компиляции библиотеку совместимости перед основной библиотекой, как показано в следующей строке:

$ gcc -о dbm1 -I/usr/include/gdbm dbm1.с -lgdbm_compat -lgdbm

Как это работает

Сначала вы открываете базу данных, при необходимости создавая ее. Затем вы заполняете три элемента структуры

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

Далее вы задаете две структуры типа

datum
, одну для ключа и другую для сохраняемых данных. Сохранив три элемента в базе данных, вы конструируете новый ключ и настраиваете структуру типа
datum
так, чтобы она указывала на него. Затем вы применяете данный ключ для извлечения данных из базы данных. Убедитесь в успехе, проверив, что
dptr
в возвращенном
datum
не равен
null
. Получив подтверждение, вы можете копировать извлеченные данные (которые могут храниться внутри библиотеки dbm) в вашу собственную структуру, применяя возвращенный размер
dbm_fetch
(если этого не сделать, при наличии данных переменного размера вы можете скопировать несуществующие данные). В заключение извлеченные данные выводятся на экран, чтобы продемонстрировать корректность их извлечения.

Дополнительные функции dbm

После знакомства с основными функциями библиотеки dbm приведем несколько оставшихся функций, применяемых при работе с базой данных dbm:

int dbm_delete(DBM *database_descriptor, datum key);

int dbm_error(DBM *database_descriptor);

int dbm_clearerr(DBM *database_dascriptor);

datum dbm_firstkey(DBM *database_descriptor);

datum dbm_nextkey(DBM *database_descriptor);

dbm_delete

Функция

dbm_delete
применяется для удаления элементов из базы данных. Она принимает ключ типа
datum
точно так же, как функция
dbm_fetch
, но вместо извлечения данных она удаляет их. В случае успешного завершения функция возвращает 0.

dbm_error

Функция

dbm_error
просто проверяет базу данных на наличие ошибок, возвращая 0 при их отсутствии.

dbm_clearerr

Функция dbm_clearerr очищает любой флаг ошибочной ситуации, который может быть установлен в базе данных.

dbm_firstkey и dbm_nextkey

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

DBM *db_ptr;

datum key;

for (key = dbm_firstkey(db_ptr); key.dptr; key = dbm_nextkey(db_ptr));

Выполните упражнение 7.13.

Упражнение 7.13. Извлечение и удаление

В этом примере вы улучшите файл dbm1.с с помощью описанных новых функций и создадите новый файл dbm2.c.

1. Сделайте копию dbm1.с и откройте его для редактирования. Отредактируйте строку

#define TEST_DB_FILE
.

#unclude <unistd.h>

#include <stdlib.h>

#include <stdio.h>

#include <fcntl.h>

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

Знахарь

Сапегин Александр Павлович
Фантастика:
мистика
альтернативная история
фэнтези
5.00
рейтинг книги
Знахарь

#НенавистьЛюбовь

Джейн Анна
Любовные романы:
современные любовные романы
6.33
рейтинг книги
#НенавистьЛюбовь

Шайтан Иван 5

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

Адвокат Империи 8

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

Сила рода. Том 1 и Том 2

Вяч Павел
1. Претендент
Фантастика:
фэнтези
рпг
попаданцы
5.85
рейтинг книги
Сила рода. Том 1 и Том 2

Последний Герой. Том 1

Дамиров Рафаэль
1. Последний герой
Фантастика:
попаданцы
альтернативная история
фантастика: прочее
5.00
рейтинг книги
Последний Герой. Том 1

Я – Легенда

Гарцевич Евгений Александрович
1. Я - Легенда!
Фантастика:
боевая фантастика
попаданцы
рпг
фантастика: прочее
5.00
рейтинг книги
Я – Легенда

Алекс и Алекс

Афанасьев Семен
1. Алекс и Алекс
Фантастика:
боевая фантастика
6.83
рейтинг книги
Алекс и Алекс

Черный Маг Императора 17

Герда Александр
17. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Черный Маг Императора 17

Личный аптекарь императора. Том 5

Карелин Сергей Витальевич
5. Личный аптекарь императора
Фантастика:
городское фэнтези
попаданцы
аниме
сказочная фантастика
фэнтези
7.50
рейтинг книги
Личный аптекарь императора. Том 5

Сильнейший Столп Империи. Книга 2

Ермоленков Алексей
2. Сильнейший Столп Империи
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Сильнейший Столп Империи. Книга 2

Моров. Том 5

Кощеев Владимир
4. Моров
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Моров. Том 5

Целеполагание

Владимиров Денис
4. Глэрд
Фантастика:
фэнтези
боевая фантастика
рпг
5.00
рейтинг книги
Целеполагание

Изгой Проклятого Клана. Том 6

Пламенев Владимир
6. Изгой
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Изгой Проклятого Клана. Том 6