ATOUTFOX
COMMUNAUTÉ FRANCOPHONE DES PROFESSIONNELS FOXPRO
Visual FoxPro : le développement durable

Conversion de DBC en base PostgreSQL   



L'auteur

Luc
France France
Membre Actif (personne physique)
# 0000000060
enregistré le 21/10/2004

http://www.limoog.net
Gilot Luc
01 700 Neyron
Fiche personnelle


Note des membres
pas de note

Contributions > 04 - DBF : Tables

Conversion de DBC en base PostgreSQL
# 0000000869
ajouté le 13/11/2013 15:25:09 et modifié le 13/11/2013
consulté 4540 fois
Niveau initié

Version(s) Foxpro :
VFP 9.0


Le téléchargement des pièces jointes est limité aux membres
Veuillez vous identifier ou vous inscrire si vous n'avez pas encore de compte ...
Description

Comme promis dans le forum, voici un ensemble de classes permettant de convertir un DBC en base PostgreSQL.

On lui donne le DBC et l'URL d'un serveur PostgreSQL et il construit la BDD postgres, le schéma postgres,la connexion dans le DBC vers la BDD postgres, les tables dans postgres avec index et crés étrangères, y pousse les données et crée les vues VFP updatables. Ca gère les booleens et les noms de champs accentués et ca permet une personnalisation poussée (BeforeCreateTable, AfterCreateTable, BeforeCreateField, ...).

En sortie, la base est créée sous PostgreSQL avec les données et plusieurs schémas pour y ranger les fonctions et procédures stockées, et un nouveau DBC est créé, dans lequel on trouvera une vue distante pour chaque table du DBC source.

En fin de traitement, il affiche le log du traitement dans votre navigateur.

En bonus, il y a la création dans PostgreSQL de quelques fonctions qui sont la traduction de fonctions VFP dont j'ai eu besoin au sein de PostgreSQL (cf. PGFunc_VFP.PRG), et d'autres qui sont utiles au traitement de l'importation (cf PGFunc_PGTools.PRG).

Un exemple d'utilisation (une fois que tous les Set Paths ont été mis d'aplomb et que les PRG ont été compilés avec les bons Set Path) :

DO lancepg_atoutfox With "Data.dbc", "192.168.1.10"

La base de données "Data.dbc" est incluse dans le zip.

Le fonctionnement repose sur deux classes de base : cPG_Importe_Base et cPG_CréeFonctionsPostgres_Base (PG_Importe_Base.PRG), qui effectuent le gros des traitements et sont sous-classées dans PG_Importe_AtoutFox.PRG pour les traitements spécifiques.

Attention : ce code n'est pas encore en production et n'a pas été nettoyé ni écrit avec des normes de programmation très constantes. Il ne serait pas surprenant d'y trouver des bugs ou autres anomalies. Par ailleurs j'ai la facheuse tendance d'utiliser des &gsSetStepOn qui introduisent des points d'arrêt dans l'exécution du code. La variable gsSetStepOn vaut par défaut "Set Step On" : il suffit de lui donner la valeur "*" pour ne plus avoir de points d'arrêt.

Un détail : il est possible que votre driver ODBC pour Postgres n'ai pas le même nom que le mien : il vous faudra alors le changer dans LancePG_AtoutFox.PRG à la ligne :

cCnxnPG_ODBCDriver = Evl(m.pcODBCDriver, "PostgreSQL ODBC Driver(UNICODE)")

Si ca intéresse quelqu'un, il y a peut-être moyen de travailelr à plusieurs pour finaliser ce bricolage et en faire un outil distribuable (sachant que par ailleurs j'ai développé des outils de tests unitaire des fonctions Postgres envoyées depuis VFP -par comparaison des résultats de la fonction originale VFP avec la fonction traduite en Postgres-, des outils de pré-traduction de fonctions VFP vers le langage pl-pgsql, ...)

Merci de vos retours en tout cas

Luc

PS : je n'ai pas trouvé d'entrée "PostgreSQL" dans le site AtoutFox, alors j'ai rangé cette contrib dans "DBF"

PS2 : j'ai utilisé les suffixes "AtoutFox" non pas pour engager la responsabilité de l'association, mais pour m'y retrouver moi-même dans les différentes versions de ce code.

Commentaires
le 25/11/2013, Hamidou a écrit :
Merci d avoir partagé avec la communauté cette contribution

Quelques remarques apres un essai:

- Data type bytea (type VFP blob,general) peut pas accepter 0 comme valeur par défaut : que j ai replace par chaine vide

- index primaire composés str(code)+str(numero) == > (code,numero)

autrement j ai pu testé la migration d une base vfp de 110 tables
vers Posgresql.

le 11/04/2014, FoxInCloud a écrit :
Félicitations Luc, joli travail
J'espère que vous pourrez monter un groupe de travail collaboratif autour de contribution

GitHub ou VFPx?

++
thn

le 11/04/2014, FoxInCloud a écrit :
Salut Luc,

Au niveau normalisation, je te propose cette syntaxe pour la déclaration et la description des paramètres :

Lparameters ;
pcDBVFP; && Adresse du DBC à convertir
, pcURLPostGres; && [127.0.0.1] URL de la BDD PostGreSQL
, pcPortPostGres; && [5432] port PostGres
, pcUserPostGres; && ["postgres"] login postgres à utiliser
, pcPwdPostGres; && ["admin"] mdp associé au login
, pcODBCDriver; && ["PostgreSQL ODBC Driver(UNICODE)"] driver ODBC à utiliser - "PostgreSQL Unicode" pour Poste PowerEdge (Win Server 2008, 64 bits), "PostgreSQL ODBC Driver(UNICODE)" pour Poste Portable-Dell2 (XP, 32bits)
, pcPréfixeDBPostGres && [JustFname(m.pcDBVFP)] préfixe à ajouter au nom de la BDD PostGreSQL à créer

En adoptant cette standardisation, nous pourrions partager mon outil d'aide dans l'IDE qui inscrit automatiquement les paramètres dans l'intellisense (abModule présenté aux Rencontres ... 2005)

++

le 11/04/2014, Luc a écrit :
Salut Thierry
J'aimerai bien monter un tel groupe de travail... J'attends les propositions.

Par contre, j'avoue ne pas aimer ta standardisation, qui rend la lecture des paramètres difficiles à mon gout. Je préfère mettre ces informations dans l'en-tête de la fonction, comme tu pourras le voir dans le code fourni.
De plus, ma propre version de Intellisense me reporte automatiquement les paramètres sous forme de commentaires dans le code, ce que je trouve plus facile à lire, car pour savoir quel est le paramètre attendu, je n'ai pas besoin de taper une virgule ou une parenthèse :
lcLst = AddSepa(m.lcLst ; && psLst
, "," ; && psSépa
)
(sauf qu'ici ca ressort mal à cause de la valeur HTML des tabulations).

Par contre, je pense que ton outil pourrait être adapté à ma façon de noter les commentaires (tout en gardant ton fonctionnement selon la configuration), et je veux bien m'en charger dans le cadre de l'éventuel groupe de travail que tu évoques.

Luc

le 11/04/2014, FoxInCloud a écrit :
OK, difficile de se séparer des ses conventions ...

J'aimerais vraiment travailler avec un SCM, à la Gregory (Continuous Integration), ceci étant assez sympa
http://youtu.be/sE4wQ50Itqg

le 06/01/2015, FoxInCloud a écrit :
Salut Luc,

Si tu n'as que des fichiers texte dans ce projet (prg ou sql) ce serait cool de monter un projet sur GitHub


Publicité

Les pubs en cours :

www.atoutfox.org - Site de la Communauté Francophone des Professionnels FoxPro - v3.4.0 - © 2004-2017.
Cette page est générée par un composant COM+ développé en Visual FoxPro 9.0