IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Modules Perl Discussion :

Problème étrange avec DBM::Deep


Sujet :

Modules Perl

  1. #1
    Membre actif Avatar de scaleo
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 327
    Points : 219
    Points
    219
    Par défaut Problème étrange avec DBM::Deep
    J'utilise dans un script la librairie DBM:eep , tout fonctionne sauf une chose

    j'implémente cette lib comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    tie %Ready, 'DBM::Deep', {
      'file'      => 'Ready.db',
      'locking'   => 0,
      'autoflush' => 0
    } or die "Unable to tie the Ready Queue\n";
    je l'utilise comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     {
          # Selection d'un serveur
          my ($name) = grep { ! exists $Wait{$_} } keys %Host;
          if ( scalar keys %{$Ready{$name}} > 0 ) {
            %$data = %{$Ready{$name}};
            # On reinitialise la "ready queue"
            $Ready{$name} = {};
     
            $Host{$name}{'_timeout'} = 1; # On met le serveur en attente
            $Host{$name}{'_time'}  = time; # date du dernier accès
            $Host{$name}{'_fetch'} = scalar keys %{$Ready{$name}};  # Nombre dans la "ready queue"     
            $Wait{$name} = 1; # On ajoute un référence au serveur dans la wait queue
          }
      }

    j'envoie le contenue de $data via un socket comme cela :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      print $socket Storable::nfreeze($data);
      print $socket "\neov\n";

    Mon problème est que mon script bug car Storable considère $data comme un GLOB alors qu'en faisant un print ref($data), "\n"; j'obtient bien un hash.

    Sa fait 2 heures que je cherche le problème et j'ai épuisé mon stocke d'idées, le problème semble venir de DBM:eep car quand je ne tie() pas %Ready tout vas bien !!!

    Voici la trace que perl me donne :


    Uncaught exception from user code:
    Can't store GLOB items at ..\..\lib\Storable.pm (autosplit into ..\..\lib\auto\Storable\_freeze.al) line 290, at G:/Program Files/Perl/site/lib/Engine/Scheduler/Scheduler.pm line 307
    at G:/Program Files/Perl/site/lib/POE/Resource/Events.pm line 271
    POE::Kernel::_data_ev_dispatch_due('POE::Kernel=ARRAY(0x202ec7c)') called at G:/Program Files/Perl/site/lib/POE/Loop/Select.pm line 315
    POE::Kernel::loop_do_timeslice('POE::Kernel=ARRAY(0x202ec7c)') called at G:/Program Files/Perl/site/lib/POE/Loop/Select.pm line 323
    POE::Kernel::loop_run('POE::Kernel=ARRAY(0x202ec7c)') called at G:/Program Files/Perl/site/lib/POE/Kernel.pm line 1255
    POE::Kernel::run('POE::Kernel') called at G:/Program Files/Perl/site/lib/Engine/Scheduler/Scheduler.pm line 175
    Engine::Scheduler::Scheduler::_run_processing('Engine::Scheduler::Scheduler=HASH(0x2399a44)') called at C:\Documents and Settings\Scaleo2007\Bureau\Scheduler.pl line 19

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 427
    Points : 459
    Points
    459
    Par défaut
    a mon avis le probleme n'est pas $data lui meme, mais une des valeurs de data qui doit etre un glob (un objet DBM:eep en fait, une reference vers une autre partie de %Ready)

    Essai de faire un print Dumper $data pour voir si une telle chose traine à l'interieur.
    si c'est le cas et que ta structure a un seul niveau alors tu peux faire ca pour recopier ton hash sans des valeurs de glob:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    use List::Pairwise qw(grepp);
     
     {
          # Selection d'un serveur
          my ($name) = grep { ! exists $Wait{$_} } keys %Host;
          if ( scalar keys %{$Ready{$name}} > 0 ) {
            %$data = grepp {not UNIVERSAL::isa($b, 'GLOB')} %{$Ready{$name}};
    si ton hash a plusieurs niveau et que tu veux les conserver alors il faudra que tu "detie" chaque reference à l'interieur de $data.
    pas facile comme probleme. En fait il te faut une fonction clone speciale qui fait ce que tu a fait pour %$data lui meme à l'interieur de $data.
    par chance DBM:eep expose une methode 'export' qui fait exactement ca!! (je viens de la voir). Donc il faut recuperer un objet $db (meme si ca n'est pas l'objet racine) avec tied :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     {
          # Selection d'un serveur
          my ($name) = grep { ! exists $Wait{$_} } keys %Host;
          if ( scalar keys %{$Ready{$name}} > 0 ) {
            $data = tied($Ready{$name})->export;
    (non testé)

  3. #3
    Membre actif Avatar de scaleo
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 327
    Points : 219
    Points
    219
    Par défaut
    super pospos je vais tester tout sa !!!

    J'utilise l'ancienne version de DBM:eep car la 1.0001, fait buger XML::Simple .

    J'vais updater XML::Simple pour voir mais bon j'y crois pas trop

  4. #4
    Membre actif Avatar de scaleo
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 327
    Points : 219
    Points
    219
    Par défaut
    Super sa marche merci pospos

    La soluce :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     $data = tied(%{$Ready{$name}})->export;

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 18
    Dernier message: 04/04/2007, 15h34
  2. Problème étrange avec un integer
    Par Pedro dans le forum Delphi
    Réponses: 6
    Dernier message: 05/12/2006, 22h08
  3. Problème étrange avec DecimalSeparator ?
    Par MaTHieU_ dans le forum Delphi
    Réponses: 2
    Dernier message: 13/07/2006, 10h14
  4. problème étrange avec excel
    Par lanfeust42 dans le forum Modules
    Réponses: 1
    Dernier message: 15/06/2006, 11h57
  5. [FLASH MX2004 PRO] Problème étrange avec LoadClip...
    Par josemoroide dans le forum Flash
    Réponses: 6
    Dernier message: 04/08/2004, 16h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo