dbminit, fetch, store, delete, firstkey, nextkey
НАЗВАНИЕ
dbminit, fetch, store, delete, firstkey, nextkey - Подпрограммы БД
СИНТАКСИС
typedef struct {
char *dptr;
int dsize;
} datum;
dbminit(file)
char *file;
datum fetch(key)
datum key;
store(key,content)
datum key,content;
delete(key)
datum key;
datum firstkey()
datum nextkey(key)
datum key;
dbmclose()
ОПИСАНИЕ
Все указанные функции работают в базе данных с парами значений "ключ-содержимое". Они способны манипулировать с очень большими (в миллиард блоков) базами данных и адресоваться к ключевым
данным за одно или два обращения к файловой системе. Доступ к
функциям открывается через опцию загрузчика -ldbm.
"Ключи" (keys) и "содержимое" (contents) описываются типом
datum. Этому типу соответствует строка размером dsize, на которую
указывает указатель dptr. Допустимы как строки в формате ASCII,
так и произвольные двоичные данные. База данных располагается в
двух файлах. Один файл представляет собой каталог с битовым массивом и расширением .dir. Вся остальная информация содержится во
втором файле с расширением .pag.
Для того, чтобы база данных стала доступной, она должна быть
открыта функцией dbminit. К моменту вызова этой функции файлы с
расширениями .dir и .pag должны существовать. (Пустая БД создается с пустыми файлами.)
После открытия к данным, хранящимся под ключом, открывается
доступ по fetch; запоминаются под ключом они с помощью store.
Ключ (и связанное с ним содержимое) удаляется подпрограммой
delete. Разрешен простой перебор всех ключей, хранящихся в базе,
в практически произвольном порядке с помощью функций firstkey и
nextkey. Функция firstkey возвращает первый ключ в БД. Для любого
ключа в БД функция nextkey возвращает следующее по порядку значение ключа. Программа перебора ключей в БД:
for (key=firstkey(); key.dptr!=NULL; key=nextkey(key))
Закрытие БД производится функцией dbmclose. БД должна закрываться перед открытием новой.
ДИАГНОСТИКА
Все функции, возвращающие значения типа int, сообщают об
ошибках отрицательными значениями. Код возврата, равный 0, означает успех. Подпрограммы, возвращающие значения типа datum, сообщают об ошибках нулевым значением указателя dptr.
ЗАМЕЧАНИЯ
Файл .pag может содержать пустоты, поэтому его видимый размер
почти в четыре раза превышает фактический. В предыдущих системах
для этих пустот создавались реальные файловые блоки. Такие файлы
не копируются обычными средствами (cp, cat, tp, tar, ar) без заполнения пустот.
Указатели dptr, возвращаемые этими подпрограммами, адресуют к
статической памяти, которая изменяется при последующих обращениях.
Сумма длин значений в паре "ключ/содержимое" не должна превышать размер внутреннего блока (1024 байта). Более того, все пары
"ключ/содержимое", связанные в цепочку, должны помещаться в одном
блоке. Функция store возвращает ошибку в том случае, если дисковый блок заполнен неделимыми данными.
Функция delete физически не освобождает файловое пространство, хотя и делает его доступным для последующего использования.
Порядок расположения ключей, выдаваемых функциями firskey и
nextkey, определяется алгоритмом хеширования, и ничем иным.