Доступные версии документации

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

Назначение
 

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

Примечание

Информацию о текущем состоянии каналов СУБД можно получить также с помощью SQL-запроса:

select * from $$$chan;

(см. документ «СУБД ЛИНТЕР. Системные таблицы и представления»).

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

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

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

Входными данными является контрольный блок CBL.

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

Имя поля Значение
Command "DIRK"
RowId Номер канала
LnBufRow Длина буфера выборки данных
Node Имя ЛИНТЕР-сервера
Выходные данные

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

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

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

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

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

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

struct DIRK_OUT
   {
   L_LONG User;       /* Идентификатор пользователя */
   L_LONG Task;       /* Идентификатор приложения */
   L_BYTE State;      /* Признак состояния канала */
   L_BYTE Process;    /* Идентификатор процесса */
   L_BYTE Reserve[2]; /* Зарезервировано */
   };

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

Имя поля Значение
User Идентификатор пользователя, открывшего канал
Task Идентификатор приложения, открывшего канал
State Текущее состояние канала (таблица 17)
Process Идентификатор выполняющегося в канале процесса (приложение 8)

Примечание

Полную информацию о пользователе можно получить из системной таблицы $$$USR (при наличии прав на чтение).

Используя команду DIRK, можно определить оптимальный размер очереди каналов (исключить из очереди неиспользуемые элементы).

Таблица 17. Возможные состояния канала
СтатусЗначениеСостояние канала
CHS_FREE0Канал не открыт
CHS_IDLE1Канал открыт, но запрос не обрабатывается
CHS_BUSY2Канал активен (идет обработка запроса)
CHS_EVENT3Канал-событие (по каналу выданы SQL-запросы, связанные с обработкой событий)
CHS_WAIT4Канал ждет ресурсов (по каналу были выполнены команды блокирования таблицы (записи), и он ожидает их разблокирования)
CHS_CLEAR5Канал ждет очистки (ядро инициировало освобождение всех ресурсов канала после того, как приложение не отреагировало в течение заданного тайм-аута)
CHS_DEBUG6Канал отладки процедуры (канал используется отладчиком хранимых процедур)
CHS_PAUSE7Выполнение по каналу запроса приостановлено администратором
CHS_USED8Канал занят. Выполнение запроса по нему закончено, но он ожидает завершения транзакции по родительскому каналу

Описание

Очередь каналов является статической очередью, поэтому положение элемента в очереди (номер канала) не меняется.

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

L_LONG LinterDIRK(TCBL *pCBL, L_LONG N, DIRK_OUT *Out)
   {
   memcpy(pCBL->Command, "DIRK", 4);
   pCBL->LnBufRow=sizeof(DIRK_OUT);
   pCBL->RowId=N;
   pCBL->PrzExe &= ~Q_ASYNC;
   inter(pCBL, NULL, NULL, NULL, Out);
   return pCBL->CodErr;
   }
Пример использования команд мониторинга СУБД
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "inter.h"
    #include "exlib.h"

    #ifndef WINCE
    int    main()
    #else
    int    exdirx()
    #endif
    {
    TCBL    CBLconnect;
    L_CHAR    Name_Pass[] = "SYSTEM/MANAGER";
    L_CHAR    Node[] = "        ";
    L_WORD    Priority = 0;
    L_LONG  PrzExe = M_EXCLUSIVE | Q_ENCODE | M_BINARY;
    L_LONG  Err;
    DIRR_OUT DIRR_Out;
    DIRA_OUT DIRA_Out;
    DIRF_OUT DIRF_Out;
    DIRK_OUT DIRK_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 = LinterDIRR(&CBLconnect, 4, &DIRR_Out);
    if (Err != NORMAL)
      PrintError(&CBLconnect);
    printf("DIRR:\n");
    printf("\tOwner=%ld\n", DIRR_Out.Owner);
    printf("\tTblName=%.18s\n", DIRR_Out.TblName);
    printf("\tUpdFlag=%d\n\n", DIRR_Out.UpdFlag);

    Err = LinterDIRA(&CBLconnect, 13, &DIRA_Out);
    if (Err != NORMAL)
      PrintError(&CBLconnect);
    printf("DIRA:\n");
    printf("\tOwner=%ld\n", DIRA_Out.Owner);
    printf("\tTblName=%.18s\n", DIRA_Out.TblName);
    printf("\tColName=%.18s\n", DIRA_Out.ColName);
    printf("\tUpdFlag=%d\n\n", DIRA_Out.UpdFlag);

    Err = LinterDIRF(&CBLconnect, 1, &DIRF_Out);
    if (Err != NORMAL)
      PrintError(&CBLconnect);
    printf("DIRF:\n");
    printf("\tOwner=%ld\n", DIRF_Out.Owner);
    printf("\tTblName=%.18s\n", DIRF_Out.TblName);
    printf("\tType=%hd\n", DIRF_Out.Type);
    printf("\tExtent=%hd\n", DIRF_Out.Extent);
    printf("\tState=%ld\n\n", DIRF_Out.State);

    Err = LinterDIRK(&CBLconnect, CBLconnect.NumChan, &DIRK_Out);
    if (Err != NORMAL)
      PrintError(&CBLconnect);
    printf("DIRK:\n");
    printf("\tUser=%ld\n", DIRK_Out.User);
    printf("\tTask=%ld\n", DIRK_Out.Task);
    printf("\tStatus=%hd\n", DIRK_Out.State);
    printf("\tProcess=%hd\n\n", DIRK_Out.Process);

    printf("End Example\n");

    return 0;
    }
Заметили ошибку?
Выделите текст и нажмите Ctrl + Enter