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:
Mais sur serveur linux, le EOF ne fonctionne pas.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 while (not zIBRes.Eof) do begin zGbakLine := zIBRes.GetNextLine; DoLogEvent(zGbakLine); end;
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:
J'ai donc rajouté une condition dans ma boucle mais l'exception est générée un peu plus loin, au Detach.
Code : Sélectionner tout - Visualiser dans une fenêtre à part 'EIBInterBaseError, Unable to complete network request to host "192.168.58.128", Error reading data from the connection'
J'utilise un composant TIBRestoreService (variable zIBRes) sous Delphi 6
Donc la condition supplémentaire sur la boucle ne fait que déplacer le problème.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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;
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