TParadoxDataset: InputEncoding is a read-only property now. Empty TargetEncoding defaults to utf8.

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@6903 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz
2019-05-10 21:42:54 +00:00
parent c2d7bafd8b
commit cf7fa56835

View File

@ -169,11 +169,13 @@ type
procedure SetFileName(const AValue: TFileName); procedure SetFileName(const AValue: TFileName);
function GetEncrypted: Boolean; function GetEncrypted: Boolean;
function GetInputEncoding: String; inline;
function GetTargetEncoding: String; inline;
function GetVersion: real; function GetVersion: real;
function IsStoredTargetEncoding: Boolean;
procedure ReadBlock; procedure ReadBlock;
procedure ReadNextBlockHeader; procedure ReadNextBlockHeader;
procedure ReadPrevBlockHeader; procedure ReadPrevBlockHeader;
procedure SetInputEncoding(AValue: String);
procedure SetTargetEncoding(AValue: String); procedure SetTargetEncoding(AValue: String);
protected protected
procedure InternalOpen; override; procedure InternalOpen; override;
@ -210,8 +212,8 @@ type
published published
property TableName: TFileName read FFileName write SetFileName; property TableName: TFileName read FFileName write SetFileName;
property TableLevel: real read GetVersion; property TableLevel: real read GetVersion;
property InputEncoding: string read FInputEncoding write SetInputEncoding; property InputEncoding: String read GetInputEncoding;
property TargetEncoding: string read FTargetEncoding write SetTargetEncoding; property TargetEncoding: string read FTargetEncoding write SetTargetEncoding stored IsStoredTargetEncoding;
property FieldDefs; property FieldDefs;
property Active; property Active;
property AutoCalcFields; property AutoCalcFields;
@ -265,6 +267,27 @@ begin
Result := (FHeader^.encryption2 <> 0) Result := (FHeader^.encryption2 <> 0)
end; end;
function TParadoxDataset.GetInputEncoding: String;
begin
if FInputEncoding = '' then
Result := GetDefaultTextEncoding
else
Result := FInputEncoding;
end;
function TParadoxDataset.GetTargetEncoding: String;
begin
if (FTargetEncoding = '') or SameText(FTargetEncoding, 'utf-8') then
Result := EncodingUTF8
else
Result := FTargetEncoding;
end;
function TParadoxDataset.IsStoredTargetEncoding: Boolean;
begin
Result := not SameText(FTargetEncoding, EncodingUTF8);
end;
procedure TParadoxDataSet.ReadBlock; procedure TParadoxDataSet.ReadBlock;
var var
L : longint; L : longint;
@ -322,23 +345,10 @@ begin
end; end;
end; end;
procedure TParadoxDataset.SetInputEncoding(AValue: String);
begin
if AValue = FInputEncoding then
exit;
if AValue = '' then
FInputEncoding := GetDefaultTextEncoding
else
FInputEncoding := AValue;
end;
procedure TParadoxDataset.SetTargetEncoding(AValue: String); procedure TParadoxDataset.SetTargetEncoding(AValue: String);
begin begin
if AValue = FTargetEncoding then exit; if AValue = FTargetEncoding then exit;
if AValue = '' then FTargetEncoding := Uppercase(AValue);
FTargetEncoding := EncodingUTF8
else
FTargetEncoding := AValue;
end; end;
procedure TParadoxDataSet.InternalOpen; procedure TParadoxDataSet.InternalOpen;
@ -425,7 +435,7 @@ begin
inc(FNamesStart, FTableNameLen); // over Tablename and padding inc(FNamesStart, FTableNameLen); // over Tablename and padding
for i := 1 to FHeader^.NumFields do for i := 1 to FHeader^.NumFields do
begin begin
fname := ConvertEncoding(StrPas(FNamesStart), FInputEncoding, FTargetEncoding); fname := ConvertEncoding(StrPas(FNamesStart), GetInputEncoding, GetTargetEncoding);
case F^.fType of case F^.fType of
pxfAlpha: FieldDefs.Add(fname, ftString, F^.fSize); pxfAlpha: FieldDefs.Add(fname, ftString, F^.fSize);
pxfDate: FieldDefs.Add(fname, ftDate, 0); pxfDate: FieldDefs.Add(fname, ftDate, 0);
@ -669,19 +679,17 @@ begin
else else
size := F^.fSize; size := F^.fSize;
if F^.fType in [pxfDate..pxfNumber, pxfTime..pxfAutoInc] then // These numeric fields are stored as big endian
begin if F^.fType in [pxfDate..pxfNumber, pxfTime..pxfAutoInc] then begin
for i := 0 to pred(size) do for i := 0 to pred(size) do
begin
s[pred(size-i)] := byte(p[i]); s[pred(size-i)] := byte(p[i]);
end;
s[pred(size)] := s[pred(size)] xor $80; s[pred(size)] := s[pred(size)] xor $80;
end; end;
case F^.fType of case F^.fType of
pxfAlpha: pxfAlpha:
if (Buffer <> nil) then begin if (Buffer <> nil) then begin
str := ConvertEncoding(StrPas(p), FInputEncoding, FTargetEncoding); str := ConvertEncoding(StrPas(p), GetInputEncoding, GetTargetEncoding);
if str <> '' then begin if str <> '' then begin
StrLCopy(Buffer, PChar(str), Length(str)); StrLCopy(Buffer, PChar(str), Length(str));
Result := true; Result := true;
@ -695,9 +703,11 @@ begin
pxfDate: pxfDate:
begin begin
i := int; i := int;
if i <> $FFFFFFFF80000000 then begin // This transforms to Dec/12/9999 and probably is NULL
Move(i,Buffer^,sizeof(Integer)); Move(i,Buffer^,sizeof(Integer));
Result := True; Result := True;
end; end;
end;
pxfShort: pxfShort:
begin begin
i := si; i := si;
@ -744,8 +754,8 @@ constructor TParadoxDataSet.Create(AOwner: TComponent);
begin begin
inherited Create(AOwner); inherited Create(AOwner);
FHeader := nil; FHeader := nil;
FTargetEncoding := EncodingUTF8; FTargetEncoding := Uppercase(EncodingUTF8);
FInputEncoding := GetDefaultTextEncoding; FInputEncoding := '';
end; end;
destructor TParadoxDataSet.Destroy; destructor TParadoxDataSet.Destroy;
@ -802,7 +812,7 @@ begin
if Field.DataType = ftMemo then begin if Field.DataType = ftMemo then begin
SetLength(s, blobInfo.Length); SetLength(s, blobInfo.Length);
FBlobStream.Read(s[1], blobInfo.Length); FBlobStream.Read(s[1], blobInfo.Length);
s := ConvertEncoding(s, FInputEncoding, FTargetEncoding); s := ConvertEncoding(s, GetInputEncoding, GetTargetEncoding);
memStream.Write(s[1], Length(s)); memStream.Write(s[1], Length(s));
end else end else
begin begin
@ -820,7 +830,7 @@ begin
if Field.DataType = ftMemo then begin if Field.DataType = ftMemo then begin
SetLength(s, blobInfo.Length); SetLength(s, blobInfo.Length);
FBlobStream.Read(s[1], blobInfo.Length); FBlobStream.Read(s[1], blobInfo.Length);
s := ConvertEncoding(s, FInputEncoding, FTargetEncoding); s := ConvertEncoding(s, GetInputEncoding, GetTargetEncoding);
memStream.Write(s[1], Length(s)); memStream.Write(s[1], Length(s));
end else end else
memStream.CopyFrom(FBlobStream, blobInfo.Length); memStream.CopyFrom(FBlobStream, blobInfo.Length);
@ -830,7 +840,7 @@ begin
if Field.DataType = ftMemo then begin if Field.DataType = ftMemo then begin
SetLength(s, blobInfo.Length); SetLength(s, blobInfo.Length);
Move(p^, s[1], blobInfo.Length); Move(p^, s[1], blobInfo.Length);
s := ConvertEncoding(s, FInputEncoding, FTargetEncoding); s := ConvertEncoding(s, GetInputEncoding, GetTargetEncoding);
memStream.Write(s[1], Length(s)); memStream.Write(s[1], Length(s));
end else end else
memStream.Write(p, blobInfo.Length); memStream.Write(p, blobInfo.Length);