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 to read this using LoadStringFromFile
, which I then search for specific text using Pos
. The problem is that this fails (I assume) as the file is in use.
Exec(strInstallPath + '\Bin32\dbeng17.exe', '-n ' + strEngineName + ' "' + strInstallPath + '\Database\Olympus.db" -n ' + strDatabaseName + ' -gdall -xtcpip -ti0 -c25p -ot "' + strTempPath + '\dbeng.log"', '', SW_HIDE,
ewNoWait, intResultCode);
if not LoadStringFromFile(strTempPath + '\dbeng.log', astrDatabaseEngineLog) then
begin
Log('Loading string from file failed.');
end;
I have also tried to copy the log file using FileCopy
and attempt to read from the copy of the file, but FileCopy
also fails.
if not FileCopy(strTempPath + '\dbeng.log', strTempPath + '\dbengcopy.log', False) then
begin
Log('File copy failed.');
end;
Is there any way to read from a file that is in use or another way to do this?
Use the
TFileStream.Create(FileName, fmOpenRead or fmShareDenyNone)
.In Unicode version of Inno Setup, its use is tricky due to a bad interface of the class.
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 spawndbspawn
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.