Üdv Mindenkinek!
MySQL adatbázis Lazarusból indított bacup/restore funkcióit szeretném megoldani. A Bacup sikerült, mert a mysqldump.exe külső meghívásával a mellékelt programocska (TProcess használatával) elvégzi a mentést. Ugyanakkor, ha ebbe a kódba a P.CommandLine := 'mysql -u root -p******* --host testserver.hu tesztdb < testdata.sql'; sort helyettesítem be, akkor nem fut le a process. Output oldalon kiírja a MySQL helpet, ami arra utal, hogy valami miatt nem értelmezi a paraméteres futtatást. Parancssorból azonban a visszatöltés sikeres. Mi lehet a gondja a külső hívásnak, van valakinek ötlete?? Még egy infó, hogy az ExecuteProcess(), valamint az Exec() is hasonló módon lefut, de eredménytelen.
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, Process, Dos;
const
READ_BYTES = 2048;
var
S: TStringList;
M: TMemoryStream;
P: TProcess;
n: LongInt;
BytesRead: LongInt;
begin
M := TMemoryStream.Create;
BytesRead := 0;
P := TProcess.Create(nil);
P.CommandLine := 'mysqldump -uroot -p******* --host testserver.hu --database testdb';
P.Options := [poUsePipes, poStderrToOutPut];
Memo1.Lines.Add('-- Mentés elindult! --');
P.ShowWindow:=swoHIDE;
P.Execute;
while P.Running do
begin
M.SetSize(BytesRead + READ_BYTES);
n := P.Output.Read((M.Memory + BytesRead)^, READ_BYTES);
if n > 0
then begin
Inc(BytesRead, n);
end
else begin
Sleep(100);
end;
end;
repeat
M.SetSize(BytesRead + READ_BYTES);
n := P.Output.Read((M.Memory + BytesRead)^, READ_BYTES);
if n > 0
then begin
Inc(BytesRead, n);
end;
until n <=0;
M.SetSize(BytesRead);
Memo1.Lines.Add('-- Mentés lefutott! --');
Memo1.Lines.Add('-- Tárolt mentés mérete = '+IntToStr(M.Size)+' byte --');
begin
Memo1.Lines.Add('| '+S[n]);
end;}
Memo1.Lines.Add('-- Bacup file létrehozása! --');
M.SaveToFile('testdata.sql');
Memo1.Lines.Add('-- Mentés vége! --');
P.Free;
M.Free;
end;