Основы программирования в Linux
Шрифт:
cdc_dbm_ptr = cdt_dbm_ptr = NULL;
}
5. Далее у вас появляется функция, извлекающая единственный элемент каталога, когда передан указатель на строку текста из каталога. Если элемент не найден, у возвращенных данных пустое поле каталога:
cdc_entry get_cdc_entry(const char *cd_catalog_ptr) {
cdc_entry entry_to_return;
char entry_to_find[CAT_CAT_LEN + 1];
datum local data datum;
datum local_key_datum;
memset(&entry_to_return, '\0', sizeof(entry_to_return));
6. Начните
null
:
if (!cdc_dbm_ptr || !cdt_dbm_ptr) return (entry_to_return);
if (!cd_catalog_ptr) return (entry_to_return);
if (strlen(cd_catalog_ptr) >= CAT_CAT_LEN) return (entry_to_return);
memset(&entry_to_find, '\0', sizeof(entry_to_find));
strcpy(entry_to_find, cd_catalog_ptr);
7. Задайте структуру
datum
, нужную функциям базы данных dbm, и используйте функцию dbm_fetch
для извлечения данных. Если не извлечены никакие данные, вы возвращаете пустую структуру entry_to_return
, которая была инициализирована ранее:
local_key_datum.dptr = (void *) entry_to_find;
local_key_datum.dsize = sizeof(entry_to_find);
memset(&local_data_datum, '\0', sizeof(local_data_datum));
local_data_datum = dbm_fetch(cdc_dbm_ptr, local_key_datum);
if (local_data_datum.dptr) {
memcpy(&entry_to_return, (char*)local_data_datum.dptr, local_data_datum.dsize);
}
return (entry_to_return);
} /* get_cdc_entry */
8. Было бы неплохо иметь возможность получать также и одиночный элемент-дорожку, именно этим занимается следующая функция аналогично функции
get_cdc_entry
, но с указателем на строку каталога и номер дорожки в качестве параметров:
cdt_entry get_cdt_entry(const char *cd_catalog_ptr, const int track_no) {
cdt_entry entry_to_return;
char entry_to_find[CAT_CAT_LEN + 10];
datum local_data_datum;
datum local_key_datum;
memset(&entry_to_return, '\0', sizeof(entry_to_return));
if (!cdc_dbm_ptr || !cdt_dbm_ptr) return (entry_to_return);
if (!cd_catalog_ptr) return (entry_to_return);
if (strlen(cd_catalog_ptr) >= CAT_CAT_LEN) return (entry_to_return);
/*
Устанавливает ключ поиска, представляющий собой комбинацию
элемента каталога и номера дорожки */
memset(&entry_to_find, '\0', sizeof(entry_to_find));
sprintf(entry_to_find, "%s %d", cd_catalog_ptr, track_no);
local_key_datum.dptr = (void*)entry_to_find;
local_key_datum.dsize = sizeof(entry_to_find);
memset(&local_data_datum, '\0', sizeof(local_data_datum));
local_data_datum = dbm_fetch(cdt_dbm_ptr, local_key_datum);
if (local_data_datum.dptr) {
memcpy(&entry_to_return, (char*)local_data_datum.dptr, local_data_datum.dsize);
}
return (entry_to_return);
}
9. Следующая функция
add_cdc_entry
добавляет новый элемент каталога:
int add_cdc_entry(const cdc_entry entry_to_add) {
char key_to_add[CAT_CAT_LEN + 1];
datum local_data_datum;
datum local_key_datum;
int result;
/* Проверяет инициализацию базы данных и корректность параметров */
if (!cdc_dbm_ptr || !cdt_dbm_ptr) return (0);
if (strlen(entry_to_add.catalog) >= CAT_CAT_LEN) return (0);
/* Гарантирует включение в ключ поиска только корректной строки
и значений null */
memset(&key_to_add, '\0', sizeof(key_to_add));
strcpy(key_to_add, entry_to_add.catalog);
local_key_datum.dptr = (void*)key_to_add;
local_key_datum.dsize = sizeof(key_to_add);
local_data_datum.dptr = (void*)&entry_to_add;
local_data_datum.dsize = sizeof(entry_to_add);
result = dbm_store(cdc_dbm_ptr, local_key_datum, local_data_datum, DBM_REPLACE);
/* dbm_store применяет 0 для успешного завершения */
Поделиться:
Популярные книги
Забытые Боги
3. Серые будни
Фантастика:
эпическая фантастика
фэнтези
5.00
рейтинг книги
Матабар IX
9. Матабар
Проза:
магический реализм
5.00
рейтинг книги
Гибель гигантов
1. Столетняя трилогия
Проза:
историческая проза
7.38
рейтинг книги
Том 11. Былое и думы. Часть 6-8
11. Собрание сочинений в тридцати томах
Проза:
русская классическая проза
5.00
рейтинг книги
Стрелок. Извлечение троих. Бесплодные земли
Фантастика:
фэнтези
5.00
рейтинг книги
Медная шкатулка (сборник)
Проза:
современная проза
7.50
рейтинг книги
Приручить королевича
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
В поисках христиан и пряностей
Страницы истории
Научно-образовательная:
история
5.00
рейтинг книги
Точка Бифуркации V
5. ТБ
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Ночные бродяги
Тайны забытого острова
Детские:
детская фантастика
5.00
рейтинг книги
Спальня, в которой ты, он и я
1. Французская трилогия
Любовные романы:
эро литература
5.00
рейтинг книги
Собрание сочинений
Детские:
прочая детская литература
5.00
рейтинг книги
Загадки истории. Факты. Открытия. Люди
Научно-образовательная:
история
7.00
рейтинг книги
Вор и Книга Демона
Фантастика:
героическая фантастика
8.50