Учебник РНР
Назад Вперёд

XCI. Функции баз данных SESAM

SESAM/SQL-Server это основа системы БД, разработанной фирмой Fujitsu Siemens Computers, Германия. Она работает на высококлассных серверах с ОС BS2000/OSD.

При установке на BS2000, SESAM/SQL-Server показал ...

  • лёгкость использования соединений с Java-, Web- и клиент/серверных;

  • способность работать с доступностью более 99.99%;

  • способность обслуживать тысячи и даже сотни тысяч пользователей.

Теперь имеется интерфейс PHP3-SESAM, позволяющий выполнять операции с БД в PHP-скриптах.

Замечания по конфигурации: отсутствует отдельная поддержка интерфейса PHP-SESAM, он работает только как часть интегрированного Apache-модуля. В РНР-модуле Apache этот SESAM-интерфейс конфигурируется директивами Apache.

Таблица 1. Директивы конфигурирования SESAM
Директива Значение
php3_sesam_oml Имя BS2000 PLAM-библиотеки, содержащей загружаемые модули драйверов SESAM. Необходима для использования SESAM-функций.

Пример:

php3_sesam_oml $.SYSLNK.SESAM-SQL.030
php3_sesam_configfile Имя файла конфигурации приложения SESAM. необходим для использования SESAM-функций.

Пример:

php3_sesam_configfile $SESAM.SESAM.CONF.AW

Обычно содержит конфигурацию такого вида (см. справочник SESAM):

CNF=B NAM=K NOTYPE
php3_sesam_messagecatalog Имя файла каталога сообщений SESAM. В большинстве случаев эта директива не нужна. Но если файл сообщений SESAM не установлен в таблице файлов сообщений системы BS2000, он может быть установлен этой директивой.

Пример:

php3_sesam_messagecatalog $.SYSMES.SESAM-SQL.030

Помимо конфигурирования интерфейса PHP/SESAM, вы должны, как обычно, сконфигурировать сам сервер БД SESAM на вашем базовом компьютере. Это означает:

  • стартовать SESAM database handler (DBH)/обработчик БД и

  • соединиться с БД обработчиком БД SESAM.

Для получения соединения между PHP-скриптом и обработчиком БД, параметры CNF и NAM выбранного файла конфигурации SESAM обязаны совпадать с id стартовавшего обработчика БД.

В случае с распределёнными БД вы должны стартовать агент SESAM/SQL-DCN с таблицей распределения, включая имена хоста и БД.

Сообщение между PHP (запущенного в подсистеме POSIX) и обработчиком БД (запущенного вне подсистемы POSIX) реализуется специальным модулем драйверов под названием SQLSCI и моделями соединений SESAM с использованием обычной памяти. Из-за доступа к общей памяти и из-за того, что PHP является статической частью web-сервера, доступ к БД выполняется очень быстро, так как не требуется удалённый доступ через ODBC, JDBC или UTM.

Только небольшой загрузчик заглушек/stub loader (SESMOD) связан с PHP, и модули соединений SESAM находятся в пуле SESAM OML PLAM-библиотеки. В конфигурации вы обязаны указать PHP имя этой PLAM-библиотеки и дать ссылку на файл для использования с файлом конфигурации SESAM (что касается SESAM V3.0, SQLSCI доступен в SESAM Tool Library, которая является частью стандартного дистрибутива).

По причине закавычивания в SQL-командах одинарных кавычек, что даёт двойные кавычки (в отличие от одинарной кавычки с обратным слэшем, используемым в некоторых других БД), советуем устанавливать директивы конфигурации PHP php3_magic_quotes_gpc и php3_magic_quotes_sybase в On для всех PHP-скриптов, использующих интерфейс SESAM.

Проблемы этапа прогона: из-за ограничений модели процессов BS2000, этот драйвер может быть загружен только после того как Apache-сервер закроет ветвление по дочерним процессам. Это несколько замедляет начальный SESAM-запрос каждого потомка, но последующие запросы выполняются на полной скорости.

При явном определении Message Catalog для SESAM, этот каталог будет загружаться каждый раз при загрузке драйвера (т.е. при начальном запросе SESAM). ОС BS2000 печатает сообщение после успешной загрузки каталога сообщений, которое может быть отправлено в файл error_log сервера Apache. BS2000 в настоящее время не поддерживает подавление этого сообщения, и оно будет постепенно заполнять log.

Убедитесь, что библиотека SESAM OML PLAM и файл конфигурации SESAM могут читаться user id, запускающим данный web-сервер. Иначе сервер не сможет загружать драйвер и вызывать SESAM-функции. Также должен быть обеспечен доступ к БД для user id, под которым работает Apache-сервер. Иначе соединение с обработчиком БД SESAM не удастся.

Типы курсоров: результирующие курсоры, которые выделяются для SQL "select type"-запросов, могут быть либо "sequential/последовательными", либо "scrollable/прокручиваемыми". Из-за большой загрузки памяти курсорами "scrollable", по умолчанию используются "sequential".

При использовании "scrollable"-курсоров, курсор может свободно позиционироваться в результирующем наборе. Для каждого "scrollable"-запроса имеются глобальные значения по умолчанию типа прокрутки (инициализируется вSESAM_SEEK_NEXT) и смещения прокрутки, которое может устанавливаться однократно в sesam_seek_row() , либо каждый раз при извлечении ряда с помощью sesam_fetch_row() . При извлечении ряда с использованием "scrollable"-курсора выполняется следующий пост-процессинг для глобальных значений по умолчанию типа и смещения прокрутки:

Таблица 2. Пост-процессинг прокручиваемого курсора
Тип прокрутки Акция
SESAM_SEEK_NEXT нет
SESAM_SEEK_PRIOR нет
SESAM_SEEK_FIRST устанавливает тип прокрутки SESAM_SEEK_NEXT
SESAM_SEEK_LAST устанавливает тип прокрутки SESAM_SEEK_PRIOR
SESAM_SEEK_ABSOLUTE автоинкремент значения внутреннего смещения
SESAM_SEEK_RELATIVE нет. (обслуживает глобальное значение по умолчанию offset , которое, например, извлекает каждый 10й ряд в обратном направлении)

Перенос: поскольку в PHP индексирование обычно начинается с нуля (а не с 1), сделана некоторая адаптация интерфейса SESAM: если индексированный массив начинается с индекса 1 в SESAM-интерфейсе, интерфейс PHP использует индекс 0 в начале. Например, при запрашивании столбцов с помощью sesam_fetch_row() , первый столбец имеет индекс 0, а последующие столбцы имеют индексы до, но не включительно, ($array["count"]). При переносе приложений SESAM из других высокоуровневых приложений в PHP имейте в виду это изменение интерфейса. Там, где уместно, описание соответствующей php sesam-функций включает примечание о том, что индексирование ведётся от 0.

Безопасность: при выдаче разрешения на доступ к БД SESAM, пользователь web-сервера должен иметь самые минимальные привилегии. Для большинства БД должен даваться доступ только для чтения. В зависимости от сценария использования, можете добавить больше прав доступа. Никогда не давайте полный контроль над БД любому пользователю сети! Ограничьте доступ к php-скриптам администрирования БД паролем и/или с помощью SSL.

Перенос из других БД SQL: нет двух разновидностей SQL, совместимых на 100%. При переносе SQL-приложений из других интерфейсов БД в SESAM может потребоваться некоторая адаптация. Нужно учитывать следующие типичные различия:

  • специфичные для данного продавца типы данных;

    Может понадобиться заменить некоторые специфичные для данного продавца типы данных на стандартные типы данных SQL (например, TEXT нужно заменить на VARCHAR(max. size)).

  • ключевые слова как идентификаторы SQL;

    В SESAM (как в стандартном SQL) такие идентификаторы обязаны быть заключены в двойные кавычки (или переименованы).

  • экранный размер типов данных;

    Типы данных SESAM имеют точность, а не экранный размер/display length. Вместо int(4) (предполагаемое использование: целые числа до '9999'), SESAM требует просто int для подразумеваемого размера в 31 бит. Также доступными типами datetime в SESAM являются: DATE, TIME(3) и TIMESTAMP(3).

  • SQL-типы со специфическими для изготовителя атрибутами unsigned, zerofill или auto_increment;

    Unsigned и zerofill не поддерживаются. Auto_increment является автоматическим (используйте "INSERT ... VALUES(*, ...)" вместо "... VALUES(0, ...)", чтобы получить преимущество от автоинкремента SESAM.

  • int ... DEFAULT '0000'

    Числовые переменные обязаны не инициализироваться строковыми константами. Вместо этого используйте DEFAULT 0. Для инициализации переменных datetime SQL-типов данных строка инициализации обязана иметь префикс из ключевого слова соответствующего типа, как здесь: CREATE TABLE exmpl ( xtime timestamp(3) DEFAULT TIMESTAMP '1970-01-01 00:00:00.000' NOT NULL ).

  • $count = xxxx_num_rows();

    Некоторые БД выдают количество рядов в результате запроса, даже если возвращаемое значение совершенно некорректно. SESAM не знает количества рядов в результате запроса, пока действительно не получит их. Если вам ДЕЙСТВИТЕЛЬНО необходим этот подсчёт, попытайтесь использовать SELECT COUNT(...) WHERE .... Второй запрос (скорее всего) возвратит результаты.

  • DROP TABLE thename;

    В SESAM, при выполнении команды DROP TABLE, после имени таблицы должно идти ключевое слово RESTRICT или CASCADE. Когда специфицировано RESTRICT, возвращается ошибка, если имеются зависимые объекты (например VIEWs/просмотры), а если CASCADE, зависимые объекты будут удалены вместе со специфицированной таблицей.

Замечания об использовании различных SQL-типов: SESAM в данный момент не поддерживает тип BLOB. В будущей версии SESAM поддержка BLOB будет.

В интерфейсе PHP автоматически применяются следующие типы конвертации при запросе SQL-полей:

Таблица 3. Конвертация типов из SQL в PHP
SQL-тип PHP-тип
SMALLINT, INTEGER integer
NUMERIC, DECIMAL, FLOAT, REAL, DOUBLE float
DATE, TIME, TIMESTAMP string
VARCHAR, CHARACTER string

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

Поддержка "множественных полей" SESAM: Специальная возможность "multiple fields" SESAM позволяет полям состоять из массива полей. Такой столбец "множественного поля" может быть создан так:

Пример 1. Создание столбца "multiple field/множественного поля"
CREATE TABLE multi_field_test ( pkey CHAR(20) PRIMARY KEY, multi(3) CHAR(12) )

и может быть заполнен:

Пример 2. Заполнение столбца "multiple field"
INSERT INTO multi_field_test (pkey, multi(2..3) ) VALUES ('Second', <'first_val', 'second_val'>)

Заметьте, что (как в данном случае) ведущие пустые субполя игнорируются, а заполненные значения сжимаются, поэтому результат этого примера появится как multi(1..2), а не как multi(2..3).

При запрашивании результирующего ряда доступ к "множественным столбцам" делается как в "инлайновым" дополнительным столбцам. В предыдущем примере "pkey" будет иметь индекс 0, а три "multi(1..3)" столбца будут доступны как индексы с 1 по 3.

Специфические детали SESAM см. в документации SESAM/SQL-Server (english) или SESAM/SQL-Server (german), доступные online, или используйте соответствующие учебники.

Содержание
sesam_affected_rows - получает количество рядов, задействованных в непосредственном запросе/immediate query
sesam_commit - подтверждает обновление БД SESAM
sesam_connect - открывает соединение с БД SESAM
sesam_diagnostic - возвращает информацию статуса для последнего вызова SESAM
sesam_disconnect - отключает от SESAM-соединения
sesam_errormsg - возвращает сообщение об ошибке последнего вызова SESAM
sesam_execimm - выполняет "immediate" SQL-оператор
sesam_fetch_array - извлекает один ряд как ассоциативный массив
sesam_fetch_result - возвращает все части результата запроса
sesam_fetch_row - извлекает один ряд как массив
sesam_field_array - возвращает meta-информацию об отдельных столбцах результата
sesam_field_name - возвращает имя одного столбца результирующего набора
sesam_free_result - освобождает ресурсы запроса
sesam_num_fields - возвращает количество полей/столбцов в результирующем наборе
sesam_query - выполняет SESAM SQL-запрос/query и готовит результат
sesam_rollback - отменяет обновления БД SESAM
sesam_seek_row - устанавливает режим scrollable-курсора для последующих извлечений
sesam_settransaction - устанавливает параметры транзакции SESAM

Назад Оглавление Вперёд
shm_remove Вверх sesam_affected_rows