Выбрать главу

Type

   TRecord = record

     ISBN: String[16];

     Title: String[64];

     Author: String[64];

     Publisher: String[32];

     Price: Double;

     Code: String[7];

     { Comments }

     Leveclass="underline" 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,'<BR>');

{$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 сервер и браузер для этого…

2.2.10. Результаты запроса

Теперь посмотрим на последнюю часть CGI приложения: часть, в которой генерируется HTML код. Здесь я использую другое свойство расширенного HTML, именованные таблицы, что бы вывод выглядел красивее. Для каждой записи, у которой счетчик более единицы, я выводу счетчик, название, автора, издательство, ISBN, уровень, техническое содержание, качество книги, стоимость и общее значение. Я также включаю ссылку из названия на другое место, где находится более подробное описание. С помощью этого великолепного свойства динамических HTML страниц: вы даже можете включать ссылки на статические страницы, так как результат запроса, часто стартовая точка для прыжка в другое место!

writeln('<HR>');

writeln('<P>');

writeln('<H3>The following books have been found for you:</h3>');

writeln('<TABLE BORDER>');

writeln('<TR>');

writeln('<TH><B>Hits</B></TH>');

writeln('<TH><B>Title</B></TH>');