Основы программирования в Linux
Основы программирования в Linux читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
case '?': default: fprintf(stderr, "Usage: %s [-i]n", prog_name); result = EXIT_FAILURE; break; } /* switch */ } /* while */ return(result);}Теперь переходите к функциям доступа к базе данных dbm.
1. Как обычно, начните с нескольких файлов
#include#define#define _XOPEN_SOURCE#include <unistd.h>#include <stdlib.h>#include <stdio.h>#include <fcntl.h>#include <string.h>#include <ndbm.h>/* В некоторых дистрибутивах файл в предыдущей строке может быть придется заменить на gdbm-ndbm.h */#include "cd_data.h"#define CDC_FILE_BASE "cdc_data"#define CDT_FILE_BASE "cdt_data"#define CDC_FILE_DIR "cdc_data.dir"#define CDC_FILE_PAG "cdc_data.pag"#define CDT_FILE_DIR "cdt_data.dir"#define CDT_FILE_PAG "cdt_data.pag"2. Используйте эти две переменные области действия файла для отслеживания текущей базы данных:
static DBM *cdc_dbm_ptr = NULL;static DBM *cdt_dbm_ptr = NULL;3. По умолчанию функция
database_initializenew_databaseint database_initialize(const int new_database) { int open_mode = O_CREAT | O_RDWR; /* Если открыта какая-либо имеющаяся база данных, закрывает ее */ if (cdc_dbm_ptr) dbm_close(cdc_dbm_ptr); if (cdt_dbm_ptr) dbm_close(cdt_dbm_ptr); if (new_database) { /* Удаляет старые файлы */ (void)unlink(CDC_FILE_PAG); (void)unlink(CDC_FILE_DIR); (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 databasen"); cdc_dbm_ptr = cdt_dbm_ptr = NULL; return (0); } return (1);}4. Функция
database_closenullvoid 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, ' ', 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, ' ', sizeof(entry_to_find)); strcpy(entry_to_find, cd_catalog_ptr);7. Задайте структуру
datumdbm_fetchentry_to_return local_key_datum.dptr = (void *) entry_to_find; local_key_datum.dsize = sizeof(entry_to_find); memset(&local_data_datum, ' ', 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);
