Дать описание таблицы

Назначение
 

Команда 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];
  };

Примечания

  1. Значение «идентификатор владельца» можно также получить при помощи команды FUSR интерфейса нижнего уровня или выбрать из системной таблицы $$$USR (при наличии права на SELECT-запросы к этой таблице).

  2. Если длина имени объекта меньше 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
  };

Примечания

  1. Длина поля Desc в буфере выборки данных зависит от используемой версии СУБД ЛИНТЕР. Значение макросу _VER_MAX присваивается в командной строке транслятора C/С++ (см. раздел «Условия применения»).

  2. Поле Desc является копией столбца $$$S14 из системной таблицы $$$SYSRL.

  3. Структура столбца $$$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;
  }