Читаем Основы программирования в Linux полностью

 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 для успешного завершения */

 if (result == 0) return (1);

 return (0);

}

10. Функция add_cdt_entry добавляет новый элемент-дорожку. Ключ доступа — это комбинация строки из каталога и номера дорожки:

int add_cdt_entry(const cdt_entry entry_to_add) {

 char key_to_add[CAT_CAT_LEN + 10];

 datum local_data_datum;

 datum local_key_datum;

 int result;

 if (!cdc_dbm_ptr || !cdt_dbm_ptr) return (0);

Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже