Класс 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.