Библиотека GoIrbis

Введение. Установка. Примеры программ

Введение

Пакет irbis представляет собой простую библиотеку для создания клиентских приложений для системы автоматизации библиотек ИРБИС64 на языке Go.

Пакет не содержит ссылок на внешний код и не требует irbis64_client.dll. Успешно работает на 32-битных и 64-битных версиях операционных систем Windows и Linux.

Основные возможности пакета:

  • Поиск и расформатирование записей.

  • Создание и модификация записей, сохранение записей в базе данных на сервере.

  • Работа с поисковым словарем: просмотр терминов и постингов.

  • Административные функции: получение списка пользователей, его модификация, передача списка на сервер, создание и удаление баз данных.

Поддерживается компилятор Go версии 1.12 (как 32-битные, так и 64-битные версии) и сервер ИРБИС64, начиная с 2014. Более ранние версии инструментария Go будут выдавать ошибки.

Установка

Возможны два варианта установки пакета. Первый предусматривает копирование папки irbis из репозитория в свой проект, после чего используется следующая ссылка на пакет

import "./irbis"

Второй вариант – предпочтительный. Пакет подключается следующим образом:

go get github.com/amironov73/GoIrbis/src/irbis

а в исходных текстах программы на него ссылаются так:

import "github.com/amironov73/GoIrbis/src/irbis"

В среде GoLand скачивание пакета автоматизировано, пользователю остается лишь согласиться с предложением загрузить и установить пакет:

Предложение скачивания

Примеры программ

Ниже прилагается пример простой программы. Сначала находятся и загружаются 10 первых библиографических записей, в которых автором является А. С. Пушкин. Показано нахождение значения поля с заданным тегом и подполя с заданным кодом. Также показано расформатирование записи в формат brief.

package main

import "../src/irbis"

func main ()  {
    // Подключаемся к серверу
    connection := irbis.NewConnection()
    connection.Host = "localhost"
    connection.Username = "librarian"
    connection.Password = "secret"
    if !connection.Connect() {
        println("Не удалось подключиться")
        return
    }

    // По выходу из функции произойдет отключение от сервера
    defer connection.Disconnect()

    // Общие сведения о сервере
    println("Версия сервера:", connection.ServerVersion)
    println("Интервал:", connection.Interval)

    // Из INI-файла можно получить настройки клиента
    ini := connection.Ini
    dbnnamecat := ini.GetValue("Main", "DBNNAMECAT", "???")
    println("DBNNAMECAT:", dbnnamecat)

    // Находим записи с автором "Пушкин"
    found := connection.Search("\"A=Пушкин$\"")
    println("Найдено:", len(found))

    // Ограничиваемся первыми 10 записями
    found = found[:10]

    for _, mfn := range found {
        // Считываем запись с сервера
        record := connection.ReadRecord(mfn)

        // Получаем значение поля/подполя
        title := record.FSM(200, 'a')
        println("Заглавие:", title)

        // Расформатируем запись на сервере
        description := connection.FormatMfn("@brief", mfn)
        println("Биб. описание:", description)
    }
}

В следующей программе создается и отправляется на сервер 10 записей. Показано добавление в запись полей с подполями.

package main

import (
    "../src/irbis"
    "fmt"
    "strconv"
)

func main() {
    // Подключаемся к серверу
    connection := irbis.NewConnection()
    connection.Host = "localhost"
    connection.Username = "librarian"
    connection.Password = "secret"
    if !connection.Connect() {
        println("Не удалось подключиться")
        return
    }

    // По выходу из функции произойдет отключение от сервера
    defer connection.Disconnect()

    // Записи будут помещаться в базу SANDBOX
    connection.Database = "SANDBOX"

    for i:=0; i < 10; i++ {
        // Создаём запись в памяти клиента
        record := irbis.NewMarcRecord()

        // Наполняем ее полями: первый автор (поле с подполями),
        record.Add(700, "").
            Add('a', "Миронов").
            Add('b', "А. В.").
            Add('g', "Алексей Владимирович")

        // заглавие (поле с подполями)
        record.Add(200, "").
            Add('a', "Работа с ИРБИС64: версия " +
                strconv.Itoa(i) ).
            Add('e', "руководство пользователя")

        // выходные данные (поле с подполями)
        record.Add(210, "").
            Add('a', "Иркутск").
            Add('c', "ИРНИТУ").
            Add('d', "2019")

        // рабочий лист (поле без подполей)
        record.Add(920, "PAZK")

        // Отсылаем запись на сервер.
        // Обратно приходит запись,
        // обработанная AUTOIN.GBL
        connection.WriteRecord(record)

        fmt.Println(record)
    }
}

Структура Connection

Структура Connection - “рабочая лошадка”. Она осуществляет связь с сервером и всю необходимую перепаковку данных из клиентского представления в сетевое.

Экземпляр клиента создается конструктором:

connection := irbis.NewConnection()

При создании клиента можно указать (некоторые) настройки:

client := irbis.NewConnection()
client.Host = "irbis.rsl.ru"
client.Port = 5555 // нестандартный порт!
client.Username = "ninja"
client.Password = "i_am_invisible"

Поле

Тип

Назначение

Значение по умолчанию

Host

string

Адрес сервера

"127.0.0.1"

Port

int

Порт

6666

Username

string

Имя (логин) пользователя

пустая строка

Password

string

Пароль пользователя

пустая строка

Database

string

Имя базы данных

"IBIS"

Workstation

string

Тип АРМа (см. таблицу ниже)

"C"

Типы АРМов

Обозначение

Тип

"R"

Читатель

"C"

Каталогизатор

"M"

Комплектатор

"B"

Книговыдача

"K"

Книгообеспеченность

"A"

Администратор

Можно использовать мнемонические константы, определённые в файле Constants.go:

const ADMINISTRATOR = "A" // Адмнистратор
const CATALOGER     = "C" // Каталогизатор
const ACQUSITIONS   = "M" // Комплектатор
const READER        = "R" // Читатель
const CIRCULATION   = "B" // Книговыдача
const BOOKLAND      = "B" // Книговыдача
const PROVISITON    = "K" // Книгообеспеченность

Обратите внимание, что адрес сервера задается строкой, так что может принимать как значения вроде 192.168.1.1, так и irbis.yourlib.com.

Если какой-либо из вышеперечисленных параметров не задан явно, используется значение по умолчанию.

Подключение к серверу и отключение от него

Только что созданный клиент еще не подключен к серверу. Подключаться необходимо явно с помощью метода Connect, при этом можно указать параметры подключения:

client := irbis.NewConnection()
client.Host = "myhost.com"
if !client.Connect() {
    log.Fatal("Не удалось подключиться!")
}

Отключаться от сервера необходимо с помощью метода Disconnect, желательно помещать вызов в блок defer сразу после подключения (чтобы не забыть):

client.Connect()
defer client.Disconnect()

При подключении клиент получает с сервера INI-файл с настройками, которые могут понадобиться в процессе работы:

client.Connect()
defer client.Disconnect()
// Получаем имя MNU-файла, хранящего перечень форматов
formatMenuName := client.Ini.GetValue("Main", "FmtMnu", "FMT31.MNU")

Полученный с сервера INI-файл хранится в поле Ini.

Повторная попытка подключения с помощью того же экземпляра Connection игнорируется. При необходимости можно создать другой экземпляр и подключиться с его помощью (если позволяют клиентские лицензии). Аналогично игнорируются повторные попытки отключения от сервера.

Проверить статус “клиент подключен или нет” можно с помощью поля Connected:

if !client.Connected {
    // В настоящее время мы не подключены к серверу
}

Вместо индивидуального задания каждого из полей Host, Port, Username, Password и Database, можно использовать метод ParseConnectionString:

client.ParseConnectionString("host=192.168.1.4;port=5555;" +
         "username=itsme;password=secret;")
client.Connect()

Многопоточность

Клиент написан в наивном однопоточном стиле, поэтому не поддерживает одновременный вызов методов из разных потоков.

Для одновременной отсылки на сервер нескольких команд необходимо создать соответствующее количество экземпляров подключений (если подобное позволяет лицензия сервера).

Подтверждение подключения

GoIrbis не посылает самостоятельно на сервер подтверждений того, что клиент все еще подключен. Этим должно заниматься приложение, например, по таймеру.

Подтверждение посылается серверу методом NoOp:

client.NoOp()

Чтение записей с сервера

mfn := 123
record := client.ReadRecord(mfn)

Можно прочитать несколько записей сразу:

mfns := []int{12, 34, 56}
records := client.ReadRecords(mfns)

Можно прочитать определенную версию записи

mfn := 123
version := 3
record := client.ReadRecordVersion(mfn, version)

Сохранение записи на сервере

// Любым образом создаём в памяти клиента
// или получаем с сервера запись.
record := client.ReadRecord(123)

// Производим какие-то манипуляции над записью
record.Add(999, "123")

// Отсылаем запись на сервер
newMaxMfn := client.WriteRecord(record)
println("New Max MFN:", newMaxMfn)

Сохранение нескольких записей (возможно, из разных баз данных):

records := make([]MarcRecord,10)
...
if !client.WriteRecords(records) {
    log.Fatal("Failure!")
}

Удаление записи на сервере

mfn := 123
client.DeleteRecord(mfn)

Восстановление записи:

mfn := 123
record := client.UndeleteRecord(mfn)

Поиск записей

found := client.Search(`"A=ПУШКИН$"`)
println("Найдено записей:", len(found))

Обратите внимание, что поисковый запрос заключен в дополнительные кавычки. Эти кавычки явлются элементом синтаксиса поисковых запросов ИРБИС64, и лучше их не опускать.

Вышеприведённый запрос вернёт не более 32 тыс. найденных записей. Сервер ИРБИС64 за одно обращение к нему может выдать не более 32 тыс. записей. Чтобы получить все записи, используйте метод SearchAll (см. ниже), он выполнит столько обращений к серверу, сколько нужно.

Поиск с одновременной загрузкой записей:

records := client.SearchRead(`"A=ПУШКИН$"`, 50)
println("Найдено записей:", len(records))

Поиск и загрузка единственной записи:

record := client.SearchSingleRecord(`"I=65.304.13-772296"`)
if record == nil {
    println("Не нашли!")
}

Количество записей, соответствующих поисковому выражению:

expression := `"A=ПУШКИН$"`
count := client.SearchCount(expression)

Расширенный поиск: можно задать не только количество возвращаемых записей, но и расформатировать их.

parameters := NewSearchParameters()
parameters.Expression = `"A=ПУШКИН$"`
parameters.Format = BRIEF_FORMAT
parameters.NumberOfRecords = 5
found := client.SearchEx(parameters)
if len(found) == 0 {
    println("Не нашли")
} else {
    // в found находится слайс структур FoundLine
    first := found[0]
    fmt.Println("MFN:", first.Mfn, "DESCRIPTION:", first.Description)
}

Поиск всех записей (даже если их окажется больше 32 тыс.):

found := client.SearchAll(`"A=ПУШКИН$"`)
println("Найдено записей:", len(count))

Подобные запросы следует использовать с осторожностью, т. к. они, во-первых, создают повышенную нагрузку на сервер, и во-вторых, потребляют очень много памяти на клиенте. Некоторые запросы (например, “I=$”) могут вернуть все записи в базе данных, а их там может быть десятки миллионов.

Форматирование записей

mfn := 123
format := BRIEF_FORMAT
text := client.FormatRecord(format, mfn)
println("Результат форматирования:", text)

При необходимости можно использовать в формате все символы UNICODE.

Форматирование нескольких записей:

mfns := []int {12, 34, 56}
format := BRIEF_FORMAT
lines := client.FormatRecords(format, mfns)
fmt.Println("Результаты:", lines)

Печать таблиц

table := new(TableDefinition)
table.Database = "IBIS"
table.Table = "@tabf1w"
table.SearchQuery = `"T=A$"`
text := client.PrintTable(table)

Работа с контекстом

Функция

Назначение

ListFiles

Получение списка файлов на сервере

ReadIniFile

Получение INI-файла с сервера

ReadMenuFile

Получение MNU-файла с сервера

ReadSearchScenario

Загрузка сценариев поиска с сервера

ReadTextFile

Получение текстового файла с сервера

ReadTextLines

Получение текстового файла в виде массива строк

ReadTreeFile

Получение TRE-файла с сервера

UpdateIniFile

Обновление строк серверного INI-файла

WriteTextFile

Сохранение текстового файла на сервере

Работа с мастер-файлом

Функция

Назначение

ReadRawRecord

Чтение указанной записи в “сыром” виде

WriteRawRecord

Сохранение на сервере “сырой” записи

Работа со словарем

Функция

Назначение

GetRecordPostings

Получение слайса постингов для указанной записи

ListTerms

Получение слайса терминов с указанным префиксом

ReadPostings

Чтение постингов поискового словаря

ReadTerms

Чтение терминов поискового словаря

ReadTermsEx

Расширенное чтение терминов

Информационные функции

Функция

Назначение

GetDatabaseInfo

Получение информации о базе данных

GetMaxMfn

Получение максимального MFN для указанной базы данных

GetServerVersion

Получение версии сервера

ListDatabases

Получение списка баз данных с сервера

ToConnectionString

Получение строки подключения

Администраторские функции

Нижеперечисленные записи доступны лишь из АРМ “Администратор”, поэтому подключаться к серверу необходимо так:

client := irbis.NewConnection()
client.Username = "librarian"
client.Password = "secret"
client.Workstation = ADMINISTRATOR
if !client.Connect() {
    log.Fatal("Не удалось подключиться")
}

Функция

Назначение

ActualizeDatabase

Актуализация базы данных

ActualizeRecord

Актуализация записи

CreateDatabase

Создание базы данных

CreateDictionary

Создание словаря

DeleteDatabase

Удаление базы данных

DeleteFile

Удаление файла на сервере

GetServerStat

Получение статистики с сервера

GetUserList

Получение списка пользователей с сервера

ListProcesses

Получение списка серверных процессов

ReloadDictionary

Пересоздание словаря

ReloadMasterFile

Пересоздание мастер-файла

RestartServer

Перезапуск сервера

TruncateDatabase

Опустошение базы данных

UnlockDatabase

Разблокирование базы данных

UnlockRecords

Разблокирование записей

UpdateUserList

Обновление списка пользователей на сервере

Глобальная корректировка

settings := new(GblSettings)
settings.Database = "IBIS"
settings.MfnList = []int{1, 2, 3}
settings.statements = []GblStatement {
    GblStatement{ADD_FIELD, "3000", "XXXXXXXXX", "'Hello'"}
}
result := connection.GlobalCorrection(settings)
for line := range result {
    println(line)
}

Расширение функциональности

ExecuteAnyCommand(string $command, array $params) – выполнение произвольной команды с параметрами в кодировке ANSI.

Структуры MarcRecord, RecordField и SubField

MarcRecord

Каждый экземпляр MarcRecord соответствует одной записи в базе данных ИРБИС. Он содержит следующие поля:

Поле

Тип

Назначение

Database

string

Имя базы данных, из которой загружена данная запись. Для вновь созданных записей пустая строка.

Mfn

int

Номер записи в мастер-файле. Для вновь созданных записей 0.

Status

int

Статус записи: логически удалена, отсутствует (см. ниже).

Version

int

Номер версии записи.

Fields

[]*RecordField

Слайс указателей на поля записи

Статус записи: набор флагов (определены как константы в Constants.go)

Имя

Число

Значение

LOGICALLY_DELETED

1

Логически удалена (может быть восстановлена).

PHYSICALLY_DELETED

2

Физически удалена (не может быть восстановлена).

ABSENT

4

Отсутствует.

NON_ACTUALIZED

8

Не актуализирована.

NEW_RECORD

16

Первый экземпляр записи (флаг фактически не используется).

LAST

32

Последняя версия записи.

LOCKED

64

Запись заблокирована на ввод.

AUTOIN_ERROR

128

Ошибка в Autoin.gbl.

FULLTEXT_NOT_ACTUALIZED

256

Полный текст не актуализирован.

func NewMarcRecord() *MarcRecord – конструктор, создаёт новый экземпляр записи в памяти клиента.

func (record *MarcRecord) Add(tag int, value string) *RecordField – добавляет в конец записи поле с указанными меткой и значением. Возвращает добавленное поле, поэтому может использоваться для “цепочечных” вызовов методов, добавляющих подполя в это поле (см. пример ниже).

func (record *MarcRecord) Clear() – очищает запись (удаляет все поля).

func (record *MarcRecord) Clone() *MarcRecord – клонирует запись со всеми полями.

func (record *MarcRecord) Decode(lines []string) – декодирование записи из протокольного представления.

func (record *MarcRecord) Encode(delimiter string) string – кодирование записи в протокольное представление.

func (record *MarcRecord) FM(tag int) string – получение значения поля с указанной меткой. Если поле не найдено, возвращается пустая строка.

func (record *MarcRecord) FSM(tag int, code rune) string – получение значения подполя с указанными меткой и кодом. Если подполе не найдено, возвращается пустая строка.

func (record *MarcRecord) FMA(tag int) []string – получение слайса со значениями полей с указанной меткой. Если поля не найдены, возвращается слайс нулевой длины.

func (record *MarcRecord) FSMA(tag int, code rune) []string – получение слайса со значениями подполей с указанными меткой и кодом. Если подполя не найдены, возвращается слайс нулевой длины.

func (record *MarcRecord) GetField(tag, occurrence int) *RecordField – получение указанного повторения поля с указанной меткой. Если поле не найдено, возвращает nil.

func (record *MarcRecord) GetFields(tag int) []*RecordField – получение слайса полей с указанной меткой. Если поля не найдены, возвращается пустой массив.

func (record *MarcRecord) GetFirstField(tag int) *RecordField – получение первого повторения поля с указанной меткой. Если поле не найдено, возвращается nil.

func (record *MarcRecord) HaveField(tag int) bool – выясняет, есть ли в записи поле с указанной меткой.

func (record *MarcRecord) InsertAt(i int, tag int, value string) *RecordField – вставляет поле в указанную позицию.

func (record *MarcRecord) IsDeleted() bool – проверка статуса, не удалена ли запись.

func (record *MarcRecord) RemoveAt(i int) *MarcRecord – удаляет поле в указанной позиции.

func (record *MarcRecord) RemoveField(tag int) *MarcRecord – удаляет все поля с указанной меткой.

func (record *MarcRecord) Reset() – сброс состояния записи, отвязка её от базы данных. Поля данных остаются при этом нетронутыми.

func (record *MarcRecord) SetField(tag int, value string) *MarcRecord – устанавливает значение первого повторения поля с указанной меткой. Если такого поля нет, оно создаётся.

func (record *MarcRecord) SetSubfield(tag int, code rune, value string) *MarcRecord – устанавливает значение подполя первого повторения поля с указанной меткой. Если необходимые поля или подполе отсутствуют, они создаются.

func (record *MarcRecord) String() string – выдаёт строковое представление записи.

record := NewMarcRecord()
record.Add(700, "").
    Add('a', "Миронов").
    Add('b', "А. В.").
    Add('g', "Алексей Владимирович")
record.Add(200, "").
    Add('a', "Заглавие книги").
    Add('e', "подзаголовочные сведения")

RecordField

Поле

Тип

Назначение

Tag

int

Метка поля.

Value

string

Значение поля до первого разделителя.

Subfields

[]*SubField

Слайс указателей на подполя.

func NewRecordField(tag int, value string) *RecordField – конструктор поля, создаёт поле с указанными меткой и значением.

func (field *RecordField) Add(code rune, value string) *RecordField – добавляет подполе с указанными кодом и значением к полю. Возвращает field, так что может испольоваться для “цепочечных” вызовов.

func (field *RecordField) AddNonEmpty(code rune, value string) *RecordField – добавляет подполе, при условии, что его значение не пустое.

func (field *RecordField) Clear() *RecordField – очищает поле (удаляет значение и все подполя). Метка поля остаётся нетронутой. Возвращает field.

func (field *RecordField) Clone() *RecordField – клонирует поле со всеми подполями.

func (field *RecordField) DecodeBody(body string) – декодирует только текст поля и подполей (без метки).

func (field *RecordField) Decode(text string) – декодирует поле из протокольного представления (метку, значение и подполя).

func (field *RecordField) Encode() string – кодирует поле в протокольное представление (метку, значение и подполя).

func (field *RecordField) EncodeBody() string – кодирует поле в протокольное представление (только значение и подполя).

func (field *RecordField) GetEmbeddedFields() []*RecordField – получает слайс встроенных полей из данного поля.

func (field *RecordField) GetFirstSubField(code rune) *SubField – возвращает первое вхождение подполя с указанным кодом или `nil.

func (field *RecordField) GetFirstSubFieldValue(code rune) string – возвращает значение первого вхождения подполя с указанным кодом или пустую строку.

func (field *RecordField) GetValueOrFirstSubField() string – выдаёт значение для ^*.

func (field *RecordField) HaveSubField(code rune) bool – выясняет, есть ли подполе с указанным кодом.

func (field *RecordField) InsertAt(i int, code rune, value string) – вставляет подполе в указанную позицию.

func (field *RecordField) RemoveAt(i int) – удаляет подполе в указанной позиции.

func (field *RecordField) RemoveSubfield(code rune) –удаляет все подполя с указанным кодом.

func (field *RecordField) ReplaceSubfield(code rune, oldValue, newValue string) *RecordField – заменяет значение подполя.

func (field *RecordField) SetSubfield(code rune, value string) *RecordField – устанавливает значение первого повторения подполя с указанным кодом. Если value==nil, подполе удаляется.

func (field *RecordField) String() string – возвращает строковое представление данного поля.

func (field *RecordField) Verify() bool – проверяет, правильно ли сформировано поле (и все его подполя).

field := NewRecordField(700, "")
field.Add('a', "Миронов").
    Add('b', "А. В.").
    Add('g', "Алексей Владимирович")

SubField

Поле|Тип|Назначение —-|---|———- Code | rune | Код подполя Value | string | Значение подполя

func NewSubField(code rune, value string) *SubField – конструктор подполя, создаёт подполе с указанными кодом и значением.

func (subfield *SubField) Clone() *SubField – клонирует подполе.

func (subfield *SubField) Decode(text string) – декодирует подполе из протокольного представления.

func (subfield *SubField) Encode() string – кодирует подполе в протокольное представление.

func (subfield *SubField) String() string – выдаёт текстовое представление подполя.

func (subfield *SubField) Verify() bool – проверяет, правильно ли сформировано подполе.

subfield := NewSubField('a', "Подполе A")
fmt.Println(subfield.String())

RawRecord

Запись с нераскодированными полями/подполями.

Поле|Тип|Назначение ———|------------|———- Database | string | Имя базы данных, из которой загружена данная запись. Для вновь созданных записей пустая строка. Mfn | int | Номер записи в мастер-файле. Для вновь созданных записей 0. Status | int | Статус записи: логически удалена, отсутствует (аналогично MarcRecord). Version | int | Номер версии записи. Fields | []string | Слайс полей записи в “сыром” виде.

func NewRawRecord() *RawRecord – конструктор, создаёт новый экземпляр записи в памяти клиента.

func (record *RawRecord) Decode(lines []string) – декодирует запись из протокольного представления.

func (record *RawRecord) Encode(delimiter string) string – кодирует запись в протокольное представление.

func (record *RawRecord) IsDeleted() bool – проверка статуса, не удалена ли запись.

func (record *RawRecord) Reset() – сброс состояния записи, отвязка её от базы данных. Поля данных остаются при этом нетронутыми.

func (record *RawRecord) String() string – выдаёт строковое представление записи.

Прочие (вспомогательные) структуры и функции

FoundLine

Строка найденной записи, может содержать результат расформатирования найденной записи.

IniFile, IniSection и IniLine

INI-файл, состоящий из секций (IniSection), которые в свою очередь состоят из строк вида “ключ=значение” (IniLine).

TreeFile и TreeLine

TRE-файл – древовидный справочник.

DatabaseInfo

Информация о базе данных ИРБИС.

ProcessInfo

Информация о запущенном на ИРБИС-сервере процессе.

VersionInfo

Информация о версии ИРБИС-сервера.

ClientInfo

Информация о клиенте, подключенном к серверу ИРБИС (не обязательно о текущем).

UserInfo

Информация о зарегистрированном пользователе системы (по данным client_m.mnu). Состоит из полей:

Поле

Назначение

Number

Номер по порядку в списке.

Name

Логин пользователя.

Password

Пароль.

Cataloger

Доступность АРМ “Каталогизатор”.

Reader

Доступность АРМ “Читатель”.

Circulation

Доступность АРМ “Книговыдача”.

Acquisitions

Доступность АРМ “Комплектатор”.

Provision

Доступность АРМ “Книгообеспеченность”.

Administrator

Доступность АРМ “Администратор”.

Если строка доступа к АРМ пустая, то доступ к соответствующему АРМ запрещен.

users := client.GetUserList()
newUser := UserInfo{Name: "Tyler Durden",
    Password: "Fight Club",
    Cataloger: "INI\\TylerC.ini"}
users = append(users, newUser)
client.UpdateUserList(users)

TableDefinition

Данные для метода printTable.

ServerStat

Статистика работы ИРБИС-сервера.

PostingParameters

Параметры для запроса постингов с сервера.

TermParameters

Параметры для запроса терминов с сервера.

TermInfo

Информация о термине поискового словаря.

TermPosting

Постинг термина в поисковом индексе.

SearchParameters

Параметры для поиска записей (метод SearchEx).

SearchScenario

Сценарий поиска.

ParFile

PAR-файл – содержит пути к файлам базы данных ИРБИС.

OptFile и OptLine

OPT-файл – файл оптимизации рабочих листов и форматов показа.

GblStatement и GblSettings

Поддержка глобальной корректировки базы данных.

ClientQuery

Клиентский запрос. Инфраструктура.

ServerResponse

Ответ сервера. Инфраструктура.