Структура 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.