<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://blog.guillaume.lelarge.info/index.php/feed/rss2/xslt" ?><rss version="2.0"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/"
  xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
  <title>gleu's blog - PostgreSQL</title>
  <link>http://blog.guillaume.lelarge.info/index.php/</link>
  <atom:link href="http://blog.guillaume.lelarge.info/index.php/feed/category/Postgresql/rss2" rel="self" type="application/rss+xml"/>
  <description></description>
  <language>fr</language>
  <pubDate>Mon, 06 Oct 2008 22:48:39 +0200</pubDate>
  <copyright></copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>PGDayFr 2008, un succès mérité</title>
    <link>http://blog.guillaume.lelarge.info/index.php/post/2008/10/05/PGDayFr-2008-un-succes-merite</link>
    <guid isPermaLink="false">urn:md5:7e278c4bedd158a63402ba9aa9fd168c</guid>
    <pubDate>Sun, 05 Oct 2008 23:36:00 +0200</pubDate>
    <dc:creator>Guillaume Lelarge</dc:creator>
        <category>PostgreSQL</category>
            
    <description>    &lt;p&gt;Je reviens tout juste de Toulouse. La première édition de &lt;a href=&quot;http://www.pgday.fr&quot; hreflang=&quot;fr&quot;&gt;PGDay France&lt;/a&gt; vient de se terminer. L'expérience fut bonne. J'ai tout particulièrement apprécié la prestation de Guillaume Smet. Mais plutôt que de partir moi-aussi dans la description de toutes les conférences, je vous conseille de lire le &lt;a href=&quot;http://thomas.enix.org/Blog-20081005130335-Libre&quot; hreflang=&quot;fr&quot;&gt;billet de Thomas Petazzoni&lt;/a&gt;. Bien que peu intéressé par le domaine des bases de données, il a participé fréquemment aux discussions de préparation de cette journée en tant que membre du LUG local. Il a aussi passé sa journée à filmer toutes les conférences, ce qui nous permettra de mettre rapidement en ligne celles-ci pour ceux qui n'ont pas pu venir. Bref, il était là et ses commentaires sur la journée rejoignent fortement mes impressions.&lt;/p&gt;


&lt;p&gt;J'ai pris un &lt;a href=&quot;http://photos.guillaume.lelarge.info/?galerie=pgdayfr08&quot; hreflang=&quot;fr&quot;&gt;certain nombre de photos que vous trouverez ici&lt;/a&gt; dans un premier temps. Elles sont brutes, aucune retouche, y compris pour les yeux rouges, ni même une simple suppression des photos floues. Je suis trop fatigué pour m'en occuper ce soir. Si certains ne souhaitent pas apparaître, qu'ils me laissent un simple commentaire et je supprimerais la photo du site.&lt;/p&gt;


&lt;p&gt;Dernier point, je tiens à remercier toutes les personnes qui ont participé à la mise en place de PGDayFr 2008, et notamment Jean-Christophe Arnu, qui, par sa proximité géographique, a réalisé de très nombreuses démarches pour que cet événement ait lieu. (Et je ne me remercie pas vu que je n'ai pratiquement pas participé... préparer ce genre d'événements n'est pas quelque chose qui me motive suffisament).&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.guillaume.lelarge.info/index.php/post/2008/10/05/PGDayFr-2008-un-succes-merite#comment-form</comments>
      <wfw:comment>http://blog.guillaume.lelarge.info/index.php/post/2008/10/05/PGDayFr-2008-un-succes-merite#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.guillaume.lelarge.info/index.php/feed/rss2/comments/1067</wfw:commentRss>
      </item>
    
  <item>
    <title>Article « Les vues systèmes sous PostgreSQL 8.3 » sur dalibo.org</title>
    <link>http://blog.guillaume.lelarge.info/index.php/post/2008/10/01/Article-Les-vues-systemes-sous-PostgreSQL-83-sur-daliboorg</link>
    <guid isPermaLink="false">urn:md5:934fe1e3396b38a887725f68746bfb56</guid>
    <pubDate>Wed, 01 Oct 2008 15:25:00 +0200</pubDate>
    <dc:creator>Guillaume Lelarge</dc:creator>
        <category>PostgreSQL</category>
            
    <description>    &lt;p&gt;Je viens tout juste de placer cet &lt;a href=&quot;http://www.dalibo.org/glmf106_les_vues_systemes_sous_postgresql_8.3&quot; hreflang=&quot;fr&quot;&gt;article sur dalibo.org&lt;/a&gt;, initialement paru sous le &lt;a href=&quot;http://www.ed-diamond.com/produit.php?produit=585&quot; hreflang=&quot;fr&quot;&gt;numéro 106 de GNU/Linux Magazine France&lt;/a&gt;, et maintenant disponible sous licence Creative Commons.&lt;/p&gt;


&lt;p&gt;J'ai aussi envoyé mon tout dernier article à Denis Bodor, le rédacteur-en-chef du magazine. J'attends son verdict &lt;img src=&quot;/themes/default/smilies/wink.png&quot; alt=&quot;;)&quot; class=&quot;smiley&quot; /&gt; Pour infos, cela porte sur la recherche plein texte, et plus précisément sur la configuration de cette fonctionnalité.&lt;/p&gt;


&lt;p&gt;Pour les suivants, j'avoue que je commence à être un peu à court d'idées... si quelqu'un a une proposition, je suis preneur &lt;img src=&quot;/themes/default/smilies/smile.png&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt; Dans les articles possibles, j'ai :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;nouveautés SQL et PL/pgsql en 8.3 ;&lt;/li&gt;
&lt;li&gt;gestion des processus avec PostgreSQL ;&lt;/li&gt;
&lt;li&gt;nouveautés sur les performances.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Le premier me plaît moyen mais il permettrait de faire un article simple avec des nouveautés, donc dans l'esprit de ce que je fais depuis le premier article. Le second me plaît plus, on met beaucoup plus les mains dans le cambouis. Le dernier me plaît beaucoup aussi mais va demander beaucoup plus de travail que ce que je peux faire actuellement.&lt;/p&gt;


&lt;p&gt;Bref, une autre idée serait la bienvenue...&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.guillaume.lelarge.info/index.php/post/2008/10/01/Article-Les-vues-systemes-sous-PostgreSQL-83-sur-daliboorg#comment-form</comments>
      <wfw:comment>http://blog.guillaume.lelarge.info/index.php/post/2008/10/01/Article-Les-vues-systemes-sous-PostgreSQL-83-sur-daliboorg#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.guillaume.lelarge.info/index.php/feed/rss2/comments/1065</wfw:commentRss>
      </item>
    
  <item>
    <title>Petite minute d'autopromotion</title>
    <link>http://blog.guillaume.lelarge.info/index.php/post/2008/09/29/Petite-minute-d-autopromotion</link>
    <guid isPermaLink="false">urn:md5:27cfd8ceaa2a4eb228d440ad85d79f02</guid>
    <pubDate>Mon, 29 Sep 2008 10:16:00 +0200</pubDate>
    <dc:creator>Guillaume Lelarge</dc:creator>
        <category>PostgreSQL</category>
            
    <description>    &lt;p&gt;Dur matin aujourd'hui... mal réveillé, pas en super forme après le déménagement de ce week-end... Pfiou que de mails en attente, et de billets de blogs non lus. C'est vrai que ça fait cinq jours que je suis à fond dans le boulot et le déménagement. Bref.&lt;/p&gt;


&lt;p&gt;Je viens de lire un billet qui m'a fait beaucoup plaisir. Leo Hsu et Regina Obe (les auteurs du &lt;a href=&quot;http://www.postgresonline.com/&quot; hreflang=&quot;en&quot;&gt;Postgres Online Journal&lt;/a&gt;) ont testé la version de développement de pgAdmin (la 1.9) et viennent de publier leurs &lt;a href=&quot;http://www.postgresonline.com/journal/index.php?/archives/73-guid.html&quot; hreflang=&quot;en&quot;&gt;impressions&lt;/a&gt;. En fait, ils citent les cinq nouvelles fonctionnalités qui les ont le plus marqué. En tout premier, le &lt;a href=&quot;http://blog.guillaume.lelarge.info/index.php/post/2008/07/28/Ajout-de-la-recherche-plein-texte-sur-pgAdmin3&quot; hreflang=&quot;fr&quot;&gt;support de FTS&lt;/a&gt;. J'en ai déjà (trop ?) longuement parlé. Ensuite le &lt;a href=&quot;http://blog.guillaume.lelarge.info/index.php/post/2008/08/19/GSoC-pgAdmin-%3A-Graphical-Query-Builder&quot; hreflang=&quot;fr&quot;&gt;concepteur de requêtes graphiques&lt;/a&gt;. Enfin, le &lt;a href=&quot;http://blog.guillaume.lelarge.info/index.php/post/2008/08/26/pgAdmin-%3A-enfin-des-dialogues-redimensionnables&quot; hreflang=&quot;fr&quot;&gt;dimensionnement modifiable des fenêtres&lt;/a&gt;, la &lt;a href=&quot;http://blog.guillaume.lelarge.info/index.php/post/2008/08/11/Journee-satisfaisante-pour-pgAdmin&quot; hreflang=&quot;fr&quot;&gt;gestion de l'héritage des tables&lt;/a&gt; et le &lt;a href=&quot;http://blog.guillaume.lelarge.info/index.php/post/2008/06/15/Une-journee-pgAdmin&quot; hreflang=&quot;fr&quot;&gt;champ SQL modifiable&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Autrement dit, sur les cinq fonctionnalités qu'ils ont choisi de mettre en avant, quatre ont été codées par moi &lt;img src=&quot;/themes/default/smilies/smile.png&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt; Hmmm... vous ne pouvez pas vous plaindre, je vous avais prévenu dans le titre &lt;img src=&quot;/themes/default/smilies/smile.png&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.guillaume.lelarge.info/index.php/post/2008/09/29/Petite-minute-d-autopromotion#comment-form</comments>
      <wfw:comment>http://blog.guillaume.lelarge.info/index.php/post/2008/09/29/Petite-minute-d-autopromotion#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.guillaume.lelarge.info/index.php/feed/rss2/comments/1063</wfw:commentRss>
      </item>
    
  <item>
    <title>De la création d'index pour une fonction</title>
    <link>http://blog.guillaume.lelarge.info/index.php/post/2008/09/26/De-la-creation-d-index-pour-une-fonction</link>
    <guid isPermaLink="false">urn:md5:b41e422b080ed4684dcc27c3efa4a27e</guid>
    <pubDate>Fri, 26 Sep 2008 16:11:00 +0200</pubDate>
    <dc:creator>Guillaume Lelarge</dc:creator>
        <category>PostgreSQL</category>
            
    <description>    &lt;p&gt;Au cas où vous seriez en train de créer un index pour accélérer la rapidité d'une requête dans une fonction &lt;a href=&quot;http://docs.postgresql.fr/8.3/plpgsql.html&quot; hreflang=&quot;fr&quot;&gt;PL/pgsql&lt;/a&gt;, pensez à (re-)créer votre fonction &lt;strong&gt;après&lt;/strong&gt; avoir créé l'index.&lt;/p&gt;


&lt;p&gt;En effet, le plan de la fonction est créé lors de la création de la fonction, si bien que toute amélioration possible après coup (comme par exemple l'ajout d'un index) n'est pas pris en compte. Recréer la fonction recréera le plan d'exécution... et vous pourriez vous retrouver comme moi avec une fonction passant de 58 secondes de durée d'exécution à 2 secondes. Un gain vraiment appréciable &lt;img src=&quot;/themes/default/smilies/smile.png&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Valide en version 8.1... pas sûr que cela soit encore nécessaire en 8.2 ou 8.3.&lt;/p&gt;


&lt;p&gt;&lt;em&gt;Mise à jour :&lt;/em&gt; merci à Thomas pour avoir trouvé une erreur dans ce billet... qui est maintenant corrigé.&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.guillaume.lelarge.info/index.php/post/2008/09/26/De-la-creation-d-index-pour-une-fonction#comment-form</comments>
      <wfw:comment>http://blog.guillaume.lelarge.info/index.php/post/2008/09/26/De-la-creation-d-index-pour-une-fonction#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.guillaume.lelarge.info/index.php/feed/rss2/comments/1062</wfw:commentRss>
      </item>
    
  <item>
    <title>Développons une nouvelle fonctionnalité pour PostgreSQL (5/?)</title>
    <link>http://blog.guillaume.lelarge.info/index.php/post/2008/09/23/Developpons-une-nouvelle-fonctionnalite-pour-PostgreSQL-5/</link>
    <guid isPermaLink="false">urn:md5:f97317234f0f948632601c99bd1430f6</guid>
    <pubDate>Tue, 23 Sep 2008 23:59:00 +0200</pubDate>
    <dc:creator>Guillaume Lelarge</dc:creator>
        <category>PostgreSQL</category>
            
    <description>    &lt;p&gt;&lt;em&gt;continuons à améliorer l'interface&lt;/em&gt;&lt;/p&gt;


&lt;p&gt;Je n'ai pas trop le temps, donc on va faire deux petites modifs rapides : ajouter l'aide dans psql et gérer la complétion automatique toujours dans psql.&lt;/p&gt;


&lt;p&gt;Je laisse de côté les étapes de récupération des sources mises à jour (cvs -q update -d), la compilation/installation (make &amp;amp;&amp;amp; make install), la possible ré-initialisation du cluster (j'en ai encore eu besoin... les développeurs bossent beaucoup ces temps-ci &lt;img src=&quot;/themes/default/smilies/smile.png&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt; ), etc.&lt;/p&gt;


&lt;p&gt;Testons la méta-commande \h sur la commande ALTER DATABASE :&lt;/p&gt;


&lt;pre&gt;guillaume@laptop$ psql postgres
psql (8.4devel)
Type &amp;quot;help&amp;quot; for help.

postgres=# \h alter database
Command:     ALTER DATABASE
Description: change a database
Syntax:
ALTER DATABASE name [ [ WITH ] option [ ... ] ]

where option can be:

    CONNECTION LIMIT connlimit

ALTER DATABASE name RENAME TO newname

ALTER DATABASE name OWNER TO new_owner

ALTER DATABASE name SET configuration_parameter { TO | = } { value | DEFAULT }
ALTER DATABASE name SET configuration_parameter FROM CURRENT
ALTER DATABASE name RESET configuration_parameter
ALTER DATABASE name RESET ALL&lt;/pre&gt;


&lt;p&gt;Il manque notre option. Le fichier à modifier, on l'a déjà aperçu dans un épisode précédent, est &lt;code&gt;src/bin/psql/sql_help.h&lt;/code&gt;. On aperçoit dans les toutes premières lignes :&lt;/p&gt;


&lt;pre&gt;* *** Do not change this file by hand. It is automatically
* *** generated from the DocBook documentation.&lt;/pre&gt;


&lt;p&gt;Ah, dommage. Bon, on va quand même le modifier juste pour la forme &lt;img src=&quot;/themes/default/smilies/smile.png&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;


&lt;p&gt;En lisant rapidement ce fichier, on arrive à la ligne 36 qui indique ceci :&lt;/p&gt;


&lt;pre&gt;    { &amp;quot;ALTER DATABASE&amp;quot;,
      N_(&amp;quot;change a database&amp;quot;),
      N_(&amp;quot;ALTER DATABASE name &lt;a href=&quot;http://blog.guillaume.lelarge.info/index.php/post/2008/09/23/Developpons-une-nouvelle-fonctionnalite-pour-PostgreSQL-5/[ WITH&quot; title=&quot;[ WITH&quot;&gt;[ WITH&lt;/a&gt; option &lt;a href=&quot;http://blog.guillaume.lelarge.info/index.php/post/2008/09/23/Developpons-une-nouvelle-fonctionnalite-pour-PostgreSQL-5/...&quot; title=&quot;...&quot;&gt;...&lt;/a&gt; ]\n\nwhere option can be:\n\n    CONNECTION LIMIT connlimit\n\nALTER DATABASE name RENAME TO newname\n\nALTER DATABASE name OWNER TO new_owner\n\nALTER DATABASE name SET configuration_parameter { TO | = } { value | DEFAULT }\nALTER DATABASE name SET configuration_parameter FROM CURRENT\nALTER DATABASE name RESET configuration_parameter\nALTER DATABASE name RESET ALL&amp;quot;) },&lt;/pre&gt;


&lt;p&gt;Il suffit de modifier la troisième ligne en ajoutant le texte suivant après le mot connlimit : &lt;code&gt;\n    TABLESPACE tablespace_name&lt;/code&gt;. Après avoir modifié le fichier, il nous reste plus qu'à compiler et tester :&lt;/p&gt;


&lt;pre&gt;guillaume@laptop$ make &amp;amp;&amp;amp; make install
[... coupé ...]
make&lt;a href=&quot;http://blog.guillaume.lelarge.info/index.php/post/2008/09/23/Developpons-une-nouvelle-fonctionnalite-pour-PostgreSQL-5/1&quot; title=&quot;1&quot;&gt;1&lt;/a&gt;: quittant le répertoire « /home/guillaume/postgresql_src/pgsql/config »
PostgreSQL installation complete.
guillaume@laptop$ psql postgres
psql (8.4devel)
Type &amp;quot;help&amp;quot; for help.

postgres=# \h alter database
Command:     ALTER DATABASE
Description: change a database
Syntax:
ALTER DATABASE name [ [ WITH ] option [ ... ] ]

where option can be:

    CONNECTION LIMIT connlimit
    TABLESPACE tablespace_name

ALTER DATABASE name RENAME TO newname

ALTER DATABASE name OWNER TO new_owner

ALTER DATABASE name SET configuration_parameter { TO | = } { value | DEFAULT }
ALTER DATABASE name SET configuration_parameter FROM CURRENT
ALTER DATABASE name RESET configuration_parameter
ALTER DATABASE name RESET ALL&lt;/pre&gt;


&lt;p&gt;Yes ! ça fonctionne &lt;img src=&quot;/themes/default/smilies/smile.png&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt; mais pas bien compliqué en fait.&lt;/p&gt;


&lt;p&gt;Maintenant, la gestion de la complétion automatique. Actuellement, on a ceci :&lt;/p&gt;


&lt;pre&gt;guillaume@laptop$ psql postgres
psql (8.4devel)
Type &amp;quot;help&amp;quot; for help.

postgres=# alter DATABASE guillaume&amp;lt;tab&amp;gt;&amp;lt;tab&amp;gt;
CONNECTION LIMIT  OWNER TO          RENAME TO         RESET             SET
postgres=# alter DATABASE guillaume&lt;/pre&gt;


&lt;p&gt;&amp;lt;tab&amp;gt; étant à remplacer par une tabulation. On voit là-aussi que le mot clé TABLESPACE ne s'y trouve pas... allez hop, on se remonte les manches. Là-aussi, on connaît déjà le fichier, il s'agit de &lt;code&gt;src/bin/psql/tab-complete.c&lt;/code&gt;. On peut chercher ALTER DATABASE pour trouver à la première occurence cette partie :&lt;/p&gt;


&lt;pre&gt;	/* ALTER DATABASE &amp;lt;name&amp;gt; */
	else if (pg_strcasecmp(prev3_wd, &amp;quot;ALTER&amp;quot;) == 0 &amp;amp;&amp;amp;
			 pg_strcasecmp(prev2_wd, &amp;quot;DATABASE&amp;quot;) == 0)
	{
		static const char *const list_ALTERDATABASE&lt;a href=&quot;http://blog.guillaume.lelarge.info/index.php/post/2008/09/23/Developpons-une-nouvelle-fonctionnalite-pour-PostgreSQL-5/&quot;&gt;&lt;/a&gt; =
		{&amp;quot;RESET&amp;quot;, &amp;quot;SET&amp;quot;, &amp;quot;OWNER TO&amp;quot;, &amp;quot;RENAME TO&amp;quot;, &amp;quot;CONNECTION LIMIT&amp;quot;, NULL};

		COMPLETE_WITH_LIST(list_ALTERDATABASE);
	}&lt;/pre&gt;


&lt;p&gt;Les options semblent être toutes dans la variable list_ALTERDATABASE. Modifions-la pour ajouter l'option TABLESPACE. On compile de nouveau, et on teste :&lt;/p&gt;


&lt;pre&gt;guillaume@laptop$ psql postgres
psql (8.4devel)
Type &amp;quot;help&amp;quot; for help.

postgres=# alter database guillaume&amp;lt;tab&amp;gt;&amp;lt;tab&amp;gt;
CONNECTION LIMIT  OWNER TO          RENAME TO         RESET             SET               TABLESPACE
postgres=# alter database guillaume&lt;/pre&gt;


&lt;p&gt;Ça fonctionne \o/&lt;/p&gt;


&lt;p&gt;Bref, pas grand chose de nouveau, mais il fallait de toute façon le faire. On fera plus passionnant la prochaine fois.&lt;/p&gt;


&lt;p&gt;Au fait, au dernier numéro, j'ai ajouté un fichier patch au billet sans expliquer comment je l'ai fait. C'est très simple, il suffit d'exécuter la commande suivante :&lt;/p&gt;


&lt;pre&gt;guillaume@laptop$ cvs diff &amp;gt; ~/tablespace2.patch&lt;/pre&gt;


&lt;p&gt;Le fichier obtenu correspond à celui en pièce jointe de ce fichier. Vous pouvez appliquer ce patch en vous plaçant dans le répertoire des sources et en exécutant la commande suivante :&lt;/p&gt;


&lt;pre&gt;guillaume@laptop$ patch -Np0 &amp;lt; chemin/vers/tablespace2.patch&lt;/pre&gt;</description>
    
          <enclosure url="http://blog.guillaume.lelarge.info/public/patchs_tablespace/tablespace2.patch"
      length="3632" type="text/plain" />
    
    
          <comments>http://blog.guillaume.lelarge.info/index.php/post/2008/09/23/Developpons-une-nouvelle-fonctionnalite-pour-PostgreSQL-5/#comment-form</comments>
      <wfw:comment>http://blog.guillaume.lelarge.info/index.php/post/2008/09/23/Developpons-une-nouvelle-fonctionnalite-pour-PostgreSQL-5/#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.guillaume.lelarge.info/index.php/feed/rss2/comments/1061</wfw:commentRss>
      </item>
    
  <item>
    <title>Développons une nouvelle fonctionnalité pour PostgreSQL (4/?)</title>
    <link>http://blog.guillaume.lelarge.info/index.php/post/2008/09/22/Developpons-une-nouvelle-fonctionnalite-pour-PostgreSQL-4/</link>
    <guid isPermaLink="false">urn:md5:219a933c266fea357c38edab5a2a5d53</guid>
    <pubDate>Mon, 22 Sep 2008 23:48:00 +0200</pubDate>
    <dc:creator>Guillaume Lelarge</dc:creator>
        <category>PostgreSQL</category>
            
    <description>    &lt;p&gt;&lt;em&gt;un peu de code&lt;/em&gt;&lt;/p&gt;


&lt;p&gt;Encore une fois, commençons par mettre à jour les sources :&lt;/p&gt;


&lt;pre&gt;guillaume@laptop$ cd postgresql_src/pgsql/
guillaume@laptop$ cvs -q update -d
[... coupé parce que trop long ...]
P src/interfaces/libpq/fe-exec.c
P src/interfaces/libpq/libpq-events.c
P src/interfaces/libpq/libpq-events.h
P src/interfaces/libpq/libpq-fe.h
P src/interfaces/libpq/libpq-int.h&lt;/pre&gt;


&lt;p&gt;Et on compile rapidement :&lt;/p&gt;


&lt;pre&gt;guillaume@laptop$ make &amp;amp;&amp;amp; make install
[... coupé parce que trop long ...]
PostgreSQL installation complete.&lt;/pre&gt;


&lt;p&gt;Lançons PostgreSQL :&lt;/p&gt;


&lt;pre&gt;guillaume@laptop$ export PGDIR=/home/guillaume/postgresql_devel
guillaume@laptop$ export PGDATA=$PGDIR/data
guillaume@laptop$ export PATH=$PGDIR/bin:$PATH
guillaume@laptop$ pg_ctl start
server starting
FATAL:  database files are incompatible with server
DETAIL:  The database cluster was initialized with CATALOG_VERSION_NO 200809151, but the server was compiled with CATALOG_VERSION_NO 200809191.
HINT:  It looks like you need to initdb.&lt;/pre&gt;


&lt;p&gt;Oups. Tiens, la version du catalogue a changé. Il faut de nouveau exécuter initdb... c'est parti :&lt;/p&gt;


&lt;pre&gt;guillaume@laptop$ rm -rf $PGDATA/* /home/guillaume/postgresql_tblspc/*
guillaume@laptop$ initdb
The files belonging to this database system will be owned by user &amp;quot;guillaume&amp;quot;.
This user must also own the server process.
[... coupé ...]
Success. You can now start the database server using:

    postgres -D /home/guillaume/postgresql_devel/data
or
    pg_ctl -D /home/guillaume/postgresql_devel/data -l logfile start

guillaume@laptop$ pg_ctl start
server starting
LOG:  database system was shut down at 2008-09-22 19:48:45 CEST
LOG:  autovacuum launcher started
LOG:  database system is ready to accept connections&lt;/pre&gt;


&lt;p&gt;C'est bon ! On doit recréer la base de données, la table et le tablespace :&lt;/p&gt;


&lt;pre&gt;guillaume@laptop$ createdb guillaume
guillaume@laptop$ psql guillaume
psql (8.4devel)
Type &amp;quot;help&amp;quot; for help.

guillaume=# CREATE TABLE t1 (id integer);
CREATE TABLE
guillaume=# CREATE TABLESPACE mon_espace_de_stockage LOCATION '/home/guillaume/postgresql_tblspc';
CREATE TABLESPACE&lt;/pre&gt;


&lt;p&gt;Voilà. On est prêt à plonger dans le code.&lt;/p&gt;


&lt;p&gt;La première chose à faire est de modifier la syntaxe. On a vu la dernière fois que cela se passe dans le fichier &lt;code&gt;src/backend/parser/gram.y&lt;/code&gt; (gram pour grammaire). En regardant la syntaxe déjà proposée par &lt;a href=&quot;http://docs.postgresql.fr/8.3/sql-alterdatabase.html&quot; hreflang=&quot;fr&quot;&gt;ALTER DATABASE&lt;/a&gt;, on voit qu'il est déjà possible d'ajouter une option, l'option « connection limit ». On va donc chercher cette syntaxe dans le fichier &lt;code&gt;gram.y&lt;/code&gt;. Cherchons l'instruction &lt;code&gt;ALTER DATABASE&lt;/code&gt;. Première occurence, le ALTER DATABASE pour le renommage d'une base de données. En fait ce code est intégré aux autres instructions de renommage des objets. Ça ne nous intéresse pas. Occurence suivante, le ALTER DATABASE pour changer le propriétaire. Là aussi, ce code est intégré aux autres instructions de changement de propriétaire. Ça ne nous intéresse toujours pas. Occurence suivante. Ah, une partie complète sur ALTER DATABASE. Le jeton AlterDatabaseStmt est celui qui nous intéresse. « ALTER DATABASE database_name opt_with alterdb_opt_list » correspond au « ALTER DATABASE database_name WITH CONNECTION LIMIT x ». « alterdb_opt_list » correspond à la liste des options, pour l'instant qui se limite à une, mais nous devons en ajouter une deuxième. Cherchons donc maintenant « alterdb_opt_list ». Nous trouvons ce code :&lt;/p&gt;


&lt;pre&gt;alterdb_opt_list:
			alterdb_opt_list alterdb_opt_item		{ $$ = lappend($1, $2); }
			| /* EMPTY */							{ $$ = NIL; }
		;&lt;/pre&gt;


&lt;p&gt;Cela déclare « tout simplement » une liste. Nous devons maintenant chercher « alterdb_opt_item », et nous trouvons ceci :&lt;/p&gt;


&lt;pre&gt;alterdb_opt_item:
			CONNECTION LIMIT opt_equal SignedIconst
				{
					$$ = makeDefElem(&amp;quot;connectionlimit&amp;quot;, (Node *)makeInteger($4));
				}
		;&lt;/pre&gt;


&lt;p&gt;Si on essaie d'analyser cela, on comprend que la chaîne précise les mots fixes (« CONNECTION LIMIT »), un jeton pour le symbole d'égalité et un SignedIconst qui est un jeton correspondant à une constante entière signée (Signed Integer Constant). Il nous faut ajouter la syntaxe pour le tablespace :&lt;/p&gt;


&lt;pre&gt;alterdb_opt_item:
			CONNECTION LIMIT opt_equal SignedIconst
				{
					$$ = makeDefElem(&amp;quot;connectionlimit&amp;quot;, (Node *)makeInteger($4));
				}
			| TABLESPACE name
				{
					$$ = makeDefElem(&amp;quot;tablespace&amp;quot;, (Node *)makeString($2));
				}
		;&lt;/pre&gt;


&lt;p&gt;C'est-à-dire le mot fixe TABLESPACE suivi du nom du tablespace. « name » n'est pas juste la traduction bête, mais un jeton représentant le nom d'un objet PostgreSQL.&lt;/p&gt;


&lt;p&gt;Et maintenant que doit faire cette nouvelle syntaxe ? Nous avons vu la dernière fois que le fichier &lt;code&gt;backend/commands/tablecmds.c&lt;/code&gt; gérait tout ce qui concernait les commandes relatives aux tables. Peut-être existe-il la même chose pour les bases. Cherchons ça :&lt;/p&gt;


&lt;pre&gt;guillaume@laptop$ ll src/backend/commands/ | grep base
guillaume@laptop$ ll src/backend/commands/ | grep db
-rw-r&lt;del&gt;r&lt;/del&gt; 1 guillaume guillaume  46550 2008-09-22 22:37 dbcommands.c
-rw-r&lt;del&gt;r&lt;/del&gt; 1 guillaume guillaume  22084 2008-09-22 22:37 dbcommands.o&lt;/pre&gt;


&lt;p&gt;&lt;code&gt;backend/commands/dbcommands.c&lt;/code&gt; semble être le bon fichier. Ouvrons le fichier et cherchons le texte « ALTER DATABASE ». On arrive directement sur une fonction qui prend en argument une structure AlterDatabaseStmt. Hmmm, mais c'est le jeton que nous avons modifié... excellent, ça. En lisant le code de la fonction, on voit cette partie :&lt;/p&gt;


&lt;pre&gt;if (strcmp(defel-&amp;gt;defname, &amp;quot;connectionlimit&amp;quot;) == 0)
{
  if (dconnlimit)
    ereport(ERROR,
      (errcode(ERRCODE_SYNTAX_ERROR),
      errmsg(&amp;quot;conflicting or redundant options&amp;quot;)));
    dconnlimit = defel;
}&lt;/pre&gt;


&lt;p&gt;C'est le code qui s'occupe de l'option CONNECTION LIMIT. Il nous reste à ajouter le code pour l'option TABLESPACE. Nous allons seulement ajouter un code qui envoie un message dans les journaux applicatifs pour savoir si nous avons bien réussi à intégrer une nouvelle syntaxe. Cela donne ce code :&lt;/p&gt;


&lt;pre&gt;else if (strcmp(defel-&amp;gt;defname, &amp;quot;tablespace&amp;quot;) == 0)
{
  elog(NOTICE, &amp;quot;set tablespace !&amp;quot;);
}&lt;/pre&gt;


&lt;p&gt;Simple, non ?&lt;/p&gt;


&lt;p&gt;Voyons déjà ce que donne ces modifications. On compile, installe et redémarre PostgreSQL :&lt;/p&gt;


&lt;pre&gt;guillaume@laptop$ make &amp;amp;&amp;amp; make install
[... coupé de nouveau ...]
make&lt;a href=&quot;http://blog.guillaume.lelarge.info/index.php/post/2008/09/22/Developpons-une-nouvelle-fonctionnalite-pour-PostgreSQL-4/1&quot; title=&quot;1&quot;&gt;1&lt;/a&gt;: quittant le répertoire « /home/guillaume/postgresql_src/pgsql/config »
PostgreSQL installation complete.
guillaume@laptop$ pg_ctl restart
waiting for server to shut down....
LOG:  received smart shutdown request
LOG:  autovacuum launcher shutting down
LOG:  shutting down
LOG:  database system is shut down
 done
server stopped
server starting
LOG:  database system was shut down at 2008-09-22 22:36:28 CEST
LOG:  autovacuum launcher started
LOG:  database system is ready to accept connections&lt;/pre&gt;


&lt;p&gt;Lançons psql :&lt;/p&gt;


&lt;pre&gt;guillaume@laptop$ psql postgres
psql (8.4devel)
Type &amp;quot;help&amp;quot; for help.

postgres=# alter database guillaume with tablespace mon_espace_de_stockage ;
NOTICE:  set tablespace !
ALTER DATABASE&lt;/pre&gt;


&lt;p&gt;L'ajout de la syntaxe a fonctionné \o/&lt;/p&gt;


&lt;p&gt;Maintenant, il va falloir ajouter un code plus intéressant dans cette fonction.&lt;/p&gt;</description>
    
          <enclosure url="http://blog.guillaume.lelarge.info/public/patchs_tablespace/tablespace1.patch"
      length="1286" type="text/plain" />
    
    
          <comments>http://blog.guillaume.lelarge.info/index.php/post/2008/09/22/Developpons-une-nouvelle-fonctionnalite-pour-PostgreSQL-4/#comment-form</comments>
      <wfw:comment>http://blog.guillaume.lelarge.info/index.php/post/2008/09/22/Developpons-une-nouvelle-fonctionnalite-pour-PostgreSQL-4/#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.guillaume.lelarge.info/index.php/feed/rss2/comments/1060</wfw:commentRss>
      </item>
    
  <item>
    <title>Développons une nouvelle fonctionnalité pour PostgreSQL (3/?)</title>
    <link>http://blog.guillaume.lelarge.info/index.php/post/2008/09/17/Developpons-une-nouvelle-fonctionnalite-pour-PostgreSQL-3/</link>
    <guid isPermaLink="false">urn:md5:73466b04ba4132ce3402b81d41f1d682</guid>
    <pubDate>Thu, 18 Sep 2008 12:09:00 +0200</pubDate>
    <dc:creator>Guillaume Lelarge</dc:creator>
        <category>PostgreSQL</category>
            
    <description>    &lt;p&gt;&lt;em&gt;un peu de recherche&lt;/em&gt;&lt;/p&gt;


&lt;p&gt;Nous venons de voir qu'une table est un fichier dont le nom dépend du relfilenode de la table et qui se trouve dans le sous-répertoire correspondant à l'OID de la base de données, lui même appartenant au répertoire du tablespace.&lt;/p&gt;


&lt;p&gt;Déplacer une table d'un tablespace à un autre doit simplement revenir à faire un &lt;code&gt;mv&lt;/code&gt; du fichier vers le nouveau tablespace. Vérifions cela.&lt;/p&gt;


&lt;p&gt;Avant toute action sur les sources, commençons par les mettre à jour :&lt;/p&gt;


&lt;pre&gt;guillaume@laptop$ cd postgresql_src/pgsql/
guillaume@laptop$ cvs -q update -d
[... coupé parce que trop long ...]
P src/timezone/data/leapseconds
P src/timezone/data/northamerica
P src/timezone/data/southamerica
P src/timezone/data/zone.tab
P src/tools/msvc/Install.pm&lt;/pre&gt;


&lt;p&gt;OK. Plaçons-nous maintenant dans le répertoire src où se concentrent tous les fichiers sources de PostgreSQL (pour ceux qui connaissent le répertoire contrib, il contient bien des sources, mais ces sources ne font pas partis du moteur).&lt;/p&gt;


&lt;pre&gt;guillaume@laptop$ cd src&lt;/pre&gt;


&lt;p&gt;Recherchons toutes les occurences de « &lt;code&gt;set tablespace&lt;/code&gt; », mais filtrons les fichiers intermédiaires de compilation (suffixe &lt;code&gt;.o&lt;/code&gt;), les fichiers de traduction (suffixe &lt;code&gt;.po&lt;/code&gt;) et les fichiers binaires.&lt;/p&gt;


&lt;pre&gt;guillaume@laptop$ grep -ri &amp;quot;set tablespace&amp;quot; * | grep -v &amp;quot;\.po&amp;quot; | grep -v &amp;quot;\.o&amp;quot; | grep -v &amp;quot;Fichier binaire&amp;quot;
backend/parser/gram.y:                  /* ALTER TABLE &amp;lt;name&amp;gt; SET TABLESPACE &amp;lt;tablespacename&amp;gt; */
backend/parser/gram.y:                  | SET TABLESPACE name
backend/commands/tablecmds.c:           case AT_SetTableSpace:  /* SET TABLESPACE */
backend/commands/tablecmds.c:           case AT_SetTableSpace:  /* SET TABLESPACE */
backend/commands/tablecmds.c:                    * If we had SET TABLESPACE but no reason to reconstruct tuples,
backend/commands/tablecmds.c: * ALTER TABLE SET TABLESPACE
backend/commands/tablecmds.c:                            errmsg(&amp;quot;cannot have multiple SET TABLESPACE subcommands&amp;quot;)));
backend/commands/tablecmds.c: * Execute ALTER TABLE SET TABLESPACE for cases where there is no tuple
bin/psql/sql_help.h:      N_(&amp;quot;ALTER INDEX name RENAME TO new_name\nALTER INDEX name SET TABLESPACE tablespace_name\nALTER INDEX name SET ( storage_parameter = value &lt;a href=&quot;http://blog.guillaume.lelarge.info/index.php/post/2008/09/17/Developpons-une-nouvelle-fonctionnalite-pour-PostgreSQL-3/, ...&quot; title=&quot;, ...&quot;&gt;, ...&lt;/a&gt; )\nALTER INDEX name RESET ( storage_parameter &lt;a href=&quot;http://blog.guillaume.lelarge.info/index.php/post/2008/09/17/Developpons-une-nouvelle-fonctionnalite-pour-PostgreSQL-3/, ...&quot; title=&quot;, ...&quot;&gt;, ...&lt;/a&gt; )&amp;quot;) },
bin/psql/sql_help.h:      N_(&amp;quot;ALTER TABLE &lt;a href=&quot;http://blog.guillaume.lelarge.info/index.php/post/2008/09/17/Developpons-une-nouvelle-fonctionnalite-pour-PostgreSQL-3/ONLY&quot; title=&quot;ONLY&quot;&gt;ONLY&lt;/a&gt; name &lt;a href=&quot;http://blog.guillaume.lelarge.info/index.php/post/2008/09/17/Developpons-une-nouvelle-fonctionnalite-pour-PostgreSQL-3/*&quot; title=&quot;*&quot;&gt;*&lt;/a&gt;\n    action &lt;a href=&quot;http://blog.guillaume.lelarge.info/index.php/post/2008/09/17/Developpons-une-nouvelle-fonctionnalite-pour-PostgreSQL-3/, ...&quot; title=&quot;, ...&quot;&gt;, ...&lt;/a&gt;\nALTER TABLE &lt;a href=&quot;http://blog.guillaume.lelarge.info/index.php/post/2008/09/17/Developpons-une-nouvelle-fonctionnalite-pour-PostgreSQL-3/ONLY&quot; title=&quot;ONLY&quot;&gt;ONLY&lt;/a&gt; name &lt;a href=&quot;http://blog.guillaume.lelarge.info/index.php/post/2008/09/17/Developpons-une-nouvelle-fonctionnalite-pour-PostgreSQL-3/*&quot; title=&quot;*&quot;&gt;*&lt;/a&gt;\n RENAME &lt;a href=&quot;http://blog.guillaume.lelarge.info/index.php/post/2008/09/17/Developpons-une-nouvelle-fonctionnalite-pour-PostgreSQL-3/COLUMN&quot; title=&quot;COLUMN&quot;&gt;COLUMN&lt;/a&gt; column TO new_column\nALTER TABLE name\n    RENAME TO new_name\nALTER TABLE name\n    SET SCHEMA new_schema\n\nwhere action is one of:\n\n    ADD &lt;a href=&quot;http://blog.guillaume.lelarge.info/index.php/post/2008/09/17/Developpons-une-nouvelle-fonctionnalite-pour-PostgreSQL-3/COLUMN&quot; title=&quot;COLUMN&quot;&gt;COLUMN&lt;/a&gt; column type &lt;a href=&quot;http://blog.guillaume.lelarge.info/index.php/post/2008/09/17/Developpons-une-nouvelle-fonctionnalite-pour-PostgreSQL-3/column_constraint [ ...&quot; title=&quot;column_constraint [ ...&quot;&gt;column_constraint [ ...&lt;/a&gt; ]\n    DROP &lt;a href=&quot;http://blog.guillaume.lelarge.info/index.php/post/2008/09/17/Developpons-une-nouvelle-fonctionnalite-pour-PostgreSQL-3/COLUMN&quot; title=&quot;COLUMN&quot;&gt;COLUMN&lt;/a&gt; column &lt;a href=&quot;http://blog.guillaume.lelarge.info/index.php/post/2008/09/17/Developpons-une-nouvelle-fonctionnalite-pour-PostgreSQL-3/CASCADE&quot;&gt; RESTRICT &lt;/a&gt;\n    ALTER &lt;a href=&quot;http://blog.guillaume.lelarge.info/index.php/post/2008/09/17/Developpons-une-nouvelle-fonctionnalite-pour-PostgreSQL-3/COLUMN&quot; title=&quot;COLUMN&quot;&gt;COLUMN&lt;/a&gt; column TYPE type &lt;a href=&quot;http://blog.guillaume.lelarge.info/index.php/post/2008/09/17/Developpons-une-nouvelle-fonctionnalite-pour-PostgreSQL-3/USING expression&quot; title=&quot;USING expression&quot;&gt;USING expression&lt;/a&gt;\n    ALTER &lt;a href=&quot;http://blog.guillaume.lelarge.info/index.php/post/2008/09/17/Developpons-une-nouvelle-fonctionnalite-pour-PostgreSQL-3/COLUMN&quot; title=&quot;COLUMN&quot;&gt;COLUMN&lt;/a&gt; column SET DEFAULT expression\n    ALTER &lt;a href=&quot;http://blog.guillaume.lelarge.info/index.php/post/2008/09/17/Developpons-une-nouvelle-fonctionnalite-pour-PostgreSQL-3/COLUMN&quot; title=&quot;COLUMN&quot;&gt;COLUMN&lt;/a&gt; column DROP DEFAULT\n    ALTER &lt;a href=&quot;http://blog.guillaume.lelarge.info/index.php/post/2008/09/17/Developpons-une-nouvelle-fonctionnalite-pour-PostgreSQL-3/COLUMN&quot; title=&quot;COLUMN&quot;&gt;COLUMN&lt;/a&gt; column { SET | DROP } NOT NULL\n ALTER &lt;a href=&quot;http://blog.guillaume.lelarge.info/index.php/post/2008/09/17/Developpons-une-nouvelle-fonctionnalite-pour-PostgreSQL-3/COLUMN&quot; title=&quot;COLUMN&quot;&gt;COLUMN&lt;/a&gt; column SET STATISTICS integer\n    ALTER &lt;a href=&quot;http://blog.guillaume.lelarge.info/index.php/post/2008/09/17/Developpons-une-nouvelle-fonctionnalite-pour-PostgreSQL-3/COLUMN&quot; title=&quot;COLUMN&quot;&gt;COLUMN&lt;/a&gt; column SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN }\n    ADD table_constraint\n    DROP CONSTRAINT constraint_name &lt;a href=&quot;http://blog.guillaume.lelarge.info/index.php/post/2008/09/17/Developpons-une-nouvelle-fonctionnalite-pour-PostgreSQL-3/CASCADE&quot;&gt; RESTRICT &lt;/a&gt;\n    DISABLE TRIGGER &lt;a href=&quot;http://blog.guillaume.lelarge.info/index.php/post/2008/09/17/Developpons-une-nouvelle-fonctionnalite-pour-PostgreSQL-3/ALL&quot;&gt; trigger_name &lt;/a&gt;\n    ENABLE TRIGGER &lt;a href=&quot;http://blog.guillaume.lelarge.info/index.php/post/2008/09/17/Developpons-une-nouvelle-fonctionnalite-pour-PostgreSQL-3/ALL&quot;&gt; trigger_name &lt;/a&gt;\n    ENABLE REPLICA TRIGGER trigger_name\n ENABLE ALWAYS TRIGGER trigger_name\n    DISABLE RULE rewrite_rule_name\n    ENABLE RULE rewrite_rule_name\n    ENABLE REPLICA RULE rewrite_rule_name\n    ENABLE ALWAYS RULE rewrite_rule_name\n    CLUSTER ON index_name\n    SET WITHOUT CLUSTER\n    SET WITHOUT OIDS\n    SET ( storage_parameter = value &lt;a href=&quot;http://blog.guillaume.lelarge.info/index.php/post/2008/09/17/Developpons-une-nouvelle-fonctionnalite-pour-PostgreSQL-3/, ...&quot; title=&quot;, ...&quot;&gt;, ...&lt;/a&gt; )\n    RESET ( storage_parameter &lt;a href=&quot;http://blog.guillaume.lelarge.info/index.php/post/2008/09/17/Developpons-une-nouvelle-fonctionnalite-pour-PostgreSQL-3/, ...&quot; title=&quot;, ...&quot;&gt;, ...&lt;/a&gt; )\n INHERIT parent_table\n    NO INHERIT parent_table\n    OWNER TO new_owner\n    SET TABLESPACE new_tablespace&amp;quot;) },
bin/psql/tab-complete.c:                {&amp;quot;SET TABLESPACE&amp;quot;, &amp;quot;OWNER TO&amp;quot;, &amp;quot;RENAME TO&amp;quot;, &amp;quot;SET&amp;quot;, &amp;quot;RESET&amp;quot;, NULL};
bin/psql/tab-complete.c:        /* If we have TABLE &amp;lt;sth&amp;gt; SET TABLESPACE provide a list of tablespaces */
include/nodes/parsenodes.h:     AT_SetTableSpace,                       /* SET TABLESPACE */
interfaces/ecpg/preproc/preproc.y:              /* ALTER &amp;lt;name&amp;gt; SET TABLESPACE &amp;lt;tablespacename&amp;gt; */
interfaces/ecpg/preproc/preproc.y:              | SET TABLESPACE name
interfaces/ecpg/preproc/preproc.y:                      { $$ = cat2_str(make_str(&amp;quot;set tablespace&amp;quot;), $3); }
interfaces/ecpg/preproc/preproc.c:    { (yyval.str) = cat2_str(make_str(&amp;quot;set tablespace&amp;quot;), (yyvsp&lt;a href=&quot;http://blog.guillaume.lelarge.info/index.php/post/2008/09/17/Developpons-une-nouvelle-fonctionnalite-pour-PostgreSQL-3/(3) - (3)&quot; title=&quot;(3) - (3)&quot;&gt;(3) - (3)&lt;/a&gt;.str)); ;}
test/regress/input/tablespace.source:ALTER TABLE testschema.atable SET TABLESPACE testspace;
test/regress/input/tablespace.source:ALTER INDEX testschema.anindex SET TABLESPACE testspace;
test/regress/output/tablespace.source:ALTER TABLE testschema.atable SET TABLESPACE testspace;
test/regress/output/tablespace.source:ALTER INDEX testschema.anindex SET TABLESPACE testspace;&lt;/pre&gt;


&lt;p&gt;Les deux premières lignes concernent un fichier nommé &lt;code&gt;gram.y&lt;/code&gt;. Le suffixe &lt;code&gt;.y&lt;/code&gt; indique qu'il s'agit d'un fichier bison. &lt;a href=&quot;http://www.gnu.org/software/bison/&quot; hreflang=&quot;en&quot;&gt;Bison&lt;/a&gt; est un outil permettant de créer facilement un langage (pour les anciens Unixiens, Bison est la version GNU de yacc). C'est d'ailleurs ce fichier qu'il nous faudra modifier pour ajouter notre variante à l'instruction « &lt;code&gt;ALTER TABLE&lt;/code&gt; ». Le fichier &lt;code&gt;tablecmds.c&lt;/code&gt; a l'air de s'occuper de l'exécution concrète des commandes sur les tables. Son emplacement est d'ailleurs significatif. Le répertoire &lt;code&gt;backends&lt;/code&gt; contient tous les sources du serveur, le sous-répertoire &lt;code&gt;commands&lt;/code&gt; tous les sources concernant l'exécution des commandes SQL. Le fichier &lt;code&gt;sql_help.h&lt;/code&gt; semble contenir l'aide proposée par psql via la commande &lt;code&gt;\\h&lt;/code&gt;. Son emplacement est significatif là-aussi. Le répertoire &lt;code&gt;bin&lt;/code&gt; contient tous les sources des outils binaires de PostgreSQL (psql, initdb, pg_dump, etc.). Le nom du fichier &lt;code&gt;bin/psql/tab-complete.c&lt;/code&gt; nous donne une indication sur son utilité : il s'agit des sources pour la gestion de la complétion automatique dans psql. Quant au reste des fichiers, ils nous intéressent peu. Cela touche à ECPG et aux tests de régression. Beurk &lt;img src=&quot;/themes/default/smilies/smile.png&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Bref, le fichier qui nous intéresse le plus actuellement, c'est &lt;code&gt;tablecmds.h&lt;/code&gt;. Ouvrons-le et recherchons la première occurence de « &lt;code&gt;SET TABLESPACE&lt;/code&gt; ».&lt;/p&gt;


&lt;p&gt;La première occurence correspond au début d'une instruction &lt;code&gt;case&lt;/code&gt; :&lt;/p&gt;


&lt;pre&gt;case AT_SetTableSpace:	/* SET TABLESPACE */
  ATSimplePermissionsRelationOrIndex(rel);
  /* This command never recurses */
  ATPrepSetTableSpace(tab, rel, cmd-&amp;gt;name);
  pass = AT_PASS_MISC;	/* doesn't actually matter */
  break;&lt;/pre&gt;


&lt;p&gt;Deux fonctions sont appelées. D'après leur nom, on imagine facilement que la première va vérifier les droits de la table ou de l'index, et que la second prépare l'exécution du « SET TABLESPACE ». Si on regarde dans quelle fonction se trouve ces instructions (simplement en remontant un peu), on trouve l'en-tête suivant :&lt;/p&gt;


&lt;pre&gt;/*
 * ATPrepCmd
 *
 * Traffic cop for ALTER TABLE Phase 1 operations, including simple
 * recursion and permission checks.
 *
 * Caller must have acquired AccessExclusiveLock on relation already.
 * This lock should be held until commit.
 */&lt;/pre&gt;


&lt;p&gt;Cette fonction traite la phase 1 de l'instruction « ALTER TABLE », qui laisse penser qu'il y a d'autres phases et que cette phase 1 est la phase préparatoire.&lt;/p&gt;


&lt;p&gt;Bon, deuxième occurence :&lt;/p&gt;


&lt;pre&gt;case AT_SetTableSpace:	/* SET TABLESPACE */
  /*
   * Nothing to do here; Phase 3 does the work
   */
  break;&lt;/pre&gt;


&lt;p&gt;Ce code ne fait rien. On apprend juste que le travail se fait en trois phases et que seule la phase 3 fait le boulot.&lt;/p&gt;


&lt;p&gt;Occurence suivante :&lt;/p&gt;


&lt;pre&gt;/*
 * If we had SET TABLESPACE but no reason to reconstruct tuples,
 * just do a block-by-block copy.
 */
if (tab-&amp;gt;newTableSpace)
  ATExecSetTableSpace(tab-&amp;gt;relid, tab-&amp;gt;newTableSpace);&lt;/pre&gt;


&lt;p&gt;Là-aussi, peu de choses. On apprend seulement que le « SET TABLESPACE » semble fonctionner dans un mode copie bloc par bloc. Ce qui serait assez logique, tout PostgreSQL fonctionne par bloc.&lt;/p&gt;


&lt;p&gt;Occurence suivante :&lt;/p&gt;


&lt;pre&gt;/*
 * ALTER TABLE SET TABLESPACE
 */
static void
ATPrepSetTableSpace(AlteredTableInfo *tab, Relation rel, char *tablespacename)&lt;/pre&gt;


&lt;p&gt;Tiens, c'est la fonction appelée à la phase 1. Je ne vais pas mettre tout le code ici, mais voici l'explication du code de cette fonction. La fonction commence par vérifier si le tablespace existe. Dans le cas contraire, elle envoie un message « tablespace &amp;quot;%s&amp;quot; does not exist » avec un niveau ERROR. Ensuite, les droits sont vérifiés. En fait, un seul, celui de création sur le tablespace cible. Enfin, des informations sont sauvegardées pour la fameuse phase 3.&lt;/p&gt;


&lt;p&gt;Allez, courage, occurence suivante :&lt;/p&gt;


&lt;pre&gt;/*
 * Execute ALTER TABLE SET TABLESPACE for cases where there is no tuple
 * rewriting to be done, so we just want to copy the data as fast as possible.
 */
static void
ATExecSetTableSpace(Oid tableOid, Oid newTableSpace)&lt;/pre&gt;


&lt;p&gt;Cette fois, c'est l'occurence 3 qui fait appel à cette fonction. Pareil, je ne mets pas le code, mais une explication de son travail. Joie, c'est là que le boulot se fait. La fonction commence par poser un verrou AccessExclusiveLock sur la table. Les tables systèmes partagées ne sont pas déplaçables, donc elle vérifie aussi ce cas. Le tablespace cible est vérifié : il ne faut pas que ce soit pg_global, qui est le tablespace des objets systèmes non partagés. La fonction vérifie aussi le statut de la table : si elle est temporaire, elle n'est pas déplaçable. Dernière vérification, le tablespace cible est-il le tablespace où se trouve déjà la table ? Une fois toutes ces vérifications terminées, si le déplacement est possible, le boulot de copie va commencer. Tout d'abord, la fonction force l'enregistrement des blocs modifiés de cette table du cache de PostgreSQL (shared_buffers) sur le disque. Ensuite, la fonction exécute une autre fonction pour chaque fichier de la table source (en effet, une table est stockée sur plusieurs fichiers de 1 Go). Cette autre fonction, de nom copy_relation_data, s'occupe de la copie physique des données. En la parcourant rapidement, on s'aperçoit que le fichier source est copié bloc par bloc, c'est-à-dire 8 Ko par 8 Ko. Chaque copie de bloc est tracée dans les journaux de transactions dans le cas où l'archivage des journaux est activé. Les blocs ne passent pas par le cache disque de PostgreSQL, on ne risque donc pas de dévalider l'entièreté du cache simplement parce qu'on déplace des fichiers.&lt;/p&gt;


&lt;p&gt;Faisons un petit résumé. Le fichier &lt;code&gt;backend/commands/tablecmds.c&lt;/code&gt; contient toutes ls instructions permettant d'exécuter le déplacement d'une table/index d'un tablespace vers un autre. La copie est elle-même est tout simple : une copie de chaque bloc, un par un.&lt;/p&gt;


&lt;p&gt;On sait maintenant comment PostgreSQL réagit à l'ordre de déplacement d'une table. Essayons d'extrapoler. Si on veut déplacer une base de données complète vers un autre tablespace, cela revient à récupérer la liste des tables et index et à les envoyer un par un vers le nouveau tablespace. En fait, plus exactement, cela revient à déplacer les fichiers qui sont dans le &lt;em&gt;tablespace par défaut&lt;/em&gt; de la base de données vers le nouveau tablespace. En effet, si d'autres objets ont été déplacés volontairement par l'utilisateur, il ne faut pas les prendre en compte.&lt;/p&gt;


&lt;p&gt;Du coup, on peut écrire un pseudo code :&lt;/p&gt;


&lt;pre&gt;Pour toutes les tables et index compris dans le tablespace par défaut de la base de données ciblée,
 Faire l'équivalent d'un ALTER TABLE la table SET TABLESPACE le nouveau tablespace
Enregistrer que le tablespace par défaut est le tablespace cible.&lt;/pre&gt;


&lt;p&gt;Donc, le gros du travail est déjà fait. Ça nous simplifie considérablement la tâche. La prochaine étape est donc de faire accepter la nouvelle instruction à PostgreSQL en déclenchant l'exécution d'une fonction. Enfin ! On va écrire un peu de code &lt;img src=&quot;/themes/default/smilies/smile.png&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.guillaume.lelarge.info/index.php/post/2008/09/17/Developpons-une-nouvelle-fonctionnalite-pour-PostgreSQL-3/#comment-form</comments>
      <wfw:comment>http://blog.guillaume.lelarge.info/index.php/post/2008/09/17/Developpons-une-nouvelle-fonctionnalite-pour-PostgreSQL-3/#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.guillaume.lelarge.info/index.php/feed/rss2/comments/1059</wfw:commentRss>
      </item>
    
  <item>
    <title>Développons une nouvelle fonctionnalité pour PostgreSQL (2/?)</title>
    <link>http://blog.guillaume.lelarge.info/index.php/post/2008/09/16/Developpons-une-nouvelle-fonctionnalite-pour-PostgreSQL-2/</link>
    <guid isPermaLink="false">urn:md5:5775a504c8c2d0de45cb73305b6204b7</guid>
    <pubDate>Wed, 17 Sep 2008 22:03:00 +0200</pubDate>
    <dc:creator>Guillaume Lelarge</dc:creator>
        <category>PostgreSQL</category>
            
    <description>    &lt;p&gt;&lt;em&gt;... la réflexion avant l'action ...&lt;/em&gt;&lt;/p&gt;


&lt;p&gt;Avant de se lancer dans le code, commençons par nous demander ce qu'est un tablespace. Un tablespace est tout simplement un espace de stockage. Par défaut, après l'&lt;a href=&quot;http://docs.postgresql.fr/8.3/app-initdb.html&quot; hreflang=&quot;fr&quot;&gt;initdb&lt;/a&gt;, il existe déjà deux tablespaces « virtuels ».&lt;/p&gt;


&lt;pre&gt;guillaume@laptop$ export PGDIR=/home/guillaume/postgresql_devel
guillaume@laptop$ export PGDATA=$PGDIR/data
guillaume@laptop$ export PATH=$PGDIR/bin:$PATH
guillaume@laptop$ pg_ctl start
server starting
LOG:  database system was shut down at 2008-09-16 23:50:01 CEST
LOG:  autovacuum launcher started
LOG:  database system is ready to accept connections
guillaume@laptop$ psql -c &amp;quot;SELECT oid, spcname, spclocation FROM pg_tablespace&amp;quot; postgres
 oid  |  spcname   | spclocation
- - - +- - - - - - +- - - - - - -
 1663 | pg_default |
 1664 | pg_global  |
(2 rows)&lt;/pre&gt;


&lt;p&gt;Pourquoi virtuel ? parce qu'ils n'ont pas d'emplacement (colonne « Location » vide). En fait, ils désignent tous les deux le répertoire du cluster, c'est-à-dire &lt;code&gt;/home/guillaume/postgresql_devel/data&lt;/code&gt; dans mon cas.&lt;/p&gt;


&lt;p&gt;Créons un répertoire qui va servir à notre futur tablespace :&lt;/p&gt;


&lt;pre&gt;guillaume@laptop$ mkdir postgresql_tblspc&lt;/pre&gt;


&lt;p&gt;Ensuite, créons le tablespace en précisant le répertoire comme emplacement de stockage :&lt;/p&gt;


&lt;pre&gt;guillaume@laptop$ psql postgres
psql (8.4devel)
Type &amp;quot;help&amp;quot; for help.

postgres=# CREATE TABLESPACE mon_espace_de_stockage LOCATION '/home/guillaume/postgresql_tblspc';
CREATE TABLESPACE&lt;/pre&gt;


&lt;p&gt;Enfin, créons une table... ah, non, on va commencer par créer une base et on va s'y connecter :&lt;/p&gt;


&lt;pre&gt;postgres=# CREATE DATABASE guillaume;
CREATE DATABASE
postgres=# \c guillaume
psql (8.4devel)
You are now connected to database &amp;quot;guillaume&amp;quot;.&lt;/pre&gt;


&lt;p&gt;Créons enfin cette table :&lt;/p&gt;


&lt;pre&gt;guillaume=# CREATE TABLE t1 (id integer);
CREATE TABLE&lt;/pre&gt;


&lt;p&gt;Où est stockée cette table ?&lt;/p&gt;


&lt;pre&gt;guillaume=# SELECT relname, reltablespace, relfilenode FROM pg_class WHERE relname='t1';
 relname | reltablespace | relfilenode
- - - - -+- - - - - - - -+- - - - - - -
 t1      |             0 |       16386
(1 row)&lt;/pre&gt;


&lt;p&gt;Le tablespace de la table correspond à l'identifiant 0, donc une première réponse serait : dans le tablespace par défaut de la base de données.&lt;/p&gt;


&lt;pre&gt;guillaume=# SELECT oid, datname, dattablespace FROM pg_database WHERE datname='guillaume';
  oid  |  datname  | dattablespace
- - - -+- - - - - -+- - - - - - - -
 16384 | guillaume |          1663
(1 row)&lt;/pre&gt;


&lt;p&gt;Le tablespace de la base de données correspond lui à l'identifiant 1663. C'est le tablespace pg_default (voir plus haut). Logique, nous n'avons pas spécifié un tablespace particulier pour la base de données que nous venons de créer. Donc notre table se trouve dans le fichier nommé &lt;code&gt;16386&lt;/code&gt; (ie le relfilenode), fichier qui se trouve dans le répertoire &lt;code&gt;16384&lt;/code&gt; (OID de la base de données) du répertoire &lt;code&gt;base&lt;/code&gt; du répertoire &lt;code&gt;/home/guillaume/postgresql_devel/data&lt;/code&gt;. Autrement dit, il s'agit du fichier &lt;code&gt;/home/guillaume/postgresql_devel/data/base/16384/16386&lt;/code&gt; :&lt;/p&gt;


&lt;pre&gt;guillaume@laptop$ ll /home/guillaume/postgresql_devel/data/base/16384/16386
-rw&lt;del&gt;&lt;/del&gt;--- 1 guillaume guillaume 0 2008-09-17 20:18 /home/guillaume/postgresql_devel/data/base/16384/16386&lt;/pre&gt;


&lt;p&gt;Très bien. Et si on déplaçait cette table dans notre tablespace :&lt;/p&gt;


&lt;pre&gt;guillaume=# ALTER TABLE t1 SET TABLESPACE mon_espace_de_stockage;
ALTER TABLE
guillaume=# SELECT relname, reltablespace, relfilenode FROM pg_class WHERE relname='t1';
 relname | reltablespace | relfilenode
- - - - -+- - - - - - - -+- - - - - - -
 t1      |         16385 |       16386
(1 row)

guillaume=# SELECT * FROM pg_tablespace WHERE oid=16385;
        spcname         | spcowner |            spclocation            | spcacl
- - - - - - - - - - - - +- - - - - +- - - - - - - - - - - - - - - - - -+- - - - 
 mon_espace_de_stockage |       10 | /home/guillaume/postgresql_tblspc |
(1 row)&lt;/pre&gt;


&lt;p&gt;Très bien, Donc ma table doit être stockée dans le répertoire 16384 du répertoire du tablespace :&lt;/p&gt;


&lt;pre&gt;guillaume@laptop$ ll /home/guillaume/postgresql_tblspc/16384/16386
-rw&lt;del&gt;&lt;/del&gt;--- 1 guillaume guillaume 0 2008-09-17 21:47 /home/guillaume/postgresql_tblspc/16384/16386&lt;/pre&gt;


&lt;p&gt;Parfait.&lt;/p&gt;


&lt;p&gt;Je ne vais pas faire une démo aussi pour les index, mais le comportement est le même.&lt;/p&gt;


&lt;p&gt;En résumant tout ça, un tablespace n'est qu'un simple répertoire contenant un répertoire par base de données ayant des objets dans ce tablespace. Chaque objet de ce tablespace, table et index, sont stockées dans le sous répertoire correspondant à l'OID de la base de données.&lt;/p&gt;


&lt;p&gt;Maintenant qu'on sait &lt;em&gt;physiquement&lt;/em&gt; ce qu'est un tablespace, on va pouvoir regarder un peu le code.&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.guillaume.lelarge.info/index.php/post/2008/09/16/Developpons-une-nouvelle-fonctionnalite-pour-PostgreSQL-2/#comment-form</comments>
      <wfw:comment>http://blog.guillaume.lelarge.info/index.php/post/2008/09/16/Developpons-une-nouvelle-fonctionnalite-pour-PostgreSQL-2/#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.guillaume.lelarge.info/index.php/feed/rss2/comments/1057</wfw:commentRss>
      </item>
    
  <item>
    <title>Nouveau site web pg.fr</title>
    <link>http://blog.guillaume.lelarge.info/index.php/post/2008/09/16/Nouveau-site-web-pfrorg</link>
    <guid isPermaLink="false">urn:md5:acd3d83a1dee0cbe22501f182c77f41c</guid>
    <pubDate>Tue, 16 Sep 2008 20:51:00 +0200</pubDate>
    <dc:creator>Guillaume Lelarge</dc:creator>
        <category>PostgreSQL</category>
            
    <description>    &lt;p&gt;.. ou plutôt nouveau&lt;strong&gt;x&lt;/strong&gt; site&lt;strong&gt;s&lt;/strong&gt; web.&lt;/p&gt;


&lt;p&gt;Comme l'a annoncé Damien vendredi dernier sur la liste de discussion française, le site www.postgresqlfr.org a été entièrement revu. Plutôt que d'utiliser Drupal pour les news, le forum et certainement d'autres choses, nous sommes passés à plusieurs outils :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.dotclear.net&quot; hreflang=&quot;fr&quot;&gt;Dotclear&lt;/a&gt; pour les &lt;a href=&quot;http://blog.postgresql.fr&quot; hreflang=&quot;fr&quot;&gt;news&lt;/a&gt; ;&lt;/li&gt;
&lt;li&gt;une page web faite à la main pour l'index des docs, et une génération personnalisée des &lt;a href=&quot;http://docs.postgresql.fr&quot; hreflang=&quot;fr&quot;&gt;manuels&lt;/a&gt; (à partir de feuilles de style XSLT bien modifiées) ;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://fluxbb.org/&quot; hreflang=&quot;en&quot;&gt;FluxBB&lt;/a&gt; pour les &lt;a href=&quot;http://forums.postgresql.fr&quot;&gt;forums&lt;/a&gt; ;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.dokuwiki.org/&quot; hreflang=&quot;en&quot;&gt;dokuwiki&lt;/a&gt; pour le &lt;a href=&quot;http://asso.postgresql.fr&quot; hreflang=&quot;fr&quot;&gt;wiki de l'association&lt;/a&gt; ;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://trac.edgewall.org/&quot; hreflang=&quot;en&quot;&gt;trac&lt;/a&gt; pour les &lt;a href=&quot;http://trac.postgresql.fr/&quot; hreflang=&quot;fr&quot;&gt;sources des manuels&lt;/a&gt; ;&lt;/li&gt;
&lt;li&gt;et enfin &lt;a href=&quot;http://www.planetplanet.org&quot; hreflang=&quot;en&quot;&gt;planet&lt;/a&gt; pour l'&lt;a href=&quot;http://planete.postgresql.fr&quot; hreflang=&quot;fr&quot;&gt;agrégateur de blogs&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ils ont tous le même en-tête, la même feuille de style... on pourrait croire qu'il s'agit d'un seul et même site).&lt;/p&gt;


&lt;p&gt;Il a aussi été décidé qu'ils auront chacun leur alias :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;blog.postgresql.fr pour les news ;&lt;/li&gt;
&lt;li&gt;docs.postgresql.fr pour la documentation ;&lt;/li&gt;
&lt;li&gt;forums.postgresql.fr pour les forums ;&lt;/li&gt;
&lt;li&gt;asso.postgresql.fr pour le wiki ;&lt;/li&gt;
&lt;li&gt;planete.postgresql.fr pour la planète des blogueurs PostgreSQL français ;&lt;/li&gt;
&lt;li&gt;etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Le boulot qui reste est de transférer le contenu du Drupal dans Dotclear et le wiki. Ça ne devrait pas être long et ça permettra de se débarrasser du Drupal. Joie &lt;img src=&quot;/themes/default/smilies/smile.png&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Je suis vraiment très content du résultat. Si on regarde finement le codage, il y a encore du travail pour tout factoriser. Mais le résultat est convaincant. J'avais initié le travail sur les nouveaux sites le samedi 6 septembre. 11 jours de travail, à raison d'une ou deux heures en moyenne par jour, c'est rien du tout comparé au résultat. Oui, ça fait un peu auto-congratulation mais j'assume &lt;img src=&quot;/themes/default/smilies/wink.png&quot; alt=&quot;;)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;


&lt;p&gt;En tout cas, je vous invite à utiliser ces nouveaux sites et à m'indiquer tout dysfonctionnement. Je vais essayer de réagir promptement à tout problème constaté.&lt;/p&gt;


&lt;p&gt;&lt;em&gt;UPDATE&lt;/em&gt;: correction du titre (merci Damien &lt;img src=&quot;/themes/default/smilies/smile.png&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt; )&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.guillaume.lelarge.info/index.php/post/2008/09/16/Nouveau-site-web-pfrorg#comment-form</comments>
      <wfw:comment>http://blog.guillaume.lelarge.info/index.php/post/2008/09/16/Nouveau-site-web-pfrorg#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.guillaume.lelarge.info/index.php/feed/rss2/comments/1058</wfw:commentRss>
      </item>
    
  <item>
    <title>Développons une nouvelle fonctionnalité pour PostgreSQL (1/?)</title>
    <link>http://blog.guillaume.lelarge.info/index.php/post/2008/09/16/Developpons-une-nouvelle-fonctionnalite-pour-PostgreSQL-1/</link>
    <guid isPermaLink="false">urn:md5:b40a8ed82f343ed94a3d2fb5d0053d1a</guid>
    <pubDate>Tue, 16 Sep 2008 19:04:00 +0200</pubDate>
    <dc:creator>Guillaume Lelarge</dc:creator>
        <category>PostgreSQL</category>
            
    <description>    &lt;p&gt;&lt;em&gt;... get the source, Luke ...&lt;/em&gt;&lt;/p&gt;


&lt;p&gt;Commençons par récupérer les sources. Pour cela, nous devons passer par l'outil cvs. Choisissez un répertoire de travail, placez-vous y :&lt;/p&gt;


&lt;pre&gt;guillaume@laptop$ mkdir /home/guillaume/postgresql-src
guillaume@laptop$ cd /home/guillaume/postgresql-src&lt;/pre&gt;


&lt;p&gt;Lancez la commande de connexion à CVS :&lt;/p&gt;


&lt;pre&gt;guillaume@laptop$ export CVSROOT=:pserver:anoncvs@anoncvs.postgresql.org:/projects/cvsroot
guillaume@laptop$ cvs login
Logging in to :pserver:anoncvs@anoncvs.postgresql.org:2401/projects/cvsroot
CVS password:&lt;/pre&gt;


&lt;p&gt;Un mot de passe vous sera demandé. Saisissez ce que vous voulez, mais pas rien.&lt;/p&gt;


&lt;p&gt;Puis récupérez les sources de la version de développement (appelé HEAD dans l'argot CVS) :&lt;/p&gt;


&lt;pre&gt;guillaume@laptop$ cvs -z3 co -P pgsql
[...]
U pgsql/src/tutorial/funcs_new.c
U pgsql/src/tutorial/syscat.source
cvs checkout: Updating pgsql/src/tutorial/C-code
cvs checkout: Updating pgsql/src/utils
cvs checkout: Updating pgsql/src/win32&lt;/pre&gt;


&lt;p&gt;Après un bon moment et des dizaines de lignes affichées plus tard, vous vous trouverez avec un répertoire pgsql contenant les sources de la prochaine version de PostgreSQL. Vous pouvez le renommer si vous le souhaitez.&lt;/p&gt;


&lt;p&gt;On va en profiter pour compiler cette version. Tout d'abord, il faut lancer l'étape de configuration :&lt;/p&gt;


&lt;pre&gt;guillaume@laptop$ cd pgsql
guillaume@laptop$ export PGDIR=/home/guillaume/postgresql_devel
guillaume@laptop$ ./configure --prefix=$PGDIR
[...]
config.status: linking ./src/backend/port/sysv_shmem.c to src/backend/port/pg_shmem.c
config.status: linking ./src/backend/port/dynloader/linux.h to src/include/dynloader.h
config.status: linking ./src/include/port/linux.h to src/include/pg_config_os.h
config.status: linking ./src/makefiles/Makefile.linux to src/Makefile.port&lt;/pre&gt;


&lt;p&gt;L'option --prefix me permet de spécifier le répertoire où sera installé la version compilée de PostgreSQL. Changez-le par le répertoire qui vous intéresse.&lt;/p&gt;


&lt;p&gt;Enfin, lancez la compilation et l'installation :&lt;/p&gt;


&lt;pre&gt;guillaume@laptop$ make &amp;amp;&amp;amp; make install
[...]
make[1]: quittant le répertoire « /home/guillaume/postgresql_src/pgsql/config »
PostgreSQL installation complete.&lt;/pre&gt;


&lt;p&gt;Après quelques minutes de compilation (dépendant de votre machine), vous disposez d'une version pre-8.4 de PostgreSQL &lt;img src=&quot;/themes/default/smilies/smile.png&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Créons le cluster :&lt;/p&gt;


&lt;pre&gt;guillaume@laptop$ export PGDATA=$PGDIR/data
guillaume@laptop$ $PGDIR/bin/initdb
[...]
Success. You can now start the database server using:

    /home/guillaume/postgresql_devel/bin/postgres -D /home/guillaume/postgresql_devel/data
or
    /home/guillaume/postgresql_devel/bin/pg_ctl -D /home/guillaume/postgresql_devel/data -l logfile start&lt;/pre&gt;


&lt;p&gt;Et lançons PostgreSQL pour vérifier qu'il fonctionne bien :&lt;/p&gt;


&lt;pre&gt;guillaume@laptop$ $PGDIR/bin/pg_ctl -l logfile start
server starting
guillaume@laptop$ $PGDIR/bin/psql postgres
psql (8.4devel)
Type &amp;quot;help&amp;quot; for help.

postgres=# select version();
                                              version
&lt;del&gt;&lt;/del&gt;&lt;del&gt;&lt;/del&gt;&lt;del&gt;&lt;/del&gt;&lt;del&gt;&lt;/del&gt;&lt;del&gt;&lt;/del&gt;&lt;del&gt;&lt;/del&gt;&lt;del&gt;&lt;/del&gt;&lt;del&gt;&lt;/del&gt;&lt;del&gt;&lt;/del&gt;&lt;del&gt;&lt;/del&gt;&lt;del&gt;&lt;/del&gt;&lt;del&gt;&lt;/del&gt;&lt;del&gt;&lt;/del&gt;&lt;del&gt;&lt;/del&gt;&lt;del&gt;&lt;/del&gt;&lt;del&gt;&lt;/del&gt;&lt;del&gt;&lt;/del&gt;&lt;del&gt;&lt;/del&gt;&lt;del&gt;&lt;/del&gt;&lt;del&gt;&lt;/del&gt;&lt;del&gt;&lt;/del&gt;&lt;del&gt;&lt;/del&gt;&lt;del&gt;&lt;/del&gt;&lt;del&gt;&lt;/del&gt;---
 PostgreSQL 8.4devel on i686-pc-linux-gnu, compiled by GCC gcc (GCC) 4.2.4 (Ubuntu 4.2.4-1ubuntu1)
(1 row)&lt;/pre&gt;


&lt;p&gt;Youhou, on a une version fonctionnelle \o/&lt;/p&gt;


&lt;p&gt;(C'est une façon rapide de présenter la compilation de la version de développement PostgreSQL. N'hésitez pas à consulter l'&lt;a href=&quot;http://docs.postgresql.fr/8.3/cvs.html&quot; hreflang=&quot;fr&quot;&gt;annexe H, « Dépôt CVS »&lt;/a&gt;, pour plus d'informations.)&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.guillaume.lelarge.info/index.php/post/2008/09/16/Developpons-une-nouvelle-fonctionnalite-pour-PostgreSQL-1/#comment-form</comments>
      <wfw:comment>http://blog.guillaume.lelarge.info/index.php/post/2008/09/16/Developpons-une-nouvelle-fonctionnalite-pour-PostgreSQL-1/#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.guillaume.lelarge.info/index.php/feed/rss2/comments/1056</wfw:commentRss>
      </item>
    
  <item>
    <title>Développons une nouvelle fonctionnalité pour PostgreSQL (0/?)</title>
    <link>http://blog.guillaume.lelarge.info/index.php/post/2008/09/15/Developpons-une-nouvelle-fonctionnalite-pour-PostgreSQL-0/</link>
    <guid isPermaLink="false">urn:md5:fc0cc37e2c9aabb2b84135b6ae5d7238</guid>
    <pubDate>Mon, 15 Sep 2008 23:53:00 +0200</pubDate>
    <dc:creator>Guillaume Lelarge</dc:creator>
        <category>PostgreSQL</category>
            
    <description>    &lt;p&gt;Bonsoir,&lt;/p&gt;


&lt;p&gt;Ça fait un petit moment que ça trotte dans ma petite tête de malade.Pas le fait d'écrire un patch implantant une nouvelle fonctionnalité pour &lt;a href=&quot;http://www.postgresql.org/&quot; hreflang=&quot;en&quot;&gt;PostgreSQL&lt;/a&gt;, mais le fait d'en faire une série. Voilà c'est dit. Ce billet est le premier d'une (pas trop longue, j'espère) série sur le développement d'une nouvelle fonctionnalité pour PostgreSQL.&lt;/p&gt;


&lt;p&gt;Évidemment, j'aurais pu me plonger dans la &lt;a href=&quot;http://wiki.postgresql.org/wiki/Todo&quot; hreflang=&quot;en&quot;&gt;liste des fonctionnalités manquantes&lt;/a&gt;, mais j'avais déjà mon idée. Je l'avais depuis le début de l'été, c'est dire &lt;img src=&quot;/themes/default/smilies/smile.png&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt; Ce projet est donc d'ajouter la possibilité de modifier le &lt;a href=&quot;http://docs.postgresql.fr/8.3/manage-ag-tablespaces.html&quot; hreflang=&quot;fr&quot;&gt;tablespace&lt;/a&gt; d'une base de données. Je vous entends déjà dire que je suis à côté de mes pompes, que la fonctionnalité des tablespaces est présent depuis la version 8.0. Et vous avez raison. Enfin, pour le deuxième point en tout cas &lt;img src=&quot;/themes/default/smilies/smile.png&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt; En effet, les tablespaces sont présents depuis la version 8.0. Il est possible de créer, modifier et supprimer un tablespace. Il est possible de créer une relation (donc table ou index) dans un tablespace particulier, il est possible de la déplacer dans un autre. Pareil pour les bases de données. Pareil ? non, pas vraiment. Il est possible de créer une base de données dans un tablespace mais pas de déplacer le contenu d'une base de données existante dans un autre tablespace en une seule commande. J'avoue que quand j'ai appris cela au début de l'été, je suis tombé des nues. Je ne comprenais pas pourquoi on n'avait pas cette fonctionnalité qui semble découler tout logiquement du reste. J'ai une petite idée du pourquoi maintenant, mais je préfère garder le suspens &lt;img src=&quot;/themes/default/smilies/smile.png&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Donc, voilà. Le but est d'ajouter la fonctionnalité proposée par la commande : &lt;code&gt;ALTER DATABASE nom_base SET TABLESPACE nom_tablespace&lt;/code&gt;.&lt;/p&gt;


&lt;p&gt;Autant le dire tout de suite, je ne sais pas si je vais arriver réellement à coder cette fonctionnalité. Je ne sais pas non plus si, une fois développée, elle sera acceptée par l'équipe de développement de PostgreSQL. Et en fait, peu importe. Le but est d'apprendre. Il est aussi de montrer comment on peut (facilement) développer une nouvelle fonctionnalité. OK, pour le « facilement », je m'avance certainement un peu &lt;img src=&quot;/themes/default/smilies/smile.png&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Pourquoi ne pas en avoir fait un article pour &lt;a href=&quot;http://www.linuxmag-france.org/&quot; hreflang=&quot;fr&quot;&gt;GLMF&lt;/a&gt; ? tout simplement parce que je veux montrer ma progression au jour le jour, pas à pas. Faire un résumé ne me paraissait pas intéressant. Et dans ce cas, seul un blog permet de faire cela « à ma sauce ». Cela ne m'empêche pas de continuer à écrire pour GLMF. D'ailleurs, Denis vient de m'annoncer que « Opérations de maintenance pour PostgreSQL » sera dans le numéro 109 (à paraître fin septembre), et je suis en train de travailler (humm...) sur le prochain.&lt;/p&gt;


&lt;p&gt;Bon, alors, prêt à suivre ?&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.guillaume.lelarge.info/index.php/post/2008/09/15/Developpons-une-nouvelle-fonctionnalite-pour-PostgreSQL-0/#comment-form</comments>
      <wfw:comment>http://blog.guillaume.lelarge.info/index.php/post/2008/09/15/Developpons-une-nouvelle-fonctionnalite-pour-PostgreSQL-0/#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.guillaume.lelarge.info/index.php/feed/rss2/comments/1055</wfw:commentRss>
      </item>
    
  <item>
    <title>GSoC pgAdmin : pgScript</title>
    <link>http://blog.guillaume.lelarge.info/index.php/post/2008/09/15/GSoC-pgAdmin-%3A-pgScript</link>
    <guid isPermaLink="false">urn:md5:4cdb71f5d4c53132620e76479a40ce9e</guid>
    <pubDate>Mon, 15 Sep 2008 19:53:00 +0200</pubDate>
    <dc:creator>Guillaume Lelarge</dc:creator>
        <category>PostgreSQL</category>
        <category>pgadmin</category><category>postgresql</category>    
    <description>    &lt;p&gt;Deuxième GSoC de &lt;a href=&quot;http://www.pgadmin.org&quot; hreflang=&quot;fr&quot;&gt;pgAdmin&lt;/a&gt;, l'intégration de pgScript. Ce dernier est un outil permettant de réaliser de petits scripts mêlés avec des requêtes SQL. En effet, les langages style PL/pgsql demandent forcément la création d'une fonction. Or il se trouve des cas où créer une fonction n'a pas réellement un grand intérêt. Prenons un exemple que je viens tout juste d'avoir sur le canal IRC #postgresqlfr. Une personne a demandé comment modifier automatiquement tous les propriétaires des tables d'un schéma. Il n'existe pas vraiment de solutions en dehors d'exécuter la commande &lt;a href=&quot;http://docs.postgresql.fr/8.3/sql-altertable.html&quot; hreflang=&quot;fr&quot;&gt;ALTER TABLE&lt;/a&gt; sur chaque table. Le plus simple est de créer un petit script Bash ou Python pour cela. Maintenant, il sera aussi possible de créer un script pgscript.&lt;/p&gt;


&lt;p&gt;Tout se passe encore une fois dans l'outil de requêtage :&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://blog.guillaume.lelarge.info/public/pgadmin_pgscript/gsoc_pgscript.png&quot;&gt;&lt;img src=&quot;http://blog.guillaume.lelarge.info/public/pgadmin_pgscript/.gsoc_pgscript_m.jpg&quot; alt=&quot;gsoc_pgscript.png&quot; title=&quot;gsoc_pgscript.png, sep 2008&quot; /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Le script se rédige au même endroit que les requêtes SQL (bloc 1 dans la capture d'écran). Le code que j'ai placé se comprend assez facilement. Je lance la requête sur pg_tables, récupère toutes les lignes dans la variable tables, et parcours cette table dans une boucle while. Oui, je suis malheureusement obligé de faire aussi un count(*) pour récupérer le nombre de résultats, c'est très con et malheureusement c'est pas le seul truc très con dans cet outil. Ensuite je lance un &lt;em&gt;ALTER TABLE&lt;/em&gt; pour chaque table récupérée.&lt;/p&gt;


&lt;p&gt;Le bloc 2 indique la nouvelle icône qui permettra d'exécuter un pgScript. En cliquant dessus, le script est exécuté et le résultat s'affiche dans le bloc 3.&lt;/p&gt;


&lt;p&gt;Voilà, c'est tout simple. Quel intérêt par rapport à Python ou Perl ou $SCRIPTLANGUAGE ? aucune idée. Peut-être plus simple pour l'installation (il suffit d'installer pgAdmin, pas le langage Python, le module pyscopg2? etc). Mais ça fait un langage de plus à apprendre... alors quel intérêt ? J'avoue que je ne comprends pas vraiment. Il me semble bien plus simple de lancer un petit script bash du style :&lt;/p&gt;


&lt;pre&gt; psql -AtF &amp;quot;;&amp;quot; -c &amp;quot;select tablename from pg_tables where schemaname='public'&amp;quot; test | while read table
 do
   echo &amp;quot;alter table $table owner to postgres;&amp;quot;
 done | psql test&lt;/pre&gt;


&lt;p&gt;On pourrait aussi se dire que, après tout, c'est un langage de plus, donc du positif. Pas si sûr... parce que, maintenant, il va falloir le maintenir.&lt;/p&gt;


&lt;p&gt;PS : Oui, je sais qu'une réponse plus intéressante pour cet utilisateur est d'utiliser &lt;a href=&quot;http://docs.postgresql.fr/8.3/sql-reassign-owned.html&quot; hreflang=&quot;fr&quot;&gt;REASSIGN OWNED&lt;/a&gt;. C'est d'ailleurs ce que j'ai fait.&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.guillaume.lelarge.info/index.php/post/2008/09/15/GSoC-pgAdmin-%3A-pgScript#comment-form</comments>
      <wfw:comment>http://blog.guillaume.lelarge.info/index.php/post/2008/09/15/GSoC-pgAdmin-%3A-pgScript#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.guillaume.lelarge.info/index.php/feed/rss2/comments/1054</wfw:commentRss>
      </item>
    
  <item>
    <title>Articles dans GNU/Linux Magazine France</title>
    <link>http://blog.guillaume.lelarge.info/index.php/post/2008/08/30/Articles-dans-GNU/Linux-Magazine-France</link>
    <guid isPermaLink="false">urn:md5:ae1234f05a75e84dd72fe43b45077b78</guid>
    <pubDate>Sat, 30 Aug 2008 13:14:00 +0200</pubDate>
    <dc:creator>Guillaume Lelarge</dc:creator>
        <category>PostgreSQL</category>
            
    <description>    &lt;p&gt;... ou GLMF pour les intimes.&lt;/p&gt;


&lt;p&gt;Je viens de terminer l'avant-dernière relecture de mon prochain article, « Opérations de maintenance avec PostgreSQL », à paraître dans le numéro 109 de GLMF. Une occasion pour moi de revenir sur les articles que j'ai pu écrire pour eux.&lt;/p&gt;


&lt;p&gt;J'en suis à cinq articles. J'ai commencé avec une revue de la version 8.3 (&lt;a href=&quot;http://www.ed-diamond.com/produit.php?produit=525&quot; hreflang=&quot;fr&quot;&gt;numéro 103&lt;/a&gt;) et, après une pause dû à une mauvaise gestion de mon temps et à des vacances, j'ai essayé ensuite d'aborder chaque nouvelle fonctionnalité ou amélioration par un article détaillé : les nouvelles options des journaux applicatifs (&lt;a href=&quot;http://www.ed-diamond.com/produit.php?produit=579&quot; hreflang=&quot;fr&quot;&gt;numéro 105&lt;/a&gt;), les nouvelles vues systèmes (&lt;a href=&quot;http://www.ed-diamond.com/produit.php?produit=585&quot; hreflang=&quot;fr&quot;&gt;numéro 106&lt;/a&gt;). J'ai aussi abordé des points essentiels sur PostgreSQL comme la gestion de la mémoire (&lt;a href=&quot;http://www.ed-diamond.com/produit.php?produit=588&quot; hreflang=&quot;fr&quot;&gt;numéro 107&lt;/a&gt;) et les journaux de transactions (&lt;a href=&quot;http://www.ed-diamond.com/produit.php?produit=594&quot; hreflang=&quot;fr&quot;&gt;numéro 108&lt;/a&gt;). Bon, j'ai conservé toujours un chapitre sur les nouveautés de la 8.3, mais c'était clairement deux articles à part.&lt;/p&gt;


&lt;p&gt;J'avais déjà écrit un article sur &lt;a href=&quot;http://www.pgadmin.org&quot; hreflang=&quot;en&quot;&gt;pgAdmin&lt;/a&gt; pour &lt;a href=&quot;http://lpmagazine.org/prt/view/actualites.html&quot; hreflang=&quot;fr&quot;&gt;Linux+ DVD&lt;/a&gt; et trois sur PostgreSQL avec PHP dans &lt;a href=&quot;http://www.phpsolmag.org/prt/view/actualies.html&quot; hreflang=&quot;fr&quot;&gt;PHP Solutions&lt;/a&gt;. Mais écrire pour GLMF, c'est autre chose. C'est déjà un vieux rêve, datant certainement du premier numéro. À cette époque, je les achetais tous, et mes connaissances de Linux ont énormément progressé grâce aux différents rédacteurs des revues Linux de l'époque. Ça fait tout de même dix ans pour GLMF (lire l'édito de Denis sur le numéro de ce mois-ci). Bref, donc un rêve accompli pour commencer. Et depuis le temps que &lt;a href=&quot;http://little-monster.org.uk/&quot; hreflang=&quot;fr&quot;&gt;nessie&lt;/a&gt; me bottait le derrière à aller écrire pour eux, j'ai bien fait de suivre ces conseils. Ensuite, il faut avouer qu'il propose un contrat très attractif. Soit le rédacteur prend le contrat habituel (excellente rémunération, mais l'article n'est utilisable que par la maison d'édition Diamond Editions), soit le rédacteur prend le nouveau contrat. Ce dernier contrat est moins attractif côté rémunération (quoique bien supérieur à Linux+ DVD/PHP Solutions). Par contre, Diamond Editions s'engage à placer l'article sous &lt;a href=&quot;http://creativecommons.org/licenses/by-nc-nd/2.0/fr/legalcode&quot; hreflang=&quot;fr&quot;&gt;licence Creative Commons by-nc-nd (Paternité - Pas d'Utilisation Commerciale - Pas de Modification 2.0)&lt;/a&gt; quatre mois après sa diffusion. C'est cette dernière que j'ai choisi.&lt;/p&gt;


&lt;p&gt;Actuellement, les deux premiers articles ont passé le délai des quatres mois. J'ai donc eu le plaisir hier de les mettre en ligne sur le site communautaire de &lt;a href=&quot;http://www.dalibo.com&quot; hreflang=&quot;fr&quot;&gt;Dalibo&lt;/a&gt; : « &lt;a href=&quot;http://www.dalibo.org/doku.php/glmf103_postgresql_8.3_quoi_de_neuf&quot; hreflang=&quot;fr&quot;&gt;PostgreSQL 8.3 : quoi de neuf ?&lt;/a&gt; » et « &lt;a href=&quot;http://www.dalibo.org/doku.php/glmf105_nouvelle_gestion_des_journaux_applicatifs_avec_postgresql_8.3&quot; hreflang=&quot;fr&quot;&gt;Nouvelle gestion des journaux applicatifs sous PostgreSQL 8.3&lt;/a&gt; ».&lt;/p&gt;


&lt;p&gt;Bonne lecture &lt;img src=&quot;/themes/default/smilies/smile.png&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.guillaume.lelarge.info/index.php/post/2008/08/30/Articles-dans-GNU/Linux-Magazine-France#comment-form</comments>
      <wfw:comment>http://blog.guillaume.lelarge.info/index.php/post/2008/08/30/Articles-dans-GNU/Linux-Magazine-France#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.guillaume.lelarge.info/index.php/feed/rss2/comments/1049</wfw:commentRss>
      </item>
    
  <item>
    <title>pgAdmin : enfin des dialogues redimensionnables</title>
    <link>http://blog.guillaume.lelarge.info/index.php/post/2008/08/26/pgAdmin-%3A-enfin-des-dialogues-redimensionnables</link>
    <guid isPermaLink="false">urn:md5:cf3bc662b04a86b2a7360b01e0714d26</guid>
    <pubDate>Wed, 27 Aug 2008 00:41:00 +0200</pubDate>
    <dc:creator>Guillaume Lelarge</dc:creator>
        <category>PostgreSQL</category>
        <category>pgadmin</category><category>postgresql</category>    
    <description>    &lt;p&gt;Je travaille dessus depuis le 15 juin. Mon but était de faciliter la création de nouveaux dialogues (ne pas avoir à calculer l'emplacement d'un composant par exemple... je ne vous raconte pas le cauchemard qu'était le placement d'un élément en haut d'un dialogue car cela voulait dire recalculer la position de tous les éléments situés en dessous). C'était aussi de permettre aux utilisateurs de dimensionner les dialogues à la taille que leur permettait leur écran. Tout ceci est maintenant possible.&lt;/p&gt;


&lt;p&gt;La réalisation de ce patch m'a demandé de comprendre l'écriture de fichiers XRC (des fichiers XML de définition des fenêtres/dialogues). Ce ne fut pas une partie de plaisir car le protocole est très peu décrit. J'ai quand même fini par trouver cette &lt;a href=&quot;http://wiki.wxwidgets.org/Using_XML_Resources_with_XRC&quot; hreflang=&quot;fr&quot;&gt;page de wiki&lt;/a&gt; mais la plupart du temps, ce fut surtout un processus du style modification/test/modification/test/etc pour comprendre le fonctionnement du schmilblick que je commence à bien maîtriser. Bien sûr, il existe des outils pour dessiner l'interface d'une fenêtre et générer automatiquement le fichier XRC mais je les trouve peu commode d'utilisation et la plupart sont très buggés. Donc, c'est du manuel. Vive &lt;a href=&quot;http://www.vim.org/&quot; hreflang=&quot;en&quot;&gt;gvim&lt;/a&gt; &lt;img src=&quot;/themes/default/smilies/smile.png&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Bref, après deux mois et demi de travail, j'arrive à un gros patch non complet car j'ai encore des soucis avec sept dialogues. J'ai donc commité tous les dialogues qui ne posaient pas de problème pour mieux travailler à la résolution des problèmes constatés. En effet, conserver un gros patch sur les trois architectures de pgAdmin n'est pas chose aisée.&lt;/p&gt;


&lt;p&gt;J'ai commité ce patch cet après-midi. Tout a l'air d'aller bien.&lt;/p&gt;


&lt;p&gt;J'ai relancé la discussion sur le patch qui a initié ce gros travail, à savoir le &lt;a href=&quot;http://blog.guillaume.lelarge.info/index.php/post/2008/06/15/Une-journee-pgAdmin&quot; hreflang=&quot;fr&quot;&gt;patch sur la possibilité de modifier le champ texte SQL du dialogue de propriétés des objets&lt;/a&gt;. Dave a déjà trouvé deux bugs sur Mac OS X. Je viens de corriger un bug, bien que non relatif à mon patch. Je n'arrive pas à reproduire le deuxième. Cette correction m'a permis de comprendre comment corriger un des dialogues non commités. Et après un peu de travail, je n'ai plus que quatre dialogues à revoir : fonction, rôle, type et schedule (planification des jobs de pgAgent). J'ai bon espoir que tout ceci soit fini rapidement.&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.guillaume.lelarge.info/index.php/post/2008/08/26/pgAdmin-%3A-enfin-des-dialogues-redimensionnables#comment-form</comments>
      <wfw:comment>http://blog.guillaume.lelarge.info/index.php/post/2008/08/26/pgAdmin-%3A-enfin-des-dialogues-redimensionnables#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.guillaume.lelarge.info/index.php/feed/rss2/comments/1048</wfw:commentRss>
      </item>
    
  <item>
    <title>GSoC pgAdmin : Graphical Query Builder</title>
    <link>http://blog.guillaume.lelarge.info/index.php/post/2008/08/19/GSoC-pgAdmin-%3A-Graphical-Query-Builder</link>
    <guid isPermaLink="false">urn:md5:5329d71a3e345ff39fd71db5b92a6f03</guid>
    <pubDate>Tue, 19 Aug 2008 19:08:00 +0200</pubDate>
    <dc:creator>Guillaume Lelarge</dc:creator>
        <category>PostgreSQL</category>
        <category>pgadmin</category><category>postgresql</category>    
    <description>    &lt;p&gt;GSoC, c'est le Google Summer of Code. Cette année, pgAdmin a deux projets sponsorisés dans ce cadre. Le premier a pour but d'intégrer pgScript dans pgAdmin. Mais je vais parler aujourd'hui du deuxième dont le but est d'ajouter un constructeur graphique de requête. En gros, le but est de faire ce que Microsoft Access et OpenOffice.org Base font : permettre d'écrire une requête sans taper une ligne de SQL. Le premier patch que j'ai pu testé n'avait pas permis de voir grand chose, à cause d'erreurs de compilation. Le dernier patch, envoyé hier soir, permet beaucoup plus de choses. En fait, il est même complet.&lt;/p&gt;


&lt;p&gt;Pour accéder à cette fonctionnalité, il faut ouvrir l'outil de requêtage :&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://blog.guillaume.lelarge.info/public/pgadmin_gqb/gqb1.png&quot;&gt;&lt;img src=&quot;http://blog.guillaume.lelarge.info/public/pgadmin_gqb/.gqb1_m.jpg&quot; alt=&quot;gqb1.png&quot; title=&quot;gqb1.png, aoû 2008&quot; /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Vous voyez la différence ? c'est pas simple. Il s'agit du nouvel onglet, nommé « Graphical Query Builder ». En cliquant sur cet onglet, on voit trois nouveaux panneaux. Le premier permet de sélectionner tables et vues. Pour cela, il suffit de cliquer sur la table souhaitée et la déplacer sur le second panneau. Ce dernier va accueillir tables et vues à requêter. Il va permettre de faire des liens entre elles et de sélectionner les colonnes à afficher. Le dernier panneau dispose de trois onglets:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;le premier onglet permet de sélectionner les colonnes à afficher&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;le deuxième onglet permet de faire des filtres&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;http://blog.guillaume.lelarge.info/public/pgadmin_gqb/gqb2.png&quot;&gt;&lt;img src=&quot;http://blog.guillaume.lelarge.info/public/pgadmin_gqb/.gqb2_m.jpg&quot; alt=&quot;gqb2.png&quot; title=&quot;gqb2.png, aoû 2008&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;le troisième onglet permet de trier le résultat&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;http://blog.guillaume.lelarge.info/public/pgadmin_gqb/gqb3.png&quot;&gt;&lt;img src=&quot;http://blog.guillaume.lelarge.info/public/pgadmin_gqb/.gqb3_m.jpg&quot; alt=&quot;gqb3.png&quot; title=&quot;gqb3.png, aoû 2008&quot; /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;La requête est disponible après avoir cliqué sur le bouton d'exécution :&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://blog.guillaume.lelarge.info/public/pgadmin_gqb/gqb4.png&quot;&gt;&lt;img src=&quot;http://blog.guillaume.lelarge.info/public/pgadmin_gqb/.gqb4_m.jpg&quot; alt=&quot;gqb4.png&quot; title=&quot;gqb4.png, aoû 2008&quot; /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Le tout est très simple à utiliser. Comme je l'ai dit dans mon mail de retour suite à mes tests, tout me paraît bon en dehors de la fenêtre de saisie des valeurs. Le commit réalisé par Dave Page ce soir montre que le dialogue corrige le seul vrai problème que j'avais trouvé (un problème de redimensionnement de la fenêtre de saisie).&lt;/p&gt;


&lt;p&gt;Enfin un GSoC qui se termine avec succès pour pgAdmin. Et une évolution majeure de pgAdmin pour la prochaine version, la 1.10.&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.guillaume.lelarge.info/index.php/post/2008/08/19/GSoC-pgAdmin-%3A-Graphical-Query-Builder#comment-form</comments>
      <wfw:comment>http://blog.guillaume.lelarge.info/index.php/post/2008/08/19/GSoC-pgAdmin-%3A-Graphical-Query-Builder#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.guillaume.lelarge.info/index.php/feed/rss2/comments/1046</wfw:commentRss>
      </item>
    
  <item>
    <title>Journée satisfaisante pour pgAdmin</title>
    <link>http://blog.guillaume.lelarge.info/index.php/post/2008/08/11/Journee-satisfaisante-pour-pgAdmin</link>
    <guid isPermaLink="false">urn:md5:c32c5c716026ac29e6fd977fedef8860</guid>
    <pubDate>Mon, 11 Aug 2008 23:05:00 +0200</pubDate>
    <dc:creator>Guillaume Lelarge</dc:creator>
        <category>PostgreSQL</category>
        <category>pgadmin</category><category>postgresql</category>    
    <description>    &lt;p&gt;En effet, j'ai commité deux patchs sur lesquels je travaillais depuis un moment.&lt;/p&gt;


&lt;p&gt;Le premier concerne le support des objets FTS. J'ai déjà pas mal bloggué dessus, je n'y reviendrais donc pas. Seul point à savoir, j'ai eu quelques modifications à faire, mais cela n'a pas changé fondamentalement l'interface. Les copies d'écran déjà disponibles sont donc encore d'actualité (pour la plupart).&lt;/p&gt;


&lt;p&gt;Le second concerne le support de la modification des tables héritées sur une table existante. Cette fonctionnalité n'est disponible que depuis la version 8.2 de PostgreSQL, mais pgAdmin ne permettait pas, avec son interface, de modifier les tables héritées une fois la table créée. J'ai ajouté cette possibilité, mais ça n'a pas été une partie de plaisir. Le fonctionnement est assez complexe à comprendre... alors à coder... Mais bon, c'est fait.&lt;/p&gt;


&lt;p&gt;Bonne journée, non ? &lt;img src=&quot;/themes/default/smilies/smile.png&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.guillaume.lelarge.info/index.php/post/2008/08/11/Journee-satisfaisante-pour-pgAdmin#comment-form</comments>
      <wfw:comment>http://blog.guillaume.lelarge.info/index.php/post/2008/08/11/Journee-satisfaisante-pour-pgAdmin#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.guillaume.lelarge.info/index.php/feed/rss2/comments/1041</wfw:commentRss>
      </item>
    
  <item>
    <title>Ajout de la recherche plein texte sur pgAdmin3 - 3ème jour</title>
    <link>http://blog.guillaume.lelarge.info/index.php/post/2008/07/30/Ajout-de-la-recherche-plein-texte-sur-pgAdmin3-3eme-jour</link>
    <guid isPermaLink="false">urn:md5:f3c090d6e4abcb33192bc39ad6bf2bea</guid>
    <pubDate>Wed, 30 Jul 2008 23:47:00 +0200</pubDate>
    <dc:creator>Guillaume Lelarge</dc:creator>
        <category>PostgreSQL</category>
        <category>pgadmin</category><category>postgresql</category>    
    <description>    &lt;p&gt;Clairement, j'ai attaqué le gros morceau. J'ai mis pas mal de temps à comprendre exactement le coup des configurations et des tokens associés. Et des dictionnaires associés aux tokens. Etc, etc.&lt;/p&gt;


&lt;p&gt;Bref, le résultat de la journée, c'est ça :&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://blog.guillaume.lelarge.info/public/pgadmin_fts/fts9.png&quot;&gt;&lt;img src=&quot;http://blog.guillaume.lelarge.info/public/pgadmin_fts/.fts9_s.jpg&quot; alt=&quot;Onglet Tokens des propriétés d'une configuration&quot; title=&quot;Onglet Tokens des propriétés d'une configuration, juil 2008&quot; /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Oui, ça a l'air très peu. Il a quand même fallu que je me creuse sérieusement les méninges pour comprendre comment fonctionnent ces foutues configurations. Mais ça ne suffit pas. Il faut pouvoir ensuite le coder et surtout trouver l'interface adéquate. Bref, ça n'a pas été simple.&lt;/p&gt;


&lt;p&gt;Le gros intérêt, c'est que, maintenant, tout est codé. J'ai même réussi à réaliser l'&lt;a href=&quot;http://docs.postgresqlfr.org/current/textsearch-configuration.html&quot; hreflang=&quot;fr&quot;&gt;exemple du chapitre 12 de la documentation&lt;/a&gt;. J'ai même essayé de faire un screencast avec &lt;a href=&quot;http://www.kde-apps.org/content/show.php/Krecordmydesktop?content=54081&quot; hreflang=&quot;en&quot;&gt;krecordmydesktop&lt;/a&gt;, mais soit il est planté soit il est très lent. Impossible d'obtenir le fichier vidéo Ogg Vorbis.&lt;/p&gt;


&lt;p&gt;Bref, il ne reste plus que du debug approfondi sur toutes les plateformes. La fin de ce projet est proche &lt;img src=&quot;/themes/default/smilies/smile.png&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.guillaume.lelarge.info/index.php/post/2008/07/30/Ajout-de-la-recherche-plein-texte-sur-pgAdmin3-3eme-jour#comment-form</comments>
      <wfw:comment>http://blog.guillaume.lelarge.info/index.php/post/2008/07/30/Ajout-de-la-recherche-plein-texte-sur-pgAdmin3-3eme-jour#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.guillaume.lelarge.info/index.php/feed/rss2/comments/1031</wfw:commentRss>
      </item>
    
  <item>
    <title>Ajout de la recherche plein texte sur pgAdmin3 - 2ème jour</title>
    <link>http://blog.guillaume.lelarge.info/index.php/post/2008/07/29/Ajout-de-la-recherche-plein-texte-sur-pgAdmin3-2eme-jour</link>
    <guid isPermaLink="false">urn:md5:17fa491f76756578e6dbfe70cfd07515</guid>
    <pubDate>Tue, 29 Jul 2008 23:01:00 +0200</pubDate>
    <dc:creator>Guillaume Lelarge</dc:creator>
        <category>PostgreSQL</category>
        <category>pgadmin</category><category>postgresql</category>    
    <description>    &lt;p&gt;Comme prévu, j'ai ajouté la gestion des deux derniers objets. Voici une copie du navigateur d'objets (en n'affichant que les objets concernant la recherche plein texte) :&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://blog.guillaume.lelarge.info/public/pgadmin_fts/fts5.png&quot; alt=&quot;fts5.png&quot; title=&quot;fts5.png, juil 2008&quot; /&gt;&lt;/p&gt;


&lt;p&gt;La fenêtre sur les propriétés d'un analyseur :&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://blog.guillaume.lelarge.info/public/pgadmin_fts/fts6.png&quot;&gt;&lt;img src=&quot;http://blog.guillaume.lelarge.info/public/pgadmin_fts/.fts6_s.jpg&quot; alt=&quot;fts6.png&quot; title=&quot;fts6.png, juil 2008&quot; /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Et celle sur les propriétés d'un dictionnaire :&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://blog.guillaume.lelarge.info/public/pgadmin_fts/fts7.png&quot;&gt;&lt;img src=&quot;http://blog.guillaume.lelarge.info/public/pgadmin_fts/.fts7_s.jpg&quot; alt=&quot;fts7.png&quot; style=&quot;float:left; margin: 0 1em 1em 0;&quot; title=&quot;fts7.png, juil 2008&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;http://blog.guillaume.lelarge.info/public/pgadmin_fts/fts8.png&quot;&gt;&lt;img src=&quot;http://blog.guillaume.lelarge.info/public/pgadmin_fts/.fts8_s.jpg&quot; alt=&quot;fts8.png&quot; style=&quot;display:block; margin:0 auto;&quot; title=&quot;fts8.png, juil 2008&quot; /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Le deuxième onglet d'un dictionnaire concerne les options à fournir au modèle associé.&lt;/p&gt;


&lt;p&gt;Le développement a donc bien avancé. Dans le boulot qui reste, il faut que je revienne sur la fenêtre des propriétés des configurations. Je dois lui ajouter un deuxième onglet pour gérer la modification du contenu d'une configuration. Je dois aussi tester mon code sur Mac et Windows.&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.guillaume.lelarge.info/index.php/post/2008/07/29/Ajout-de-la-recherche-plein-texte-sur-pgAdmin3-2eme-jour#comment-form</comments>
      <wfw:comment>http://blog.guillaume.lelarge.info/index.php/post/2008/07/29/Ajout-de-la-recherche-plein-texte-sur-pgAdmin3-2eme-jour#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.guillaume.lelarge.info/index.php/feed/rss2/comments/1030</wfw:commentRss>
      </item>
    
  <item>
    <title>Ajout de la recherche plein texte sur pgAdmin3</title>
    <link>http://blog.guillaume.lelarge.info/index.php/post/2008/07/28/Ajout-de-la-recherche-plein-texte-sur-pgAdmin3</link>
    <guid isPermaLink="false">urn:md5:b000f1576989a77985ea3ba5e54bfe18</guid>
    <pubDate>Mon, 28 Jul 2008 23:36:00 +0200</pubDate>
    <dc:creator>Guillaume Lelarge</dc:creator>
        <category>PostgreSQL</category>
        <category>pgadmin</category><category>postgresql</category>    
    <description>    &lt;p&gt;Cette semaine, je bosse à plein temps sur &lt;a href=&quot;http://www.pgadmin.org/&quot; hreflang=&quot;fr&quot;&gt;pgAdmin&lt;/a&gt;. Merci encore à &lt;a href=&quot;http://www.dalibo.com/&quot; hreflang=&quot;fr&quot;&gt;Dalibo&lt;/a&gt; pour cette semaine &lt;img src=&quot;/themes/default/smilies/smile.png&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Le but principal de cette semaine de codage est d'ajouter le support des objets de la recherche plein texte dans pgAdmin. En effet, même la version 1.8, sortie pourtant en même temps que la version 8.3 de &lt;a href=&quot;http://www.postgresql.org&quot; hreflang=&quot;en&quot;&gt;PostgreSQL&lt;/a&gt;, ne permet pas de gérer ces objets par l'interface graphique. Mon travail revient donc à ajouter les dialogues permettant de créer/modifier/supprimer une configuration, un dictionnaire, un analyseur et un modèle de recherche plein texte.&lt;/p&gt;


&lt;p&gt;J'ai commencé avec la fenêtre de configuration. En voici une copie d'écran :&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://blog.guillaume.lelarge.info/public/pgadmin_fts/fts3.png&quot;&gt;&lt;img src=&quot;http://blog.guillaume.lelarge.info/public/pgadmin_fts/.fts3_s.jpg&quot; alt=&quot;fts3.png&quot; title=&quot;Fenêtre des propriétés d'une configuration de recherche plein texte&quot; /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Le travail a été assez simple. J'ai bêtement copié le dialogue des propriétés des opérateurs, et modifié de façon approprié. Du coup, l'après-midi, j'ai pu continuer avec la fenêtre des modèles :&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://blog.guillaume.lelarge.info/public/pgadmin_fts/fts4.png&quot;&gt;&lt;img src=&quot;http://blog.guillaume.lelarge.info/public/pgadmin_fts/.fts4_s.jpg&quot; alt=&quot;fts4.png&quot; title=&quot;Fenêtre des propriétés d'un modèle de recherche plein texte&quot; /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Concernant le navigateur de bases de données, &lt;a href=&quot;http://archives.postgresql.org/pgadmin-hackers/2008-06/msg00130.php&quot; hreflang=&quot;en&quot;&gt;j'avais pensé au départ placer un noeud &amp;quot;Recherche plein texte&amp;quot; au même niveau que celui des schémas, des langages, etc.&lt;/a&gt; Tout à fait comme le fait &lt;a href=&quot;http://phppgadmin.sourceforge.net/&quot; hreflang=&quot;en&quot;&gt;phpPgAdmin&lt;/a&gt;. Cependant, en implantant le premier dialogue, je me suis aperçu que les objets dépendaient aussi des schémas. Du coup, j'ai mis les objets de la recherche plein texte dans les schémas, ce qui nous donne ceci :&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://blog.guillaume.lelarge.info/public/pgadmin_fts/fts1.png&quot; alt=&quot;fts1.png&quot; title=&quot;Navigateur d'objets&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Dans la partie droite, nous avons les infos spécifiques à l'objet sélectionné, rien que du très habituel :&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://blog.guillaume.lelarge.info/public/pgadmin_fts/fts2.png&quot; alt=&quot;fts2.png&quot; title=&quot;Tableau des propriétés&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Bref, que du bon. Demain, je m'attaque tout d'abord à la fenêtre des analyseurs (qui sera une simple copie de celle des modèles), puis à celle dictionnaire, un peu plus complexe car il faut gérer un deuxième onglet).&lt;/p&gt;


&lt;p&gt;PS : toutes les fenêtres ajoutées sont évidemment directement redimensionnables.&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.guillaume.lelarge.info/index.php/post/2008/07/28/Ajout-de-la-recherche-plein-texte-sur-pgAdmin3#comment-form</comments>
      <wfw:comment>http://blog.guillaume.lelarge.info/index.php/post/2008/07/28/Ajout-de-la-recherche-plein-texte-sur-pgAdmin3#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.guillaume.lelarge.info/index.php/feed/rss2/comments/1029</wfw:commentRss>
      </item>
    
  <item>
    <title>Travaux en cours sur pgAdmin</title>
    <link>http://blog.guillaume.lelarge.info/index.php/post/2008/07/19/Travaux-en-cours-sur-pgAdmin</link>
    <guid isPermaLink="false">urn:md5:b820bc015de037da7980cb9d110ff714</guid>
    <pubDate>Sat, 19 Jul 2008 19:11:00 +0200</pubDate>
    <dc:creator>Guillaume Lelarge</dc:creator>
        <category>PostgreSQL</category>
        <category>pgadmin</category><category>postgresql</category>    
    <description>    &lt;p&gt;Depuis ma &amp;quot;&lt;a href=&quot;http://blog.guillaume.lelarge.info/index.php/post/2008/06/15/Une-journee-pgAdmin&quot; hreflang=&quot;fr&quot;&gt;journée de codage sur pgAdmin&lt;/a&gt;&amp;quot;, j'ai continuer à bosser intensément sur le code de pgAdmin.&lt;/p&gt;


&lt;p&gt;Concernant le patch sur l'activation du champ texte de la requête SQL, il a été décidé avec Dave Page que j'allais l'intégrer dans une revue des dialogues. Mon idée est de revoir tous les dialogues de propriétés des objets pour ajouter des composants (wxFlexGridSizer et wxSizer pour les connaisseurs) permettant un dimensionnement automatique des dialogues. Cela permet notamment d'autoriser le changement de taille des dialogues par l'utilisateur comme le font actuellement les dialogues sur les fonctions et les triggers. Donc, plus simplement, ce travail va revoir l'intégralité des dialogues pour permettre leur redimensionnement par les utilisateurs. C'est un gros boulot. Dès le premier dialogue, je pense être tombé sur un bug de wxWidgets sur Mac. Pfff, il est pas prêt de se terminer, ce patch.&lt;/p&gt;


&lt;p&gt;L'autre gros travail concerne la fenêtre d'état du serveur. Il se fera en plusieurs patchs suivant cette découpe :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Remplacer le composant wxNotebook par wxAuiNotebook pour que les utilisateurs puissent fermer certains onglets, arranger l'ordre des onglets restants via drag-and-drop, etc.&lt;/li&gt;
&lt;li&gt;Permettre d'ouvrir plusieurs fenêtres d'état du serveur (ça permettra de voir plusieurs rapports d'un même serveur en même temps, ou de surveiller plusieurs serveurs).&lt;/li&gt;
&lt;li&gt;Ajouter une barre d'outils pour modifier le serveur surveillé, le délai de rafraichissement et ajouter un filtre et/ou un tri.&lt;/li&gt;
&lt;li&gt;Ajouter des rapports sous forme de graphes pour les vues statistiques (à la &amp;quot;Gnome System Monitor&amp;quot;).&lt;/li&gt;
&lt;li&gt;Améliorer l'affichage des journaux applicatifs (en affichant avec différentes colonnes, en permettant tri et filtre).&lt;/li&gt;
&lt;li&gt;Ajouter une option en ligne de commande pour démarrer la fenêtre d'état du serveur.&lt;/li&gt;
&lt;li&gt;Colorier les lignes des processus (par exemple vert pour les processus fonctionnels, orange pour ceux en cours d'exécution d'une requête mais dont l'exécution de la requête a dépassé une certain durée, bleu pour les processus ne faisant rien, rouge pour ceux en attente d'un verrou, etc.)&lt;/li&gt;
&lt;li&gt;Ajouter la possibilité de sélectionner un processus et de copier la requête dans l'éditeur de requêtes.&lt;/li&gt;
&lt;li&gt;Ajouter la possibilité de sélectionner un processus et de n'afficher que les verrous utilisés ou attendus par ce processus.&lt;/li&gt;
&lt;li&gt;Afficher un arbre logique des verrous plutôt qu'une liste.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bref, du boulot, mais bien découpé, donc plutôt simple à suivre.&lt;/p&gt;


&lt;p&gt;Le troisième gros boulot concerne l'ajout des fonctionnalités de recherche plein texte. Il s'agit simplement d'ajouter la gestion des trois types de données. Cela devrait être assez simple, et je suis assez impatient de m'attaquer à cela.&lt;/p&gt;


&lt;p&gt;En dehors de ces trois gros boulots, je me suis attaqué à un petit manque de pgAdmin. Il n'est pas possible actuellement d'ajouter des tables héritées à une table déjà existante alors que cette fonctionnalité est proposée par PostgreSQL depuis la version 8.2. J'ai donc commencé un patch sur cela. J'ai encore un petit bug à corriger et cela devrait être commitable.&lt;/p&gt;


&lt;p&gt;Enfin, cette semaine, j'ai remarqué chez un client que pgAdmin ne propose aucune statistique sur les index quand on est sur le noeud principal Index. C'est assez simple à ajouter, je vais m'en occuper rapidement.&lt;/p&gt;


&lt;p&gt;Tout ça pour dire que le boulot continue, que le boulot est plaisant. Tant mieux car l'investissement (en temps et en argent) est croissant.&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.guillaume.lelarge.info/index.php/post/2008/07/19/Travaux-en-cours-sur-pgAdmin#comment-form</comments>
      <wfw:comment>http://blog.guillaume.lelarge.info/index.php/post/2008/07/19/Travaux-en-cours-sur-pgAdmin#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.guillaume.lelarge.info/index.php/feed/rss2/comments/1026</wfw:commentRss>
      </item>
    
</channel>
</rss>