Класс Connection

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

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

$connection = new Irbis\Connection();

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

$client = new Irbis\Connection();
$client->host = 'irbis.rsl.ru';
$client->port = 5555;
$client->username = 'ninja';
$client->password = 'i_am_invisible';

Поле

Тип

Назначение

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

host

string

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

‘127.0.0.1’

port

integer

Порт

6666

username

string

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

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

password

string

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

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

database

string

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

‘IBIS’

workstation

string

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

‘C’

Типы АРМов

Обозначение

Тип

‘R’

Читатель

‘C’

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

‘M’

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

‘B’

Книговыдача

‘K’

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

‘A’

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

Можно использовать мнемонические константы, определённые в PhpIrbis:

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 = new Irbis\Connection();
$client->host = 'myhost.com';
if (!$client->connect()) {
    echo "Не удалось подключиться!";
    die(1);
}

Отключаться от сервера можно двумя способами: во-первых, с помощью метода disconnect:

$client->disconnect();

во-вторых, клиент автоматически отключается от сервера при уничтожении экземпляра класса:

unset($client); // Происходит неявный вызов disconnect()

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

$client->connect();
// Получаем имя MNU-файла, хранящего перечень форматов
$formatMenuName = $client->iniFile->getValue('Main', 'FmtMnu', 'FMT31.MNU');

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

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

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

if (!$client->isConnected()) {
    // В настоящее время мы не подключены к серверу
}

Вместо индивидуального задания каждого из полей host, port, username, password и database, можно использовать метод parseConnectionString:

$client->parseConnectionString('host=192.168.1.4;port=5555;' .
         'username=itsme;password=secret;');
$client->connect();

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

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

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

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

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

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

$client->noOp();

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

$mfn = 123;
$record = $client->readRecord($mfn);

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

$mfns = array(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);
echo "New MaxMFN: $newMaxMfn";

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

$records = array();
...
if (!$client->writeRecords($records))) {
    echo "Failure!";
}

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

$mfn = 123;
$client->deleteRecord($mfn);

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

$mfn = 123;
$record = $client->undeleteRecord($mfn);

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

$found = $client->search('"A=ПУШКИН$"');
echo "Найдено записей: " . count($found);

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

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

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

$records = $client->searchRead('"A=ПУШКИН$"', 50);
echo "Найдено записей: " . count($records);

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

$record = $client->searchSingleRecord('"I=65.304.13-772296"');
if (!$record) {
    echo 'Не нашли!';
}

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

$expression = '"A=ПУШКИН$"';
$count = $client->searchCount($expression);

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

$parameters = new Irbis\SearchParameters();
$parameters->expression = '"A=ПУШКИН$"';
$parameters->format = BRIEF_FORMAT;
$parameters->numberOfRecords = 5;
$found = $client->searchEx($parameters);
if (!$found) {
    echo 'Не нашли';
} else {
    // в $found находится массив FoundLine
    $first = $found[0];
    echo "<p>MFN: {$first->mfn}, DESCRIPTION: {$first->description}</p>";
}

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

$found = $client->searchAll('"A=ПУШКИН$"');
echo "Найдено записей: " . count($found);

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

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

$mfn = 123;
$format = BRIEF_FORMAT;
$text = $client->formatRecord($format, $mfn);
echo '<p>Результат форматирования: ' . $text . '</p>';

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

$mfn = 123;
$format = "'Ἀριστοτέλης: ', v200^a";
$text = $client->formatRecord($format, $mfn);
echo '<p>Результат форматирования: ' . $text . '</p>';

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

$mfns = array ( 12, 34, 56 );
$format = BRIEF_FORMAT;
$lines = $client->formatRecords($format, $mfns);
echo '<p>Результаты:<br/>' . implode('<br/>', $lines) . '</p>';

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

$table = new Irbis\TableDefinition();
$table->database = 'IBIS';
$table->table = '@tabf1w';
$table->searchQuery = '"T=A$"';
$text = $client->printTable($table);

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

Контекст в данном случае – файлы обвязки, хранящиеся на сервере ИРБИС64 (форматы, меню и проч.).

Функция

Назначение

listFiles

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

readIniFile

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

readMenuFile

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

readSearchScenario

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

readTextFile

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

readTextLines

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

readTreeFile

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

updateIniFile

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

writeTextFile

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

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

Функция

Назначение

readRawRecord

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

writeRawRecord

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

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

Функция

Назначение

getRecordPostings

Массив постингов для указанных MFN и префикса

listTerms

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

readPostings

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

readTerms

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

readTermsEx

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

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

Функция

Назначение

getDatabaseInfo

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

getMaxMfn

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

getServerVersion

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

listDatabases

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

toConnectionString

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

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

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

$client = new Irbis\Connection();
$client->username = 'librarian';
$client->password = 'secret';
$client->workstation = ADMINISTRATOR;
if (!$client->connect()) {
    echo 'Не удалось подключиться!';
    die(1);
}

Функция

Назначение

actualizeDatabase

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

actualizeRecord

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

createDatabase

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

createDictionary

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

deleteDatabase

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

deleteFile

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

getServerStat

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

getUserList

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

listProcesses

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

reloadDictionary

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

reloadMasterFile

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

restartServer

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

truncateDatabase

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

unlockDatabase

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

unlockRecords

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

updateUserList

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

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

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