ОБЗОР
#include <sys/types.h>
#include <db.h>
ОПИСАНИЕ
Примечание: В этой странице описаны интерфейсы, предоставляемые glibc до
версии 2.1. Начиная с версии 2.2, glibc больше не поддерживает эти
интерфейсы. Вероятно, вы ищите API, предоставляемое библиотекой libdb.
Функция dbopen(3) — это библиотечный интерфейс к файлам баз данных. Один из поддерживаемых форматов файлов — нумерованные данные. Общее описание методов доступа к базам данных находится в dbopen(3). Эта справочная страница содержит только информацию, относящуюся к нумерованным данным.
Структура нумерованных данных может описывать записи переменной или фиксированной длины, хранящиеся в файле в «плоском» формате, и доступные по логическому номеру записи. Существование записи с номером пять подразумевает существование записей от одного до четырёх и удаление записи с номером один вызывает перенумеровывание записи с номером пять в запись с номером четыре, а также сдвиг курсора вниз на одну запись, если он указывает на запись после номера один.
Специальная структура метода доступа к данным recno, предоставляемая dbopen(3), определена в <db.h> следующим образом:
typedef struct { unsigned long flags; unsigned int cachesize; unsigned int psize; int lorder; size_t reclen; unsigned char bval; char *bfname; } RECNOINFO;
Элементы этой структуры определены так:
flags Значение флага определяется логическим ИЛИ следующих значений:
R_FIXEDLEN Записи фиксированной длины без разделительного байта. Полем reclen определяется длина записи, а поле bval используется как дополняющий символ. Все вставляемые в базу данных записи, размер которых меньше reclen байт, автоматически дополняются.
R_NOKEY В интерфейсе, определённом dbopen(3), последовательная выборка записей заполняет структуры данных и ключа вызывающего. Если указан флаг R_NOKEY, то процедурам cursor не обязательно заполнять структуру ключа. Это позволяет приложениям извлекать записи из конца файлов без чтения всех промежуточных записей.
R_SNAPSHOT
Этим флагом указывается, чтобы в момент вызова dbopen(3) был сделан
снимок (snapshot) файла, а не выполнялось чтение каких-либо не изменённых
записей из оригинального файла.
cachesize
Предполагаемый максимальный размер кэша памяти в байтах. Эта величина
только рекомендация, метод доступа скорее выделит больше памяти, чем
завершится с ошибкой. Если значение cachesize равно 0 (размер не указан),
то используется кэш по умолчанию.
psize
Метод доступа recno хранит копии своих записей в памяти в виде дерева
btree. Это значение задаёт размер страниц (в байтах), используемых для узлов
в этом дереве. Если значение psize равно 0 (размер страницы не указан),
то размер выбирается на основе размера блока ввода-вывода нижележащей
файловой системы. Подробней смотрите btree(3).
lorder
Порядок расположения байтов, используемый при хранении целых чисел в
метаданных базы данных. Число должно отражать порядок размещения в виде
целого значения; например, порядок «big endian» должен обозначаться числом
4321. Если lorder равно 0 (порядок не определён), то используется
значение по умолчанию, принятое на машине.
reclen
Длина записи фиксированной длины.
bval
Разделительный байт, для использования в качестве отметки конца записи с
переменной длиной и как заполняющий символ для записи с фиксированной
длиной. Если значение не указано, то для отметки конца записи с переменной
длиной используется символ новой строки («\n»), а записи с фиксированной
длиной дополняются пробелом.
bfname
Метод доступа recno хранит в памяти копии своих записей в дереве btree. Если
значение bfname не равно NULL, то им задаётся имя btree-файла в том же
виде, что и при доступе dbopen(3) для доступа к btree-файлу.
Часть «данные» из пары ключ/данные, используемая методом доступа recno, является такой же, как в других методах доступа. Ключ используется иначе. Как следует из определения заголовочного файла <db.h>, поле ключа data должно быть указателем на расположение памяти типа recno_t. Этот тип, обычно, является наибольшим беззнаковым целочисленным типом данных, применяемым в реализации. Значение поля ключа size должен задавать размер этого типа.
Так как в файлах с данными в формате recno могут отсутствовать метаданные, то любые изменения значений по умолчанию (например, длина фиксированной записи или разделяющий байт) должны явно указываться каждый раз при открытии файла.
В интерфейсе, определённым dbopen(3), использование интерфейса put для создания новой записи повлечёт за собой создание множества пустых записей, если номер записи больше, чем номер наибольшей записи, имеющейся в базе данных.
ОШИБКИ
Функции метода доступа recno могут завершиться с ошибкой и присвоить
errno любое значение из определённых для библиотеки функций dbopen(3),
а также:
EINVAL Попытка добавить слишком большую запись в базу данных фиксированной длины.