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.
|
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.