Дать параметры курсора
Назначение
Команда
FCUR
предназначена для получения информации о заданном курсоре.
Параметры вызова
inter(CBL, VarBuf, NULL, [CondBuf], RowBuf);
Входные данные
Входными данными являются:
-
контрольный блок
CBL; -
буфер описания параметров
VarBuf.
В контрольном блоке должны быть заполнены поля:
| Имя поля | Значение | |
|---|---|---|
NumChan
| Номер канала | |
Command
|
"FCUR"
| |
LnBufRow
| Длина буфера выборки данных | |
Node
| Имя ЛИНТЕР-сервера |
Буфер описания параметров
VarBuf должен содержать имя курсора (не больше MAX_ID_LEN символов).
Примечание
Строка имени курсора в
VarBuf должна заканчиваться двоичным нулем.
Выходные данные
Выходными данными являются:
-
контрольный блок
CBL; -
буфер выборки данных
RowBuf.
В контрольном блоке будут возвращены:
| Имя поля | Значение | |
|---|---|---|
CodErr
| Код завершения запроса к СУБД ЛИНТЕР | |
LnBufRow
| Фактическая длина буфера выборки данных | |
SysErr
| Код состояния ОС |
Информация в буфере выборки данных
RowBuf будет представлена в следующем виде:
struct FCUR_OUT
{
L_WORD Channel;
L_BYTE Updatable;
L_BYTE Process;
L_LONG AnsCnt;
};
В полях буфера выборки данных будет содержаться:
| Имя поля | Значение | |
|---|---|---|
Channel
| Номер канала, соответствующий заданному курсору | |
Updatable
| Признак обновляемости курсора: 1 – курсор обновляемый, 0 – не обновляемый | |
Process
| Идентификатор текущего процесса, выполняемого в канале, соответствующем курсору (см. приложение 11) | |
AnsCnt
| Количество записей в заданном курсоре, если текущим процессом является выполнение SELECT-запроса, в противном случае значение не определено |
Описание
Команда
FCUR
канальная. Она может быть подана только по главному родительскому
каналу или по любому подканалу, подчиненному этому главному.
Если в качестве имени курсора задана пустая строка (нулевой длины
или заполненная пробелами), то
FCUR
возвращает
описание того канала, по которому она подана.
Коды завершения
| Код | Описание | |
|---|---|---|
| NORMAL | Нормальное завершение | |
| SMALLBUFKOR | Недостаточный размер буфера выборки данных | |
| EORR | Указанное имя курсора не найдено или команда была подана по недопустимому каналу | |
| ERRTRANSLSTR | Ошибка перекодирования имени курсора |
Пример формирования команды
#include <string.h>
#include <stdlib.h>
#include "inter.h"
L_LONG LinterFCUR(TCBL * pCBL, L_CHAR * NameCur, FCUR_OUT * pOut)
{
memcpy(pCBL->Command, "FCUR", 4);
pCBL->LnBufRow = sizeof(FCUR_OUT);
pCBL->PrzExe &= ~Q_ASYNC;
inter(pCBL, NameCur, 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 exfcur()
#endif
{
TCBL CBLconnect,
CBL1;
L_CHAR Name_Pass[] = "SYSTEM/MANAGER8";
L_CHAR Node[] = " ";
L_CHAR NameCur[] = "Cursor1";
L_WORD Priority = 0;
L_LONG PrzExe = M_EXCLUSIVE | Q_ENCODE | M_BINARY;
L_LONG Err;
FCUR_OUT FCUR_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 = LinterOCUR(&CBL1, CBLconnect.NumChan, Priority, PrzExe);
if (Err != NORMAL)
PrintError(&CBL1);
printf("Open Channel\n");
Err = LinterSETO(&CBL1, NameCur);
if (Err != NORMAL)
PrintError(&CBL1);
printf("Set Name for Channel\n");
Err = LinterFCUR(&CBLconnect, NameCur, &FCUR_Out);
if (Err != NORMAL)
PrintError(&CBLconnect);
printf("FCUR:\n");
printf("\tChannel=%d\n\tUpdatable=%hd\n\tProcess=%hd\n\tAnsCnt=%ld\n",
FCUR_Out.Channel,
FCUR_Out.Updatable,
FCUR_Out.Process,
FCUR_Out.AnsCnt);
printf("End Example\n");
return 0;
}