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"-курсора выполняется
следующий пост-процессинг для глобальных значений по умолчанию типа и смещения прокрутки:
нет. (обслуживает глобальное значение по умолчанию 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-полей:
При запрашивании всего ряда результат возвращается как массив. Пустые
поля не заполняются, поэтому вы сами должны будете проверить существование отдельных полей (используя
isset() или empty() для проверки наличия пустых полей). Это даст больше контроля пользователя над
появлением пустых полей (чем в случае использования пустой строки для представления пустого поля).
Поддержка "множественных полей" SESAM:
Специальная возможность "multiple fields" SESAM позволяет полям состоять
из массива полей. Такой столбец "множественного поля" может быть создан
так:
Пример 1. Создание столбца "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.