Quick links: Content - sections - sub sections
EN FR
Quick Search Advanced search
 
Page

  [Opened] Exploitation de l'api jDao de jelix 1.3.1

Posted by William on 03/20/2012 09:54

Bonjour,

je jeté mon dévolu sur le framework jelix pour développer une application qui exploitera deux SGBD (oracle et mysql) selon le déploiement qui sera effectué chez le client. j'ai été très ravi de tomber sur l'api jDao qui d'emblé représenterais une interface générique pour les accès au bases de données (quel que soit le SGBD). Dans l'exploitation de cette api,je me suis rendu compte que le fichier xml qui est géréné avec la commande "createdao" est différent selon le SGBD utilisé (plus précisement, j'ai eu dans mon fichier xml des types de données différents selon, que le fichier était généré viaune table mysql et une table oracle, en outre j'ai généré un fichier xml via une table de bd mysql puis j'ai voulu exploiter le même fichier pour mettre a jour une table similaire de ma bd oracle et cela n'a pas marché). ce faisant, cela me pose un problème vu que j'espèrerais réaliser mes traitements indépendamment du SGBD que j'aurai en ammont avec une couche d'abstraction pertinente un peu comme l'api JPA de java JEE. je souhaiterais savoir si'il est possible pour moi d'avoir un seul fichier xml me permettra de gérer l'acces à mes BD.

Merci d'avance

Bien cordialement . . .

  [Opened] Exploitation de l'api jDao de jelix 1.3.1

Reply #1 Posted by laurentj on 03/20/2012 10:37

Bonjour,

normalement oui, c'est théoriquement possible d'avoir le même fichier DAO pour les deux types de bases. C'est fait pour même. Faudrait maintenant qu'on sache les détails des problèmes que tu as eu, les différences que tu as eu etc.. Il y a peut-être des bugs ou des choses à adapter.

  [Opened] Exploitation de l'api jDao de jelix 1.3.1

Reply #2 Posted by William on 03/21/2012 10:20

Bonjour M laurentj

Merci Bien pour votre prompte réaction, et désolé pour ma réaction tardive

En effet, j'ai crée un projet jelix, et j'ai défini deux profil de connexion (un profil pour ma bd mysql et un autre pour ma bd oracle). dans chacune de mes bd, j'ai créé une simple table "user(nom[id],prenom,age) avec les même caractéristiques . Je réussi à générer le fichier xml "user.dao.xml" à partir de la commande createdao et à partir de chaque profil défini que je configure comme profil par défaut successivement dans mes générations de dao (le succès de la génération des dao m'a permis de valider la configuration des mes profils de connexion). j'ai comparé les deux fichier géréné:

dao généré via le profil de connexion à la BD mysql :

<?xml version="1.0" encoding="UTF-8"?>
<dao xmlns="http://jelix.org/ns/dao/1.0">
    <datasources>;
        <primarytable name="user" realname="user" primarykey="nom" />;
    </datasources>
    <record>
        <property name="nom" fieldname="nom" datatype="varchar" required="true" maxlength="20"/>
        <property name="prenom" fieldname="prenom" datatype="varchar" required="true" maxlength="20"/>
        <property name="age" fieldname="age" datatype="int" default=""/>
    </record>
</dao>

dao généré via le profil de connexion à la BD oracle :

<?xml version="1.0" encoding="UTF-8"?>
<dao xmlns="http://jelix.org/ns/dao/1.0">
    <datasources>
        <primarytable name="user" realname="user" primarykey="nom" />
    </datasources>
    <record>
        <property name="nom" fieldname="nom" datatype="varchar2" required="true" maxlength="20"/>
        <property name="prenom" fieldname="prenom" datatype="varchar2" default="" maxlength="20"/>
        <property name="age" fieldname="age" datatype="number" default=""/>
    </record>
</dao>

Au besoin voici mon fichier profiles.ini.php

[jdb]
; name of the default profile to use for any connection
default=     ; j'ai saisi testjdao2 / testjdao1 successivement 

[jdb:testjdao2]
; profil de connexion à une base de données Oracle
driver=pdo
dsn="oci:dbname=//localhost:1521/yob"
user=system
password=
persistent=on
force_encoding=on
usepdo=on

[jdb:testjdao1]
; profil de connexion à une base de données Mysql
driver=mysql
database=testjdao
host=localhost
user=root
password=
persistent=on
  • lorsque dans mon controleur j'exécute la méthode index() suivante avec le dao msql et le profil mysql, l'insertion se passe bien :
function index() {
   $rep = $this->getResponse('html');

   // instanciation de la factory
   $maFactory = jDao::get("user");

   // creation d'un record correspondant au dao foo
   $record = jDao::createRecord("user");

   // on remplit le record
   $record->nom = "TCHAMI";
   $record->prenom = "Landry";
   $record->age = 29;

   // on le sauvegarde dans la base
   $maFactory->insert($record);
   return $rep;
}

mais lorque j'exécute le même code avec le dao mysql et le profil oracle j'obtient ce message d'erreur dans le fichier var/lol/errors.log

2012-03-21 09:33:35	127.0.0.1	error	2012-03-21 09:33:35	127.0.0.1	*[HY000]	SQLSTATE[HY000]: General error: 903 OCIStmtExecute: ORA-00903: invalid table name
(ext\pdo_oci\oci_driver.c:343)	C:\xampp\htdocs\jelix\lib\jelix\db\jDbPDOConnection.class.php	145
	/jelix/jdao/www/index.php
array ( )

	0	PDO->exec()	C:\xampp\htdocs\jelix\lib\jelix\db\jDbPDOConnection.class.php : 145
	1	jDbPDOConnection->exec()	C:\xampp\htdocs\jelix\temp\jdao\www\compiled\daos\modules\jdao~user~oci.php : 128
	2	cDao_jdao_Jx_user_Jx_oci->insert()	C:\xampp\htdocs\jelix\jdao\modules\jdao\controllers\default.classic.php : 35
	3	defaultCtrl->index()	C:\xampp\htdocs\jelix\lib\jelix\core\jCoordinator.class.php : 205
	4	jCoordinator->process()	C:\xampp\htdocs\jelix\jdao\www\index.php : 19

En utilisant cette fois ci le dao oracle et le profil de connexion oracle, j'ai la même erreur, et la je ne comprend pas pourquoi au moins ce cas ci ne marche pas .

Désolé pour ce très long message, je voulais juste poser mon problème le plus clairement possible

Merci de me répondre

Bien Cordialement ...

  [Opened] Exploitation de l'api jDao de jelix 1.3.1

Reply #3 Posted by foxmask on 03/21/2012 10:32

bonjour,

pour la lisibilité j'aurai plutôt utilisé la balise <code>...</code> à la place des etoiles utilisées pour les listes

ensuite pour le pb où oracle s'y perd en switchant de profil ; peut-être qu'un rafraichissement du cache aiderait ?

enfin le varchar vs varchar2 et le int vs number ... c'est flagrant :/


@GitHub - Forum HaveFnuBB! powered by Jelix - Le Booster Jelix !

  [Opened] Exploitation de l'api jDao de jelix 1.3.1

Reply #4 Posted by laurentj on 03/21/2012 11:28

J'ai corrigé le message en mettant des balise de code, parce que c'était illisible ;-)

Bon sinon

En utilisant cette fois ci le dao oracle et le profil de connexion oracle, j'ai la même erreur,

Il y a bien une table qui s'appelle user dans la base ? Il n'y aurait pas une histoire de schema à indiquer ? Il y a les bons droits oracle sur la table en question ?

Active les logs SQL (sql=file dans la section logger de la conf), regarde les requêtes qui passent, et retranscrit les nous. Tu peux aussi les exécuter dans un client oracle pour voir si ça fait la même erreur.

  [Opened] Exploitation de l'api jDao de jelix 1.3.1

Reply #5 Posted by William on 03/21/2012 13:10

Bonjour M. laurentj

Merci Bien pour votre sollicitude

  • Il y a bien une table qui s'appelle user dans la base ? :: effectivement, il ya une table qui s'appelle user dans ma base oracle et c'est bien à partir de cette table que j'ai généré le dao user
  • Il n'y aurait pas une histoire de schema à indiquer ?:: je ne sais pas vraiment, j'ai pu généré le dao de la table user avec succes via la configuration du profil suivant ou j'aidique le schéma de bd 'system/yob'
[jdb:testjdao2]
; profil de connexion à une base de données Oracle
driver=pdo
dsn="oci:dbname=//localhost:1521/yob"
user=system
password=yob
persistent=on
force_encoding=on
usepdo=on
  • Il y a les bons droits oracle sur la table en question ? :: je pense qu'il ya de bon droits, d'ailleurs, la table 'user' est un objet du schema oracle 'system' qui a tout les droits.
  • J'ai activé le logger sql, afin de visualiser les requêtes. lorque j'utilise un dao généré via la table mysql 'user' et un profil mysql et que je réalise une insertion dans la table mysql 'user' il ya pas de problème; tout marche bien et le logger sql affiche la requete sql généré.
  • par contre, lorsque j'utilise un dao oracle à partir de la table oracle 'user' et un profil oracle et que je réalise une insertion dans la table oracle, j'obtient le même message d'erreur et le logger ne produit pas de requete généré par le dao.

Merci de m'aider à resoudre mon problème qui s'avère capitalpour la suite de mon travail

Bien Cordialement . . .

  [Opened] Exploitation de l'api jDao de jelix 1.3.1

Reply #6 Posted by laurentj on 03/21/2012 14:43

Faudrait voir le code source généré par jDao, dans C:\xampp\htdocs\jelix\temp\jdao\www\compiled\daos\modules\jdao~user~oci.php et C:\xampp\htdocs\jelix\temp\jdao\www\compiled\daos\modules\jdao~user~mysql.php

Est ce que la table s'appelle bien user en minuscule, et pas "User" ou "USER" ? J'ai souvenir qu'Oracle avait des comportements complètement illogique avec la casse des caractères.

  [Opened] Exploitation de l'api jDao de jelix 1.3.1

Reply #7 Posted by William on 03/21/2012 15:06

Bonsoir,

  • Est ce que la table s'appelle bien user en minuscule, et pas "User" ou "USER" ? J'ai souvenir qu'Oracle avait des comportements complètement illogique avec la casse des caractères. :: voici la commande utilisé pour générer le dao 'user.dao.xml'
php cmd.php createdao jdao user
  • j'ai juste renseigner le nom du module ('jdao') et le nom du dao (user), j'ai pas mis le nom de la table 'user' enfin que ma commande puisse aller elle même rechercher la table de nom 'user' dans la BD, ce qui à marcher correctement , j'obtiend la creation du fichier 'user.dao.xml'.

voici le contenu de jdao~user~oci.php


<?php  require_once ( JELIX_LIB_PATH .'dao/jDaoRecordBase.class.php');
 require_once ( JELIX_LIB_PATH .'dao/jDaoFactoryBase.class.php');

class cDaoRecord_jdao_Jx_user_Jx_oci extends jDaoRecordBase {
 public $nom;
 public $prenom;
 public $age;
   public function getProperties() { return cDao_jdao_Jx_user_Jx_oci::$_properties; }
   public function getPrimaryKeyNames() { return cDao_jdao_Jx_user_Jx_oci::$_pkFields; }
}

class cDao_jdao_Jx_user_Jx_oci extends jDaoFactoryBase {
   protected $_tables = array (
  'user' => 
  array (
    'name' => 'user',
    'realname' => 'user',
    'pk' => 
    array (
      0 => 'nom',
    ),
    'fields' => 
    array (
      0 => 'nom',
      1 => 'prenom',
      2 => 'age',
    ),
  ),
);
   protected $_primaryTable = 'user';
   protected $_selectClause='SELECT user.nom, user.prenom, user.age';
   protected $_fromClause;
   protected $_whereClause='';
   protected $_DaoRecordClassName='cDaoRecord_jdao_Jx_user_Jx_oci';
   protected $_daoSelector = 'jdao~user';
   public static $_properties = array (
  'nom' => 
  array (
    'name' => 'nom',
    'fieldName' => 'nom',
    'regExp' => NULL,
    'required' => true,
    'requiredInConditions' => true,
    'isPK' => true,
    'isFK' => false,
    'datatype' => 'varchar2',
    'unifiedType' => 'varchar',
    'table' => 'user',
    'updatePattern' => '',
    'insertPattern' => '%s',
    'selectPattern' => '%s',
    'sequenceName' => '',
    'maxlength' => 20,
    'minlength' => NULL,
    'ofPrimaryTable' => true,
    'defaultValue' => NULL,
    'autoIncrement' => false,
  ),
  'prenom' => 
  array (
    'name' => 'prenom',
    'fieldName' => 'prenom',
    'regExp' => NULL,
    'required' => false,
    'requiredInConditions' => false,
    'isPK' => false,
    'isFK' => false,
    'datatype' => 'varchar2',
    'unifiedType' => 'varchar',
    'table' => 'user',
    'updatePattern' => '%s',
    'insertPattern' => '%s',
    'selectPattern' => '%s',
    'sequenceName' => '',
    'maxlength' => 20,
    'minlength' => NULL,
    'ofPrimaryTable' => true,
    'defaultValue' => NULL,
    'autoIncrement' => false,
  ),
  'age' => 
  array (
    'name' => 'age',
    'fieldName' => 'age',
    'regExp' => NULL,
    'required' => false,
    'requiredInConditions' => false,
    'isPK' => false,
    'isFK' => false,
    'datatype' => 'number',
    'unifiedType' => 'decimal',
    'table' => 'user',
    'updatePattern' => '%s',
    'insertPattern' => '%s',
    'selectPattern' => '%s',
    'sequenceName' => '',
    'maxlength' => NULL,
    'minlength' => NULL,
    'ofPrimaryTable' => true,
    'defaultValue' => NULL,
    'autoIncrement' => false,
  ),
);
   public static $_pkFields = array('nom');
 
public function __construct($conn){
   parent::__construct($conn);
   $this->_fromClause = ' FROM '.$this->_conn->prefixTable('user').' user';
}
   public function getProperties() { return self::$_properties; }
   public function getPrimaryKeyNames() { return self::$_pkFields;}
 
 protected function _getPkWhereClauseForSelect($pk){
   extract($pk);
 return ' WHERE  user.nom'.' = '.$this->_conn->quote($nom).'';
}
 
protected function _getPkWhereClauseForNonSelect($pk){
   extract($pk);
   return ' where  nom'.' = '.$this->_conn->quote($nom).'';
}
public function insert ($record){
    $query = 'INSERT INTO '.$this->_conn->prefixTable('user').' (
nom,prenom,age
) VALUES (
'.($record->nom === null ? 'NULL' : $this->_conn->quote2($record->nom,false)).', '.($record->prenom === null ? 'NULL' : $this->_conn->quote2($record->prenom,false)).', '.($record->age === null ? 'NULL' : jDb::floatToStr($record->age)).'
)';
   $result = $this->_conn->exec ($query);
    return $result;
}
public function update ($record){
   $query = 'UPDATE '.$this->_conn->prefixTable('user').' SET 
 prenom= '.($record->prenom === null ? 'NULL' : $this->_conn->quote2($record->prenom,false)).', age= '.($record->age === null ? 'NULL' : jDb::floatToStr($record->age)).'
 where  nom'.' = '.$this->_conn->quote($record->nom).'
';
   $result = $this->_conn->exec ($query);
   return $result;
 }


}
?>

  [Opened] Exploitation de l'api jDao de jelix 1.3.1

Reply #8 Posted by William on 03/21/2012 15:17

Bonsoir M laurentj

Je trevaille avec ORACLE 10g et tous les noms d'objet sont en majuscule; donc le nom de la table est bien "USER" ; lorque j'exécute les commandes

php cmd.php createdao jdao user
  • ici j'ai pas préciser le nom de la table à partir de laquelle le dao sera generé
et
php cmd.php createdao jdao USER
  • ici j'ai précisé le nom de la table à partir de laquelle le dao sera generé

j'obtient toutjours la génération du fichier 'user.dao.xml'

  [Opened] Exploitation de l'api jDao de jelix 1.3.1

Reply #9 Posted by laurentj on 03/21/2012 15:45

Modifiez alors votre fichier DAO en mettant le nom de la table en majuscule alors, ça fonctionnera peut être. (createdao est juste un utilitaire, vous n'êtes pas obligé de l'utiliser)

<primarytable name="USER" realname="USER" primarykey="nom" />

Si ça ne fonctionne pas, je ne vois pas ce qu'on peut faire de plus. Pour moi, tout est en ordre dans la classe PHP générée, et je soupçonnerai alors plutôt un problème du coté de la connexion et de la base...

 
Page
  1. Exploitation de l'api jDao de jelix 1.3.1