2
0
Эх сурвалжийг харах

* Applied patch from 19097, compilable with Delphi

git-svn-id: trunk@17247 -
michael 14 жил өмнө
parent
commit
56bd9e0d25

+ 41 - 16
packages/fcl-db/src/memds/memds.pp

@@ -11,8 +11,10 @@
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 
  **********************************************************************}
  **********************************************************************}
+{$IFDEF FPC}
 {$mode objfpc}
 {$mode objfpc}
 {$H+}
 {$H+}
+{$ENDIF}
 {
 {
   TMemDataset : In-memory dataset.
   TMemDataset : In-memory dataset.
   - Has possibility to copy Structure/Data from other dataset.
   - Has possibility to copy Structure/Data from other dataset.
@@ -37,6 +39,10 @@ const
   smData      = 2;
   smData      = 2;
 
 
 type
 type
+  {$IFNDEF FPC}
+  ptrint = Integer;
+  {$ENDIF}
+
   MDSError=class(Exception);
   MDSError=class(Exception);
 
 
   PRecInfo=^TMTRecInfo;
   PRecInfo=^TMTRecInfo;
@@ -63,6 +69,9 @@ type
     FFilterBuffer: PChar;
     FFilterBuffer: PChar;
     ffieldoffsets: PInteger;
     ffieldoffsets: PInteger;
     ffieldsizes: PInteger;
     ffieldsizes: PInteger;
+    function GetCharPointer(p:PChar; Pos:Integer):PChar;
+    function GetIntegerPointer(p:PInteger; Pos:Integer):PInteger;
+
     procedure calcrecordlayout;
     procedure calcrecordlayout;
     function  MDSGetRecordOffset(ARecNo: integer): longint;
     function  MDSGetRecordOffset(ARecNo: integer): longint;
     function  MDSGetFieldOffset(FieldNo: integer): integer;
     function  MDSGetFieldOffset(FieldNo: integer): integer;
@@ -123,16 +132,16 @@ type
 
 
     Function  DataSize : Integer;
     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 LoadFromStream(F : TStream);
     Procedure LoadFromFile(AFileName : String);
     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;
     Property FileModified : Boolean Read FFileModified;
 
 
@@ -284,7 +293,7 @@ end;
 
 
 function TMemDataset.MDSGetFieldOffset(FieldNo: integer): integer;
 function TMemDataset.MDSGetFieldOffset(FieldNo: integer): integer;
 begin
 begin
- result:= ffieldoffsets[fieldno-1];
+ result:= getIntegerpointer(ffieldoffsets, fieldno-1)^;
 end;
 end;
 
 
 Procedure TMemDataset.RaiseError(Fmt : String; Args : Array of const);
 Procedure TMemDataset.RaiseError(Fmt : String; Args : Array of const);
@@ -706,7 +715,7 @@ begin
           not getfieldisnull(pointer(srcbuffer),I);
           not getfieldisnull(pointer(srcbuffer),I);
  if result and (buffer <> nil) then 
  if result and (buffer <> nil) then 
    begin
    begin
-   Move((SrcBuffer+ffieldoffsets[I])^, Buffer^,FFieldSizes[I]);
+   Move(getcharpointer(SrcBuffer,getintegerpointer(ffieldoffsets,I)^)^, Buffer^,GetIntegerPointer(FFieldSizes, I)^);
    end;
    end;
 end;
 end;
 
 
@@ -724,10 +733,10 @@ begin
    else 
    else 
      begin 
      begin 
      unsetfieldisnull(pointer(destbuffer),I);
      unsetfieldisnull(pointer(destbuffer),I);
-     J:=FFieldSizes[I];
+     J:=GetIntegerPointer(FFieldSizes, I)^;
      if Field.DataType=ftString then
      if Field.DataType=ftString then
        Dec(J); // Do not move terminating 0, which is in the size.
        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));
      dataevent(defieldchange,ptrint(field));
      end;
      end;
    end;
    end;
@@ -843,18 +852,22 @@ begin
  // Avoid mem-leak if CreateTable is called twice
  // Avoid mem-leak if CreateTable is called twice
  FreeMem(ffieldoffsets);
  FreeMem(ffieldoffsets);
  Freemem(ffieldsizes);
  Freemem(ffieldsizes);
-
+ {$IFDEF FPC}
  FFieldOffsets:=getmem(Count*sizeof(integer));
  FFieldOffsets:=getmem(Count*sizeof(integer));
  FFieldSizes:=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
  FRecSize:= (Count+7) div 8; //null mask
 {$IFDEF FPC_REQUIRES_PROPER_ALIGNMENT}
 {$IFDEF FPC_REQUIRES_PROPER_ALIGNMENT}
  FRecSize:=Align(FRecSize,4);
  FRecSize:=Align(FRecSize,4);
 {$ENDIF}
 {$ENDIF}
  for i:= 0 to Count-1 do
  for i:= 0 to Count-1 do
    begin
    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;
 end;
 end;
 
 
@@ -988,4 +1001,16 @@ begin
     end;
     end;
 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.
 end.