diff --git a/fcl/db/Makefile b/fcl/db/Makefile index 496e6d5c41..5bc608c7a1 100644 --- a/fcl/db/Makefile +++ b/fcl/db/Makefile @@ -1,8 +1,8 @@ # -# Don't edit, this file is generated by FPCMake Version 1.1 [2003/04/01] +# Don't edit, this file is generated by FPCMake Version 1.1 [2003/06/26] # default: all -MAKEFILETARGETS=linux go32v2 win32 os2 freebsd beos netbsd amiga atari sunos qnx netware openbsd wdosx palmos macos macosx emx +MAKEFILETARGETS=linux go32v2 win32 os2 freebsd beos netbsd amiga atari sunos qnx netware openbsd wdosx palmos macos darwin emx override PATH:=$(subst \,/,$(PATH)) ifeq ($(findstring ;,$(PATH)),) inUnix=1 @@ -32,7 +32,7 @@ inOS2=1 endif endif else -ifneq ($(findstring cygwin,$(MACHTYPE)),) +ifneq ($(findstring cygdrive,$(PATH)),) inCygWin=1 endif endif @@ -220,7 +220,7 @@ endif ifeq ($(OS_TARGET),openbsd) override TARGET_DIRS+=mysql interbase endif -override TARGET_UNITS+=db ddg_ds ddg_rec +override TARGET_UNITS+=db ddg_ds ddg_rec dbwhtml override TARGET_EXAMPLEDIRS+=tests override INSTALL_FPCPACKAGE=y override COMPILER_OPTIONS+=-S2 @@ -534,6 +534,12 @@ ifeq ($(OS_TARGET),macos) EXEEXT= FPCMADE=fpcmade.mcc endif +ifeq ($(OS_TARGET),darwin) +EXEEXT= +HASSHAREDLIB=1 +FPCMADE=fpcmade.darwin +ZIPSUFFIX=darwin +endif else ifeq ($(OS_TARGET),go32v1) PPUEXT=.pp1 @@ -892,69 +898,159 @@ TAREXT=.tar.gz endif override REQUIRE_PACKAGES=rtl ifeq ($(OS_TARGET),linux) +ifeq ($(CPU_TARGET),i386) REQUIRE_PACKAGES_RTL=1 REQUIRE_PACKAGES_MYSQL=1 REQUIRE_PACKAGES_IBASE=1 endif +endif +ifeq ($(OS_TARGET),linux) +ifeq ($(CPU_TARGET),m68k) +REQUIRE_PACKAGES_RTL=1 +REQUIRE_PACKAGES_MYSQL=1 +REQUIRE_PACKAGES_IBASE=1 +endif +endif +ifeq ($(OS_TARGET),linux) +ifeq ($(CPU_TARGET),powerpc) +REQUIRE_PACKAGES_RTL=1 +REQUIRE_PACKAGES_MYSQL=1 +REQUIRE_PACKAGES_IBASE=1 +endif +endif +ifeq ($(OS_TARGET),linux) +ifeq ($(CPU_TARGET),sparc) +REQUIRE_PACKAGES_RTL=1 +REQUIRE_PACKAGES_MYSQL=1 +REQUIRE_PACKAGES_IBASE=1 +endif +endif +ifeq ($(OS_TARGET),linux) +ifeq ($(CPU_TARGET),x86_64) +REQUIRE_PACKAGES_RTL=1 +REQUIRE_PACKAGES_MYSQL=1 +REQUIRE_PACKAGES_IBASE=1 +endif +endif ifeq ($(OS_TARGET),go32v2) +ifeq ($(CPU_TARGET),i386) REQUIRE_PACKAGES_RTL=1 endif +endif ifeq ($(OS_TARGET),win32) +ifeq ($(CPU_TARGET),i386) REQUIRE_PACKAGES_RTL=1 REQUIRE_PACKAGES_MYSQL=1 REQUIRE_PACKAGES_IBASE=1 endif +endif ifeq ($(OS_TARGET),os2) +ifeq ($(CPU_TARGET),i386) REQUIRE_PACKAGES_RTL=1 endif +endif ifeq ($(OS_TARGET),freebsd) +ifeq ($(CPU_TARGET),i386) REQUIRE_PACKAGES_RTL=1 REQUIRE_PACKAGES_MYSQL=1 REQUIRE_PACKAGES_IBASE=1 endif +endif +ifeq ($(OS_TARGET),freebsd) +ifeq ($(CPU_TARGET),m68k) +REQUIRE_PACKAGES_RTL=1 +REQUIRE_PACKAGES_MYSQL=1 +REQUIRE_PACKAGES_IBASE=1 +endif +endif ifeq ($(OS_TARGET),beos) +ifeq ($(CPU_TARGET),i386) REQUIRE_PACKAGES_RTL=1 endif +endif ifeq ($(OS_TARGET),netbsd) +ifeq ($(CPU_TARGET),i386) REQUIRE_PACKAGES_RTL=1 REQUIRE_PACKAGES_MYSQL=1 REQUIRE_PACKAGES_IBASE=1 endif +endif +ifeq ($(OS_TARGET),netbsd) +ifeq ($(CPU_TARGET),m68k) +REQUIRE_PACKAGES_RTL=1 +REQUIRE_PACKAGES_MYSQL=1 +REQUIRE_PACKAGES_IBASE=1 +endif +endif ifeq ($(OS_TARGET),amiga) +ifeq ($(CPU_TARGET),m68k) REQUIRE_PACKAGES_RTL=1 endif +endif ifeq ($(OS_TARGET),atari) +ifeq ($(CPU_TARGET),m68k) REQUIRE_PACKAGES_RTL=1 endif +endif ifeq ($(OS_TARGET),sunos) +ifeq ($(CPU_TARGET),i386) REQUIRE_PACKAGES_RTL=1 endif +endif +ifeq ($(OS_TARGET),sunos) +ifeq ($(CPU_TARGET),sparc) +REQUIRE_PACKAGES_RTL=1 +endif +endif ifeq ($(OS_TARGET),qnx) +ifeq ($(CPU_TARGET),i386) REQUIRE_PACKAGES_RTL=1 endif +endif ifeq ($(OS_TARGET),netware) +ifeq ($(CPU_TARGET),i386) REQUIRE_PACKAGES_RTL=1 endif +endif ifeq ($(OS_TARGET),openbsd) +ifeq ($(CPU_TARGET),i386) REQUIRE_PACKAGES_RTL=1 REQUIRE_PACKAGES_MYSQL=1 REQUIRE_PACKAGES_IBASE=1 endif -ifeq ($(OS_TARGET),wdosx) +endif +ifeq ($(OS_TARGET),openbsd) +ifeq ($(CPU_TARGET),m68k) REQUIRE_PACKAGES_RTL=1 +REQUIRE_PACKAGES_MYSQL=1 +REQUIRE_PACKAGES_IBASE=1 +endif +endif +ifeq ($(OS_TARGET),wdosx) +ifeq ($(CPU_TARGET),i386) +REQUIRE_PACKAGES_RTL=1 +endif endif ifeq ($(OS_TARGET),palmos) +ifeq ($(CPU_TARGET),m68k) REQUIRE_PACKAGES_RTL=1 endif +endif ifeq ($(OS_TARGET),macos) +ifeq ($(CPU_TARGET),powerpc) REQUIRE_PACKAGES_RTL=1 endif -ifeq ($(OS_TARGET),macosx) +endif +ifeq ($(OS_TARGET),darwin) +ifeq ($(CPU_TARGET),powerpc) REQUIRE_PACKAGES_RTL=1 endif +endif ifeq ($(OS_TARGET),emx) +ifeq ($(CPU_TARGET),i386) REQUIRE_PACKAGES_RTL=1 endif +endif ifdef REQUIRE_PACKAGES_RTL PACKAGEDIR_RTL:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /rtl/$(OS_TARGET)/Makefile.fpc,$(PACKAGESDIR)))))) ifneq ($(PACKAGEDIR_RTL),) @@ -1152,7 +1248,7 @@ override COMPILER:=$(FPC) $(FPCOPT) ifeq (,$(findstring -s ,$(COMPILER))) EXECPPAS= else -ifeq ($(OS_SOURCE),$(OS_TARGET)) +ifeq ($(FULL_SOURCE),$(FULL_TARGET)) EXECPPAS:=@$(PPAS) endif endif diff --git a/fcl/db/Makefile.fpc b/fcl/db/Makefile.fpc index c2dca72630..c9e1963330 100644 --- a/fcl/db/Makefile.fpc +++ b/fcl/db/Makefile.fpc @@ -12,7 +12,7 @@ dirs_freebsd=mysql interbase dirs_netbsd=mysql interbase dirs_openbsd=mysql interbase dirs_win32=mysql interbase -units=db ddg_ds ddg_rec +units=db ddg_ds ddg_rec dbwhtml exampledirs=tests [compiler] diff --git a/fcl/db/dbwhtml.pp b/fcl/db/dbwhtml.pp new file mode 100644 index 0000000000..9d0ee1eb77 --- /dev/null +++ b/fcl/db/dbwhtml.pp @@ -0,0 +1,483 @@ +{$mode objfpc} +{$H+} +unit dbwhtml; + +Interface + +uses sysutils,classes,db,whtml; + +Type + THTMLAlign = (haDefault,haLeft,haRight,haCenter); // Compatible with Delphi. + + TTableColumn = Class(TCollectionItem) + private + FActionUrl: String; + FAlign: THTMLAlign; + FBGColor: String; + FCaptionURL: String; + FFieldName : String; + FCaption : String; + FGetColumn: String; + FImgUrl: String; + Protected + FField : TField; // Filled. + Published + Property FieldName : String Read FFieldName Write FFieldName; + Property Caption : String Read FCaption Write FCaption; + Property ImgUrl : String Read FImgUrl Write FImgUrl; + Property ActionUrl : String Read FActionUrl Write FActionUrl; + Property CaptionURL : String Read FCaptionURL Write FCaptionURL; + Property BGColor : String Read FBGColor Write FBGColor; + Property Align : THTMLAlign read FAlign Write Falign; + end; + + TTableColumns = Class(TCollection) + Constructor Create; + end; + + THTMLProducer = Class(TComponent) + Private + FDataset : TDataset; + FContents: TMemorySTream; + Function GetContent : String; + Protected + Procedure CheckContents; + Procedure WriteString(S : TStream; Const Value : String); + Procedure WriteString(S : TStream; Const Fmt : String; Args : Array Of Const); + Public + Destructor Destroy; override; + Procedure ClearContent; + Procedure CreateContent; virtual; Abstract; + Property Content : String Read GetContent; + Published + Property Dataset : TDataset Read FDataset Write FDataset; + end; + + + TTableProducer = Class(THTMLProducer) + Private + FTableColumns : TTableColumns; + FBorder : Boolean; + Protected + Procedure BindColumns; + Procedure CreateTableColumns; Virtual; + Procedure CreateTableHeader(Stream : TStream); + Procedure CreateHeaderCell(C : TTableColumn; Stream : TStream); virtual; + Procedure CreateTableRow(Stream : TStream);virtual; + Procedure StartTable(Stream : TStream); virtual; + Procedure EndTable(Stream : TStream); virtual; + Procedure EmitFieldCell(C : TTableColumn; Stream : TStream); virtual; + Public + Constructor Create(AOwner : TComponent); override; + Destructor Destroy; virtual; + Procedure Clear; + Procedure CreateColumns(FieldList : TStrings); + Procedure CreateColumns(FieldList : String); + Procedure CreateTable(Stream : TStream); + Procedure CreateTable; + Procedure CreateContent; override; + Published + Property Border : Boolean Read FBorder Write FBorder; + end; + + TComboBoxProducer = Class(THTMLProducer) + private + FDatafield: String; + FInputName: String; + FValue: String; + FValueField: String; + function GetInputName: String; + protected + procedure CreateItem(Stream : TStream; VF,DF : TField; Selected : Boolean); virtual; + Public + Constructor Create(AOwner : TComponent); override; + Destructor Destroy; virtual; + Procedure CreateComboBox(Stream : TStream); + Procedure CreateComboBox; + Procedure CreateContent; override; + Published + Property ValueField : String Read FValueField Write FValueField; + Property DataField : String Read FDatafield Write FDataField; + Property Value : String Read FValue Write FValue; + Property InputName : String Read GetInputName Write FInputName; + end; + + TDBHtmlWriter = Class(THTMLWriter) + Protected + Function CreateTableProducer: TTableProducer; virtual; + Public + Procedure CreateTable(Dataset : TDataset); + Procedure CreateTable(Dataset : TDataset; Producer : TTableProducer); + end; + + +Implementation + +{ TTableColumns } + +constructor TTableColumns.Create; +begin + inherited Create(TTableColumn); +end; + +{ TTableProducer } + + +procedure TTableProducer.BindColumns; + +Var + I : Integer; + +begin + With FTableColumns do + For I:=0 to Count-1 do + With TTableColumn(Items[I]) do + FField:=FDataset.FieldByName(FieldName); +end; + +procedure TTableProducer.CreateTableColumns; +begin + FTableColumns:=TTableColumns.Create; +end; + +procedure TTableProducer.CreateTableHeader(Stream : TStream); + +Var + I : Integer; + +begin + WriteString(Stream,''); + With FTableColumns do + For I:=0 to Count-1 do + CreateHeaderCell(TTableColumn(Items[I]),Stream); + WriteString(Stream,''#10); +end; + +procedure TTableProducer.CreateHeaderCell(C: TTableColumn; Stream: TStream); + +Var + URL : String; + +begin + WriteString(Stream,''); + With C do + begin + If (FCaptionURL<>'') then + begin + URL:=Format(FCaptionURL,[FieldName]); + URL:=Format('',[URL]); + WriteString(Stream,URL); + end; + WriteString(Stream,Caption); + If (FCaptionURL<>'') then + WriteString(Stream,''); + If (FImgURL<>'') then + begin + if (FCaptionURL<>'') then + WriteString(Stream,URL); + WriteString(Stream,'',[FImgURL]); + If (FCaptionURL<>'') then + WriteString(Stream,''); + end; + end; + WriteString(Stream,''); +end; + +procedure TTableProducer.CreateTableRow(Stream : TStream); + +Var + I : Integer; + +begin + WriteString(Stream,''); + With FTableColumns do + For I:=0 to Count-1 do + EmitFieldCell(TTableColumn(Items[I]),Stream); + WriteString(Stream,''#10); +end; + +procedure TTableProducer.StartTable(Stream: TStream); + +Var + S : String; + +begin + S:=''; + WriteString(Stream,S); +end; + +procedure TTableProducer.EndTable(Stream: TStream); +begin + WriteString(Stream,''#10); +end; + +procedure TTableProducer.EmitFieldCell(C: TTableColumn; Stream: TStream); + +Var + URL : String; + +begin + WriteString(Stream,''); + With C.FField Do + begin + URL:=C.ActionURL; + If (URL<>'') then + begin + URL:=Format(C.ActionURL,[AsString]); + WriteString(Stream,'',[URL]); + end; + WriteString(Stream,AsString); + If (URL<>'') then + WriteString(Stream,''); + end; + WriteString(Stream,''); +end; + +constructor TTableProducer.Create(AOwner : TComponent); +begin + Inherited Create(AOwner); + CreateTableColumns; +end; + +destructor TTableProducer.Destroy; +begin + FTableColumns.Free; + Inherited; +end; + +procedure TTableProducer.Clear; +begin + FTableColumns.Clear; + If Assigned(FContents) then + FreeAndNil(FContents); + FBorder:=False; + +end; + +procedure TTableProducer.CreateColumns(FieldList: TStrings); + +Var + I : Integer; + FN : String; + +begin + For I:=0 to FDataset.FieldCount-1 do + begin + FN:=FDataset.Fields[I].FieldName; + If (FieldList=Nil) or (FieldList.IndexOf(FN)<>-1) then + With FTableColumns.Add as TTableColumn do + begin + FieldName:=FN; + Caption:=FDataset.Fields[i].DisplayName; + end; + end +end; + +procedure TTableProducer.CreateColumns(FieldList: String); + +Var + L : TStringList; + +begin + If (FieldList='') then + CreateColumns(Nil) + else + begin + L:=TStringList.Create; + try + L.CommaText:=FieldList; + CreateColumns(L); + Finally + L.Free; + end; + end; +end; + +procedure TTableProducer.CreateTable(Stream: TStream); +begin + If FTableColumns.Count=0 then + CreateColumns(Nil); + BindColumns; + StartTable(Stream); + Try + CreateTableHeader(Stream); + While Not Dataset.EOF do + begin + CreateTableRow(Stream); + Dataset.Next; + end; + Finally + EndTable(Stream); + end; +end; + +procedure TTableProducer.CreateTable; +begin + CheckContents; + CreateTable(FContents); +end; + +procedure TTableProducer.CreateContent; +begin + CreateTable; +end; + + +{ TComboBoxProducer } + +function TComboBoxProducer.GetInputName: String; +begin + If (FInputName='') then + Result:=Name + else + Result:=FInputName; +end; + +constructor TComboBoxProducer.Create(AOwner: TComponent); +begin + inherited Create(AOwner); +end; + +destructor TComboBoxProducer.Destroy; +begin + Inherited; +end; + +procedure TComboBoxProducer.CreateItem(Stream : TStream; VF,DF : TField; Selected : Boolean); + +Const + SOptions : Array[Boolean] of String = ('Nil) and (VF<>DF) then + WriteString(Stream,' VALUE="'+VF.AsString+'"'); + WriteString(Stream,'>'+DF.AsString+#10); +end; + +procedure TComboBoxProducer.CreateComboBox(Stream: TStream); + +Var + VF,DF,SF : TField; + +begin + DF:=Dataset.FieldByNAme(DataField); + if (ValueField<>'') then + VF:=DF + else + VF:=Nil; + If (Value='') then + SF:=Nil + else + if VF<>NIl then + SF:=VF + else + SF:=DF; + WriteString(Stream,''); + end; +end; + +procedure TComboBoxProducer.CreateComboBox; +begin + CheckContents; + CreateComboBox(FContents); +end; + +procedure TComboBoxProducer.CreateContent; +begin + CreateComboBox; +end; + +{ THTMLProceder } + +function THTMLProducer.GetContent: String; + +begin + If Assigned(FContents) then + begin + SetLength(Result,FContents.Size); + If (FContents.Size>0) then + Move(FContents,Result[1],FContents.Size); + end; +end; + +procedure THTMLProducer.CheckContents; +begin + If Assigned(FContents) then + FContents.Clear + else + FContents:=TMemoryStream.Create; +end; + +destructor THTMLProducer.Destroy; +begin + If Assigned(FContents) then + FreeAndNil(FContents); + inherited Destroy; +end; + +procedure THTMLProducer.ClearContent; +begin + If Assigned(FContents) then + FContents.Clear; +end; + +procedure THTMLProducer.WriteString(S: TStream; const Value: String); + +Var + L : Integer; + +begin + L:=Length(Value); + If L>0 then + S.Write(Value[1],L); +end; + +procedure THTMLProducer.WriteString(S: TStream; const Fmt: String; + Args: array of const); +begin + WriteString(S,Format(Fmt,Args)); +end; + +{ TDBHtmlWriter } + +function TDBHtmlWriter.CreateTableProducer: TTableProducer; +begin + Result:=TTableProducer.Create(Nil); +end; + +procedure TDBHtmlWriter.CreateTable(Dataset: TDataset); + +Var + P : TTableProducer; + +begin + P:=CreateTableProducer; + Try + CreateTable(Dataset,P); + Finally + P.Free; + end; +end; + +procedure TDBHtmlWriter.CreateTable(Dataset: TDataset; Producer: TTableProducer); +begin + Producer.Dataset:=Dataset; + Producer.CreateTable(Self.Stream); +end; + +end.