mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-24 20:29:34 +02:00
+ Caching of blob-fields which can only be fetched for the current record is now handled by TSQLConnection
+ postgresql text-fields are now considered to be blob-fields git-svn-id: trunk@4584 -
This commit is contained in:
parent
24ae32c855
commit
d0a367ef1e
@ -51,10 +51,6 @@ Type
|
||||
ParamBinding : TParamBinding;
|
||||
ParamReplaceString : String;
|
||||
MapDSRowToMSQLRow : array of integer;
|
||||
FBlobStrings:TStringList; // list of strings in which the blob-fields are stored
|
||||
public
|
||||
constructor Create;
|
||||
destructor Destroy; override;
|
||||
end;
|
||||
|
||||
TConnectionName = class (TSQLConnection)
|
||||
@ -99,7 +95,6 @@ Type
|
||||
procedure CommitRetaining(trans : TSQLHandle); override;
|
||||
procedure RollBackRetaining(trans : TSQLHandle); override;
|
||||
procedure UpdateIndexDefs(var IndexDefs : TIndexDefs;TableName : string); override;
|
||||
procedure LoadBlobIntoStream(Field: TField;AStream: TMemoryStream;cursor: TSQLCursor;ATransaction : TSQLTransaction); override;
|
||||
Public
|
||||
Property ServerInfo : String Read FServerInfo;
|
||||
Property HostInfo : String Read FHostInfo;
|
||||
@ -216,7 +211,7 @@ var esc_str : pchar;
|
||||
|
||||
begin
|
||||
if (not assigned(param)) or param.IsNull then Result := 'Null'
|
||||
else if param.DataType = ftString then
|
||||
else if param.DataType in [ftString,ftBlob] then
|
||||
begin
|
||||
Getmem(esc_str,length(param.asstring)*2+1);
|
||||
mysql_real_escape_string(FMySQL,esc_str,pchar(param.asstring),length(param.asstring));
|
||||
@ -347,7 +342,7 @@ begin
|
||||
C.FRes:=Nil;
|
||||
end;
|
||||
SetLength(c.MapDSRowToMSQLRow,0);
|
||||
c.FBlobStrings.Clear;
|
||||
inherited;
|
||||
end;
|
||||
|
||||
procedure TConnectionName.Execute(cursor: TSQLCursor;
|
||||
@ -764,25 +759,6 @@ begin
|
||||
qry.free;
|
||||
end;
|
||||
|
||||
procedure TConnectionName.LoadBlobIntoStream(Field: TField;AStream: TMemoryStream;cursor: TSQLCursor;ATransaction : TSQLTransaction);
|
||||
|
||||
var blobId : pinteger;
|
||||
BlobBuf : TBufBlobField;
|
||||
s : string;
|
||||
|
||||
begin
|
||||
if not field.getData(@BlobBuf) then
|
||||
exit;
|
||||
blobId := @BlobBuf;
|
||||
|
||||
s := (cursor as TCursorName).FBlobStrings.Strings[blobid^];
|
||||
|
||||
AStream.WriteBuffer(s[1],length(s));
|
||||
|
||||
AStream.seek(0,soFromBeginning);
|
||||
end;
|
||||
|
||||
|
||||
function TConnectionName.GetTransactionHandle(trans: TSQLHandle): pointer;
|
||||
begin
|
||||
Result:=Nil;
|
||||
@ -813,18 +789,4 @@ begin
|
||||
// Do nothing
|
||||
end;
|
||||
|
||||
{ TCursorName }
|
||||
|
||||
constructor TCursorName.Create;
|
||||
begin
|
||||
FBlobStrings := TStringList.Create;
|
||||
inherited;
|
||||
end;
|
||||
|
||||
destructor TCursorName.Destroy;
|
||||
begin
|
||||
FBlobStrings.Free;
|
||||
inherited Destroy;
|
||||
end;
|
||||
|
||||
end.
|
||||
|
@ -49,7 +49,6 @@ type
|
||||
Function AllocateTransactionHandle : TSQLHandle; override;
|
||||
|
||||
procedure PrepareStatement(cursor: TSQLCursor;ATransaction : TSQLTransaction;buf : string; AParams : TParams); override;
|
||||
procedure FreeFldBuffers(cursor : TSQLCursor); override;
|
||||
procedure Execute(cursor: TSQLCursor;atransaction:tSQLtransaction; AParams : TParams); override;
|
||||
procedure AddFieldDefs(cursor: TSQLCursor; FieldDefs : TfieldDefs); override;
|
||||
function Fetch(cursor : TSQLCursor) : boolean; override;
|
||||
@ -307,7 +306,8 @@ begin
|
||||
case Type_Oid of
|
||||
Oid_varchar,Oid_bpchar,
|
||||
Oid_name : Result := ftstring;
|
||||
Oid_text : Result := ftstring;
|
||||
// Oid_text : Result := ftstring;
|
||||
Oid_text : Result := ftBlob;
|
||||
Oid_oid : Result := ftInteger;
|
||||
Oid_int8 : Result := ftLargeInt;
|
||||
Oid_int4 : Result := ftInteger;
|
||||
@ -451,12 +451,6 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TPQConnection.FreeFldBuffers(cursor : TSQLCursor);
|
||||
|
||||
begin
|
||||
// Do nothing
|
||||
end;
|
||||
|
||||
procedure TPQConnection.Execute(cursor: TSQLCursor;atransaction:tSQLtransaction;AParams : TParams);
|
||||
|
||||
var ar : array of pointer;
|
||||
@ -537,9 +531,11 @@ begin
|
||||
begin
|
||||
size := pqfmod(res,i)-4;
|
||||
if size = -5 then size := dsMaxStringSize;
|
||||
end;
|
||||
if fieldtype = ftdate then
|
||||
size := sizeof(double);
|
||||
end
|
||||
else if fieldtype = ftdate then
|
||||
size := sizeof(double)
|
||||
else if fieldtype = ftblob then
|
||||
size := 0;
|
||||
|
||||
TFieldDef.Create(FieldDefs, PQfname(Res, i), fieldtype,size, False, (i + 1));
|
||||
end;
|
||||
@ -581,6 +577,7 @@ var
|
||||
dbl : pdouble;
|
||||
cur : currency;
|
||||
NumericRecord : ^TNumericRecord;
|
||||
s : string;
|
||||
|
||||
begin
|
||||
with cursor as TPQCursor do
|
||||
@ -619,6 +616,14 @@ begin
|
||||
pchar(Buffer + li)^ := #0;
|
||||
i := pqfmod(res,x)-3;
|
||||
end;
|
||||
ftBlob :
|
||||
begin
|
||||
li := pqgetlength(res,curtuple,x);
|
||||
setlength(s,li);
|
||||
Move(CurrBuff^, s[1], li);
|
||||
i := fBlobStrings.Add(S);
|
||||
Move(I, Buffer^, SizeOf(Integer));
|
||||
end;
|
||||
ftdate :
|
||||
begin
|
||||
dbl := pointer(buffer);
|
||||
|
@ -38,11 +38,17 @@ type
|
||||
TSQLHandle = Class(TObject)
|
||||
end;
|
||||
|
||||
{ TSQLCursor }
|
||||
|
||||
TSQLCursor = Class(TSQLHandle)
|
||||
public
|
||||
FPrepared : Boolean;
|
||||
FInitFieldDef : Boolean;
|
||||
FStatementType : TStatementType;
|
||||
FBlobStrings : TStringList; // list of strings in which the blob-fields are stored
|
||||
public
|
||||
constructor Create;
|
||||
destructor Destroy; override;
|
||||
end;
|
||||
|
||||
|
||||
@ -90,7 +96,7 @@ type
|
||||
procedure AddFieldDefs(cursor: TSQLCursor; FieldDefs : TfieldDefs); virtual; abstract;
|
||||
procedure UnPrepareStatement(cursor : TSQLCursor); virtual; abstract;
|
||||
|
||||
procedure FreeFldBuffers(cursor : TSQLCursor); virtual; abstract;
|
||||
procedure FreeFldBuffers(cursor : TSQLCursor); virtual;
|
||||
function LoadField(cursor : TSQLCursor;FieldDef : TfieldDef;buffer : pointer) : boolean; virtual; abstract;
|
||||
function GetTransactionHandle(trans : TSQLHandle): pointer; virtual; abstract;
|
||||
function Commit(trans : TSQLHandle) : boolean; virtual; abstract;
|
||||
@ -455,6 +461,11 @@ begin
|
||||
Result := nil;
|
||||
end;
|
||||
|
||||
procedure TSQLConnection.FreeFldBuffers(cursor: TSQLCursor);
|
||||
begin
|
||||
cursor.FBlobStrings.Clear;
|
||||
end;
|
||||
|
||||
function TSQLConnection.GetSchemaInfoSQL( SchemaType : TSchemaType; SchemaObjectName, SchemaPattern : string) : string;
|
||||
|
||||
begin
|
||||
@ -463,8 +474,20 @@ end;
|
||||
|
||||
procedure TSQLConnection.LoadBlobIntoStream(Field: TField;AStream: TMemoryStream; cursor: TSQLCursor;ATransaction : TSQLTransaction);
|
||||
|
||||
var blobId : pinteger;
|
||||
BlobBuf : TBufBlobField;
|
||||
s : string;
|
||||
|
||||
begin
|
||||
DatabaseErrorFmt(SUnsupportedFieldType,['Blob']);
|
||||
if not field.getData(@BlobBuf) then
|
||||
exit;
|
||||
blobId := @BlobBuf;
|
||||
|
||||
s := cursor.FBlobStrings.Strings[blobid^];
|
||||
|
||||
AStream.WriteBuffer(s[1],length(s));
|
||||
|
||||
AStream.seek(0,soFromBeginning);
|
||||
end;
|
||||
|
||||
{ TSQLTransaction }
|
||||
@ -1260,4 +1283,18 @@ begin
|
||||
DataSource:=Nil;
|
||||
end;
|
||||
|
||||
{ TSQLCursor }
|
||||
|
||||
constructor TSQLCursor.Create;
|
||||
begin
|
||||
FBlobStrings := TStringList.Create;
|
||||
inherited;
|
||||
end;
|
||||
|
||||
destructor TSQLCursor.Destroy;
|
||||
begin
|
||||
FBlobStrings.Free;
|
||||
inherited Destroy;
|
||||
end;
|
||||
|
||||
end.
|
||||
|
Loading…
Reference in New Issue
Block a user