On Sat, 19 Nov 2011, Reinier Olislagers wrote:
On 19-11-2011 13:28, Reinier Olislagers wrote:
Hi list,
The Firebird/Interbase ibconnection.pp code has this code in its
SetParameters procedure to upload blobs in segments (BlobSegmentSize
property is set to 80 on object creation):
while BlobBytesWritten < (BlobSize-BlobSegmentSize) do
begin
isc_put_segment(@FStatus[0], @blobHandle, BlobSegmentSize,
@s[(i*BlobSegmentSize)+1]);
inc(BlobBytesWritten,BlobSegmentSize);
inc(i);
end;
if BlobBytesWritten <> BlobSize then
isc_put_segment(@FStatus[0], @blobHandle,
BlobSize-BlobBytesWritten, @s[(i*BlobSegmentSize)+1]);
I've asked the Firebird list whether we need to upload in segments and
the answer is no, you can upload in chunks of up to 65535 bytes (see below).
Would getting rid of the BlobSegmentSize property and replacing it by a
BlobSegmentSize const set at 65535 make sense (e.g. for performance)?
Did a small performance test:
- once with 80, once with 65535
- 10MB blobs
- Firebird 2.5 server
- on a virtual machine (just restored from snapshot before each run)
The difference seems fairly big: 395 seconds versus 260 seconds
Hope I'm testing correctly.
Test code is attached; I'd appreciate confirmation.
Also attached is a patch for ibconnection.pp against FPC fixes_2_6.
I set the BlobSegmentSize property to deprecated and basically ignored
the underlying variable when writing blobs.
I applied the patch, thank you. revision 19659.
I wonder whether/what changes are required for reading blobs...
The following function needs adapting:
function TIBConnection.getMaxBlobSize(blobHandle : TIsc_Blob_Handle) : longInt;
var
iscInfoBlobMaxSegment : byte = isc_info_blob_max_segment;
blobInfo : array[0..50] of byte;
begin
if isc_blob_info(@Fstatus[0], @blobHandle, sizeof(iscInfoBlobMaxSegment),
pchar(@iscInfoBlobMaxSegment), sizeof(blobInfo)
CheckError('isc_blob_info', FStatus);
if blobInfo[0] = isc_info_blob_max_segment then
begin
result := isc_vax_integer(pchar(@blobInfo[3]),
isc_vax_integer(pchar(@blobInfo[1]), 2));
end
else
CheckError('isc_blob_info', FStatus);
end;
You should first check what it returns. I suspect the declared blob segment
size.
Michael.
_______________________________________________
fpc-pascal maillist - fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal