You've already forked lazarus-ccr
fix blob field in TRxMemdataset
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@804 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
@@ -226,6 +226,14 @@ const
|
|||||||
|
|
||||||
{ Utility routines }
|
{ Utility routines }
|
||||||
|
|
||||||
|
procedure FinalizeBlobFields(BlobArray:PMemBlobArray; BlobFieldCount:integer);
|
||||||
|
var
|
||||||
|
i:integer;
|
||||||
|
begin
|
||||||
|
for i:=0 to BlobFieldCount-1 do
|
||||||
|
BlobArray^[i]:='';
|
||||||
|
end;
|
||||||
|
|
||||||
function CompareFields(Data1, Data2: Pointer; FieldType: TFieldType;
|
function CompareFields(Data1, Data2: Pointer; FieldType: TFieldType;
|
||||||
CaseInsensitive: Boolean): Integer;
|
CaseInsensitive: Boolean): Integer;
|
||||||
begin
|
begin
|
||||||
@@ -378,9 +386,17 @@ begin
|
|||||||
if FMemoryData <> nil then
|
if FMemoryData <> nil then
|
||||||
begin
|
begin
|
||||||
FMemoryData.FRecords.Remove(Self);
|
FMemoryData.FRecords.Remove(Self);
|
||||||
if FMemoryData.BlobFieldCount > 0 then
|
{ if FMemoryData.BlobFieldCount > 0 then
|
||||||
Finalize(PMemBlobArray(FBlobs)^[0], FMemoryData.BlobFieldCount);
|
Finalize(PMemBlobArray(FBlobs)^[0], FMemoryData.BlobFieldCount);
|
||||||
ReallocMem(FBlobs, 0);
|
ReallocMem(FBlobs, 0);}
|
||||||
|
if FMemoryData.BlobFieldCount > 0 then
|
||||||
|
begin
|
||||||
|
FinalizeBlobFields(FBlobs, Value.BlobFieldCount);
|
||||||
|
Freemem(FBlobs, Value.BlobFieldCount * SizeOf(TMemBlobData));
|
||||||
|
//Finalize(PMemBlobArray(FBlobs)^[0], FMemoryData.BlobFieldCount);
|
||||||
|
// ReallocMem(FBlobs, 0);
|
||||||
|
end;
|
||||||
|
FBlobs:=nil;
|
||||||
ReallocMem(FData, 0);
|
ReallocMem(FData, 0);
|
||||||
FMemoryData := nil;
|
FMemoryData := nil;
|
||||||
end;
|
end;
|
||||||
@@ -395,8 +411,12 @@ begin
|
|||||||
FMemoryData := Value;
|
FMemoryData := Value;
|
||||||
if Value.BlobFieldCount > 0 then
|
if Value.BlobFieldCount > 0 then
|
||||||
begin
|
begin
|
||||||
ReallocMem(FBlobs, Value.BlobFieldCount * SizeOf(Pointer));
|
// ReallocMem(FBlobs, Value.BlobFieldCount * SizeOf(Pointer));
|
||||||
Initialize(PMemBlobArray(FBlobs)^[0]);//, Value.BlobFieldCount);
|
// Initialize(PMemBlobArray(FBlobs)^[0]);//, Value.BlobFieldCount);
|
||||||
|
GetMem(FBlobs, Value.BlobFieldCount * SizeOf(TMemBlobData));
|
||||||
|
FinalizeBlobFields(FBlobs, Value.BlobFieldCount);
|
||||||
|
// FillChar(FBlobs^, Value.BlobFieldCount * SizeOf(Pointer), 0);
|
||||||
|
// Initialize(PMemBlobArray(FBlobs)^[0]);//, Value.BlobFieldCount);
|
||||||
end;
|
end;
|
||||||
DataSize := 0;
|
DataSize := 0;
|
||||||
for I := 0 to Value.FieldDefs.Count - 1 do
|
for I := 0 to Value.FieldDefs.Count - 1 do
|
||||||
@@ -569,7 +589,7 @@ begin
|
|||||||
if GetProps then FRecordSize := CalcRecordSize;
|
if GetProps then FRecordSize := CalcRecordSize;
|
||||||
FBookmarkOfs := FRecordSize + CalcFieldsSize;
|
FBookmarkOfs := FRecordSize + CalcFieldsSize;
|
||||||
FBlobOfs := FBookmarkOfs + SizeOf(TMemBookmarkInfo);
|
FBlobOfs := FBookmarkOfs + SizeOf(TMemBookmarkInfo);
|
||||||
FRecBufSize := FBlobOfs + BlobFieldCount * SizeOf(Pointer);
|
FRecBufSize := FBlobOfs + BlobFieldCount * SizeOf(TMemBlobData);//Pointer);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TRxMemoryData.ClearRecords;
|
procedure TRxMemoryData.ClearRecords;
|
||||||
@@ -582,14 +602,21 @@ end;
|
|||||||
function TRxMemoryData.AllocRecordBuffer: PChar;
|
function TRxMemoryData.AllocRecordBuffer: PChar;
|
||||||
begin
|
begin
|
||||||
Result := StrAlloc(FRecBufSize);
|
Result := StrAlloc(FRecBufSize);
|
||||||
|
FillChar(Result^, FRecBufSize, 0);
|
||||||
if BlobFieldCount > 0 then
|
if BlobFieldCount > 0 then
|
||||||
Initialize(PMemBlobArray(Result + FBlobOfs)^[0]);//, BlobFieldCount);
|
begin
|
||||||
|
// Initialize(PMemBlobArray(Result + FBlobOfs)^[0]);//, BlobFieldCount);
|
||||||
|
// FillChar(PMemBlobArray(Result + FBlobOfs)^, BlobFieldCount * SizeOf(Pointer),0);//, BlobFieldCount);
|
||||||
|
FinalizeBlobFields(PMemBlobArray(Result + FBlobOfs), BlobFieldCount);
|
||||||
|
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TRxMemoryData.FreeRecordBuffer(var Buffer: PChar);
|
procedure TRxMemoryData.FreeRecordBuffer(var Buffer: PChar);
|
||||||
begin
|
begin
|
||||||
if BlobFieldCount > 0 then
|
if BlobFieldCount > 0 then
|
||||||
Finalize(PMemBlobArray(Buffer + FBlobOfs)^[0]);//, BlobFieldCount);
|
FinalizeBlobFields(PMemBlobArray(Buffer + FBlobOfs), BlobFieldCount);
|
||||||
|
// Finalize(PMemBlobArray(Buffer + FBlobOfs)^[0]);//, BlobFieldCount)
|
||||||
StrDispose(Buffer);
|
StrDispose(Buffer);
|
||||||
Buffer := nil;
|
Buffer := nil;
|
||||||
end;
|
end;
|
||||||
@@ -643,7 +670,7 @@ begin
|
|||||||
BookmarkFlag := bfCurrent;
|
BookmarkFlag := bfCurrent;
|
||||||
end;
|
end;
|
||||||
for I := 0 to BlobFieldCount - 1 do
|
for I := 0 to BlobFieldCount - 1 do
|
||||||
PMemBlobArray(Buffer + FBlobOfs)[I] := PMemBlobArray(Rec.FBlobs)[I];
|
PMemBlobArray(Buffer + FBlobOfs)^[I] := PMemBlobArray(Rec.FBlobs)^[I];
|
||||||
GetCalcFields(Buffer);
|
GetCalcFields(Buffer);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@@ -903,8 +930,8 @@ procedure TRxMemoryData.CloseBlob(Field: TField);
|
|||||||
begin
|
begin
|
||||||
if (FRecordPos >= 0) and (FRecordPos < FRecords.Count) and
|
if (FRecordPos >= 0) and (FRecordPos < FRecords.Count) and
|
||||||
(State = dsEdit) then
|
(State = dsEdit) then
|
||||||
PMemBlobArray(ActiveBuffer + FBlobOfs)[Field.Offset] :=
|
PMemBlobArray(ActiveBuffer + FBlobOfs)^[Field.Offset] :=
|
||||||
PMemBlobArray(Records[FRecordPos].FBlobs)[Field.Offset]
|
PMemBlobArray(Records[FRecordPos].FBlobs)^[Field.Offset]
|
||||||
else PMemBlobArray(ActiveBuffer + FBlobOfs)^[Field.Offset] := '';
|
else PMemBlobArray(ActiveBuffer + FBlobOfs)^[Field.Offset] := '';
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@@ -1000,7 +1027,7 @@ var
|
|||||||
begin
|
begin
|
||||||
Move(Buffer^, Rec.Data^, FRecordSize);
|
Move(Buffer^, Rec.Data^, FRecordSize);
|
||||||
for I := 0 to BlobFieldCount - 1 do
|
for I := 0 to BlobFieldCount - 1 do
|
||||||
PMemBlobArray(Rec.FBlobs)[I] := PMemBlobArray(Buffer + FBlobOfs)[I];
|
PMemBlobArray(Rec.FBlobs)^[I] := PMemBlobArray(Buffer + FBlobOfs)^[I];
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TRxMemoryData.SetMemoryRecordData(Buffer: PChar; Pos: Integer);
|
procedure TRxMemoryData.SetMemoryRecordData(Buffer: PChar; Pos: Integer);
|
||||||
|
Reference in New Issue
Block a user