| 1 |
<?xml version="1.0" encoding="ISO-8859-15"?> |
|---|
| 2 |
<!-- Dernière modification |
|---|
| 3 |
le $Date$ |
|---|
| 4 |
par $Author$ |
|---|
| 5 |
révision $Revision$ --> |
|---|
| 6 |
<!-- SAS : 20070314 --> |
|---|
| 7 |
|
|---|
| 8 |
<chapter id="bki"> |
|---|
| 9 |
<title>Interface du moteur, <acronym>BKI</acronym></title> |
|---|
| 10 |
|
|---|
| 11 |
<para> |
|---|
| 12 |
Les fichiers d'interface du moteur (<acronym>BKI</acronym> pour |
|---|
| 13 |
<foreignphrase>Backend Interface</foreignphrase>) sont des scripts |
|---|
| 14 |
écrits dans un langage spécial, compris par le serveur |
|---|
| 15 |
<productname>PostgreSQL</productname> lorsqu'il est exécuté en mode |
|---|
| 16 |
<quote>bootstrap</quote>. Ce mode autorise la création et le remplissage des catalogues |
|---|
| 17 |
systèmes <foreignphrase>ab initio</foreignphrase>, là où les commandes SQL |
|---|
| 18 |
exigent leur existence préalable. |
|---|
| 19 |
Les fichiers <acronym>BKI</acronym> peuvent donc être utilisés en premier |
|---|
| 20 |
lieu pour créer le système de base de données. (Ils n'ont probablement |
|---|
| 21 |
pas d'autre utilité.) |
|---|
| 22 |
</para> |
|---|
| 23 |
|
|---|
| 24 |
<para> |
|---|
| 25 |
<application>initdb</application> utilise un fichier <acronym>BKI</acronym> |
|---|
| 26 |
pour réaliser une partie de son travail lors de la création d'un nouveau |
|---|
| 27 |
cluster de bases de données. Le fichier d'entrée utilisé par |
|---|
| 28 |
<application>initdb</application> est créé, lors de la construction et de |
|---|
| 29 |
l'installation de <productname>PostgreSQL</productname>, par un programme |
|---|
| 30 |
nommé <filename>genbki.sh</filename> qui lit différents fichiers d'en-têtes |
|---|
| 31 |
C spécialement formatés à partir du répertoire |
|---|
| 32 |
<filename>src/include/catalog</filename> des sources. Le fichier |
|---|
| 33 |
<acronym>BKI</acronym> créé est appelé <filename>postgres.bki</filename> et |
|---|
| 34 |
est normalement installé dans le sous-répertoire <filename>share</filename> |
|---|
| 35 |
du répertoire d'installation. |
|---|
| 36 |
</para> |
|---|
| 37 |
|
|---|
| 38 |
<para> |
|---|
| 39 |
D'autres informations sont disponibles dans la documentation |
|---|
| 40 |
d'<application>initdb</application>. |
|---|
| 41 |
</para> |
|---|
| 42 |
|
|---|
| 43 |
<sect1 id="bki-format"> |
|---|
| 44 |
<title>Format des fichiers <acronym>BKI</acronym></title> |
|---|
| 45 |
|
|---|
| 46 |
<para> |
|---|
| 47 |
Cette section décrit l'interprétation des fichiers <acronym>BKI</acronym> |
|---|
| 48 |
par le moteur de <productname>PostgreSQL</productname>. Cette description |
|---|
| 49 |
est plus facile à comprendre si le fichier <filename>postgres.bki</filename> |
|---|
| 50 |
est utilisé comme exemple. |
|---|
| 51 |
</para> |
|---|
| 52 |
|
|---|
| 53 |
<para> |
|---|
| 54 |
L'entrée de <acronym>BKI</acronym> représente une séquence de commandes. Les |
|---|
| 55 |
commandes sont constituées de lexèmes |
|---|
| 56 |
(<foreignphrase>tokens</foreignphrase>) dont le nombre dépend de la syntaxe de |
|---|
| 57 |
la commande. Les lexèmes sont habituellement séparés par des espaces |
|---|
| 58 |
fines, mais en l'absence d'ambiguïté ce n'est pas nécessaire. Il n'y a pas |
|---|
| 59 |
de séparateur spécial pour les commandes ; le prochain lexème qui ne |
|---|
| 60 |
peut syntaxiquement pas appartenir à la commande qui précède en lance une |
|---|
| 61 |
autre. (En général, il est préférable, pour des raisons de clarté, de |
|---|
| 62 |
placer toute nouvelle commande sur une nouvelle ligne.) Les lexèmes peuvent être |
|---|
| 63 |
des mots clés, des caractères spéciaux (parenthèses, virgules, etc.), nombres ou |
|---|
| 64 |
chaînes de caractères entre guillemets doubles. Tous sont sensibles à la |
|---|
| 65 |
casse. |
|---|
| 66 |
</para> |
|---|
| 67 |
|
|---|
| 68 |
<para> |
|---|
| 69 |
Les lignes qui débutent par <literal>#</literal> sont ignorées. |
|---|
| 70 |
</para> |
|---|
| 71 |
|
|---|
| 72 |
</sect1> |
|---|
| 73 |
|
|---|
| 74 |
<sect1 id="bki-commands"> |
|---|
| 75 |
<title>Commandes <acronym>BKI</acronym></title> |
|---|
| 76 |
|
|---|
| 77 |
<variablelist> |
|---|
| 78 |
<varlistentry> |
|---|
| 79 |
<term> |
|---|
| 80 |
<literal>create</literal> |
|---|
| 81 |
<optional><literal>bootstrap</literal></optional> |
|---|
| 82 |
<optional><literal>shared_relation</literal></optional> |
|---|
| 83 |
<optional><literal>without_oids</literal></optional> |
|---|
| 84 |
<replaceable class="parameter">tablename</replaceable> |
|---|
| 85 |
<replaceable class="parameter">tableoid</replaceable> |
|---|
| 86 |
(<replaceable class="parameter">name1</replaceable> = |
|---|
| 87 |
<replaceable class="parameter">type1</replaceable> |
|---|
| 88 |
<optional>, <replaceable class="parameter">name2</replaceable> = |
|---|
| 89 |
<replaceable class="parameter">type2</replaceable>, ...</optional>) |
|---|
| 90 |
</term> |
|---|
| 91 |
|
|---|
| 92 |
<listitem> |
|---|
| 93 |
<para> |
|---|
| 94 |
Crée une table nommée <replaceable class="parameter">nomtable</replaceable>, |
|---|
| 95 |
possédant l'OID |
|---|
| 96 |
<replaceable class="parameter">tableoid</replaceable> et composée des colonnes |
|---|
| 97 |
données entre parenthèses. |
|---|
| 98 |
</para> |
|---|
| 99 |
|
|---|
| 100 |
<para> |
|---|
| 101 |
Les types de colonnes suivants sont supportés directement par |
|---|
| 102 |
<filename>bootstrap.c</filename>: <type>bool</type>, |
|---|
| 103 |
<type>bytea</type>, <type>char</type> (1 byte), |
|---|
| 104 |
<type>name</type>, <type>int2</type>, |
|---|
| 105 |
<type>int4</type>, <type>regproc</type>, <type>regclass</type>, |
|---|
| 106 |
<type>regtype</type>, <type>text</type>, |
|---|
| 107 |
<type>oid</type>, <type>tid</type>, <type>xid</type>, |
|---|
| 108 |
<type>cid</type>, <type>int2vector</type>, <type>oidvector</type>, |
|---|
| 109 |
<type>_int4</type> (array), <type>_text</type> (array), |
|---|
| 110 |
<type>_oid</type> (array), <type>_char</type> (array), |
|---|
| 111 |
<type>_aclitem</type> (array). Bien qu'il soit possible de créer des |
|---|
| 112 |
tables contenant des colonnes d'autres types, cela ne peut pas être |
|---|
| 113 |
réalisé avant que <structname>pg_type</structname> ne soit créé et |
|---|
| 114 |
rempli avec les entrées |
|---|
| 115 |
appropriées. (Ce qui signifie en fait que seuls ces types de colonnes |
|---|
| 116 |
peuvent être utilisés dans les tables utilisant le |
|---|
| 117 |
<quote>bootstrap</quote> mais que les catalogues ne l'utilisant pas |
|---|
| 118 |
peuvent contenir tout type interne.) |
|---|
| 119 |
</para> |
|---|
| 120 |
|
|---|
| 121 |
<para> |
|---|
| 122 |
Quand <literal>bootstrap</literal> est précisé, la table est |
|---|
| 123 |
uniquement construite sur disque ; rien n'est entré dans |
|---|
| 124 |
<structname>pg_class</structname>, <structname>pg_attribute</structname>, |
|---|
| 125 |
etc, pour cette table. Du coup, la table n'est pas accessible par les |
|---|
| 126 |
opérations SQL standard tant que ces entrées ne sont pas |
|---|
| 127 |
réalisées en dur (à l'aide de commandes <literal>insert</literal>). |
|---|
| 128 |
Cette option est utilisée pour créer <structname>pg_class</structname>, etc. |
|---|
| 129 |
</para> |
|---|
| 130 |
|
|---|
| 131 |
<para> |
|---|
| 132 |
La table est créée partagée si <literal>shared_relation</literal> est |
|---|
| 133 |
indiqué. Elle possède des OID à moins que |
|---|
| 134 |
<literal>without_oids</literal> ne soit précisé. |
|---|
| 135 |
</para> |
|---|
| 136 |
</listitem> |
|---|
| 137 |
</varlistentry> |
|---|
| 138 |
|
|---|
| 139 |
<varlistentry> |
|---|
| 140 |
<term> |
|---|
| 141 |
<literal>open</literal> <replaceable class="parameter">nomtable</replaceable> |
|---|
| 142 |
</term> |
|---|
| 143 |
|
|---|
| 144 |
<listitem> |
|---|
| 145 |
<para> |
|---|
| 146 |
Ouvre la table nommée |
|---|
| 147 |
<replaceable class="parameter">nomtable</replaceable> |
|---|
| 148 |
pour l'ajout de données. Toute table alors ouverte est fermée. |
|---|
| 149 |
</para> |
|---|
| 150 |
</listitem> |
|---|
| 151 |
</varlistentry> |
|---|
| 152 |
|
|---|
| 153 |
<varlistentry> |
|---|
| 154 |
<term> |
|---|
| 155 |
<literal>close</literal> <optional><replaceable class="parameter">nomtable</replaceable></optional> |
|---|
| 156 |
</term> |
|---|
| 157 |
|
|---|
| 158 |
<listitem> |
|---|
| 159 |
<para> |
|---|
| 160 |
Ferme la table ouverte. Le nom de la |
|---|
| 161 |
table peut-être indiqué pour vérification mais ce n'est pas nécessaire. |
|---|
| 162 |
</para> |
|---|
| 163 |
</listitem> |
|---|
| 164 |
</varlistentry> |
|---|
| 165 |
|
|---|
| 166 |
<varlistentry> |
|---|
| 167 |
<term> |
|---|
| 168 |
<literal>insert</literal> <optional><literal>OID =</literal> <replaceable class="parameter">valeur_oid</replaceable></optional> <literal>(</literal><replaceable class="parameter">valeur1</replaceable> <replaceable class="parameter">valeur2</replaceable> ...<literal>)</literal> |
|---|
| 169 |
</term> |
|---|
| 170 |
|
|---|
| 171 |
<listitem> |
|---|
| 172 |
<para> |
|---|
| 173 |
Insère une nouvelle ligne dans la table ouverte en utilisant |
|---|
| 174 |
<replaceable class="parameter">valeur1</replaceable>, |
|---|
| 175 |
<replaceable class="parameter">valeur2</replaceable>, etc., comme valeurs de |
|---|
| 176 |
colonnes et <replaceable class="parameter">valeur_oid</replaceable> |
|---|
| 177 |
comme OID. Si |
|---|
| 178 |
<replaceable class="parameter">valeur_oid</replaceable> vaut zéro |
|---|
| 179 |
(0) ou si la clause est omise, et que la table a des OID, alors le |
|---|
| 180 |
prochain OID disponible est utilisé. |
|---|
| 181 |
</para> |
|---|
| 182 |
|
|---|
| 183 |
<para> |
|---|
| 184 |
La valeur NULL peut être indiquée en utilisant le mot clé spécial |
|---|
| 185 |
<literal>_null_</literal>. Les valeurs contenant des espaces doivent être |
|---|
| 186 |
placées entre des guillemets doubles. |
|---|
| 187 |
</para> |
|---|
| 188 |
</listitem> |
|---|
| 189 |
</varlistentry> |
|---|
| 190 |
|
|---|
| 191 |
<varlistentry> |
|---|
| 192 |
<term> |
|---|
| 193 |
<literal>declare</literal> <optional><literal>unique</literal></optional> |
|---|
| 194 |
<literal>index</literal> <replaceable class="parameter">nomindex</replaceable> |
|---|
| 195 |
<replaceable class="parameter">oidindex</replaceable> |
|---|
| 196 |
<literal>on</literal> <replaceable class="parameter">nomtable</replaceable> |
|---|
| 197 |
<literal>using</literal> <replaceable class="parameter">nomam</replaceable> |
|---|
| 198 |
<literal>(</literal> <replaceable class="parameter">classeop1</replaceable> |
|---|
| 199 |
<replaceable class="parameter">nom1</replaceable> |
|---|
| 200 |
<optional>, ...</optional> <literal>)</literal> |
|---|
| 201 |
</term> |
|---|
| 202 |
|
|---|
| 203 |
<listitem> |
|---|
| 204 |
<para> |
|---|
| 205 |
Crée un index nommé |
|---|
| 206 |
<replaceable class="parameter">nomindex</replaceable>, d'OID |
|---|
| 207 |
<replaceable class="parameter">indexoid</replaceable>, sur la table nommée |
|---|
| 208 |
<replaceable class="parameter">nomtable</replaceable> en utilisant la |
|---|
| 209 |
méthode d'accès nommée <replaceable class="parameter">nomam</replaceable>. |
|---|
| 210 |
Les champs à indexer sont appelés |
|---|
| 211 |
<replaceable class="parameter">nom1</replaceable>, |
|---|
| 212 |
<replaceable class="parameter">nom2</replaceable> etc., et les classes d'opérateur à |
|---|
| 213 |
utiliser sont respectivement |
|---|
| 214 |
<replaceable class="parameter">classeop1</replaceable>, |
|---|
| 215 |
<replaceable class="parameter">classeop2</replaceable> etc. |
|---|
| 216 |
Le fichier index est créé et les entrées appropriées du catalogue sont |
|---|
| 217 |
ajoutées pour lui, mais le contenu de l'index n'est pas initialisé par |
|---|
| 218 |
cette commande. |
|---|
| 219 |
</para> |
|---|
| 220 |
</listitem> |
|---|
| 221 |
</varlistentry> |
|---|
| 222 |
|
|---|
| 223 |
<varlistentry> |
|---|
| 224 |
<term> |
|---|
| 225 |
<literal>declare toast</literal> |
|---|
| 226 |
<replaceable class="parameter">toasttableoid</replaceable> |
|---|
| 227 |
<replaceable class="parameter">toastindexoid</replaceable> |
|---|
| 228 |
<literal>on</literal> <replaceable class="parameter">nomtable</replaceable> |
|---|
| 229 |
</term> |
|---|
| 230 |
|
|---|
| 231 |
<listitem> |
|---|
| 232 |
<para> |
|---|
| 233 |
Crée une table TOAST pour la table nommée |
|---|
| 234 |
<replaceable class="parameter">nomtable</replaceable>. |
|---|
| 235 |
La table TOAST se voit affecter l'OID |
|---|
| 236 |
<replaceable class="parameter">toasttableoid</replaceable> |
|---|
| 237 |
et son index l'OID |
|---|
| 238 |
<replaceable class="parameter">toastindexoid</replaceable>. |
|---|
| 239 |
Comme avec <literal>declare index</literal>, le remplissage de l'index |
|---|
| 240 |
est reporté. |
|---|
| 241 |
</para> |
|---|
| 242 |
</listitem> |
|---|
| 243 |
</varlistentry> |
|---|
| 244 |
|
|---|
| 245 |
<varlistentry> |
|---|
| 246 |
<term><literal>build indices</literal></term> |
|---|
| 247 |
|
|---|
| 248 |
<listitem> |
|---|
| 249 |
<para> |
|---|
| 250 |
Remplit les index précédemment déclarés. |
|---|
| 251 |
</para> |
|---|
| 252 |
</listitem> |
|---|
| 253 |
</varlistentry> |
|---|
| 254 |
</variablelist> |
|---|
| 255 |
|
|---|
| 256 |
</sect1> |
|---|
| 257 |
|
|---|
| 258 |
<sect1 id="bki-structure"> |
|---|
| 259 |
<title>Structure du fichier <acronym>BKI</acronym> de <quote>bootstrap</quote></title> |
|---|
| 260 |
|
|---|
| 261 |
<para> |
|---|
| 262 |
La commande <literal>open</literal> ne peut pas être utilisée avant que les |
|---|
| 263 |
tables qu'elle utilise n'existent et n'aient des entrées pour la table à |
|---|
| 264 |
ouvrir. (Ces tables minimales sont <structname>pg_class</structname>, |
|---|
| 265 |
<structname>pg_attribute</structname>, <structname>pg_proc</structname> et |
|---|
| 266 |
<structname>pg_type</structname>.) Pour permettre le remplissage de ces |
|---|
| 267 |
tables elles-mêmes, |
|---|
| 268 |
<literal>create</literal> utilisé avec l'option <literal>bootstrap</literal> |
|---|
| 269 |
ouvre implicitement la table créée pour l'insertion de données. |
|---|
| 270 |
</para> |
|---|
| 271 |
|
|---|
| 272 |
<para> |
|---|
| 273 |
De la même façon, les commandes <literal>declare index</literal> et |
|---|
| 274 |
<literal>declare toast</literal> ne peuvent pas être utilisées tant que |
|---|
| 275 |
les catalogues systèmes dont elles ont besoin n'ont pas été créés et remplis. |
|---|
| 276 |
</para> |
|---|
| 277 |
|
|---|
| 278 |
<para> |
|---|
| 279 |
Du coup, la structure du fichier <filename>postgres.bki</filename> doit |
|---|
| 280 |
être : |
|---|
| 281 |
<orderedlist> |
|---|
| 282 |
<listitem> |
|---|
| 283 |
<para> |
|---|
| 284 |
<literal>create bootstrap</literal> une des tables critiques |
|---|
| 285 |
</para> |
|---|
| 286 |
</listitem> |
|---|
| 287 |
<listitem> |
|---|
| 288 |
<para> |
|---|
| 289 |
<literal>insert</literal> les données décrivant au moins les tables critiques |
|---|
| 290 |
</para> |
|---|
| 291 |
</listitem> |
|---|
| 292 |
<listitem> |
|---|
| 293 |
<para> |
|---|
| 294 |
<literal>close</literal> |
|---|
| 295 |
</para> |
|---|
| 296 |
</listitem> |
|---|
| 297 |
<listitem> |
|---|
| 298 |
<para> |
|---|
| 299 |
Répéter pour les autres tables critiques. |
|---|
| 300 |
</para> |
|---|
| 301 |
</listitem> |
|---|
| 302 |
<listitem> |
|---|
| 303 |
<para> |
|---|
| 304 |
<literal>create</literal> (sans <literal>bootstrap</literal>) une table non critique |
|---|
| 305 |
</para> |
|---|
| 306 |
</listitem> |
|---|
| 307 |
<listitem> |
|---|
| 308 |
<para> |
|---|
| 309 |
<literal>open</literal> |
|---|
| 310 |
</para> |
|---|
| 311 |
</listitem> |
|---|
| 312 |
<listitem> |
|---|
| 313 |
<para> |
|---|
| 314 |
<literal>insert</literal> les données souhaitées |
|---|
| 315 |
</para> |
|---|
| 316 |
</listitem> |
|---|
| 317 |
<listitem> |
|---|
| 318 |
<para> |
|---|
| 319 |
<literal>close</literal> |
|---|
| 320 |
</para> |
|---|
| 321 |
</listitem> |
|---|
| 322 |
<listitem> |
|---|
| 323 |
<para> |
|---|
| 324 |
Répéter pour les autres tables non critiques. |
|---|
| 325 |
</para> |
|---|
| 326 |
</listitem> |
|---|
| 327 |
<listitem> |
|---|
| 328 |
<para> |
|---|
| 329 |
Définir les index et les tables TOAST. |
|---|
| 330 |
</para> |
|---|
| 331 |
</listitem> |
|---|
| 332 |
<listitem> |
|---|
| 333 |
<para> |
|---|
| 334 |
<literal>build indices</literal> |
|---|
| 335 |
</para> |
|---|
| 336 |
</listitem> |
|---|
| 337 |
</orderedlist> |
|---|
| 338 |
</para> |
|---|
| 339 |
|
|---|
| 340 |
<para> |
|---|
| 341 |
Il existe, sans doute, d'autres dépendances d'ordre non documentées. |
|---|
| 342 |
</para> |
|---|
| 343 |
</sect1> |
|---|
| 344 |
|
|---|
| 345 |
<sect1 id="bki-example"> |
|---|
| 346 |
<title>Exemple</title> |
|---|
| 347 |
|
|---|
| 348 |
<para> |
|---|
| 349 |
La séquence de commandes suivante crée la table |
|---|
| 350 |
<literal>test_table</literal> avec l'OID 420, deux colonnes |
|---|
| 351 |
<literal>cola</literal> et <literal>colb</literal> de types respectifs |
|---|
| 352 |
<type>int4</type> et <type>text</type> et insère deux lignes dans la |
|---|
| 353 |
table : |
|---|
| 354 |
<programlisting>create test_table 420 (cola = int4, colb = text) |
|---|
| 355 |
open test_table |
|---|
| 356 |
insert OID=421 ( 1 "value1" ) |
|---|
| 357 |
insert OID=422 ( 2 _null_ ) |
|---|
| 358 |
close test_table |
|---|
| 359 |
</programlisting> |
|---|
| 360 |
</para> |
|---|
| 361 |
</sect1> |
|---|
| 362 |
</chapter> |
|---|