Книга: Основы программирования в Linux
Дополнительные функции dbm
Разделы на этой странице:
Дополнительные функции 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>
#include <ndbm.h>
#include <string.h>
#define TEST_DB_FILE "/tmp/dbm2_test"
#define ITEMS_USED 3
2. Теперь вам нужно внести изменения только в секцию извлечения:
/* теперь попытайтесь удалить некоторые данные */
sprintf(key_to_use, "bu%d", 13);
key_datum.dptr = key_to_use;
key_datum.dsize = strlen(key_to_use);
if (dbm_delete(dbm_ptr, key_datum) == 0) {
printf("Data with key %s deletedn", key_to_use);
} else {
printf("Nothing deleted for key %sn", key_to_use);
}
for (key_datum = dbm_firstkey(dbm_ptr);
key_datum.dptr;
key_datum = dbm_nextkey(dbm_ptr)) {
data_datum = dbm_fetch(dbm_ptr, key_datum);
if (data_datum.dptr) {
printf("Data retrievedn");
memcpy(&item_retrieved, data_datum.dptr, data_datum.dsize);
printf("Retrieved item - %s %d %sn",
item_retrieved.misc_chars, item_retrieved.any_integer,
item_retrieved.more_chars);
} else {
printf("No data found for key %sn", key_to_use);
}
}
}
Далее приведен вывод:
$ ./dbm2
Data with key bu13 deleted
Data retrieved
Retrieved item — Third 3 baz
Data retrieved
Retrieved item - First! 47 foo
Как это работает
Первая часть программы, идентичная предыдущему примеру, просто сохраняет данные в базе данных. Затем вы формируете ключ, соответствующий второму элементу, и удаляете этот элемент из базы данных.
Далее программа применяет функции dbm_firstkey
и dbm_nextkey
для обращения к каждому значению ключа по очереди и для извлечения соответствующих ключу данных. Обратите внимание на то, что данные извлекаются не по порядку. Перебор ключей по очереди не определяет никакого порядка извлечения данных, это просто способ просмотра всех элементов в базе данных;
- Аргументы функции в Python
- Дополнительные национальные кодовые страницы и порядки сортировки
- 3. Функции
- Новые функции API для работы с Blob и массивами
- Глава 8 Дополнительные службы
- Математические функции
- Размытые функции
- 7.3. Финансовые функции
- 4.3. Логические функции и таблицы истинности
- B1.7. Функции обработки ошибок
- 9.1.4.2. Функции-оболочки: execl() и др.
- 11.5. Функции getservbyname и getservbyport