diff options
-rw-r--r-- | fcl/db/bufdataset.inc | 26 | ||||
-rw-r--r-- | fcl/db/sqldb/mysql/mysqlconn.inc | 35 |
2 files changed, 36 insertions, 25 deletions
diff --git a/fcl/db/bufdataset.inc b/fcl/db/bufdataset.inc index 8627ca12ef..25815947bc 100644 --- a/fcl/db/bufdataset.inc +++ b/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); diff --git a/fcl/db/sqldb/mysql/mysqlconn.inc b/fcl/db/sqldb/mysql/mysqlconn.inc index e15f62b3e8..05d51cc7c7 100644 --- a/fcl/db/sqldb/mysql/mysqlconn.inc +++ b/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} |