\documentclass{report}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{textcomp}
\usepackage{geometry}
\geometry{top=15mm, bottom=15mm, left=1cm, right=1cm}
\usepackage[french]{babel}
\usepackage{pslatex}
\usepackage[colorlinks=true,urlcolor=black]{hyperref}
\usepackage{graphicx}
\usepackage{fancyhdr}
\pagestyle{fancy}
\renewcommand{\footrulewidth}{0.4pt}
\fancyfoot[L]{Uubu.fr}
\fancyfoot[R]{dim. oct. 27 20:10:49 CET 2013}
\lfoot{\Large \textit{Uubu.fr}}
\hypersetup{pdfinfo={
Title={slapd-sql},
Author={Sylvain Girod},
Creator={Bash script from uubu.fr's format version 1},
Producer={Bash script and PDFLaTeX},
Subject={Backend sql},
CreationDate={D:20131027201049},
ModDate={D:20131027201049},
Keywords={LDAP;OpenLDAP;Lightweight Directory Access Protocol}
}}
\begin{document}
 
\begin{center}
{\Huge slapd-sql }
\end{center}
\vspace{1cm}
 
\begin{flushleft}
 
{\large Backend sql}
 
\vspace{10mm}
 
\hspace{1mm}  Backend SQL pour slapd. Il permet de présenter les informations stockées dans un RDBMS sous forme d’entrée LDAP.
\vspace{5mm} \\
 
 
\vspace{1cm}{\huge options - Configuration de source de données }
 
\
 
\begin{description} \normalsize
\item[\hspace{1mm} dbname <datasource name>]{Le nom de la source ODBC à utiliser}
\item[\hspace{1mm} dbhost <hostname>]{}
\item[\hspace{1mm} dbpasswd <password>]{}
\item[\hspace{1mm} dbuser <username>]{Informations de connections à la source ODBC}
\end{description}
 
\vspace{1cm}{\huge options - Configuration de scope }
 
\
 
\begin{description} \normalsize
\item[\hspace{1mm} subtree\_cond <SQL expression>]{template where-clause pour former une condition de recherche de subtree \textbf{(dn="(.+,) ?<dn>\$")}. (ex: "<upper\_func>(ldap\_entries.dn) LIKE CONCAT(’\%’, ?)")}
\item[\hspace{1mm} children\_cond <SQL expression>]{template where-clause pour former une condition de recherche enfant \textbf{(dn=".+,<dn>\$")}. (ex: "<upper\_func>(ldap\_entries.dn) LIKE CONCAT(’\%,’, ?)")}
\item[\hspace{1mm} use\_subtree\_shortcut YES]{Ne pas utiliser de condition de subtree quand la base de recherche est le suffix de la base.}
\end{description}
 
\vspace{1cm}{\huge options - Configuration de déclarations }
 
\
 
\begin{description} \normalsize
\item[\hspace{1mm} oc\_query <SQL expression>]{requête utilisée pour collecter le mapping des objectClass depuis la table ldap\_oc\_mappings. (défaut : "SELECT id, name, keytbl, keycol, create\_proc, delete\_proc, expect\_return FROM ldap\_oc\_mappings")}
\item[\hspace{1mm} at\_query <SQL expression>]{requête utilisée pour collecter le mapping des attributeType depuis la table ldap\_attr\_mappings}
\item[\hspace{1mm} id\_query <SQL expression>]{requête utilisée pour mapper un DN à une entrée dans la table ldap\_entries (défaut : "SELECT name, sel\_expr, from\_tbls, join\_where, add\_proc, delete\_proc, param\_order, expect\_return FROM ldap\_attr\_mappings WHERE oc\_map\_id= ?") )}
\item[\hspace{1mm} insentry\_stmt <SQL expression>]{requête utilisée pour insérer une nouvelle entrée dans la table ldap\_entries (défaut : "INSERT INTO ldap\_entries (dn, oc\_map\_id, parent, keyval) VALUES (?, ?, ?, ?)" )}
\item[\hspace{1mm} delentry\_stmt <SQL expression>]{requête utilisée pour supprimer une entrée existante depuis la table ldap\_entries (défaut : "DELETE FROM ldap\_entries WHERE id= ?")}
\item[\hspace{1mm} delobjclasses\_stmt <SQL expression>]{requête utilisée pour supprimer l’ID d’une entrée dans la table ldap\_objclasses. (défaut : "DELETE FROM ldap\_entry\_objclasses WHERE entry\_id= ?"}
\end{description}
 
\vspace{1cm}{\huge options - Configuration helper }
 
\
 
\begin{description} \normalsize
\item[\hspace{1mm} upper\_func <SQL function name>]{Spécifie le nom d’un fonction qui convertit une valeur en majuscule (ex : UCASE, UPPER)}
\item[\hspace{1mm} upper\_needs\_cast NO]{Définis si upper\_func doit explicitement être utilisé sur des chaînes littérales.}
\item[\hspace{1mm} strcast\_func <SQL function name>]{Spécifie le nom d’une fonction qui convertis une valeur donnée en chaîne pour l’ordonnancement. Utilisé dans SELECT DISTINCT.}
\item[\hspace{1mm} concat\_pattern <pattern>]{Définis le pattern utilisé pour concaténer les chaînes. le pattern doit contenir 2 ’ ?’ qui seront remplacés par 2 chaînes à concaténer. (défaut : CONCAT(?, ?), PostfreSQL : ?|| ? )}
\item[\hspace{1mm} aliasing\_keyword <string>]{Définis le mot clé d’alias. défaut : AS}
\item[\hspace{1mm} aliasing\_quote <string>]{Définis le caractère de quoting pour les mots clé d’alias. défaut : aucun.}
\item[\hspace{1mm} has\_ldapinfo\_dn\_ru NO]{Informe explicitement le backend si la colonne dn\_ru (DN sous forme majuscule inversé) est présent dans la table ldap\_entries.}
\item[\hspace{1mm} fail\_if\_no\_mapping NO]{Force les opérations d’écriture d’attribut à échouer si aucun mapping approprié n’est disponible. uniquement pour les attributs. N’a pas d’impacte sur les classec d’objet.}
\item[\hspace{1mm} allow\_orphans NO]{Permet d’ajouter des entrées orphelines.}
\item[\hspace{1mm} baseObject \texttt{[} <filename> \texttt{]}]{Instruit la base de créer et gérer une entrée baseObject en mémoire au lieu d’en chercher un dans le RDBMS. Si filename est fournis, l’entrée est lue depuis ce ldif. Utile quand les informations ldap\_entries sont stockés dans une vue et union n’est pas supporté pour les vues}
\item[\hspace{1mm} create\_needs\_select NO]{Instruit la base si la création d’entrée dans la table ldap\_entries a besoin d’un select pour collecter l’ID assigné automatiquement, au lieu d’être retourné par une procédure stockée.}
\item[\hspace{1mm} fetch\_attrs <attrlist>]{}
\item[\hspace{1mm} fetch\_all\_attrs NO]{Le premier état permet de fournir un liste d’attributs qui doivent toujours être remplis en plus de ceux requis par un opération spécifique. Pour l’instant, tous les attributs utilisés dans les ACL devraient être listés ici. Le second état est un raccourci pour tous les atributs}
\item[\hspace{1mm} check\_schema YES]{Instruit la base de vérifier l’adhérence des entrées au schéma après modification.}
\item[\hspace{1mm} sqllayer <name> \texttt{[}...\texttt{]}]{Charge la couche name dans la pile d’helpers qui sont utilisés pour mapper les DN de LDAP vers la représentation SQL et inversement. Les arguments suivants sont passés à la routine de configuration.}
\item[\hspace{1mm} autocommit NO]{Active l’autocommit. défaut : off}
\end{description}
 
\vspace{1cm}{\huge Exemples }
 
\
 
\hspace{1mm} Supposons que l’on stocke des informations sur des personnes travaillant dans notre organisation dans 2 tables: \\
\hspace{1mm} \textbf{PERSONS PHONES} \\
\hspace{1mm} \textbf{-------------} \\
\hspace{1mm} \textbf{id integer id integer} \\
\hspace{1mm} \textbf{first\_name varchar pers\_id integer references persons(id)} \\
\hspace{1mm} \textbf{last\_name varchar phone} \\
\hspace{1mm} \textbf{middle\_name varchar} \\
\hspace{1mm} \textbf{...} \\
\hspace{1mm} Une personne peut avoir plusieurs téléphones, phone peut contenir plusieurs enregistrements avec le pers\_id correspondant, ou aucun. Une classe d’objet LDAP pourrait présenter de tels informations comme ceci: \\
\hspace{1mm} \textbf{person} \\
\hspace{1mm} \textbf{MUST cn} \\
\hspace{1mm} \textbf{MAY telephoneNumber \$ firstName \$ lastName} \\
\hspace{1mm} \textbf{...} \\
\hspace{1mm} Pour renseigner toutes les valeurs cn, on construit la requête: \\
\hspace{1mm} \textbf{SELECT CONCAT(persons.first\_name,’ ’,persons.last\_name) AS cn FROM persons WHERE persons.id= ?} \\
\hspace{1mm} Pour telephoneNumber on peut utiliser: \\
\hspace{1mm} \textbf{SELECT phones.phone AS telephoneNumber FROM persons,phones WHERE persons.id=phones.pers\_id AND persons.id= ?} \\
\hspace{1mm} Si on veut des requêtes LDAP avec des filtres tels que (telephoneNumber=123*), on peut construire : \\
\hspace{1mm} \textbf{SELECT ... FROM persons,phones WHERE persons.id=phones.pers\_id AND persons.id= ? AND phones.phone like ’\%1\%2\%3\%’} \\
\hspace{1mm} On a donc les informations sur quelles tables contiennent les valeurs de chaque attribut, comment joindre ces tables et arranger les valeurs, on pourrait essayer de générer automatiquement de tels déclaration, et traduire les filtres de recherche en clause WHERE. \\
\hspace{1mm} Pour stocker de tels informations, on ajoute 3 tables de plus à notre schéma: \\
\hspace{1mm} \textbf{ldap\_oc\_mappings (some columns are not listed for clarity)} \\
\end{flushleft}
\end{document}
