[fonction C] commande systeme
Bonjour,
j'ai développé une petite dll (je suis sous windows) dont j'importe les éléments fonctionnels un à un dans des fonctions C sous postgre. Tout fonctionne très bien pour le moment mais j'ai un soucis lors des appels de commandes système faits par certains des éléments fonctionnels de ma dll.
Ainsi un des éléments fonctionnels de ma dll (importé dans une fonction C sous postgre) est définit ainsi :
Code:
1 2 3 4 5 6 7 8 9 10 11 12
| PG_FUNCTION_INFO_V1(restruct_voie);
DLLIMPORT Datum restruct_voie(PG_FUNCTION_ARGS)
{
system("cd ./RestructVoie");
system("mkdir rep_test_systeme");
system("My_RestructVoie.BAT");;
system("cd ..");
PG_RETURN_NULL();
} |
Par défaut je suis dans le répertoire data de postgre; répertoire dans lequel j'ai créé un sous répertoire RestructVoie.
J'attends que le prog 'se déplace' dans 'RestructVoie' puis lance le fichier 'My_RestructVoie' avant de revenir à la racine.
Pour débugger et savoir ou je suis à un instant donné je crée un répertoire de test : 'rep_test_systeme'.
Mon problème est que la commande cd ne fonctionne pas (comme je l'attends) car quoi que je fasse le répertoire 'rep_test_systeme' (que je crée afin de débugger mon programme) est créé à la racine du répertoire 'data' de postgre. Ce qui signifie bien que ma commande "cd ./RestructVoie" ou encore "cd RestructVoie" n'a pas été prise en compte comme je le désire.
J'ai déjà vu des notes concernant des subtilité dans le mécanisme associé à la commande 'cd' mais je ne les retrouve pas.
Quelqu'un aurait-il la solution ?
Merci pour votre lecture !
Merci tout de même JeitEmgie
Il est vrai que j'ai aussi eu à traiter le problème de droit dont tu parles et quelques autres du au fait que je ne suis pas en localhost. D'ailleurs il se peut que je n'ai pas résolu le problème dans les régles de l'art et que mon process soit très peu portable.
Le process postgres s'éxécute avec sous quel utilisateur ? celui définit par le owner de la fonction ?
Merci encore.
Le mieux est l'ennemi du bien...
(sauf quand le bien ne suffit pas !)
Bonjour,
j'ai toujours un soucis avec la ligne de commande suivante :
Code:
chdir("D:\\Echanges\\mdp_ta_init_lib_c\\RestructVoie");
j'ai aussi essayé d'utiliser la commande que vous m'avez indiqué mais rien n'y fait.
Je vais prendre le temps d'expliquer le problème un peu bizarre au quel je suis confronté :
1- j'ai donc une dll qui contient différents éléments fonctionnels dont celui particulier pour lequel j'ai indiqué le code dans les messages précédents .
2- j'ai aussi une fonction C dans PostGreSQL pour chacun des éléments de ma dll.
3- lorsque je lance ma fonction 'RestructVoie' depuis PostGre après l'avoir "liée" à l'élément correspondant de la dll, la fonction opére : le programme se rend à l'emplacement indiqué et lance le BAT qui me génére différents fichiers de sortie.
4- le problème est que l'appel de la fonction me renvoie un message d'erreur édité par pgAdmin :
Code:
1 2
| Une erreur s'est produite.
ERROR : could not open relation 1663/50117178/1247 |
5- Plus surprenant encore : si je me déconnecte, que je me reconnecte, que je lance d'abord une des fonctions référençant un des éléments fonctionnels autre que celui qui léve le message d'erreur tout se passe bien et même pire (ou mieux) si je lance ensuite ma fonction 'RestructVoie' alors non seulement elle opére mais je n'ai plus de message d'erreur !
6- on pourrait se dire alors qu'il suffit de faire précéder l'appel de la fonction bloquante par un appel à une des autres fonctions ("débloquante") ... mais quand on met le tout dans une fonction globale ça affiche le message d'erreur de nouveau.
Drôle de chose !