mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-10 10:29:17 +02:00
* Replaced TIBConnections LoadBlobIntoStream for LoadblobIntobuffer
* Dont check the quotation-style if no database is selected yet git-svn-id: trunk@6106 -
This commit is contained in:
parent
feea4deb6d
commit
d9efc52dba
@ -151,7 +151,7 @@ type
|
||||
function Fetch : boolean; virtual; abstract;
|
||||
function LoadField(FieldDef : TFieldDef;buffer : pointer; out CreateBlob : boolean) : boolean; virtual; abstract;
|
||||
procedure LoadBlobIntoStream(Field: TField;AStream: TStream); virtual; abstract;
|
||||
procedure LoadBlobIntoBuffer(FieldDef: TFieldDef;ABlobBuf: PBlobBuffer); virtual; abstract;
|
||||
procedure LoadBlobIntoBuffer(FieldDef: TFieldDef;ABlobBuf: PBufBlobField); virtual; abstract;
|
||||
|
||||
public
|
||||
constructor Create(AOwner: TComponent); override;
|
||||
@ -513,7 +513,7 @@ begin
|
||||
begin
|
||||
BufBlob := PBufBlobField(Buffer);
|
||||
BufBlob^.BlobBuffer := GetNewBlobBuffer;
|
||||
LoadBlobIntoBuffer(FieldDefs[x],BufBlob^.BlobBuffer);
|
||||
LoadBlobIntoBuffer(FieldDefs[x],BufBlob);
|
||||
end;
|
||||
inc(buffer,GetFieldSize(FieldDefs[x]));
|
||||
end;
|
||||
@ -1096,7 +1096,8 @@ begin
|
||||
if not assigned(bufblob.BlobBuffer) then with FDataSet do
|
||||
begin
|
||||
FBlobBuffer := GetNewBlobBuffer;
|
||||
LoadBlobIntoStream(field,self);
|
||||
bufblob.BlobBuffer := FBlobBuffer;
|
||||
LoadBlobIntoBuffer(FieldDefs[field.FieldNo-1],@bufblob);
|
||||
end
|
||||
else
|
||||
FBlobBuffer := bufblob.BlobBuffer;
|
||||
|
@ -7,7 +7,7 @@ unit IBConnection;
|
||||
interface
|
||||
|
||||
uses
|
||||
Classes, SysUtils, sqldb, db, math, dbconst,
|
||||
Classes, SysUtils, sqldb, db, math, dbconst, bufdataset,
|
||||
{$IfDef LinkDynamically}
|
||||
ibase60dyn;
|
||||
{$Else}
|
||||
@ -87,7 +87,7 @@ type
|
||||
procedure RollBackRetaining(trans : TSQLHandle); override;
|
||||
procedure UpdateIndexDefs(var IndexDefs : TIndexDefs;TableName : string); override;
|
||||
function GetSchemaInfoSQL(SchemaType : TSchemaType; SchemaObjectName, SchemaPattern : string) : string; override;
|
||||
procedure LoadBlobIntoStream(Field: TField;AStream: TStream;cursor: TSQLCursor;ATransaction : TSQLTransaction); override;
|
||||
procedure LoadBlobIntoBuffer(FieldDef: TFieldDef;ABlobBuf: PBufBlobField; cursor: TSQLCursor; ATransaction : TSQLTransaction); override;
|
||||
public
|
||||
constructor Create(AOwner : TComponent); override;
|
||||
procedure CreateDB; override;
|
||||
@ -104,7 +104,7 @@ type
|
||||
|
||||
implementation
|
||||
|
||||
uses strutils, bufdataset;
|
||||
uses strutils;
|
||||
|
||||
type
|
||||
TTm = packed record
|
||||
@ -1070,7 +1070,7 @@ begin
|
||||
CheckError('isc_blob_info', FStatus);
|
||||
end;
|
||||
|
||||
procedure TIBConnection.LoadBlobIntoStream(Field: TField;AStream: TStream;cursor: TSQLCursor;ATransaction : TSQLTransaction);
|
||||
procedure TIBConnection.LoadBlobIntoBuffer(FieldDef: TFieldDef;ABlobBuf: PBufBlobField; cursor: TSQLCursor; ATransaction : TSQLTransaction);
|
||||
const
|
||||
isc_segstr_eof = 335544367; // It's not defined in ibase60 but in ibase40. Would it be better to define in ibase60?
|
||||
|
||||
@ -1080,12 +1080,10 @@ var
|
||||
blobSegLen : word;
|
||||
maxBlobSize : longInt;
|
||||
TransactionHandle : pointer;
|
||||
BlobBuf : TBufBlobField;
|
||||
blobId : PISC_QUAD;
|
||||
ptr : Pointer;
|
||||
begin
|
||||
if not field.getData(@BlobBuf) then
|
||||
exit;
|
||||
blobId := PISC_QUAD(@BlobBuf.ConnBlobBuffer);
|
||||
blobId := PISC_QUAD(@(ABlobBuf^.ConnBlobBuffer));
|
||||
|
||||
TransactionHandle := Atransaction.Handle;
|
||||
blobHandle := nil;
|
||||
@ -1097,11 +1095,18 @@ begin
|
||||
|
||||
blobSegment := AllocMem(maxBlobSize);
|
||||
|
||||
while (isc_get_segment(@FStatus[0], @blobHandle, @blobSegLen, maxBlobSize, blobSegment) = 0) do begin
|
||||
AStream.writeBuffer(blobSegment^, blobSegLen);
|
||||
end;
|
||||
with ABlobBuf^.BlobBuffer^ do
|
||||
begin
|
||||
Size := 0;
|
||||
while (isc_get_segment(@FStatus[0], @blobHandle, @blobSegLen, maxBlobSize, blobSegment) = 0) do
|
||||
begin
|
||||
ReAllocMem(Buffer,Size+blobSegLen);
|
||||
ptr := Buffer+Size;
|
||||
move(blobSegment^,ptr^,blobSegLen);
|
||||
inc(Size,blobSegLen);
|
||||
end;
|
||||
end;
|
||||
freemem(blobSegment);
|
||||
AStream.seek(0,soFromBeginning);
|
||||
|
||||
if FStatus[1] = isc_segstr_eof then
|
||||
begin
|
||||
|
@ -64,7 +64,7 @@ type
|
||||
procedure RollBackRetaining(trans : TSQLHandle); override;
|
||||
procedure UpdateIndexDefs(var IndexDefs : TIndexDefs;TableName : string); override;
|
||||
function GetSchemaInfoSQL(SchemaType : TSchemaType; SchemaObjectName, SchemaPattern : string) : string; override;
|
||||
procedure LoadBlobIntoBuffer(FieldDef: TFieldDef;ABlobBuf: PBlobBuffer; cursor: TSQLCursor;ATransaction : TSQLTransaction); override;
|
||||
procedure LoadBlobIntoBuffer(FieldDef: TFieldDef;ABlobBuf: PBufBlobField; cursor: TSQLCursor;ATransaction : TSQLTransaction); override;
|
||||
public
|
||||
constructor Create(AOwner : TComponent); override;
|
||||
procedure CreateDB; override;
|
||||
@ -829,7 +829,7 @@ begin
|
||||
end;
|
||||
|
||||
procedure TPQConnection.LoadBlobIntoBuffer(FieldDef: TFieldDef;
|
||||
ABlobBuf: PBlobBuffer; cursor: TSQLCursor; ATransaction: TSQLTransaction);
|
||||
ABlobBuf: PBufBlobField; cursor: TSQLCursor; ATransaction: TSQLTransaction);
|
||||
var
|
||||
x : integer;
|
||||
li : Longint;
|
||||
@ -838,9 +838,9 @@ begin
|
||||
begin
|
||||
x := FieldBinding[FieldDef.FieldNo-1];
|
||||
li := pqgetlength(res,curtuple,x);
|
||||
ReAllocMem(ABlobBuf^.Buffer,li);
|
||||
Move(pqgetvalue(res,CurTuple,x)^, ABlobBuf^.Buffer^, li);
|
||||
ABlobBuf^.Size := li;
|
||||
ReAllocMem(ABlobBuf^.BlobBuffer^.Buffer,li);
|
||||
Move(pqgetvalue(res,CurTuple,x)^, ABlobBuf^.BlobBuffer^.Buffer^, li);
|
||||
ABlobBuf^.BlobBuffer^.Size := li;
|
||||
end;
|
||||
end;
|
||||
|
||||
|
@ -109,7 +109,7 @@ type
|
||||
procedure UpdateIndexDefs(var IndexDefs : TIndexDefs;TableName : string); virtual;
|
||||
function GetSchemaInfoSQL(SchemaType : TSchemaType; SchemaObjectName, SchemaPattern : string) : string; virtual;
|
||||
procedure LoadBlobIntoStream(Field: TField;AStream: TStream;cursor: TSQLCursor;ATransaction : TSQLTransaction); virtual;
|
||||
procedure LoadBlobIntoBuffer(FieldDef: TFieldDef;ABlobBuf: PBlobBuffer; cursor: TSQLCursor; ATransaction : TSQLTransaction); virtual; abstract;
|
||||
procedure LoadBlobIntoBuffer(FieldDef: TFieldDef;ABlobBuf: PBufBlobField; cursor: TSQLCursor; ATransaction : TSQLTransaction); virtual; abstract;
|
||||
public
|
||||
property Handle: Pointer read GetHandle;
|
||||
destructor Destroy; override;
|
||||
@ -237,7 +237,7 @@ type
|
||||
Function GetDataSource : TDatasource; override;
|
||||
Procedure SetDataSource(AValue : TDatasource);
|
||||
procedure LoadBlobIntoStream(Field: TField;AStream: TStream); override;
|
||||
procedure LoadBlobIntoBuffer(FieldDef: TFieldDef;ABlobBuf: PBlobBuffer); override;
|
||||
procedure LoadBlobIntoBuffer(FieldDef: TFieldDef;ABlobBuf: PBufBlobField); override;
|
||||
public
|
||||
procedure Prepare; virtual;
|
||||
procedure UnPrepare; virtual;
|
||||
@ -640,7 +640,10 @@ begin
|
||||
UnPrepare;
|
||||
if (FSQL <> nil) then
|
||||
begin
|
||||
ConnOptions := (DataBase as TSQLConnection).ConnOptions;
|
||||
if assigned(DataBase) then
|
||||
ConnOptions := (DataBase as TSQLConnection).ConnOptions
|
||||
else
|
||||
ConnOptions := [sqEscapeRepeat,sqEscapeSlash];
|
||||
Fparams.ParseSQL(FSQL.Text,True, sqEscapeSlash in ConnOptions, sqEscapeRepeat in ConnOptions,psInterbase);
|
||||
If Assigned(FMasterLink) then
|
||||
FMasterLink.RefreshParamNames;
|
||||
@ -673,6 +676,7 @@ begin
|
||||
inherited setdatabase(value);
|
||||
if assigned(value) and (Transaction = nil) and (Assigned(db.Transaction)) then
|
||||
transaction := Db.Transaction;
|
||||
OnChangeSQL(Self);
|
||||
end;
|
||||
end;
|
||||
|
||||
@ -1326,7 +1330,7 @@ begin
|
||||
end;
|
||||
|
||||
procedure TSQLQuery.LoadBlobIntoBuffer(FieldDef: TFieldDef;
|
||||
ABlobBuf: PBlobBuffer);
|
||||
ABlobBuf: PBufBlobField);
|
||||
begin
|
||||
(DataBase as tsqlconnection).LoadBlobIntoBuffer(FieldDef, ABlobBuf, FCursor,(Transaction as tsqltransaction));
|
||||
end;
|
||||
|
Loading…
Reference in New Issue
Block a user