Основы программирования в Linux
Основы программирования в Linux читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
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 %sn", 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 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);
}
dbm_close(dbm_ptr);
exit(EXIT_SUCCESS);
}
Когда вы откомпилируете и выполните программу, вывод будет следующим:
$ <b>gcc -о dbm1 -I/usr/include/gdtm dbm1.с -lgdbm</b>
$ <b>./dbm1</b>
Data retrieved
Retrieved item — bar 13 unlucky?
Вы получите приведенный вывод, если база данных gdbm установлена в режиме совместимости. Если компиляция не прошла, возможно, вам придется изменить директиву
include
$ <b>gcc -о dbm1 -I/usr/include/gdbm dbm1.с -lgdbm_compat -lgdbm</b>
Как это работает
Сначала вы открываете базу данных, при необходимости создавая ее. Затем вы заполняете три элемента структуры
items_to_store
Далее вы задаете две структуры типа
datum
datum
dptr
datum
null
dbm_fetch
Дополнительные функции dbm
После знакомства с основными функциями библиотеки dbm приведем несколько оставшихся функций, применяемых при работе с базой данных dbm:
<b>int dbm_delete(DBM *database_descriptor, datum key);</b>
<b>int dbm_error(DBM *database_descriptor);</b>
<b>int dbm_clearerr(DBM *database_dascriptor);</b>
<b>datum dbm_firstkey(DBM *database_descriptor);</b>
<b>datum dbm_nextkey(DBM *database_descriptor);</b>
Функция
dbm_delete
datum
dbm_fetch
Функция
dbm_error
Функция dbm_clearerr очищает любой флаг ошибочной ситуации, который может быть установлен в базе данных.
Эти подпрограммы обычно используются вместе для просмотра ключей всех элементов базы данных. Далее приведена структура требуемого для просмотра цикла:
DBM *db_ptr;
datum key;
for (key = dbm_firstkey(db_ptr); key.dptr; key = dbm_nextkey(db_ptr));
Выполните упражнение 7.13.
В этом примере вы улучшите файл dbm1.с с помощью описанных новых функций и создадите новый файл dbm2.c.
1. Сделайте копию dbm1.с и откройте его для редактирования. Отредактируйте строку
#define TEST_DB_FILE
<i>#unclude <unistd.h></i>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <ndbm.h>
#include <string.h>
<i>#define TEST_DB_FILE "/tmp/dbm2_test"</i>
#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);
<i> if (dbm_delete(dbm_ptr, key_datum) == 0) {</i>