Основы программирования в Linux
dbm_storeЭту функцию применяют для ввода данных в базу данных. Как упоминалось ранее, все данные должны сохраняться с уникальным индексом. Для определения данных, которые вы хотите сохранить, и индекса, используемого для ссылки на них, следует задать два типа datum: один для ссылки на индекс, а другой — на реальные данные. Последний параметр
управляет действиями, совершаемыми при попытке сохранить какие-либо данные с применением ключа, который уже существует. Если установлено значение параметраstore_mode, сохранение завершается аварийно и функцияdbm_insertвозвращает 1. Если установлено значение параметраdbm_store, новые данные заменяют существующие иdbm_replaceвозвращает 0. При возникновении других ошибок функцияdbm_storeвозвращает отрицательные числа.dbm_storedbm_fetchПодпрограмма
применяется для извлечения данных из базы данных. Она принимает в качестве параметра указатель dbm, возвращенный предшествующим вызовом функцииdbm_fetchи типdbm_open, который должен быть задан как указатель на ключ. Типdatumвозвращается, если данные, относящиеся к используемому ключу, найдены в базе данных, возвращаемая структураdatumбудет иметь значенияdatumиdptr, ссылающиеся на возвращенные данные. Если ключ не найден,dsizeбудет равенdptr.nullПримечаниеВажно помнить, что функция
возвращает только параметр типаdbm_fetch, содержащий указатель на данные. Реальные данные могут находиться в локальной области памяти внутри библиотеки dbm и должны быть скопированы в переменные программы перед дальнейшими вызовами функций dbm.datumdbm_closeЭта подпрограмма закрывает базу данных, открытую функцией
, и должна получить указательdbm_open, возвращенный предшествующим вызовомDBM.dbm_openА теперь выполните упражнение 7.12.
Упражнение 7.12. Простая база данных dbmПознакомившись с основными функциями базы данных dbm, теперь вы знаете, как написать вашу первую программу для работы с dbm (dbm1.c). В этой программе применяется структура, названная
.test_data1. Первыми представлены файлы
, директивы#include, функция#defineи объявление структурыmain:test_data#include <unistd.h>#include <stdlib.h>#include <stdio.h>#include <fcntl.h>#include <ndbm.h>/* В некоторых системах вам нужно заменить вышестоящую строку строкой #include <gdbm-ndbm.h>*/#include <string.h>#define TEST_DB_FILE "/tmp/dbm1_test"#define ITEMS_USED 3struct test_data {char misc_chars[15];int any_integer;char more_chars[21];};int main() {2. В функции
задайте элементы структурmainиitems_to_store, строкуitems_receivedи типыkey:datumstruct test_data items_to_store[ITEMS_USED];struct test_data item_retrieved;char key_to_use[20];int i, result;datum key_datum;datum data_datum;DBM *dbm_ptr;3. Объявив указатель на структуру типа
, откройте вашу тестовую базу данных для чтения и записи, создав ее при необходимости:DBMdbm_ptr = dbm_open(TEST_DB_FILE, O_RDWR | O_CREAT, 0666);if (!dbm_ptr) {fprintf (stderr, "Failed to open database\n");exit(EXIT_FAILURE);}4. Теперь добавьте данные в структуру
:items_to_storememset(items_to_store, '\0', sizeof(items_to_store));strcpy(items_to_store[0].misc_chars, "First! ");items_to_store[0].any_integer = 47;strcpy(items_to_store[0].more_chars, "foo");strcpy(items_to_store[1].misc_chars, "bar");items_to_store[1].any_integer = 13;strcpy(items_to_store[1].more_chars, "unlucky? ");strcpy(items_to_store[2].misc_chars, "Third");items_to_store[2].any_integer = 3;strcpy(items_to_store[2].more_chars, "baz");5. Для каждого элемента необходимо сформировать ключ для будущих ссылок в виде первой буквы каждой строки и целого числа. Этот ключ затем будет обозначен
, когдаkey_datumсошлется на элементdata_datum. Далее вы сохраняете данные в базе данных:items_to_storefor (i = 0; i < ITEMS_USED; i++) {sprintf(key_to_use, "%c%c%d",items_to_store[i].misc_chars[0], items_to_store[i].more_chars[0], items_to_store[i].any_integer);key_datum.dptr = (void*)key_to_use;key_datum.dsize = strlen(key to_use);