SESAM/SQL-Server est une base de données mainframe, développée
par Fujitsu Siemens Computers, Allemagne. Elle fonctionne sur les
serveur mainframe, sous BS2000/OSD.
Sur de nombreuses installation BS2000 en production, SESAM/SQL-Server
a prouvé ...
La facilité de connectivité Java, Web et client/serveur
La disponibilité de plus de 99.99%,
La capacité de gérer des dizaines et mêmes des centaines de milliers
d'utilisateurs.
Désormais, il existe une interface PHP pour SESAM, qui donne
l'accès à cette base aux scripts PHP.
Notes de configuration :
Il n'y a pas de support pour l'interface SESAM si PHP est un CGI :
elle ne fonctionne que comme module Apache. En module Apache,
l'interface SESAM peut être
configurée avec les directives Apache.
Tableau 1. Directives de configuration SESAM
Directive
Signification
php3_sesam_oml
Nom de la librairie BS2000 PLAM contenant le module du pilote
SESAM. Ceci est obligatoire pour utiliser les fonctions SESAM.
Exemple:
php3_sesam_oml $.SYSLNK.SESAM-SQL.030
php3_sesam_configfile
Nom du fichier de configuration de l'application SESAM.
Ceci est obligatoire pour utiliser les fonctions SESAM.
Exemple:
php3_sesam_configfile $SESAM.SESAM.CONF.AW
Ce fichier contient généralement une configuration comme celle
ci (voir dans le manuel de référence SESAM):
CNF=B
NAM=K
NOTYPE
php3_sesam_messagecatalog
Nom du fichier de messages SESAM. Dans la plus part des cas,
cette directive n'est pas nécessaire. Uniquement si le fichier
de messages SESAM n'es pas installé dans la table de messages
BS2000. Il peut alors être choisi avec cette directive.
Exemple:
php3_sesam_messagecatalog $.SYSMES.SESAM-SQL.030
En plus de la configuration de l'interface PHP/SESAM, vous devez
aussi configurer le serveur SESAM-Database sur votre mainframe,
comme d'habitude. Cela signifie notamment qu'il faut :
démarrer le gestionnaire de base SESAM (DBH)
connecter les bases avec le gestionnaire de bases SESAM
Pour connecter un script PHP au serveur de bases SESAM, les paramètres
CNF et NAM de la configuration
SESAM selectionnée doivent correspondre à l'id du gestionnaire de
base démarré.
Dans le cas des bases de données distribuées, vous devez démarrer
un agent SESAM/SQL-DCN, avec la table de distribution incluant
le nom de l'hôte et de la base de données.
La communication entre PHP (fonctionnant sur le sous-système POSIX)
et le gestionnaire de base (fonctionnant hors du sous-système POSIX)
est réalisée par un pilote spécial appelé SQLSCI et le module de
connexion SESAM, qui utilise la mémoire partagée. A cause de la mémoire
partagée, et parce que PHP est une partie statique du serveur web, les
accès à la base de données sont extrêmement rapide, car il ne requièrent
pas de connexion distante via ODBC, JDBC ou UTM.
Seul un chargeur de stub (stub loader, SESMOD) est compilé dans PHP.
Les modules de connexion SESAM proviennent de la librairie OML PLAM.
Dans la configuration, vous devez
indiquer à PHP le nom de la librairie PALM, et le fichier de lien à
utiliser pour la configuration de SESAM (En SESAM V3.0, SQLSCI est
disponible dans la librairie d'outils SESAM (SESAM Tool Library), qui
fait partie de la distribution standard).
Les commandes SQL imposent que les guillemets simples soient doublés
pour être interprété litéralement (contrairement à d'autres bases
de données qui utilisent un guillemet simple, précédé d'un antislash),
il est recommandé d'activer les directives PHP
php3_magic_quotes_gpc
et
php3_magic_quotes_sybase.
Exécutions :
A cause des limitations du modèle de processus BS2000, le pilote
peut être chargé uniquement après que le serveur Apache ait généré
le processus fils. Cela ralentit légèrement le traitement de la première
requête, mais toutes les requêtes suivantes seront effecutée
à pleine vitesse.
Lorsque vous définissez explicitement le catalogue de messages
SESAM, ce catalogue ser chargé à chaque fois que le pilote est
chargé (i.e., au moment de la requête initiale). Le système
d'exploitation BS2000 affiche un message après avoir correctement
chargé le catalogue de messages, qui sera envoyé au fichier
d'erreurs Apache. BS2000 ne permet pas la suppression de ce
message, qui va remplir progressivement ce fichier.
Assurez vous que la librairie SESAM OML PLAM et le fichier de
configuration SESAM sont accessibles par l'utilisateur qui
fait tourner le serveur web. Sinon, le serveur ne sera pas
capable de charger le pilote, ou d'appeler les fonctions
SESAM. L'accès à la base doit être donné à cet utilisateur.
Sinon, les connexions SESAM échoueront.
Types de curseurs :
Les curseurs de résultat sont alloués pour les requêtes
SQL de selection, peuvent être soit "séquentiels", soit
"à défilement" ("scrollable"). Les curseurs à défilement
sont beaucoup plus gourmands en mémoire, et le mode
par défaut est séquentiel.
Lorsque vous utilisez les curseurs à défilement, le curseur
peut être positionné librement dans le résultat. Pour chaque
requête à défilement, il existe des valeurs globales de
types de défilement (initialisée à :SESAM_SEEK_NEXT)
et la position peut être fixée une seule fois par
sesam_seek_row() ou bien à chaque appel,
avec la fonction sesam_fetch_row(). Lorsque
vous lisez une ligne avec un curseur à défilement, le traitement
suivant est effectué à partir des valeurs globales de type
de défilement et de position :
Tableau 2. Scrolled Cursor Post-Processing
Type de défilement
Action
SESAM_SEEK_NEXT
aucun
SESAM_SEEK_PRIOR
aucun
SESAM_SEEK_FIRST
le type de défilement devient SESAM_SEEK_NEXT
SESAM_SEEK_LAST
le type de défilement devient SESAM_SEEK_PRIOR
SESAM_SEEK_ABSOLUTE
incrémente automatiquement la valeur interne de position
SESAM_SEEK_RELATIVE
aucune. conserve les valeurs globales par défaut de
position, ce qui permet, par exemple de lire toutes
les 10 lignes, en arrière.
Porting note :
En PHP, il est naturel de commencer les index à zéro (plutôt
que 1), et quelques adaptations ont été faite pour l'interface
SESAM : à chaque fois qu'un tableau indexé commence à l'index 1
en SESAM natif, l'interface PHP utilisera l'index 0 comme point de
départ. Par exemple, lorsque vous lisez des données avec
sesam_fetch_row(), la première colonne
sera à l'index 0, et les suivantes suivront juqu'au nombre
de colonne (exclus) du résultat ($array["count"]).
Lors du portage d'applications depuis d'autres langage évolués vers
le PHP, soyez attentifs à ce changement. A chaque fois que
c'est nécessaire, la description d'une fonction PHP SESAM indique
que l'index du tableau commence à 0.
Sécurité :
Lorsque vous autorisez l'accès à une base de données SESAM, le
serveur web doit avoir le minimum de privilèges possible. Pour la
plus part des bases de données, seul le droit de lecture doit être
fourni. Suivant votre utilisation, ajoutez d'autres droits d'accès
au fur et à mesure de vos besoins. Ne donnez jamais le contrôle
total de vos bases à un utilisateur du web! Limitez l'accès aux
scripts PHP qui doivent administrer la base en utilisant un
mot de passe et/ou une sécurisation SSL.
Migration d'une autre base SQL :
Deux langage SQL ne sont jamais 100% compatibles. Lorsque vous portez
une application SQL depuis une autre interface vers SESAM,
certaines adaptation doivent être faîtes. Les différences suivantes
sont les plus courantes :
Types de données spécifiques
Certains types de données spécifiques à une base doivent être
remplacés par les types de données standard SQL.
(i.e., TEXT doit être remplacé par
VARCHAR(taille max)).
Mots reservés comme identifiants SQL.
En SESAM (comme dans le standard SQL), les mots
reservés utilisés comme identifiants doivent être entourés
de guillemets doubles (ou renommés).
Taille d'affichage des données.
Les types de données SESAM ont une taille de stockage, mais
par de taille d'affichage. A la place de int(4)
(c'est à dire : les entiers jusqu'à '9999'), SESAM requiert simplement
int, pour une taille implicite de 31 bits. De même,
les seuls types de date disponible dans SESAM sont :
DATE, TIME(3) et
TIMESTAMP(3).
Les types de données unsigned (non signé),
zerofill (complété avec des zéros), ou
auto_increment
Unsigned et zerofill ne sont pas
supportés. Auto_increment est automatique
(utilisez "INSERT ... VALUES(*, ...)" au lieu de
"... VALUES(0,...)" pour profiter des auto-increment
implicites de SESAM.
int ... DEFAULT '0000'
Les variables numériques ne doivent pas être initialisées
avec des constantes de type chaîne de caractères. Utilisez
DEFAULT 0 à la place. Pour initialiser une
date, la chaîne doit être préfixée avec le type de date
adapté, tel que :
CREATE TABLE exmpl (xtime timestamp(3) DEFAULT TIMESTAMP '1970-01-01 00:00:00.000' NOT NULL);
$count = xxxx_num_rows();
Certaines bases de données essaient d'estimer le nombre
de lignes d'un résultat, même grossièrement approximativement.
SESAM ne connait pas le nombre de lignes avant de les
avoir lues lui-même. Si vous avez vraiment besoin de
les compter, utilisez la commande
SELECT COUNT(...) WHERE ..., qui vous dira
combien de lignes sont disponibles. Une deuxième requête
devrait vous retourner tous ces résultats.
DROP TABLE lenom;
Avec SESAM, dans la commande DROP TABLE,
le nom de la table doit être suivi du mot clé
RESTRICT ou CASCADE. Avec
RESTRICT, une erreur est retounrée si il y a des
objets dépendant (par exemple, des vues), tandis qu'avec
CASCADE, les objets dépendants seront
supprimés en même temps que la table.
Notes sur l'utilisation de types SQL divers :
SESAM ne supporte pas le type BLOB. Une future version de
SESAM devra le faire.
L'interface PHP effectue automatiquement les conversions suivantes lors
de la lecture de lignes de résultats SQL :
Tableau 3. Conversion de type SQL vers PHP
Type SQL
Type PHP
SMALLINT, INTEGER
"integer" (entier)
NUMERIC, DECIMAL, FLOAT, REAL, DOUBLE
"double" (nombre à virgule flottante)
DATE, TIME, TIMESTAMP
"string"(chaîne de caractères)
VARCHAR, CHARACTER
"string"(chaîne de caractères)
Lorsque vous lisez une ligne entière, le résultat est retourné
sous la forme d'un tableau. Les champs vides ne sont pas remplis,
et vous aurez à vérifier vous même l'existence des champs (
(utilisez isset() ou empty()
pour tester les champs vides). Cela donne plus de contrôle à
l'utilisateur sur l'apparence des champs que si les champs
vides étaient représenté par des chaînes vides).
Support des "champs multiples" de SESAM :
La fonctionnalité spéciale des "champs multiples" de SESAM permet
à une colonne de contenir un tableau de champs. Un tel "champs multiple"
peut être créé comme ceci :
Exemple 1. Création d'une colonne de champs multiples
Notez que (comme c'est le cas ci-dessus), les sous-champs vides
initiaux sont ignorés, et que le tableau est alors compacté, ce qui
fait que l'exemple ci-dessus conduit à un tableau multi(1..2) au
lieu de multi(2..3).
Lors de la lecture d'une ligne, les "champs multiples" sont mis en colonne.
Dans l'exemple ci-dessu, "pkey" prend l'index 0, et les trois colonnes
"multi(1..3)" sont accessibles depuis les index 1 à 3.
Pour de plus amples détails sur SESAM, reportez vous à la
documentation SESAM/SQL-Server en anglais
ou SESAM/SQL-Server en allemand,
disponibles toutes deux en ligne, ou en manuels.
Table des matières
sesam_affected_rows -- Lit le nombre de lignes affectées par une requête immédiate
sesam_commit -- Valide la transaction SESAM en cours