Дать описание таблицы
Назначение
Команда
FREL
предназначена для получения системной информации о хранящемся в БД
объекте (таблице, представлении, синониме).
Справочная информация содержит следующие сведения:
-
системный номер объекта;
-
идентификатор владельца;
-
имя объекта;
-
идентификатор узла;
-
маска доступа к записям объекта для пользователей категории PUBLIC;
-
тип объекта (таблица, представление, синоним);
-
количество атрибутов в объекте;
-
количество ключей в объекте;
-
процент заполнения страницы таблицы;
-
количество ключей в составном ключе;
-
число внешних (ссылочных) ключей в объекте;
-
уровень доступа на чтение;
-
уровень доступа на запись;
-
дата создания объекта;
-
время жизни объекта в БД;
-
номер страницы целостности;
-
идентификатор атрибута первичного ключа;
-
количество ссылок на таблицу;
-
описание аудита;
-
признак наличия INSERT-триггера;
-
признак наличия DELETE-триггера;
-
признак наличия UPDATE-триггера;
-
максимальный номер RowId;
-
число занятых RowId;
-
текущее количество записей в объекте;
-
длина записи в неупакованном виде;
-
количество экстентов области индексов;
-
количество экстентов области данных;
-
количество экстентов области BLOB-данных;
-
размер страницы файла индексов в блоках;
-
размер страницы файла области данных в блоках;
-
размер страницы файла области BLOB-данных в блоках;
-
номер первой страницы конвертера;
-
номер BLOB-столбца в схеме таблицы;
-
процент заполнения BLOB-страницы;
-
описание экстента области индексов;
-
описание экстента области данных;
-
описание экстента области BLOB-данных.
Параметры вызова
inter(CBL, VarBuf, NULL, [CondBuf], RowBuf);
Входные данные
Входными данными являются:
-
контрольный блок
CBL; -
буфер описания параметров
VarBuf.
В контрольном блоке должны быть заполнены поля:
| Имя поля | Значение | |
|---|---|---|
NumChan
| Номер канала | |
Command
|
"FREL"
| |
LnBufRow
| Длина буфера выборки данных | |
Node
| Имя ЛИНТЕР-сервера | |
PrzExe
| Режим обработки запроса |
Буфер описания параметров команды
VarBuf должен содержать информацию об интересующей таблице в следующем
виде:
struct FREL_IN
{
L_LONG Owner;
L_CHAR TblName[MAX_ID_LEN];
};
Примечания
-
Значение «идентификатор владельца» можно также получить при помощи команды
FUSRинтерфейса нижнего уровня или выбрать из системной таблицы$$$USR(при наличии права на SELECT-запросы к этой таблице). -
Если длина имени объекта меньше MAX_ID_LEN символов, то поле
TblNameдолжно быть дополнено справа пробелами до MAX_ID_LEN символов.
Выходные данные
Выходными данными являются:
-
контрольный блок
CBL; -
буфер выборки данных
RowBuf.
В контрольном блоке будут возвращены:
| Имя поля | Значение | |
|---|---|---|
CodErr
| Код завершения запроса к СУБД ЛИНТЕР | |
LnBufRow
| Фактическая длина буфера выборки данных | |
RowId
|
Системный номер записи таблицы
$$$SYSRL,
в которой содержится описание объекта
| |
SysErr
| Код состояния ОС |
Информация в буфере выборки данных
RowBuf будет представлена в следующем виде:
struct FREL_OUT
{
L_LONG Table;
L_LONG Owner;
L_CHAR TblName[MAX_ID_LEN];
#if _VER_MAX >= 600
L_BYTE Desc[288];
#elif _VER_MAX >= 570
L_BYTE Desc[284];
#elif _VER_MAX >= 500
L_BYTE Desc[244];
#else
L_BYTE Desc[162];
#endif
};
Примечания
-
Длина поля
Descв буфере выборки данных зависит от используемой версии СУБД ЛИНТЕР. Значение макросу _VER_MAX присваивается в командной строке транслятора C/С++ (раздел «Условия применения»). -
Поле
Descявляется копией столбца $$$S14 из системной таблицы$$$SYSRL. -
Структура столбца $$$S14 описана в документе «Системные таблицы и представления», подраздел «$$$SYSRL».
Описание
При выполнении команды СУБД сначала просматривает очередь таблиц,
размещенную в оперативной памяти ядра, в поисках описания
указанного объекта.
Если описание объекта в очереди не найдено, поиск продолжается в
системной таблице
$$$SYSRL. Из этого алгоритма следует, что в зависимости
от параметров запуска ядра СУБД и способа получения описания объекта
результаты, в общем случае, могут быть различными.
Если ядро СУБД запущено с ключом
SYNC, то результаты выполнения команды
FREL
и SELECT-запроса из таблицы
$$$SYSRL
будут совпадать.
Если ядро СУБД запущено с ключом
NOSYNC, то результаты выполнения команды
FREL
и SELECT-запроса
из таблицы
$$$SYSRL
могут отличаться между собой, а именно, полученная с помощью
команды
FREL
информация
является
«самой новой»
(в отличие от полученной SELECT-запросом из таблицы
$$$SYSRL).
То есть, если объект был только что создан, информация о нем записана
в очереди таблиц, расположенной в оперативной памяти ядра, и еще не
сброшена в файлы БД,
то по команде
FREL
описание объекта будет получено, а по SELECT-запросу из таблицы
$$$SYSRL
– нет.
Если в таком режиме запуска ядра для получения системной информации об
объекте предполагается использовать вместо команды
FREL
SELECT-запрос,
то для исключения рассогласования данных перед его подачей надо
выполнить команду
SNAP.
Коды завершения
| Код | Описание | |
|---|---|---|
| NORMAL | Нормальное завершение | |
| SMALLBUFKOR | Недостаточный размер буфера выборки данных | |
| EORR | Указанный объект не найден |
Пример формирования команды
#include < string.h >
#include < stdlib.h >
#include "inter.h"
L_LONG LinterFREL(TCBL * pCBL, FREL_IN * pIn, FREL_OUT * pOut)
{
memcpy(pCBL- >Command, "FREL", 4);
pCBL- >LnBufRow = sizeof(FREL_OUT);
pCBL- >PrzExe &= ~Q_ASYNC;
inter(pCBL, pIn, NULL, NULL, pOut);
return pCBL- >CodErr;
}
Пример использования команды
#include < stdio.h >
#include < stdlib.h >
#include < string.h >
#include "inter.h"
#include "exlib.h"
#ifndef WINCE
int main()
#else
int exfrel()
#endif
{
TCBL CBLconnect;
L_CHAR Name_Pass[] = "SYSTEM/MANAGER8";
L_CHAR Node[] = " ";
L_WORD Priority = 0;
L_LONG PrzExe = M_EXCLUSIVE | Q_ENCODE | M_BINARY;
L_LONG Err;
L_LONG ID;
L_CHAR User[] = "SYSTEM";
L_CHAR Table[] = "PERSON";
FREL_IN In;
FREL_OUT Out;
memset(&CBLconnect,0,sizeof(TCBL));
Err = LinterOPEN(&CBLconnect, Name_Pass, Node, Priority, PrzExe);
if (Err != NORMAL)
PrintError(&CBLconnect);
printf("Connect to RDBMS Linter\n");
Err = LinterFUSR(&CBLconnect, User, &ID);
if (Err != NORMAL)
PrintError(&CBLconnect);
In.Owner = ID;
memset(In.TblName, ' ', MAX_ID_LEN);
strncpy(In.TblName, Table, strlen(Table));
Err = LinterFREL(&CBLconnect, &In, &Out);
if (Err != NORMAL)
PrintError(&CBLconnect);
printf("FREL:\n");
printf("\tOut.Table=%ld\n\tOwner=%ld\n", Out.Table, Out.Owner);
printf("End Example\n");
return 0;
}