To check to see when a database (SQL Anywhere) is fired up and ready to receive requests I am outputting the database message window to a log (text) file and then attempting
Use the TFileStream.Create(FileName, fmOpenRead or fmShareDenyNone)
.
In Unicode version of Inno Setup (the only version as of Inno Setup 6), its use is tricky due to a bad interface of the class.
function BufferToAnsi(const Buffer: string): AnsiString;
var
W: Word;
I: Integer;
begin
SetLength(Result, Length(Buffer) * 2);
for I := 1 to Length(Buffer) do
begin
W := Ord(Buffer[I]);
Result[(I * 2)] := Chr(W shr 8); { high byte }
Result[(I * 2) - 1] := Chr(Byte(W)); { low byte }
end;
end;
function LoadStringFromLockedFile(const FileName: string; var S: AnsiString): Boolean;
var
Buffer: string;
Stream: TFileStream;
begin
Result := True;
try
Stream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyNone);
try
SetLength(Buffer, Stream.Size div 2);
Stream.ReadBuffer(Buffer, Stream.Size);
S := BufferToAnsi(Buffer);
finally
Stream.Free;
end;
except
Result := False;
end;
end;
The code is based on TLama's code posted in Read bytes from file at desired position with Inno Setup.
When spawning the database server, use the dbspawn
utility, which is designed for this purpose. You spawn dbspawn
along with the dbeng/dbsrv command you want to run, and it starts the server for you. The dbspawn utility doesn't return until the database server is up, running, and ready to accept requests, so there's no guesswork needed and no need to read the console log file.
I don't know what version of SQL Anywhere you're running, but here is the documentation for v17. It should be the same in any other version.