Bob Swart - Интернет решения от доктора Боба
- Название:Интернет решения от доктора Боба
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:неизвестен
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Bob Swart - Интернет решения от доктора Боба краткое содержание
Интернет решения от доктора Боба - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
begin
FDosEnvList.Free;
FDosEnvList := nil;
inheritedDestroy
end {Destroy} ;
functionTBDosEnvironment.GetDosEnvCount: Word;
begin
Result := 0;
ifAssigned(FDosEnvList) thenResult := FDosEnvList.Count
end {GetDosEnvCount} ;
functionTBDosEnvironment.GetDosEnvStr( ConstName: String): String;
vari: Integer;
Tmp: String;
begin
i := 0;
Result := '';
ifAssigned(FDosEnvList) then whilei do
begin
Tmp := FDosEnvList[i];
Inc(i);
ifPos(Name,Tmp) = 1 then
begin
Delete(Tmp,1,Length(Name));
ifTmp[1] = '=' then
begin
Delete(Tmp,1,1);
Result := Tmp;
i := FDosEnvList.Count { end while-loop }
end
end
end
end {GetDosEnvStr} ;
end.
Данный компонент получает список переменных среды во время своего создания. Свойство DosEnvCount и DosEnvList является свойством только для чтения и поэтому лучше его создавать его в на ходу, а не бросать на форму, так как берется только 'свежий' список переменных среды, а не загружается из .DFM файла).
2.2.4. Анализ
Среди переменных среды есть переменная с именем REQUEST_METHOD. Она должна иметь значение POST для нашего примера (Я не люблю другие методы). Затем мы должны найти размер информации, которая передана нам. Для этого мы должны получить переменную CONTENT_LENGTH. Сама информация поступает к нам через стандартный ввод (без маркера конца файла, поэтому наша задача не пытаться читать больше, чем нам передано). Данные поступающие через стандартный ввод имеют следующую форму FIELD=VALUE и разделяется с помощью символа '&'. Например: AUTHOR="Bob_Swart"&. Поскольку мы имеем весь входной поток, как одну длинную строку, то мы можем быстро найти параметр AUTHOR с помощью следующей функции:
var
Data: String;
functionValue(Const Field: ShortString): ShortString;
vari: Integer;
begin
Result := '';
i := Pos(Field+'=',Data);
ifi = 0 then
begin
Inc(i,Length(Field)+1);
whileData[i] <> '&' do
begin
Result := Result + Data[i];
Inc(i)
end
end
end {Value} ;
Следующий шаблон кода показывает как динамически создать переменную TBDosEnvironment, прочитать информацию со стандартного ввода и получить строку готовую для анализа переменных формы.
{$APPTYPE CONSOLE}
var
Data: String;
ContentLength,i,j: Integer;
begin
writeln('HTTP/1.0 200 OK');
writeln('SERVER: Dr.Bob''s Intranet WebServer 1.0');
writeln('CONTENT- TYPE: TEXT/HTML');
writeln;
writeln('');
writeln('
');
writeln('Generated by Dr.Bob''s CGI-Expert on ',DateTimeToStr(Now));
withTBDosEnvironment.Create( nil) do
begin
fori := 0 toPred(DosEnvCount) do
begin
ifPos('REQUEST_METHOD',DosEnvList[i]) 0 then
begin
Data := DosEnvList[i];
Delete(Data,1,Pos('=',Data))
end
end;
ifData = 'POST' then
begin
ContentLength := StrToInt(GetDosEnvStr('CONTENT_LENGTH'));
SetLength(Data,ContentLength+1);
j := 0;
fori:=1 toContentLength do
begin
Inc(j);
read(Data[j]);
end;
Data[j+1] := '&';
{ now call Value or ValueAsInteger to obtain individual values }
end;
Заметим, что первые три "writeln" строки, посылаемые на стандартный вывод, необходимы для браузера, что бы сообщить ему, что содержимое страницы имеет тип TEXT/HTML.
2.2.5. Базы данных
При написании CGI приложений, вам необходим, какой то путь для доступа к данным базы. Одним из простых решений будет использование BDE и помещение ваших данных в таблицы Парадокса или dBASE. Если по какой либо причине BDE не инсталлировано на вашем NT Web сервере (может быть ваш дружественный Internet Provider не предоставляет вам BDE), вы можете использовать технику старых дней, используйте вместо базы данных файл записей.. Все что вам нужно, определить тип TRecord и написать программу, которая конвертирует вашу базу данных в file of TRecord.
2.2.6. Преобразование
Если вы посмотрите на список полей Парадокса, то вам не составит труда понять, что не все поля можно просто конвертировать в текстовый формат, например типа Memo обычно не помещаются в короткие строки (Short String). А как начет Blob? Для данного типа полей я составил небольшую таблицу конвертирования.
Paradox field type | ObjectPascal conversion type |
---|---|
TStringField (size) | String[length] |
TIntegerField, TWordField, TSmallIntField | Integer |
Currency | Double |
Memo, Blob | n/a (ignored) |
Использую данную таблицу не трудно небольшую программу, которая берет на вход таблицу и создает программу определения записи на Паскале.
{$APPTYPE CONSOLE}
usesDB, DBTables;
vari: Integer;
begin
ifParamCount = 1 then withTTable.Create( nil) do
try
TableName := ParamStr(1);
Active := True;
writeln('Type');
writeln(' TRecord = record');
fori:=0 toPred(FieldDefs.Count) do
begin
if(FieldDefs[i].FieldClass = TStringField) then
writeln(' ':4,FieldDefs[i].Name,': String[',FieldDefs[i].Size,'];')
else
begin
if(FieldDefs[i].FieldClass = TIntegerField) or
(FieldDefs[i].FieldClass = TWordField) or
(FieldDefs[i].FieldClass = TSmallintField) then
writeln(' ':4,FieldDefs[i].Name,': Integer;')
else
if(FieldDefs[i].FieldClass = TCurrencyField) then
writeln(' ':4,FieldDefs[i].Name,': Double;')
else
writeln('{ ':6,FieldDefs[i].Name,' }')
end
end
finally
writeln(' end;');
Free
end
else
writeln('Usage: recordtablename')
end.
Конечно, таблица трансляции и программа определения записи должны быть расширены, что включить и другие типы полей Парадокса, но для примера и этого достаточно.
2.2.7. Записи
После осознания, что мы можем писать на Delphi 2 CGI приложения без использования BDE, мы решили сгенерировать тип записи для нашей таблицы delbooks.db и конвертировать ее записи в файл записей. Использую программ RECORD.EXE из предыдущей главы мы получили следующее определение записи.
Type
Интервал:
Закладка: