Forráskód Böngészése

* Replaced TIBConnections LoadBlobIntoStream for LoadblobIntobuffer
* Dont check the quotation-style if no database is selected yet

git-svn-id: trunk@6106 -

joost 18 éve
szülő
commit
d9efc52dba

+ 4 - 3
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;

+ 17 - 12
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

+ 5 - 5
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;
 

+ 8 - 4
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;