diff options
| author | michael <michael@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2011-04-04 20:57:11 +0000 |
|---|---|---|
| committer | michael <michael@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2011-04-04 20:57:11 +0000 |
| commit | 3ef59361783a6f406adc89a080d12c13016f24ab (patch) | |
| tree | f7d19e4633312c1669952456c6f22abb684bee80 /packages/fcl-db | |
| parent | e075e4fc928850520c91964a3cd681f23b5309a8 (diff) | |
| download | fpc-3ef59361783a6f406adc89a080d12c13016f24ab.tar.gz | |
* Applied patch from 19097, compilable with Delphi
git-svn-id: http://svn.freepascal.org/svn/fpc/trunk@17247 3ad0048d-3df7-0310-abae-a5850022a9f2
Diffstat (limited to 'packages/fcl-db')
| -rw-r--r-- | packages/fcl-db/src/memds/memds.pp | 57 |
1 files changed, 41 insertions, 16 deletions
diff --git a/packages/fcl-db/src/memds/memds.pp b/packages/fcl-db/src/memds/memds.pp index cdb792d937..f7807f68d0 100644 --- a/packages/fcl-db/src/memds/memds.pp +++ b/packages/fcl-db/src/memds/memds.pp @@ -11,8 +11,10 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. **********************************************************************} +{$IFDEF FPC} {$mode objfpc} {$H+} +{$ENDIF} { TMemDataset : In-memory dataset. - Has possibility to copy Structure/Data from other dataset. @@ -37,6 +39,10 @@ const smData = 2; type + {$IFNDEF FPC} + ptrint = Integer; + {$ENDIF} + MDSError=class(Exception); PRecInfo=^TMTRecInfo; @@ -63,6 +69,9 @@ type FFilterBuffer: PChar; ffieldoffsets: PInteger; ffieldsizes: PInteger; + function GetCharPointer(p:PChar; Pos:Integer):PChar; + function GetIntegerPointer(p:PInteger; Pos:Integer):PInteger; + procedure calcrecordlayout; function MDSGetRecordOffset(ARecNo: integer): longint; function MDSGetFieldOffset(FieldNo: integer): integer; @@ -123,16 +132,16 @@ type Function DataSize : Integer; - procedure Clear(ClearDefs : Boolean); - procedure Clear; - Procedure SaveToFile(AFileName : String); - Procedure SaveToFile(AFileName : String; SaveData : Boolean); - Procedure SaveToStream(F : TStream); - Procedure SaveToStream(F : TStream; SaveData : Boolean); + procedure Clear(ClearDefs : Boolean);{$IFNDEF FPC} overload; {$ENDIF} + procedure Clear;{$IFNDEF FPC} overload; {$ENDIF} + Procedure SaveToFile(AFileName : String);{$IFNDEF FPC} overload; {$ENDIF} + Procedure SaveToFile(AFileName : String; SaveData : Boolean);{$IFNDEF FPC} overload; {$ENDIF} + Procedure SaveToStream(F : TStream); {$IFNDEF FPC} overload; {$ENDIF} + Procedure SaveToStream(F : TStream; SaveData : Boolean);{$IFNDEF FPC} overload; {$ENDIF} Procedure LoadFromStream(F : TStream); Procedure LoadFromFile(AFileName : String); - Procedure CopyFromDataset(DataSet : TDataSet); - Procedure CopyFromDataset(DataSet : TDataSet; CopyData : Boolean); + Procedure CopyFromDataset(DataSet : TDataSet); {$IFNDEF FPC} overload; {$ENDIF} + Procedure CopyFromDataset(DataSet : TDataSet; CopyData : Boolean); {$IFNDEF FPC} overload; {$ENDIF} Property FileModified : Boolean Read FFileModified; @@ -284,7 +293,7 @@ end; function TMemDataset.MDSGetFieldOffset(FieldNo: integer): integer; begin - result:= ffieldoffsets[fieldno-1]; + result:= getIntegerpointer(ffieldoffsets, fieldno-1)^; end; Procedure TMemDataset.RaiseError(Fmt : String; Args : Array of const); @@ -706,7 +715,7 @@ begin not getfieldisnull(pointer(srcbuffer),I); if result and (buffer <> nil) then begin - Move((SrcBuffer+ffieldoffsets[I])^, Buffer^,FFieldSizes[I]); + Move(getcharpointer(SrcBuffer,getintegerpointer(ffieldoffsets,I)^)^, Buffer^,GetIntegerPointer(FFieldSizes, I)^); end; end; @@ -724,10 +733,10 @@ begin else begin unsetfieldisnull(pointer(destbuffer),I); - J:=FFieldSizes[I]; + J:=GetIntegerPointer(FFieldSizes, I)^; if Field.DataType=ftString then Dec(J); // Do not move terminating 0, which is in the size. - Move(Buffer^,(DestBuffer+FFieldOffsets[I])^,J); + Move(Buffer^,GetCharPointer(DestBuffer, getIntegerPointer(FFieldOffsets, I)^)^,J); dataevent(defieldchange,ptrint(field)); end; end; @@ -843,18 +852,22 @@ begin // Avoid mem-leak if CreateTable is called twice FreeMem(ffieldoffsets); Freemem(ffieldsizes); - + {$IFDEF FPC} FFieldOffsets:=getmem(Count*sizeof(integer)); FFieldSizes:=getmem(Count*sizeof(integer)); + {$ELSE} + getmem(FFieldOffsets, Count*sizeof(integer)); + getmem(FFieldSizes, Count*sizeof(integer)); + {$ENDIF} FRecSize:= (Count+7) div 8; //null mask {$IFDEF FPC_REQUIRES_PROPER_ALIGNMENT} FRecSize:=Align(FRecSize,4); {$ENDIF} for i:= 0 to Count-1 do begin - ffieldoffsets[i] := frecsize; - ffieldsizes[i] := MDSGetbufferSize(i+1); - FRecSize:= FRecSize+FFieldSizes[i]; + GetIntegerPointer(ffieldoffsets, i)^ := frecsize; + GetIntegerPointer(ffieldsizes, i)^ := MDSGetbufferSize(i+1); + FRecSize:= FRecSize+GetIntegerPointeR(FFieldSizes, i)^; end; end; @@ -988,4 +1001,16 @@ begin end; end; +function TMemDataset.GetCharPointer(p:PChar; Pos:Integer):PChar; +begin + Result:=p; + inc(Result, Pos); +end; + +function TMemDataset.GetIntegerPointer(p:PInteger; Pos:Integer):PInteger; +begin + Result:=p; + inc(Result, Pos); +end; + end. |
