Pārlūkot izejas kodu

+ Fixed Native Format issues of TDateTime fields

git-svn-id: trunk@1852 -
michael 19 gadi atpakaļ
vecāks
revīzija
2ba05e2f84
3 mainītis faili ar 126 papildinājumiem un 9 dzēšanām
  1. 102 2
      fcl/db/dataset.inc
  2. 5 0
      fcl/db/db.pp
  3. 19 7
      fcl/db/fields.inc

+ 102 - 2
fcl/db/dataset.inc

@@ -498,8 +498,89 @@ end;
 function TDataSet.GetFieldData(Field: TField; Buffer: Pointer;
 function TDataSet.GetFieldData(Field: TField; Buffer: Pointer;
   NativeFormat: Boolean): Boolean;
   NativeFormat: Boolean): Boolean;
   
   
+Const
+  TempBufSize = 1024; { Let's not exaggerate.}
+    
+Var
+  Buf : Array[1..TempBufSize] of Char;
+  P : PChar; 
 begin
 begin
-  Result := GetFieldData(Field, Buffer);
+  If NativeFormat then
+    Result:=GetFieldData(Field, Buffer)
+  else
+    begin
+    If (Field.DataSize<=TempBufSize) then
+      P:=@Buf
+    else
+      P:=GetMem(Field.DataSize);
+    Result:=GetFieldData(Field,P);
+    If Result then
+      DataConvert(Field,P,Buffer,False);
+    If (P<>@Buf) then
+      FreeMem(P);
+    end;  
+end;
+
+Function DateTimeRecToDateTime(DT: TFieldType; Data: TDateTimeRec): TDateTime;
+
+var
+  TS: TTimeStamp;
+
+begin
+  TS.Date:=0;
+  TS.Time:=0;
+  case DT of
+    ftDate: TS.Date := Data.Date;
+    ftTime: With TS do
+              begin
+              Time := Data.Time;
+              Date := DateDelta;
+              end;
+  else
+    try
+      TS:=MSecsToTimeStamp(Data.DateTime);
+    except
+    end;
+  end;  
+  Result:=TimeStampToDateTime(TS);
+end; 
+
+Function DateTimeToDateTimeRec(DT: TFieldType; Data: TDateTime): TDateTimeRec;
+
+var
+  TS : TTimeStamp;
+  
+begin
+  TS:=DateTimeToTimeStamp(Data);
+  With Result do
+    case DT of
+      ftDate: 
+        Date:=TS.Date;
+      ftTime: 
+        Time:=TS.Time;
+    else
+      DateTime:=TimeStampToMSecs(TS);
+    end;
+end;
+
+procedure TDataSet.DataConvert(Field: TField; Source, Dest: Pointer; ToNative: Boolean);
+
+Type
+  PDateTime = ^TDateTime;
+  PDateTimeRec = ^TDateTimeRec;
+
+Var
+  DT : TFieldType; 
+ 
+begin
+  DT:=Field.DataType;
+  case DT of
+    ftDate, ftTime, ftDateTime:
+      if ToNative then
+         PDateTimeRec(Dest)^:=DateTimeToDateTimeRec(DT,PDateTime(Source)^) 
+       else
+         PDateTime(Dest)^:=DateTimeRecToDateTime(DT,PDateTimeRec(Source)^);
+  end;
 end;
 end;
 
 
 procedure TDataSet.SetFieldData(Field: TField; Buffer: Pointer);
 procedure TDataSet.SetFieldData(Field: TField; Buffer: Pointer);
@@ -511,8 +592,27 @@ end;
 procedure TDataSet.SetFieldData(Field: TField; Buffer: Pointer;
 procedure TDataSet.SetFieldData(Field: TField; Buffer: Pointer;
   NativeFormat: Boolean);
   NativeFormat: Boolean);
 
 
+Const
+  TempBufSize = 1024; { Let's not exaggerate.}
+    
+Var
+  Buf : Array[1..TempBufSize] of Char;
+  P : PChar; 
+
 begin
 begin
-  SetFieldData(Field, Buffer);
+  if NativeFormat then
+    SetFieldData(Field, Buffer)
+  else 
+    begin
+    if Field.DataSize<=dsMaxStringSize then
+      P:=GetMem(Field.DataSize)
+    else
+      P:=@Buf;  
+    DataConvert(Field,Buffer,P,True);
+    SetFieldData(Field,P);
+    If (P<>@Buf) then
+      FreeMem(P);
+    end;  
 end;
 end;
 
 
 Function TDataset.GetField (Index : Longint) : TField;
 Function TDataset.GetField (Index : Longint) : TField;

+ 5 - 0
fcl/db/db.pp

@@ -318,10 +318,12 @@ type
     procedure Clear; virtual;
     procedure Clear; virtual;
     procedure FocusControl;
     procedure FocusControl;
     function GetData(Buffer: Pointer): Boolean;
     function GetData(Buffer: Pointer): Boolean;
+    function GetData(Buffer: Pointer; NativeFormat : Boolean): Boolean;
     class function IsBlob: Boolean; virtual;
     class function IsBlob: Boolean; virtual;
     function IsValidChar(InputChar: Char): Boolean; virtual;
     function IsValidChar(InputChar: Char): Boolean; virtual;
     procedure RefreshLookupList;
     procedure RefreshLookupList;
     procedure SetData(Buffer: Pointer);
     procedure SetData(Buffer: Pointer);
+    procedure SetData(Buffer: Pointer; NativeFormat : Boolean);
     procedure SetFieldType(AValue: TFieldType); virtual;
     procedure SetFieldType(AValue: TFieldType); virtual;
     procedure Validate(Buffer: Pointer);
     procedure Validate(Buffer: Pointer);
     property AsBoolean: Boolean read GetAsBoolean write SetAsBoolean;
     property AsBoolean: Boolean read GetAsBoolean write SetAsBoolean;
@@ -1066,6 +1068,7 @@ type
     function GetDataSource: TDataSource; virtual;
     function GetDataSource: TDataSource; virtual;
     function GetFieldData(Field: TField; Buffer: Pointer): Boolean; overload; virtual;
     function GetFieldData(Field: TField; Buffer: Pointer): Boolean; overload; virtual;
     function GetFieldData(Field: TField; Buffer: Pointer; NativeFormat: Boolean): Boolean; overload; virtual;
     function GetFieldData(Field: TField; Buffer: Pointer; NativeFormat: Boolean): Boolean; overload; virtual;
+    procedure DataConvert(Field: TField; Source, Dest: Pointer; ToNative: Boolean);virtual;
     function GetRecord(Buffer: PChar; GetMode: TGetMode; DoCheck: Boolean): TGetResult; virtual; abstract;
     function GetRecord(Buffer: PChar; GetMode: TGetMode; DoCheck: Boolean): TGetResult; virtual; abstract;
     function GetRecordSize: Word; virtual; abstract;
     function GetRecordSize: Word; virtual; abstract;
     procedure InternalAddRecord(Buffer: Pointer; Append: Boolean); virtual; abstract;
     procedure InternalAddRecord(Buffer: Pointer; Append: Boolean); virtual; abstract;
@@ -1801,6 +1804,8 @@ Procedure DatabaseErrorFmt (Const Fmt : String; Args : Array Of Const);
 Procedure DatabaseErrorFmt (Const Fmt : String; Args : Array Of const;
 Procedure DatabaseErrorFmt (Const Fmt : String; Args : Array Of const;
                             Comp : TComponent);
                             Comp : TComponent);
 Function ExtractFieldName(Const Fields: String; var Pos: Integer): String;
 Function ExtractFieldName(Const Fields: String; var Pos: Integer): String;
+Function DateTimeRecToDateTime(DT: TFieldType; Data: TDateTimeRec): TDateTime;
+Function DateTimeToDateTimeRec(DT: TFieldType; Data: TDateTime): TDateTimeRec;
 
 
 implementation
 implementation
 
 

+ 19 - 7
fcl/db/fields.inc

@@ -540,6 +540,12 @@ end;
 
 
 function TField.GetData(Buffer: Pointer): Boolean;
 function TField.GetData(Buffer: Pointer): Boolean;
 
 
+begin
+  Result:=GetData(Buffer,True);
+end;
+
+function TField.GetData(Buffer: Pointer; NativeFormat : Boolean): Boolean;
+
 begin
 begin
   IF FDataset=Nil then
   IF FDataset=Nil then
     DatabaseErrorFmt(SNoDataset,[FieldName]);
     DatabaseErrorFmt(SNoDataset,[FieldName]);
@@ -550,7 +556,7 @@ begin
       Move (FValueBuffer^,Buffer^ ,DataSize);
       Move (FValueBuffer^,Buffer^ ,DataSize);
     end
     end
   else
   else
-    Result:=FDataset.GetFieldData(Self,Buffer);
+    Result:=FDataset.GetFieldData(Self,Buffer,NativeFormat);
 end;
 end;
 
 
 function TField.GetDataSize: Word;
 function TField.GetDataSize: Word;
@@ -767,10 +773,16 @@ end;
 
 
 procedure TField.SetData(Buffer: Pointer);
 procedure TField.SetData(Buffer: Pointer);
 
 
+begin
+ SetData(Buffer,True);
+end;
+
+procedure TField.SetData(Buffer: Pointer; NativeFormat : Boolean);
+
 begin
 begin
   If Not Assigned(FDataset) then
   If Not Assigned(FDataset) then
     EDatabaseError.CreateFmt(SNoDataset,[FieldName]);
     EDatabaseError.CreateFmt(SNoDataset,[FieldName]);
-  FDataSet.SetFieldData(Self,Buffer, False);
+  FDataSet.SetFieldData(Self,Buffer, NativeFormat);
 end;
 end;
 
 
 Procedure TField.SetDataset (Value : TDataset);
 Procedure TField.SetDataset (Value : TDataset);
@@ -1749,7 +1761,7 @@ end;
 function TDateTimeField.GetAsDateTime: TDateTime;
 function TDateTimeField.GetAsDateTime: TDateTime;
 
 
 begin
 begin
-  If Not GetData(@Result) then
+  If Not GetData(@Result,False) then
     Result:=0;
     Result:=0;
 end;
 end;
 
 
@@ -1763,7 +1775,7 @@ function TDateTimeField.GetAsVariant: Variant;
 Var d : tDateTime;
 Var d : tDateTime;
 
 
 begin
 begin
-  If Getdata(@d) then
+  If Getdata(@d,False) then
     Result := d
     Result := d
   else
   else
     Result:=Null;
     Result:=Null;
@@ -1796,7 +1808,7 @@ Var R : TDateTime;
     F : String;
     F : String;
 
 
 begin
 begin
-  If Not Getdata(@R) then
+  If Not Getdata(@R,False) then
     TheText:=''
     TheText:=''
   else
   else
     begin
     begin
@@ -1817,7 +1829,7 @@ end;
 procedure TDateTimeField.SetAsDateTime(AValue: TDateTime);
 procedure TDateTimeField.SetAsDateTime(AValue: TDateTime);
 
 
 begin
 begin
-  SetData(@Avalue);
+  SetData(@Avalue,False);
 end;
 end;
 
 
 
 
@@ -1834,7 +1846,7 @@ Var R : TDateTime;
 
 
 begin
 begin
   R:=StrToDateTime(AVAlue);
   R:=StrToDateTime(AVAlue);
-  SetData(@R);
+  SetData(@R,False);
 end;
 end;