Основы программирования в 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 для успешного завершения */
Поделиться:
Популярные книги
Переписка и деловые бумаги
Документальная литература:
публицистика
5.00
рейтинг книги
Троцкий. «Демон революции»
10 вождей
Научно-образовательная:
история
5.20
рейтинг книги
"Фантастика 2025-80". Компиляция. Книги 1-28
Фантастика 2025. Компиляция
Фантастика:
фэнтези
боевая фантастика
попаданцы
5.00
рейтинг книги
Путь Шедара
4. Другая сторона
Фантастика:
боевая фантастика
6.83
рейтинг книги
UNIX: взаимодействие процессов
Компьютеры и Интернет:
программирование
5.00
рейтинг книги
Новейший философский словарь. Постмодернизм.
Справочная литература:
словари
6.25
рейтинг книги
Я еще князь. Книга XX
20. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я еще не бог. Книга XXXV
35. Дорогой барон!
Фантастика:
аниме
попаданцы
5.00
рейтинг книги
Иллюзии
Любовные романы:
современные любовные романы
6.25
рейтинг книги
Навигаторы Апокалипсиса
Фантастика:
социально-философская фантастика
5.00
рейтинг книги
Осколки чести
1. Сага о Форкосиганах
Фантастика:
космическая фантастика
9.34
рейтинг книги
Артур и Джордж
Интеллектуальный бестселлер. Читает весь мир.
Детективы:
исторические детективы
6.40
рейтинг книги
Князь Андер Арес 5
5. Андер Арес
Фантастика:
историческое фэнтези
фэнтези
героическая фантастика
5.00
рейтинг книги
Северянин. Трилогия
Северянин
Фантастика:
фэнтези
5.75