summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhajny <hajny@3ad0048d-3df7-0310-abae-a5850022a9f2>2006-07-30 19:50:12 +0000
committerhajny <hajny@3ad0048d-3df7-0310-abae-a5850022a9f2>2006-07-30 19:50:12 +0000
commit8ebeb26a75673e004ea1e48fd968e7aaee4fcaef (patch)
treeb049fc96dcd8c9e9f18b875c7b9eeb094caa2254
parent0df4d2cdccc6d9fceb8f771aadd81e5dfeabbd26 (diff)
downloadfpc-8ebeb26a75673e004ea1e48fd968e7aaee4fcaef.tar.gz
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: http://svn.freepascal.org/svn/fpc/branches/fixes_2_0@4316 3ad0048d-3df7-0310-abae-a5850022a9f2
-rw-r--r--fcl/db/bufdataset.inc26
-rw-r--r--fcl/db/sqldb/mysql/mysqlconn.inc35
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}