Интернет решения от доктора Боба - страница 19

стр.

>Type

>   TRecord = record

>     ISBN: String[16];

>     Title: String[64];

>     Author: String[64];

>     Publisher: String[32];

>     Price: Double;

>     Code: String[7];

>     { Comments }

>     Level: Integer;

>     TechnicalContentsQuality: Integer;

>     QualityOfWriting: Integer;

>     ValueForMoney: Integer;

>     OverallAssessment: Integer;

>     { Cover }

>   end;

Теперь нам осталось написать сам конвертор, который в цикле просматривает записи таблицы, помещает их в запись и записывает в файл.

>{$APPTYPE CONSOLE}

uses DB, DBTables, SysUtils;


var i: Integer;

>     Rec: TRecord;

>     F: File of TRecord;

begin

>   if ParamCount = 1 then with TTable.Create(nil) do

>   try

>     System.Assign(f,ChangeFileExt(ParamStr(1),'.REC'));

>     Rewrite(f);

>     TableName := ParamStr(1);

>     Active := True;

>     First;

>     while not Eof do with Rec do

>     begin

>       ISBN := FieldByName('ISBN').AsString;

>       Title := FieldByName('Title').AsString;

>       Author := FieldByName('Author').AsString;

>       Publisher := FieldByName('Publisher').AsString;

>       Price := FieldByName('Price').AsFloat;

>       Code := FieldByName('Code').AsString;

>       Level := FieldByName('Level').AsInteger;

>       TechnicalContentsQuality :=

>          FieldByName('TechnicalContentsQuality').AsInteger;

>       QualityOfWriting := FieldByName('QualityOfWriting').AsInteger;

>       ValueForMoney := FieldByName('ValueForMoney').AsInteger;

>       OverallAssessment := FieldByName('OverallAssessment').AsInteger;

>       write(f,Rec);

>       Next

>     end

>   finally

>     System.Close(f);

>     Free

>   end

>   else

>     writeln('Usage: convert tablename')

> end.

Данная программа может использоваться для полного преобразования таблицы delbooks.db в файл delbooks.rec с типом записи TRecord. Delphi 2 CGI приложение может просто открыть этот файл и читать любую запись без использования BDE. Конечно, преобразование записей не просто сделать, но для этого мы имеем всегда оригинальную базу и можем запускать периодически программу преобразования. Так как я добавляю всего несколько записей примерно раз в два месяца, то меня это не очень волнует.

2.2.8. Производительность

Единственное различие между обычным CGI приложением, которое использует BDE для получения данных и нашим приложением без использования BDE это производительность. Кроме того, наше CGI всего лишь 70 KB, оно не нуждается в загрузке BDE, так что время загрузки еще меньше (в результате еще более высокая производительность). В действительности реальные CGI приложения, использующие BDE, часто используют ISAPI (Information Server API) или NSAPI (Netscape Server API) расширения для сохранения CGI приложения "все-время-в-полете (in the air)".

Еще больше можно повысить производительность, если вместо файла записей использовать массив записей с предварительно инициализированными значениями! Вместо создания файла с записями, Я генерирую Паскаль код для этой цели. Таким образом, я могу генерировать исходный Паскаль код сразу с нужной информацией. Не нужды в файле записей. И сразу после компиляции я имею одиночное приложение на Дельфи 2, размером всего 77824 байта, которое содержит информацию об 44 книгах внутри самого себя.

Книги внутри, разбор переменных среды, чтение стандартного ввода, генерация HTML страницы и отправка ее на стандартный вывод с динамическим формированием содержимого в зависимости от запроса на форме. Уверен, что единственный способ получить еще более быстрое приложение, это вернуться обратно к статическим страницам без запросов.

2.2.9. Подсчет обращений

Код для подсчета обращений весьма прост. Для поля на форме, которое было выбрано, мы проходим через все записи и добавляем единичку в соответствующую запись при совпадении информации.

>if DataRec.Author <> '' then

>begin

>{$IFDEF DEBUG}

>  writeln('Author: ',DataRec.Author,'
');

>{$ENDIF}

for i:=1 to Books16 do

>    if Pos(DataRec.Author,Book16[i].Author) <> 0 then

>      Inc(Result16[i]);

for i:=1 to Books32 do

>    if Pos(DataRec.Author,Book32[i].Author) <> 0 then

>Inc(Result32[i])

>end;

Заметим, что конструкция {$IFDEF DEBUG} может быть использована для вывода значения входного поля в стандартный вывод, так что мы можем использовать наше CGI приложение для отладки формы. Отладка вашего CGI приложения может оказать трудной задачей, поскольку вам нужен Web сервер и браузер для этого…