Page 1 sur 1

Comment PHP peut vous sortir d'embarras...

Posté : mer. sept. 09, 2009 7:45 pm
par Côme
Imaginez la situation :

Une de vos tables, importante évidemment, n'est tout d'un coup plus accessible avec un message peu engageant : "Blob file not found or corrupt"... ou en français "Fichier blob absent ou endommagé".

Patatra, catastrophe tous vos memos sont en péril. Bon vous restez calme car vous savez que Paradox offre nativement un outil de reconstruction, le fameux tutility. Mais , stupeur, celui ne parvient pas à réparer la table ou plutôt il accepte finalement mais vous réalisez que le fichier blob a été réinitialisé... Tous vos mémos sont perdus.

Un peu stressé vous essayez dans la foulée TOUS les outils connus de réparation Paradox, dont le fameux Chimney Sweep mais rien à faire votre fichier mémo semble véritablement perdu...

Bon vous scrutez nerveusement les sauvegardes disponibles pour réaliser qu'évidemment cette table n'a pas été sauvegardée depuis longtemps et là vous vous prenez un coup de chaud... surtout si le problème survient pour un gentil client à qui vous répétez depuis quinze ans que Paradox est véritablement "l'outil magique" qui ne fera que son bonheur...

Non vous n'abandonnerez pas ! Pas question qu'un client puisse perdre des données. Voyons voyons comment s'y prendre ? Etudier le format de fichier pour l'attaquer nativement, vous sentez la chose possible mais devinez que cela va vous prendre un temps infini.

Non ce qu'il faudrait ce serait une librairie qui attaquerait nativement les fichiers Paradox sans passer par le BDE ni autre ODBC. Ah mais vous avez connaissance d'une telle librairie bien connue dans le monde PHP, pxlib, écrite en C et disponible en standard depuis PHP ou Python. Allez tentons le coup...

Vite vite un premier petit test pour tester cette solution :
Ici la table endommagée s'appelle FactPro et... elle est cryptée.

Code : Tout sélectionner

<?php
if(!$pxdoc = px_new()) {  
	echo "Pb pxlib";
}  
$fp = fopen("factpro.db", "r");  
if(!px_open_fp($pxdoc, $fp)) {  
	echo "Impossible d'ouvrir la table"; 
}  

// Ici il faut apparemmet désigner par un path absolu
// le chemin vers le fichier blob.

$fichier = "c:\\xampp\\htdocs\\test_pxlib\\Factpro.mb";
px_set_blob_file ( $pxdoc , $fichier); 

// Ici on tente de récupérer le premier enregistrement indexé en 0

$mon_tableau = px_get_record($pxdoc ,0);

// On affiche ce que l'on a obtenu
print_r($mon_tableau);

px_close($pxdoc);  
px_delete($pxdoc);  
fclose($fp);  
?>
Et bingo ! vous visualisez le contenu de vos mémos pour le premier enregistrement (noté 0). La librairie gère même le décryptage des données ! Yes ! "Y'a plus qu'à..." comme on dit :

Une petite boucle de parcours pour écrire un fichier CSV avec nos précieuses données

Code : Tout sélectionner

<?php
if(!$pxdoc = px_new()) {  
	echo "Pb pxlib";
}  
$fp = fopen("factpro.db", "r");  
if(!px_open_fp($pxdoc, $fp)) {  
	echo "Impossible d'ouvrir la table"; 
}  
$fichier = "c:\\xampp\\htdocs\\test_pxlib\\Factpro.mb";
px_set_blob_file ( $pxdoc , $fichier); 

// On va écrire nos données dans un fichier CSV pour les retraiter
// facilement avant réimport dans notre table Paradox.

$fichier_dest=fopen("FactPro.CSV","w");

// Ici ma table dispose de 1549 records, bon on aurait pu rendre cela 
// dynamique mais pour l'heure cela fera l'affaire

For ($i=0;$i<1549;$i++)
{
	$row = px_get_record($pxdoc ,$i);
	//print_r($mon_tableau);
	
	$nofact = $row['NoFact'];
	$nophase = $row['NoPhase'];
	$noligne = $row['NoLigne'];
		
    // Ici le fameux blob...
	$detprod = $row['DetProduit'];
	
   // Retraiter detprod pour virer le maximum de caractères parasites
	$detprod = preg_replace("/\\x0|[\x01-\x1f]/U","",$detprod); 

  // Et hop un fichier CSV	
	fwrite($fichier_dest,"$nofact;$nophase;$noligne;$detprod;\n");	
}

fclose($fichier_dest);
px_close($pxdoc);  
px_delete($pxdoc);  
fclose($fp);  
?>
Alors certes le fichier résultat n'est pas parfait il reste quelques soucis de caractères accentués par exemple mais quelques recherche/remplacer à l'aide de Notepad++ et hop votre fichier est maintenant parfait !!

Reste alors à le réintégrer dans Paradox ce qui se fait en 5 minutes à l'aide d'un ou deux TCursor et TextStream....

Ouf... L'honneur est sauf et vous pouvez maintenant insister pour la remise en place rapide de la sauvegarde automatique qui ne fonctionne plus depuis que le disque dur portable ... a été débranché pour d'autres offices !

:D

Posté : jeu. sept. 10, 2009 12:57 pm
par Côme
Ah un mot aussi sur l'origine probable du souci, un utilisateur itinérant qui se connectait en WIFI pour accéder à l'application Paradox en réseau... A éviter véritablement pour une telle application. :roll: