Bonjour,
Je développe un composant de sauvegarde / restauration de base firebird (version utilisée 1.54),
La sauvegarde fonctionne sur serveur firebird windows et linux.
Mais la restauration ne fonctionne que sur windows (accès local et distant).
SERVEUR: Sur le serveur (Ubuntu 7.04 server sur vmWare player), firebird est lancé par xinetd
CLIENT: XP
La restauration se passe "presque bien", le fichier restauré est correct mais une exception apparait en fin de restauration.
Au départ j'avais une boucle comme ça:
1 2 3 4 5
| while (not zIBRes.Eof) do
begin
zGbakLine := zIBRes.GetNextLine;
DoLogEvent(zGbakLine);
end; |
Mais sur serveur linux, le EOF ne fonctionne pas.
La dernière ligne est affichée 'gbak: finishing, closing, and going home ' puis on rentre dans la boucle une dernière fois avant plantage sur le GetNextLine.
Avec le message suivant:
'EIBInterBaseError, Unable to complete network request to host "192.168.58.128", Error reading data from the connection'
J'ai donc rajouté une condition dans ma boucle mais l'exception est générée un peu plus loin, au Detach.
J'utilise un composant TIBRestoreService (variable zIBRes) sous Delphi 6
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| try
zIBRes.Verbose := True;
zIBRes.ServiceStart;
if zIBRes.Verbose then
begin
zGbakLine := '';
while (not zIBRes.Eof) and (zGbakLine <> 'gbak: finishing, closing, and going home ') do // Sous linux le EOF seul n'arrête pas la boucle
begin
zGbakLine := zIBRes.GetNextLine;
DoLogEvent(zGbakLine);
end;
end;
Result := True;
except
on E: EIBError do
begin
DoLogEvent(zGbakLine);
DoLogEvent(E.Message);
end;
end;
finally
if zIBRes.Active then
begin
try
zIBRes.Detach; // PLANTE ICI !!!!!!!!!!
except
on E: EIBError do
begin
DoLogEvent('Erreur lors du détachement: ' + E.Message);
end;
end;
end
end;
finally
zIBRes.Free;
end; |
Donc la condition supplémentaire sur la boucle ne fait que déplacer le problème.
Le EOF semble fermer TOUS les ports de connexion, du coup quand on appelle une méthode la connexion au socket étant fermée le composant ne trouve
plus le serveur.
Cela se vérifie sur le processus "fbserver", son pid est constant jusqu'au EOF puis il change ensuite.
Bizarrement le problème n'existe pas avec le composant de sauvegarde.
Serait-ce un bug?
Comment éviter le problème?
Merci.
Partager