diff --git a/fcl/db/bufdataset.pp b/fcl/db/bufdataset.pp index 6e3f680e60..805b222835 100644 --- a/fcl/db/bufdataset.pp +++ b/fcl/db/bufdataset.pp @@ -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; diff --git a/fcl/db/sqldb/interbase/ibconnection.pp b/fcl/db/sqldb/interbase/ibconnection.pp index 7f5577285d..d9a21b4707 100644 --- a/fcl/db/sqldb/interbase/ibconnection.pp +++ b/fcl/db/sqldb/interbase/ibconnection.pp @@ -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 diff --git a/fcl/db/sqldb/postgres/pqconnection.pp b/fcl/db/sqldb/postgres/pqconnection.pp index 73969ae612..498746a8d2 100644 --- a/fcl/db/sqldb/postgres/pqconnection.pp +++ b/fcl/db/sqldb/postgres/pqconnection.pp @@ -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; diff --git a/fcl/db/sqldb/sqldb.pp b/fcl/db/sqldb/sqldb.pp index 0864ea3573..1a1a58c7d6 100644 --- a/fcl/db/sqldb/sqldb.pp +++ b/fcl/db/sqldb/sqldb.pp @@ -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;