freetds - публичные процедуры в дереве pgoblin3mssql (a-режим)
=============================================================

Краткий справочник: ЧАСТЬ 1 - публичные процедуры freetds, которые
реально вызывает модуль pgoblin3mssql (db_mssql.c) и тестовые стенды;
ЧАСТЬ 2 - прототипы всех остальных публичных процедур, оставшихся
в дереве freetds и не используемых проектом (для ориентира при
расширении и при зачистке).

adb*-процедуры - добавленные в этом дереве ноги a-режима: перекодировки
вынесены из freetds наружу (recobe), поэтому модуль читает сырые байты
провода и сам решает, что с ними делать. После зачистки таких ног
осталось две: adbsetlname и adbmsghandle (их прежние db* живут с другой
сигнатурой); остальные переименованы в db* с утерей стоковых версий.
Файл в UTF-8 (кодировка дерева - KOI8-R, при необходимости перекладывайте).

ЧАСТЬ 1. Используемые процедуры
-------------------------------

Список собран автоматическим разбором вызовов db_mssql.c (макросы
вроде DBSETLCHARSET раскрыты до базовых dbsetl*-процедур) и тестовых
стендов scripts/pg3m-*-test.c. Имена отсортированы по группам, не
по алфавиту - порядок отражает ход работы модуля.

Жизненный цикл библиотеки и обработчики
  dbinit,            инициализация dblib (контекст tds_ctx); до dbopen. В модуле перед ней setenv("FREETDSCONF","/dev/null") - конфигурация только из параметров.
  dbexit,            закрытие библиотеки, освобождение глобального контекста; в fini() модуля.
  dberrhandle,       стоковый обработчик ошибок dblib (err_handler модуля пишет в трейс).
  dbmsghandle,       стоковый обработчик сообщений; действует до dbopen (5701/5703) и как запасной, если a-обработчик не назначен.

Соединение и login-пакет
  dblogin,           выделяет LOGINREC под login-пакет.
  dbsetifile,        путь к interfaces-файлу (в модуле - из параметров).
  adbsetlname,       a-режим: строка логина уже перекодирована (recobe) и кладётся в login-пакет С ЯВНОЙ ДЛИНОЙ (замена dbsetlname/dbsetl*); which - DBSETUSER/DBSETPWD/... или DBSETDBNAME.
  dbsetlname,        кладёт строку в login-пакет; модулем зовётся макросом DBSETLCHARSET(login, "KOI8-R") - клиентская кодировка для стоковых ног (в a-режиме строки логина идут мимо неё через adbsetlname).
  tds_lookup_port,   разбор имени сервиса/строки порта в номер порта TCP.
  tds_config_verstr, установка версии протокола TDS из строки параметра (-V7.4, -V4.2 ...).
  tdsdbopen,         собственно соединение (dbopen - макрос над ним); возвращает DBPROCESS.
  tds_dstr_set,      присвоение DSTR без копирования (server_name = asaserv, байтовый буфер asprintf).
  dbclose,           закрытие DBPROCESS и соединения.

Батчи и строки результата
  dbfcmd,            a-режим (б. adbfcmd): батч к серверу с ЯВНОЙ ДЛИНОЙ (замена стокового dbcmd/dbfcmd, которые strlen-ят; перекодированный текст несёт NUL-байты).
  dbsqlexec,         пуск набранного батча.
  dbresults,         a-режим (б. adbresults): готовит метаданные очередного результата; в a-режиме (recodein == NULL) метаданные и данные остаются сырыми байтами провода.
  dbnextrow,         a-режим (б. adbnextrow): следующая строка результата (REG_ROW/NO_MORE_ROWS/BUF_FULL).
  dbclrbuf,          выброс буферизованных строк (в #copyout поток читается без буфера).

Метаданные результата
  dbnumcols,         число колонок результата.
  dbcoltype,         кардинальный тип колонки (dblib_coltype: N-варианты разворачиваются по длине, X-семейства сохраняются).
  dbcollen,          максимальная длина колонки (column_size).
  dbcoltypeinfo,     precision/scale колонки (для numeric/decimal и scale дат-времён).
  dbcolname,         a-режим (б. adbcolname): имя колонки сырыми байтами провода (TDS 7+: UTF-16LE) со ссылкой и длиной.
  dbcolsrtype,       a-режим (б. adbcolsrtype): wire-тип колонки (on_server.column_type) - выбор recobe-дескриптора для значений и имя типа для PGOBLIN_TypeNm.
  dbcolcollation,    a-режим (б. adbcolcollation): 5 сырых байт collation колонки (TDS 7+); нули на протоколах без per-column collation; текстом их отдаёт subinfo(PGOBLIN_Collate).
  dbhasretstat,      был ли у процедуры return-статус.
  dbretstatus,       значение return-статуса процедуры.

Данные
  dbdata,            a-режим (б. adbdata): сырые байты поля (ссылка+длина); NULL-поле даёт ptr=NULL; это вход adateiso/afloa/arecode.
  dbdata_ascii,      a-режим (б. adbdata_ascii): не-текстовое поле стоковым конвертером freetds в ASCII (целые, деньги, GUID, hex двоичных); NULL и текст - NULL.
  dbconvert_ascii,   a-режим (б. adbconvert_ascii): конвертация произвольного буфера заданного типа в ASCII (эталон значений в тестовом стенде pg3m-atype-test без флага -F).
  adbmsghandle,      a-режим: обработчик сообщений СЫРЫМИ байтами провода (TDS 7+: UTF-16LE) с явными длинами; назначается после dbopen.


ЧАСТЬ 2. Неиспользуемые публичные процедуры (прототипы)
-------------------------------------------------------

Существуют в sybdb.h/sybfront.h/dblib.h, модулем не вызываются.
Оговорка: часть из них используется САМИМ freetds внутри (dbsetl*-ноги
макросов DBSETL*) или может понадобиться при расширении проекта
(BCP, RPC, параметры процедур). Все мёртвые семейства (курсоры,
деньги dbmny*, регистрация dbreg*, dbpoll, bind/print-ветки) вычищены.
Прототипы - дословно из заголовков, по семействам.


-- BCP (bulk copy)
  DBINT bcp_batch(DBPROCESS * dbproc);
  RETCODE bcp_bind(DBPROCESS * dbproc, BYTE * varaddr, int prefixlen, DBINT varlen, BYTE * terminator, int termlen, int type, int table_column);
  RETCODE bcp_colfmt(DBPROCESS * dbproc, int host_column, int host_type, int host_prefixlen, DBINT host_collen, const BYTE * host_term, int host_termlen, int colnum);
  RETCODE bcp_colfmt_ps(DBPROCESS * dbproc, int host_column, int host_type, int host_prefixlen, DBINT host_collen, BYTE * host_term, int host_termlen, int colnum, DBTYPEINFO * typeinfo);
  RETCODE bcp_collen(DBPROCESS * dbproc, DBINT varlen, int table_column);
  RETCODE bcp_colptr(DBPROCESS * dbproc, BYTE * colptr, int table_column);
  RETCODE bcp_columns(DBPROCESS * dbproc, int host_colcount);
  RETCODE bcp_control(DBPROCESS * dbproc, int field, DBINT value);
  DBINT bcp_done(DBPROCESS * dbproc);
  RETCODE bcp_exec(DBPROCESS * dbproc, DBINT * rows_copied);
  int bcp_getbatchsize(DBPROCESS * dbproc);
  DBBOOL bcp_getl(LOGINREC * login);
  RETCODE bcp_init(DBPROCESS * dbproc, const char *tblname, const char *hfile, const char *errfile, int direction);
  RETCODE bcp_options(DBPROCESS * dbproc, int option, BYTE * value, int valuelen);
  RETCODE bcp_readfmt(DBPROCESS * dbproc, const char filename[]);
  RETCODE bcp_sendrow(DBPROCESS * dbproc);

-- RPC (dbrpc*)
  RETCODE dbrpcinit(DBPROCESS * dbproc, const char rpcname[], DBSMALLINT options);
  RETCODE dbrpcparam(DBPROCESS * dbproc, const char paramname[], BYTE status, int type, DBINT maxlen, DBINT datalen, BYTE * value);
  RETCODE dbrpcsend(DBPROCESS * dbproc);

-- login-сеттеры и прочее
  RETCODE dbsetlbool(LOGINREC * login, int value, int which);
  RETCODE dbsetllong(LOGINREC * login, long value, int which);
  RETCODE dbsetlogintime(int seconds);
  RETCODE dbsetlversion (LOGINREC * login, BYTE version);
  RETCODE dbsettime(int seconds);

-- конвертация
  char *dbcolsource(DBPROCESS * dbproc, int colnum);
  DBINT dbconvert(DBPROCESS * dbproc, int srctype, const BYTE * src, DBINT srclen, int desttype, BYTE * dest, DBINT destlen);
  DBINT dbconvert_ps(DBPROCESS * dbprocess, int srctype, const BYTE * src, DBINT srclen, int desttype, BYTE * dest, DBINT destlen, DBTYPEINFO * typeinfo);
  DBBOOL dbwillconvert(int srctype, int desttype);

-- остальное (по алфавиту)
  RETCODE dbcancel(DBPROCESS * dbproc);
  DBINT dbcount(DBPROCESS * dbproc);
  DBBOOL dbdead(DBPROCESS * dbproc);
  void dbfreebuf(DBPROCESS * dbproc);
  RETCODE dbgetnull(DBPROCESS *dbproc, int bindtype, int varlen, BYTE* varaddr);
  DBBOOL dbisopt(DBPROCESS * dbproc, int option, const char param[]);
  void dbloginfree(LOGINREC * login);
  RETCODE dbmoretext(DBPROCESS * dbproc, DBINT size, const BYTE text[]);
  char *dbname(DBPROCESS * dbproc);
  int dbperror (DBPROCESS *dbproc, DBINT msgno, long errnum, ...);
  const char *dbprtype(int token);
  RETCODE dbsqlok(DBPROCESS * dbproc);
  RETCODE dbsqlsend(DBPROCESS * dbproc);
  int dbstrbuild(DBPROCESS * dbproc, char *charbuf, int bufsize, char *text, char *formats, ...);
  DBINT dbvarylen(DBPROCESS * dbproc, int column);

--
Copyright (C)2026 @BABOLO http://www.babolo.ru/
Copyright (C)2026 Z.ai (GLM AI-assistant) http://z.ai/
2-clause BSD, как и весь проект.
