Ver Fonte

Merged revisions 4266,4286,4302-4303,4311 via svnmerge from
http://svn.freepascal.org/svn/fpc/trunk

........
r4266 | joost | 2006-07-20 19:27:42 +0200 (Thu, 20 Jul 2006) | 1 line

+ set the right fieldno when adding a field
........
r4286 | joost | 2006-07-23 13:25:32 +0200 (Sun, 23 Jul 2006) | 1 line

+ optimised the search for fields in loadfield
........
r4302 | joost | 2006-07-29 18:50:24 +0200 (Sat, 29 Jul 2006) | 1 line

+ Fixed ftLargeInt fields
........
r4303 | joost | 2006-07-30 02:24:47 +0200 (Sun, 30 Jul 2006) | 1 line

+ do not search (locate) in an empty dataset
........
r4311 | joost | 2006-07-30 13:30:47 +0200 (Sun, 30 Jul 2006) | 1 line

+ reverted wrongly applied revision 4244
........

git-svn-id: branches/fixes_2_0@4316 -

Tomas Hajny há 19 anos atrás
pai
commit
f44f5ea1a2
2 ficheiros alterados com 36 adições e 25 exclusões
  1. 13 13
      fcl/db/bufdataset.inc
  2. 23 12
      fcl/db/sqldb/mysql/mysqlconn.inc

+ 13 - 13
fcl/db/bufdataset.inc

@@ -77,7 +77,6 @@ procedure TBufDataset.InternalClose;
 var pc : pchar;
 
 begin
- if fopen then begin
   FOpen:=False;
   FCurrentRecBuf := FFirstRecBuf;
   SetLength(FUpdateBuffer,0);
@@ -88,7 +87,6 @@ begin
     FreeRecordBuffer(pc);
     end;
   SetLength(FFieldBufPositions,0);
- end;
 end;
 
 procedure TBufDataset.InternalFirst;
@@ -162,12 +160,12 @@ begin
   if Result = grOK then
     begin
 
-    with PBufBookmark(Buffer + RecordSize)^ do
+    with PBufBookmark(Buffer + FRecordSize)^ do
       begin
       BookmarkData := FCurrentRecBuf;
       BookmarkFlag := bfCurrent;
       end;
-    move((pointer(FCurrentRecBuf)+sizeof(TBufRecLinkItem))^,buffer^,RecordSize);
+    move((pointer(FCurrentRecBuf)+sizeof(TBufRecLinkItem))^,buffer^,FRecordSize);
     end
   else if (Result = grError) and doCheck then
     DatabaseError('No record');
@@ -192,27 +190,27 @@ end;
 
 procedure TBufDataset.InternalSetToRecord(Buffer: PChar);
 begin
-  FCurrentRecBuf := PBufBookmark(Buffer + RecordSize)^.BookmarkData;
+  FCurrentRecBuf := PBufBookmark(Buffer + FRecordSize)^.BookmarkData;
 end;
 
 procedure TBufDataset.SetBookmarkData(Buffer: PChar; Data: Pointer);
 begin
-  PBufBookmark(Buffer + RecordSize)^.BookmarkData := pointer(Data^);
+  PBufBookmark(Buffer + FRecordSize)^.BookmarkData := pointer(Data^);
 end;
 
 procedure TBufDataset.SetBookmarkFlag(Buffer: PChar; Value: TBookmarkFlag);
 begin
-  PBufBookmark(Buffer + RecordSize)^.BookmarkFlag := Value;
+  PBufBookmark(Buffer + FRecordSize)^.BookmarkFlag := Value;
 end;
 
 procedure TBufDataset.GetBookmarkData(Buffer: PChar; Data: Pointer);
 begin
-  pointer(Data^) := PBufBookmark(Buffer + RecordSize)^.BookmarkData;
+  pointer(Data^) := PBufBookmark(Buffer + FRecordSize)^.BookmarkData;
 end;
 
 function TBufDataset.GetBookmarkFlag(Buffer: PChar): TBookmarkFlag;
 begin
-  Result := PBufBookmark(Buffer + RecordSize)^.BookmarkFlag;
+  Result := PBufBookmark(Buffer + FRecordSize)^.BookmarkFlag;
 end;
 
 procedure TBufDataset.InternalGotoBookmark(ABookmark: Pointer);
@@ -442,7 +440,7 @@ begin
         begin
         if UpdateKind = ukModify then
           begin
-          move(pchar(OldValuesBuffer+sizeof(TBufRecLinkItem))^,pchar(BookmarkData+sizeof(TBufRecLinkItem))^,RecordSize);
+          move(pchar(OldValuesBuffer+sizeof(TBufRecLinkItem))^,pchar(BookmarkData+sizeof(TBufRecLinkItem))^,FRecordSize);
           FreeRecordBuffer(OldValuesBuffer);
           end
         else if UpdateKind = ukDelete then
@@ -579,7 +577,7 @@ begin
       FFirstRecBuf := FCurrentRecBuf;
 
     // Link the newly created record buffer to the newly created TDataset record
-    with PBufBookmark(ActiveBuffer + RecordSize)^ do
+    with PBufBookmark(ActiveBuffer + FRecordSize)^ do
       begin
       BookmarkData := FCurrentRecBuf;
       BookmarkFlag := bfInserted;
@@ -601,7 +599,7 @@ begin
       begin
       // Update the oldvalues-buffer
       FUpdateBuffer[FCurrentUpdateBuffer].OldValuesBuffer := intAllocRecordBuffer;
-      move(FCurrentRecBuf^,FUpdateBuffer[FCurrentUpdateBuffer].OldValuesBuffer^,RecordSize+sizeof(TBufRecLinkItem));
+      move(FCurrentRecBuf^,FUpdateBuffer[FCurrentUpdateBuffer].OldValuesBuffer^,FRecordSize+sizeof(TBufRecLinkItem));
       FUpdateBuffer[FCurrentUpdateBuffer].UpdateKind := ukModify;
       end
     else
@@ -610,7 +608,7 @@ begin
 
   CurrBuff := pchar(FCurrentRecBuf);
   inc(Currbuff,sizeof(TBufRecLinkItem));
-  move(ActiveBuffer^,CurrBuff^,RecordSize);
+  move(ActiveBuffer^,CurrBuff^,FRecordSize);
 end;
 
 procedure TBufDataset.CalcRecordSize;
@@ -765,6 +763,8 @@ begin
 // For now it is only possible to search in one field at the same time
   result := False;
 
+  if IsEmpty then exit;
+
   keyfield := FieldByName(keyfields);
   CheckNull := VarIsNull(KeyValues);
 

+ 23 - 12
fcl/db/sqldb/mysql/mysqlconn.inc

@@ -48,6 +48,7 @@ Type
     LastInsertID : QWord;
     ParamBinding : TParamBinding;
     ParamReplaceString : String;
+    MapDSRowToMSQLRow  : array of integer;
   end;
 
   TConnectionName = class (TSQLConnection)
@@ -339,6 +340,7 @@ begin
     Mysql_free_result(C.FRes);
     C.FRes:=Nil;
     end;
+  SetLength(c.MapDSRowToMSQLRow,0);
 end;
 
 procedure TConnectionName.Execute(cursor: TSQLCursor;
@@ -426,7 +428,7 @@ procedure TConnectionName.AddFieldDefs(cursor: TSQLCursor;
 
 var
   C : TCursorName;
-  I, FC: Integer;
+  I, TF, FC: Integer;
   field: PMYSQL_FIELD;
   DFT: TFieldType;
   DFS: Integer;
@@ -441,13 +443,20 @@ begin
     end;
 //  Writeln('MySQL: have result');
   FC:=mysql_num_fields(C.FRes);
+  SetLength(c.MapDSRowToMSQLRow,FC);
+
+  TF := 1;
   For I:= 0 to FC-1 do
     begin
     field := mysql_fetch_field_direct(C.FRES, I);
 //    Writeln('MySQL: creating fielddef ',I+1);
 
     if MySQLDataType(field^.ftype, field^.length, field^.decimals, DFT, DFS) then
-      TFieldDef.Create(FieldDefs, field^.name, DFT, DFS, False, I+1);
+      begin
+      TFieldDef.Create(FieldDefs, field^.name, DFT, DFS, False, TF);
+      c.MapDSRowToMSQLRow[TF-1] := I;
+      inc(TF);
+      end
     end;
 //  Writeln('MySQL: Finished adding fielddefs');
 end;
@@ -467,7 +476,6 @@ function TConnectionName.LoadField(cursor : TSQLCursor;
   FieldDef : TfieldDef;buffer : pointer) : boolean;
 
 var
-  I, FC: Integer;
   field: PMYSQL_FIELD;
   row : MYSQL_ROW;
   C : TCursorName;
@@ -481,15 +489,10 @@ begin
      MySQLError(c.FQMySQL,SErrFetchingData,Self);
      end;
   Row:=C.Row;
-  FC := mysql_num_fields(C.FRES);
+  
+  inc(Row,c.MapDSRowToMSQLRow[FieldDef.FieldNo-1]);
+  field := mysql_fetch_field_direct(C.FRES, c.MapDSRowToMSQLRow[FieldDef.FieldNo-1]);
 
-  for I := 0 to FC-1 do
-    begin
-    field := mysql_fetch_field_direct(C.FRES, I);
-    if field^.name=FieldDef.name then break;
-    Inc(Row);
-    end;
-    
   Result := MySQLWriteData(field^.ftype, field^.length, FieldDef.DataType, Row^, Buffer);
 end;
 
@@ -620,7 +623,7 @@ begin
     exit;
   Src:=StrPas(Source);
   case AType of
-    FIELD_TYPE_TINY, FIELD_TYPE_SHORT, FIELD_TYPE_LONG, FIELD_TYPE_LONGLONG,
+    FIELD_TYPE_TINY, FIELD_TYPE_SHORT, FIELD_TYPE_LONG,
     FIELD_TYPE_INT24:
       begin
       if (Src<>'') then
@@ -629,6 +632,14 @@ begin
         VI := 0;
       Move(VI, Dest^, SizeOf(Integer));
       end;
+    FIELD_TYPE_LONGLONG:
+      begin
+      if (Src<>'') then
+        VI := StrToInt64(Src)
+      else
+        VI := 0;
+      Move(VI, Dest^, SizeOf(LargeInt));
+      end;
 {$ifdef mysql50}
     FIELD_TYPE_NEWDECIMAL,
 {$endif}