Chapitre 47. La partie base de données
47.1. Les mises à jour
Depuis 2005, dans NOALYSS, il y a une table version
qui contient les informations sur les patch de base
de données qui ont été appliqués. Quand le fichier do.php est exécuté,
il vérifie si DBVERSION contenu dans constant.php correspond à
la version actuelle.
/* Ficher do.php */
if (DBVERSION < dossier::get_version($cn))
{
echo '<h2 class="error" style="font-size:12px">' .
_("Attention: la version de base de donnée est supérieure à la version du programme, vous devriez
mettre à jour") . '</h2>';
}
if (DBVERSION > dossier::get_version($cn))
{
echo '<h2 class="error" style="font-size:12px">' . _("Votre base de données n'est pas à jour") . ' ';
$a = _("cliquez ici pour appliquer le patch");
$base = dirname($_SERVER['REQUEST_URI']) . '/admin/setup.php';
echo '<a hreF="' . $base . '">' . $a . '</a></h2>';
}
Dans le cas où DBVERSION n’est pas la valeur contenue dans la base de
donnée, do.php vous propose d’appliquer le patch sur vos bases de
données. Voici la fonction qui applique les patch SQL pour la base de
données. Ces fichiers sont dans noalyss/include/sql/patch
.
/* fichier setup.php */
//----------------------------------------------------------------------
// Upgrade the folders
//----------------------------------------------------------------------
for ($e=0;$e < $MaxDossier;$e++) {
$db_row=Database::fetch_array($Resdossier,$e);
echo "<h3>Patching ".$db_row['dos_name'].'</h3>';
$name=$cn->format_name($db_row['dos_id'],'dos');
if ( $cn->exist_database($name)> 0 )
{
$db=new Database($db_row['dos_id'],'dos');
$db->apply_patch($db_row['dos_name']);
Dossier::synchro_admin($db_row['dos_id']);
} else
{
echo_warning(_("Dossier inexistant")." $name");
}
}
La fonction qui applique le patch est Database::apply_patch
voir
https://wiki.noalyss.eu/doc/class_database.html
Tous les patchs pour la base de données se trouve dans
/noalyss/include/sql/patch/
et sont numérotés dans l’ordre d’exécution.
Chaque patch commence par
begin;
et termine par
insert into version (val,v_description) values (..version.,'.description..');
commit;
Ainsi, si le script échoue, la mise à jour s’arrête et annule toute ce qui a été fait dans le script contenant l’erreur, la base de données reste ainsi dans un état cohérent. Une fois l’erreur corrigée dans votre base de données, ce script ainsi que ceux qui suivent seront appliqués quand vous appelerez à nouveau noalyss/admin/setup.php (ou noalyss/html/install.php).
Le nombre dans la table version
est le nombre du script moins un, exemple : le script upgrade199.sql, correspond à la 200 dans la table version
/* upgrade199.sql */
insert into version (val,v_description) values (200,'Widget and improve menu');
47.2. Accèder aux données : ORM
Pour accèder aux tables ou aux vues, pour les SQL complexes , nous créons une classe qui va hériter de https://wiki.noalyss.eu/doc/class_table___data___s_q_l.html qui est dérivée de https://wiki.noalyss.eu/doc/class_data___s_q_l.html
et qui va nous permettre de faire la même chose en très peu de ligne de code.
Cette classe fournit entre-autres les fonctions suivantes qui peuvent être surchargée
- insert
-
pour insérer une ligne dans la base de données
- delete
-
pour insérer une ligne dans la base de données
- update
-
pour mettre à jour une ligne dans la base de données
- verify
-
à surcharger, vérifie que les données sont conformes
- setp
-
setter paramètre : nom de la colonne, valeur retourne l’objet
- getp
-
getter paramètre : nom de la colonne , retourne la valeur de cette colonne
- toString
-
affiche le contenu de l’objet
- from_array
-
transforme un tableau en un objet
- seek
-
recherche dans la table sur base d’une condition
- next
-
retourne l’objet suivant (après seek)
- check
-
contrôle des valeurs
Voici tout le code à taper par table, exemple pour la table stock_change.
Le fichier sera nommé table_sql.class.php , il sera dans un répertoire /database/
et la classe se nommera table_SQL
class Stock_Change_SQL extends Noalyss_SQL
{
// Le contructeur obligatoire
function __construct($p_id = -1)
{
// Façon dont les dates sont utilisées
$this->date_format="DD.MM.YYYY";
// Nom de la table
$this->table = "public.stock_change";
// nom de la clef primaire
$this->primary_key = "c_id";
// Structure de la table, à gauche le nom logique utilisable
// avec les getters/setters (setp/getp) et à droite le nom de la
// colonne
$this->name = array(
"id" => "c_id",
"c_comment" => "c_comment",
"c_date" => "c_date",
"tech_date"=>"tech_date",
"tech_user"=>"tech_user",
"r_id"=>"r_id"
);
// Type de données
$this->type = array(
"c_id" => "numeric",
"c_comment" => "text",
"c_date" => "date",
"tech_date"=>"date",
"tech_user"=>"text",
"r_id"=>"numeric"
);
// Les colonnes qui ne peuvent pas être changée ni par insert ni par
// update parce leurs valeurs sont données automatiquement
// exemple : la clef primaire qui est un numéro de séquence
//automatiquement donné
$this->default = array(
"c_id" => "auto",
"tech_date" => "auto"
);
global $cn;
parent::__construct($cn, $p_id);
}
}
47.3. Les tests unitaires
47.3.1. test-me
Les fonctions info et test_me qui sont très utiles lors des phases de déboggages. Je crée une simple page test-classe.php et j’appelle la classe; dans la fonction test_me (de la classe) je mets tout ce que je souhaite tester.
exemple :
static function test_me()
{
$cn=new Database(dossier::id());
$obj=new Periode($cn);
$obj->set_jrn(1);
$obj->display_form_periode();
}
ces tests ne sont pas ajoutés à NOALYSS mais servent de base pour les scénarios ou PHPUNIT |
47.3.2. PHPUNIT
Il faut tout d’abord un fichier bootstrap qui contient le path correct
pour php ainsi que les variables comme $g_user ou $cn, l’inclusion de
noalyss/include/config.inc.php
et de noalyss/include/constant.php
47.3.3. Scenario
Vous pouvez enregistrer ce que vous soumettez, il faut dans
config.inc.php
, ajouter
define ('LOGINPUT',true);
Ensuite créer le fichier dans noalyss/html/authorized_debug
, le contenu
n’a pas d’importance, ce fichier peut être vide.
Ensuite, aller dans votre dossier de test et faites une action (une
vente, un achat…), vous devez ouvrir le fichier test.php avec comme
paramètre le dossier (exemple
http://localhost/noalyss/html/test.php?gDossier=14
) ce que vous venez
de faire a été sauvé dans le répertoire défini par $_ENV['TMP']
, (sous
linux il s’agit de /tmp )avec un nom ressemblant à scenario-<nombre>.php
Vous devez d’abord copier ce fichier dans le répertoire noalyss/scenario , de préférence avec un nom plus parlant.
Si vous pointez votre browser sur noalyss/html/test.`php (après avoir créé le fichier authorized_debug) en cliquant sur le lien avec le nom de fichier vous pourrez rejouer l’action.
Vous pouvez améliorer la description en changeant l’annotation //@description: <CODE>
|
L’objectif étant de pouvoir tester et de rejouer facilement les actions que vous avez faites. Cela permet de débogguer plus facilement en particulier les parties ajax.