Эта глава написана в расчете на то, что у вас установлена реализация GNU gdbm, укомплектованная библиотеками совместимости с ndbm. Это обычный вариант для дистрибутивов Linux, однако, как упоминалось ранее, возможно, вам придется явно устанавливать пакет библиотеки разработки для того, чтобы компилировать файлы с использованием подпрограмм ndbm.
К сожалению, требуемые библиотеки директив include
1. Включите в ваш файл на языке С файл ndbm.h.
2. Включите каталог заголовочного файла /usr/include/gdbm с помощью опции -I/usr/include/gdbm
3. Скомпонуйте программу с библиотекой gdbm, используя опцию -lgdbm
Если программа не работает, обычная альтернатива, принятая в новейших версиях дистрибутивов Ubuntu и SUSE, — устанавливается база данных gdbm, но при необходимости явно запрашивается совместимость с базой данных ndbm, и вы должны компоновать программу сначала с библиотекой совместимости, а затем с основной библиотекой. В этом случае надо выполнить следующие шаги:
1. Вместо файла ndbm.h включите в ваш файл на С файл gdbm-ndbrh.h.
2. Включите каталог заголовочного файла /usr/include/gdbm с помощью опции -I/usr/include/gdbm
3. Скомпонуйте программу с дополнительной библиотекой совместимости gdbm, используя опцию -lgdbm_compat -lgdbm
Загружаемый Makefile и С-файлы dbm установлены с первым вариантом, принятым по умолчанию, но содержат комментарии о том, как их отредактировать, чтобы можно было легко выбрать второй вариант. В оставшейся части главы мы полагаем, что в вашей системе совместимость с ndbm — характеристика, принятая по умолчанию.
Подпрограммы
Как и библиотека curses, обсуждавшаяся нами в
-lgdbm
. Заголовочный файл — ndbm.h.Прежде чем мы попытаемся описать каждую функцию, важно понять чего старается достичь база данных dbm. Когда вы поймете это, гораздо легче будет уяснить, как применять функции dbm.
Основной элемент базы данных dbm — блок данных, предназначенных для хранения, связанный с блоком данных, действующих как ключ для извлечения данных. У всех баз данных dbm должны быть уникальные ключи для каждого хранящегося блока данных. Значение ключа используется как индекс хранящихся данных. Нет ограничений на ключи или данные и не определено никаких ошибок при использовании данных или ключей слишком большого размера. Стандарт допускает реализацию, ограничивающую размер ключа/данных величиной 1023 байта, но, как правило, ограничений не существует, поскольку реализации оказались более гибкими, чем требования, предъявляемые к ним.
Для манипулирования этими блоками как данными в заголовочном файле ndbm.h определен новый тип данных, названный datum
void *dptr;
size_t dsize
Здесь datum
FILE
, используемое для доступа к файлам. Внутреннее содержимое dbm typedef
зависит от реализации и никогда не должно использоваться.Для ссылки на блок данных при использовании библиотеки dbm вы должны объявить datum
dptr
для указания на начало данных, а также задать параметр dsize
, содержащий размер данных. На хранящиеся данные и индекс, применяемый для доступа к ним, всегда нужно ссылаться с помощью типа datum
.DBM
FILE
. Когда вы открываете базу данных dbm, обычно создаются два физических файла: один с расширением pag, а другой с расширением dir. Возвращается один указатель dbm, который применяется для обращения к обоим файлам как к паре. Файлы никогда не следует непосредственно читать и в них не нужно писать; они предназначены для доступа через стандартные операции dbm.В некоторых реализациях эти два файла объединены, и создается один новый файл.