Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > ORM > Doctrine
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 11/01/2011, 17h13   #1
Membre Expert
 
Avatar de ska_root
 
Homme
Développeur informatique
Inscription : août 2005
Messages : 1 179
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 42
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Service public

Informations forums :
Inscription : août 2005
Messages : 1 179
Points : 1 580
Points : 1 580
Par défaut Oracle 9ir2 Clob

Bonjour,

Voilà un problème sur lequel je bloque depuis plusieurs jours...

J'ai déclaré dans mon shema yaml un champ de type string sans contrainte de longueur.
la table créée dans Oracle par doctrine définit pour ce champ le type CLOB

J'ai donc crée un listener héritant de Doctrine_Record_Listener afin de récupérer le flux du champ et de le modifier en string à la volée :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
 
function fixClob_recursive(&$array, &$table)
{
 
    if (!is_null($array)) {
        $columns = $table->getColumns();
        $relations = $table->getRelations();
        foreach ($array as $k => &$v) {
            if (is_array($v)) {
                fixClob_recursive($v, $relations[key($v)]);
            } else {
 
            	if (array_key_exists(strtolower($k), $columns) && ($columns[strtolower($k)]['type'] == 'string' && empty($columns[strtolower($k)]['length']))) {
 
                    /* le bloc ci-dessous fonctionne bien, il m'affiche un string */
                    var_dump(stream_get_contents($v));
 
                    /* ce bloc ne fonctionne pas, page blanche pas de trace... */
                    $array[$k]= stream_get_contents($v); 
 
                }  
            }
        }
        unset($columns, $relations);
    }
}
 
 
class OracleFixHydratationListener extends Doctrine_Record_Listener {
 
	public function preHydrate(Doctrine_Event $event) {
 
 
		$datas = $event->data;
                $table = $event->getInvoker();
 
 
                fixClob_recursive($datas, $table);
 
 
        /* ce debug me sort le flux directement ( ressource id #XX ) */
        echo "<pre>";
        print_r($datas);
        echo "</pre>";
        //*/
 
        $event->data = $datas;
        unset($datas, $table);
 
    }
 
}
 
?>
J'aurais loupé quelque chose ?

Toute aide sera bienvenue !!
__________________
http://cdemarche.developpez.com/

Tu as la réponse à ta question ? N'oublies pas le petit en bas à gauche de ton message...
ska_root est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2011, 18h44   #2
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
Un clob en php, il est vu comme un string non ?

Je ne comprend pas trop l'intérêt de tous ce code compliqué ? Il me manque le : "mais pourquoi qu'il fait si compliqué qu'il a surement raison mais que je n'en vois vraiment pas l'intérêt". Si tu avais le pourquoi, j'aurais peut-être une solution...
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
  • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
  • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
  • Une discussion est terminée ? Alors le bouton est votre ami !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2011, 20h10   #3
Membre Expert
 
Avatar de ska_root
 
Homme
Développeur informatique
Inscription : août 2005
Messages : 1 179
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 42
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Service public

Informations forums :
Inscription : août 2005
Messages : 1 179
Points : 1 580
Points : 1 580
Citation:
Envoyé par Michel Rotta Voir le message
Un clob en php, il est vu comme un string non ?
eh ben non justement, le CLOB dans oracle permet de stocker du binaire (une image par exemple) comme du textuel de plus de 4ko, mais le format texte est stocké en ASCII aussi.
c'est pourquoi je suis obligé de le parser à la manière d'un flux de fichier avec stream_get_contents()

Citation:
Envoyé par Michel Rotta Voir le message
Je ne comprend pas trop l'intérêt de tous ce code compliqué ? Il me manque le : "mais pourquoi qu'il fait si compliqué qu'il a surement raison mais que je n'en vois vraiment pas l'intérêt".
Je me complique la vie J'utilise un listener car je peux facilement le charger au moment de la création du pool de connexion si et seulement si le SGBD le requiert. (pas besoin de gérer le CLOB avec postgresql et mysql, l'appli fonctionne bien...)

Le listener est executé par le gestionnaire d'événement de doctrine avant chaque hydratation (passage du result sql sous forme d'objet en un tableau de valeur), ceci quand on appelle la méthode fetchArray() de l'objet Doctrine_Query
Je crée un Listener appliqué à la connexion (CAD à toutes les tables) afin de gérer tous les champs de type CLOB de la même façon.
En gros, cela m'évite de modifier manuellement le jeu de résultats à chaque DQL...

Ce que je ne comprends pas, c'est que j'affiche le résultat de stream_get_contents() mais que je n'arrive pas à le pusher dans un array. C'est comme si la méthode ne renvoyait pas vraiment un string mais plutôt un standard out (comme print_r() en somme ) ou un truc du genre...

Petite précision, je force le charset doctrine en ISO8859-1 (mon appli fonctionne en UTF-8) mais je pense qu'il n'y a pas de rapport...

merci
__________________
http://cdemarche.developpez.com/

Tu as la réponse à ta question ? N'oublies pas le petit en bas à gauche de ton message...
ska_root est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2011, 00h14   #4
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
J'étais passé à côté du fait que tu utilises Oracle, qui manque à ma culture en temps que base liée à php (utilisé, mais pas dans ce cadre).

Donc... question idiote, as-tu déjà fait des recherches sur google pour ce truc ? Tu ne dois pas être le seul à utiliser oracle avec des clob et doctrine ?

Si non, je n'ai jamais utilisé les listner sous doctrine, je suppose qu'il doivent ressembler à l'équivalent que l'on a sous symfony, mais ce n'est qu'une supposition.

Ta fonction stream_get_contents est bien sensée retourner du string. Essaye peut-être de passer par une variable intermédiaire ? Et de vérifier le contenu de la variable (j'ai déjà eu une fois un truc pareil avec je ne sais plus quel fonction, il fallait passer par une variable, un bug de php dans une vielle version de 4 quelque chose.
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
  • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
  • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
  • Une discussion est terminée ? Alors le bouton est votre ami !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2011, 01h31   #5
Membre Expert
 
Avatar de ska_root
 
Homme
Développeur informatique
Inscription : août 2005
Messages : 1 179
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 42
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Service public

Informations forums :
Inscription : août 2005
Messages : 1 179
Points : 1 580
Points : 1 580
Merci de ta réponse,

Le listener est une solution que j'ai trouvé/adapté sur la toile...

j'ai déjà essayé en vain de passer par une allocation intermédiaire. Résultat identique.

Tomorrow will be a better day !
__________________
http://cdemarche.developpez.com/

Tu as la réponse à ta question ? N'oublies pas le petit en bas à gauche de ton message...
ska_root est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2011, 09h31   #6
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
Bon, si on doit voir cela demain, ca me laisse une journée pour y réfléchir.

Le pb est que je n'ai pas de base oracle sous la main pour tester quoi que cela soit.

Questions : Quel est le message d'erreur ? Est-il systématique (champ vide, champ très petit) ? Est-ce le même message si tu passes par une variable intermédiaire ?

Exemple de code pour le passage par une variable intermédiaire :
Code :
1
2
3
4
 
$strInt = '';
$strInt .= stream_get_contents($v);
$array[$k] = $strInt;
Si erreur, elle arrive quant ? Lors de l'affectation du stream dans $strInt ou celle du supposé string dans le tableau ?
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
  • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
  • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
  • Une discussion est terminée ? Alors le bouton est votre ami !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2011, 10h29   #7
Membre Expert
 
Avatar de ska_root
 
Homme
Développeur informatique
Inscription : août 2005
Messages : 1 179
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 42
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Service public

Informations forums :
Inscription : août 2005
Messages : 1 179
Points : 1 580
Points : 1 580
Bonjour Michel,

Tout d'abord, merci de ta réactivité...

Ca marche enfin !!!

J'ai en fait combiné 2 solutions dont la tienne...
Je ne comprends pas très bien comment fonctionne la fonction stream_get_contents() en natif, je ne parle pas de la doc, mais de son fonctionnement réel. Il fallait que je précise la longueur du tampon (ici -1 pour "tout le flux") et que je l'empile dans une variable...

Si j'ai le temps, j'approfondirai ma recherche plus tard.
pour info, je suis sous PHP5.3.1

Code :
1
2
3
4
5
6
 
...
$fixClob= '';
$fixClob .= stream_get_contents($v, -1);
$array[$k]= $fixClob;
...
Encore merci !
__________________
http://cdemarche.developpez.com/

Tu as la réponse à ta question ? N'oublies pas le petit en bas à gauche de ton message...
ska_root est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2011, 10h54   #8
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
Ca ressemble furieusement au bug que j'avais sur la 4...

Tu devrais pouvoir te passer de la variable et faire la même chose directement dans le tableau.

Heureux que cela marche. Comme quoi, les vieux bogue peuvent donner de nouvelles solutions
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
  • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
  • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
  • Une discussion est terminée ? Alors le bouton est votre ami !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h41.


 
 
 
 
Partenaires

Hébergement Web