Основы программирования в Linux
Шрифт:
(void)unlink(CDT_FILE_PAG);
(void)unlink(CDT_FILE_DIR);
}
/* Открывает несколько новых файлов, создавая их при необходимости */
cdc_dbm_ptr = dbm_open(CDC_FILE_BASE, open_mode, 0644);
cdt_dbm_ptr = dbm_open(CDT_FILE_BASE, open_mode, 0644);
if (!cdc_dbm_ptr || !cdt_dbm_ptr) {
fprintf(stderr, "Unable to create database\n");
cdc_dbm_ptr = cdt_dbm_ptr = NULL;
return (0);
}
return (1);
}
4. Функция
database_close
null
, чтобы показать, что нет открытой базы данных:
void database_close(void) {
if (cdc_dbm_ptr) dbm_close(cdc_dbm_ptr);
if (cdt_dbm_ptr) dbm_close(cdt_dbm_ptr);
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));
Поделиться с друзьями: