Browse Source

--- Merging r25373 into '.':
U packages/fcl-db/src/base/xmldatapacketreader.pp
--- Merging r25409 into '.':
G packages/fcl-db/src/base/xmldatapacketreader.pp
--- Merging r25522 into '.':
U packages/fcl-db/src/sqldb/postgres/pqconnection.pp
--- Merging r25540 into '.':
U packages/fcl-db/src/sqldb/sqldb.pp

# revisions: 25373,25409,25522,25540
r25373 | lacak | 2013-08-26 14:46:25 +0200 (Mon, 26 Aug 2013) | 1 line
Changed paths:
M /trunk/packages/fcl-db/src/base/xmldatapacketreader.pp

fcl-db: base: add support for ftGuid field type in XMLDatapacketReader (type='string', subtype='Guid' like in Delphi)
r25409 | lacak | 2013-09-04 09:43:32 +0200 (Wed, 04 Sep 2013) | 2 lines
Changed paths:
M /trunk/packages/fcl-db/src/base/xmldatapacketreader.pp

fcl-db: base: fix streaming of NULL values in XMLDatapacketReader (like in Delphi null values are skiped and are not saved into <ROW ... />)
r25522 | michael | 2013-09-19 08:56:53 +0200 (Thu, 19 Sep 2013) | 1 line
Changed paths:
M /trunk/packages/fcl-db/src/sqldb/postgres/pqconnection.pp

* Correction in connection pooling, we were leaking connections
r25540 | michael | 2013-09-23 20:11:34 +0200 (Mon, 23 Sep 2013) | 1 line
Changed paths:
M /trunk/packages/fcl-db/src/sqldb/sqldb.pp

* Register/Unregister SQL Statements less often

git-svn-id: branches/fixes_2_6@25749 -

marco 12 years ago
parent
commit
ce3a41f726

+ 14 - 11
packages/fcl-db/src/base/xmldatapacketreader.pp

@@ -102,9 +102,9 @@ const
       '',
       '',
       '',
+      'string:Guid',        // ftGuid
       '',
-      '',
-      'fixedFMT',
+      'fixedFMT',           // ftFmtBCD
       'string.uni',         // ftFixedWideChar
       'bin.hex:WideText'    // ftWideMemo
     );
@@ -344,11 +344,11 @@ var FieldNr      : integer;
 begin
   with ADataset do for FieldNr:=0 to FieldDefs.Count-1 do
     begin
+    AField := Fields.FieldByNumber(FieldDefs[FieldNr].FieldNo);
     AFieldNode := FRecordNode.Attributes.GetNamedItem(FieldDefs[FieldNr].Name);
     if assigned(AFieldNode) then
       begin
        s := AFieldNode.NodeValue;
-       AField := Fields.FieldByNumber(FieldDefs[FieldNr].FieldNo);
        if (FieldDefs[FieldNr].DataType in [ftBlob, ftBytes, ftVarBytes]) and (s <> '') then
          s := DecodeStringBase64(s);
        if FieldDefs[FieldNr].DataType in [ftBlob, ftMemo, ftWideMemo] then
@@ -362,25 +362,28 @@ begin
       else
         AField.AsString := s;  // set it to the filterbuffer
       end
+    else
+      AField.SetData(nil);
     end;
 end;
 
 procedure TXMLDatapacketReader.StoreRecord(ADataset : TCustomBufDataset; ARowState : TRowState; AUpdOrder : integer = 0);
 var FieldNr : Integer;
     AFieldDef: TFieldDef;
-    s: string;
+    AField: TField;
     ARecordNode : TDOMElement;
 begin
   inc(FEntryNr);
   ARecordNode := XMLDocument.CreateElement('ROW');
-  for FieldNr := 0 to ADataset.FieldDefs.Count-1 do
+  with ADataset do for FieldNr := 0 to FieldDefs.Count-1 do
     begin
-    AFieldDef := ADataset.FieldDefs[FieldNr];
-    s := ADataset.Fields.FieldByNumber(AFieldDef.FieldNo).AsString;
-    if AFieldDef.DataType in [ftBlob, ftBytes, ftVarBytes] then
-      ARecordNode.SetAttribute(AFieldDef.Name, EncodeStringBase64(s))
-    else
-      ARecordNode.SetAttribute(AFieldDef.Name, s);
+    AFieldDef := FieldDefs[FieldNr];
+    AField := Fields.FieldByNumber(AFieldDef.FieldNo);
+    if not AField.IsNull then
+      if AFieldDef.DataType in [ftBlob, ftBytes, ftVarBytes] then
+        ARecordNode.SetAttribute(AFieldDef.Name, EncodeStringBase64(AField.AsString))
+      else
+        ARecordNode.SetAttribute(AFieldDef.Name, AField.AsString);
     end;
   if ARowState<>[] then
     begin

+ 1 - 0
packages/fcl-db/src/sqldb/postgres/pqconnection.pp

@@ -409,6 +409,7 @@ begin
   else
     begin
     tr.PGConn := PQconnectdb(pchar(FConnectString));
+    T.FPGConn:=tr.PGConn;
     CheckConnectionStatus(tr.PGConn);
     if CharSet <> '' then
       PQsetClientEncoding(tr.PGConn, pchar(CharSet));

+ 8 - 7
packages/fcl-db/src/sqldb/sqldb.pp

@@ -667,11 +667,15 @@ begin
   if FDatabase=AValue then Exit;
   UnPrepare;
   If Assigned(FDatabase) then
+    begin
+    FDatabase.UnregisterStatement(Self);
     FDatabase.RemoveFreeNotification(Self);
+    end;
   FDatabase:=AValue;
   If Assigned(FDatabase) then
     begin
     FDatabase.FreeNotification(Self);
+    FDatabase.RegisterStatement(Self);
     if (Transaction=nil) and (Assigned(FDatabase.Transaction)) then
       transaction := FDatabase.Transaction;
     OnChangeSQL(Self);
@@ -833,20 +837,14 @@ procedure TCustomSQLStatement.AllocateCursor;
 
 begin
   if not assigned(FCursor) then
-    begin
     // Do this as late as possible.
     FCursor:=Database.AllocateCursorHandle;
-    FDatabase.RegisterStatement(Self);
-    end;
 end;
 
 procedure TCustomSQLStatement.DeAllocateCursor;
 begin
   if Assigned(FCursor) and Assigned(Database) then
-    begin
     DataBase.DeAllocateCursorHandle(FCursor);
-    Database.UnRegisterStatement(Self);
-    end;
 end;
 
 procedure TCustomSQLStatement.DoPrepare;
@@ -1214,7 +1212,8 @@ end;
 
 procedure TSQLConnection.UnRegisterStatement(S: TCustomSQLStatement);
 begin
-  FStatements.Remove(S);
+  if Assigned(FStatements) then // Can be nil, when we are destroying and datasets are uncoupled.
+    FStatements.Remove(S);
 end;
 
 procedure TSQLConnection.FreeFldBuffers(cursor: TSQLCursor);
@@ -1597,6 +1596,8 @@ begin
     Exit;
   if not Cursor.FSelectable then
     Exit;
+  If LogEvent(detFetch) then
+    Log(detFetch,FSQLBuf);
   if not FIsEof then FIsEOF := not TSQLConnection(Database).Fetch(Cursor);
   Result := not FIsEOF;
 end;