Дать элемент очереди файлов

Назначение
 

Команда DIRF предназначена для получения информации об указанном элементе очереди дескрипторов файлов.

Параметры вызова

inter(CBL, NULL, [Opbuf], [CondBuf], RowBuf);

Входные данные

Входными данными являются:

  • контрольный блок CBL;

  • буфер SQL-запросов OpBuf.

В контрольном блоке должны быть заполнены поля:

Имя поля Значение
Command "DIRF"
RowId Порядковый номер элемента очереди файлов (отсчет начинается с 1)
LnBufRow Длина буфера выборки данных (sizeof(DIRF_OUT))
Node Имя ЛИНТЕР-сервера

Буфер SQL-запросов OpBuf может содержать имя устанавливаемой для данного канала кодовой страницы, которая должна быть известна БД, то есть:

  • находиться в системной таблице LINTER_SYSTEM_USER.$$$CHARSET;

  • или быть описана как синоним в таблице LINTER_SYSTEM_USER.$$$CSALIAS;

  • или быть предопределённым значением UTF-8 или UCS2.

Выходные данные

Выходными данными являются:

  • контрольный блок CBL;

  • буфер выборки данных RowBuf.

В контрольном блоке будут возвращены:

Имя поля Значение
CodErr Код завершения запроса к СУБД ЛИНТЕР
LnBufRow Фактическая длина буфера выборки данных
SysErr Код состояния ОС

В буфере выборки данных RowBuf информация будет представлена в следующем виде:

struct DIRF_OUT
   {
   L_LONG Owner;               /* Идентификатор владельца таблицы */
   L_CHAR TblName[MAX_ID_LEN]; /* Имя таблицы */
   L_BYTE Type;                /* Тип файла */
   L_BYTE Extent;              /* Номер файла */
   L_LONG State;               /* Признак состояния */
   };

В полях буфера выборки данных будет содержаться:

Имя поля Значение

Owner

Идентификатор владельца таблицы, дескриптор файла которой находится в указанном элементе очереди дескрипторов файлов

TblName

Имя таблицы, дескриптор файла которой находится в указанном элементе очереди дескрипторов файлов

Type

Тип файла (таблица 15)

Extent

Логический номер файла данной таблицы. Это поле может принимать значение от 1 до 63, в зависимости от количества файлов, объявленных при создании таблицы

State

Текущее состояние элемента очереди:

1 – элемент занят дескриптором файла;

0 – элемент свободен.

Команда DIRF может быть использована для определения оптимального размера очереди дескрипторов файлов. Дескриптор файла, включенный в очередь, вытесняется из нее только в одном случае – отсутствие свободных элементов при включении в очередь нового элемента. Поэтому в процессе мониторинга БД можно выявить следующие ситуации:

  1. часть элементов очереди файлов никогда не используется. Это говорит о том, что размер очереди слишком велик и его без ущерба для производительности БД можно уменьшить (примерно на количество неиспользуемых элементов);

  2. в очереди файлов происходит интенсивное вытеснение и добавление элементов. Это говорит о недостаточном размере очереди файлов.

Изменяя размер очереди файлов (насколько позволят системные ресурсы) и выполняя мониторинг БД, можно добиться оптимального размера – когда элементы из очереди не вытесняются, и в то же время количество неиспользуемых элементов очереди минимально.

Таблица 15. Коды файлов СУБД ЛИНТЕР
ОбозначениеЗначениеФайл
FT_INDEX0Файл индексов
FT_DATA1Файл данных
FT_SYSWBV2Рабочий файл бит-векторов
FT_SYSWRK3Рабочий файл
FT_SYSSRT4Рабочий файл сортировки
FT_SYSLOG5Системный журнал
FT_BLOB7BLOB-файл

Первые 10 элементов очереди файлов заняты дескрипторами системных файлов в порядке, приведенном в таблице 16.

Таблица 16. Первые 10 элементов очереди файлов
№ элементаИмя файлаКомментарий
11.01 Файл индексов таблицы $$$SYSRL
21.11 Файл данных таблицы $$$SYSRL
32.01 Файл индексов таблицы $$$ATTRI
42.11 Файл данных таблицы $$$ATTRI
53.01 Файл индексов таблицы $$$USR
63.11 Файл данных таблицы $$$USR
71.41Рабочий файл
81.31Рабочий файл бит-векторов
91.51Рабочий файл сортировки
10РезервФайлы системного журнала

Описание

СУБД ЛИНТЕР ведет очереди, не меняя положения элемента очереди в оперативной памяти. Поэтому, если при двух обращениях к элементу с тем же самым порядковым номером были возвращены разные данные, то между двумя этими обращениями СУБД осуществила запись элемента очереди на диск, а на освободившееся место была записана новая информация.

Для файлов с кодами типа 2,3,4 (см. таблицу 15) поля Owner и TblName будут заполнены нулем и пробелами соответственно.

Информация о файлах с кодом типа 5 (см. таблицу 15) по команде DIRF не выдается.

Коды завершения
Код Описание
NORMAL Нормальное завершение
SMALLBUFKOR Недостаточный размер буфера выборки данных
EORR Элемент очереди с заданным порядковым номером не найден
Пример формирования команды
#include < string.h >
#include < stdlib.h >
#include "inter.h"

L_LONG LinterDIRF(TCBL *pCBL, L_LONG N, DIRF_OUT *Out)
   {
   memcpy(pCBL- >Command, "DIRF", 4);
   pCBL- >LnBufRow=sizeof(DIRF_OUT);
   pCBL- >RowId=N;
   pCBL- >PrzExe &= ~Q_ASYNC;
   inter(pCBL, NULL, NULL, NULL, Out);
   return pCBL- >CodErr;
   }
Пример использования команды