Publication de Coat::Persistent 0.200

Je viens d’uploader Coat::Persistent sur CPAN.

Voila une bonne chose de faîte, c’est en quelque sorte une manière de boucler la présentation des Journées Perl 2009 et le problème technique qui s’était posé.

Cette version propose les changements suivants :

  • Mention de la licence “perl” dans Makefile.PL (bug #46912)
  • Ajout d’un fichier CHANGES (bug #46913)
  • Support de l’option store_as pour les attributs persistants
  • Module Coat::Persistent::Types::MySQL qui fournit les types et les coercitions correspondantes pour les types de données MySQL Date et DateTime

Voici un petit exemple de code qui montre les possibilités de cette nouvelle version :

Reprenons notre chameau utilisé pour illustrer la présentation, nous allons lui ajouter une date de création, que l’on souhaitera manipuler sous forme de timestamp dans le code de l’application, et stocker sous forme de MySQL DateTime dans la base.

package Camel;
use Coat;
use Coat::Persistent;
use Coat::Persistent::Types::MySQL;

has_p name => (isa => 'Str');
has_p age => (age => 'Int');

has_p created_at => (
  is => 'rw',
  isa => 'Int',
  store_as => 'MySQL:DateTime',
);

Jouons maintenant avec cette classe et observons le comportement de l’accesseur created_at :

Perl> use Camel
Perl> my $c = Camel->find(3)
$Camel1 = Camel=HASH(0x9967028);

Perl> $c->created_at(time)
1245413521

Perl> $c->save
3

Maintenant regardons le contenu de la base de données pour le camel d’id 3

sqlite> select created_at from camel where id = 3;
2009-06-19 14:12:01

Au passage, on notera un effet de bord assez apréciable de cette double coercition entre type réel et type de stockage : on peut très bien assigner une valeur formattée à created_at au lieu d’un timestamp. La coercition interviendra dans l’autre sens, et notre objet aura toujours un timestamp :

Perl> $c->created_at('1979-11-20 20:20:00')
311973600

Mission complete j’ai envie de dire ;)

Update: Suite à la remarque de oz dans les commentaires, j’ai publié la version 0.210 qui propose un module Coat::Persistent::Types afin de définir tout plein de types de Date et les coercitions qui vont bien

691 views · Tags: , , , · Both comments and pings are currently closed.

3 Comments

  1. J’ai pas trop regardé en détail, mais comment tu utiliserais cette feature sur des tables dont certains champs date/time seraient stockés avec des bons vieux timestamps Unix? C’est-à-dire: côté Perl, je récupère une instance de Date (ou autre), et côté DB un timestamp.

  2. oz: Eh bien exactement la même, mais à l’envers ;-)

    package MyStuff;
    ...
    
    has_p mon_champ_ts => (
      isa => 'MySQL:DateTime',
      store_as => 'Int',
    );
    

    Bon pour que ça soit plus propre, il faudrait définir le type Timestamp, qui serait un Int particulier, et là, ça serait idéal.

    Mais déjà, le code ci-dessus fait ce que tu veux.

  3. oz: Ah tu voulais une instance d’un objet Date, j’avais lu trop vite, dans ce cas, on aurait quelquechose comme ça :

    
    use Coat::Types;
    
    coerce 'Date'
      => from 'Int'
      => via { Date->new($_)}; # si le constructeur de Date peut prenre le timestamp
    
    coerce 'Int'
      => from 'Date'
      => via { $_->get_timestamp() } # si un objet Date propose get_timestamp()
    
    has_p mon_champ_ts => (
      isa => 'Date',
      store_as 'Int',
    );
    

    Comme tu peux le constater, on peut faire ce qu’on veut, tant qu’on défini bien une coercition dans chaque sens.

Get Adobe Flash playerPlugin by wpburn.com wordpress themes