You've already forked lazarus-ccr
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:
@ -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]);
|
s[pred(size)] := s[pred(size)] xor $80;
|
||||||
end;
|
end;
|
||||||
s[pred(size)] := s[pred(size)] xor $80;
|
|
||||||
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,8 +703,10 @@ begin
|
|||||||
pxfDate:
|
pxfDate:
|
||||||
begin
|
begin
|
||||||
i := int;
|
i := int;
|
||||||
Move(i,Buffer^,sizeof(Integer));
|
if i <> $FFFFFFFF80000000 then begin // This transforms to Dec/12/9999 and probably is NULL
|
||||||
Result := True;
|
Move(i,Buffer^,sizeof(Integer));
|
||||||
|
Result := True;
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
pxfShort:
|
pxfShort:
|
||||||
begin
|
begin
|
||||||
@ -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);
|
||||||
|
Reference in New Issue
Block a user