|
@@ -625,7 +625,10 @@ begin
|
|
end;
|
|
end;
|
|
FIELD_TYPE_TINY, FIELD_TYPE_SHORT, FIELD_TYPE_YEAR:
|
|
FIELD_TYPE_TINY, FIELD_TYPE_SHORT, FIELD_TYPE_YEAR:
|
|
begin
|
|
begin
|
|
- NewType := ftSmallint;
|
|
|
|
|
|
+ if AField^.flags and UNSIGNED_FLAG <> 0 then
|
|
|
|
+ NewType := ftWord
|
|
|
|
+ else
|
|
|
|
+ NewType := ftSmallint;
|
|
end;
|
|
end;
|
|
FIELD_TYPE_LONG, FIELD_TYPE_INT24:
|
|
FIELD_TYPE_LONG, FIELD_TYPE_INT24:
|
|
begin
|
|
begin
|
|
@@ -803,6 +806,14 @@ begin
|
|
ABlobBuf^.BlobBuffer^.Size := len;
|
|
ABlobBuf^.BlobBuffer^.Size := len;
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
+function InternalStrToInt(const S: string): integer;
|
|
|
|
+begin
|
|
|
|
+ if S = '' then
|
|
|
|
+ Result := 0
|
|
|
|
+ else
|
|
|
|
+ Result := StrToInt(S);
|
|
|
|
+end;
|
|
|
|
+
|
|
function InternalStrToFloat(S: string): Extended;
|
|
function InternalStrToFloat(S: string): Extended;
|
|
|
|
|
|
var
|
|
var
|
|
@@ -923,6 +934,7 @@ var
|
|
VI: Integer;
|
|
VI: Integer;
|
|
VL: LargeInt;
|
|
VL: LargeInt;
|
|
VS: Smallint;
|
|
VS: Smallint;
|
|
|
|
+ VW: Word;
|
|
VF: Double;
|
|
VF: Double;
|
|
VC: Currency;
|
|
VC: Currency;
|
|
VD: TDateTime;
|
|
VD: TDateTime;
|
|
@@ -935,131 +947,104 @@ begin
|
|
if Source = Nil then // If the pointer is NULL, the field is NULL
|
|
if Source = Nil then // If the pointer is NULL, the field is NULL
|
|
exit;
|
|
exit;
|
|
SetString(Src, Source, Len);
|
|
SetString(Src, Source, Len);
|
|
- case AField^.ftype of
|
|
|
|
- FIELD_TYPE_TINY, FIELD_TYPE_SHORT, FIELD_TYPE_YEAR:
|
|
|
|
|
|
+
|
|
|
|
+ if Len > FieldDef.Size then
|
|
|
|
+ Len := FieldDef.Size;
|
|
|
|
+
|
|
|
|
+ case FieldDef.DataType of
|
|
|
|
+ ftSmallint:
|
|
begin
|
|
begin
|
|
- if (Src<>'') then
|
|
|
|
- VS := StrToInt(Src)
|
|
|
|
- else
|
|
|
|
- VS := 0;
|
|
|
|
- Move(VS, Dest^, SizeOf(smallint));
|
|
|
|
|
|
+ VS := InternalStrToInt(Src);
|
|
|
|
+ Move(VS, Dest^, SizeOf(Smallint));
|
|
end;
|
|
end;
|
|
- FIELD_TYPE_LONG, FIELD_TYPE_INT24:
|
|
|
|
|
|
+ ftWord:
|
|
begin
|
|
begin
|
|
- if (Src<>'') then
|
|
|
|
- VI := StrToInt(Src)
|
|
|
|
- else
|
|
|
|
- VI := 0;
|
|
|
|
|
|
+ VW := InternalStrToInt(Src);
|
|
|
|
+ Move(VW, Dest^, SizeOf(Word));
|
|
|
|
+ end;
|
|
|
|
+ ftInteger, ftAutoInc:
|
|
|
|
+ begin
|
|
|
|
+ VI := InternalStrToInt(Src);
|
|
Move(VI, Dest^, SizeOf(Integer));
|
|
Move(VI, Dest^, SizeOf(Integer));
|
|
end;
|
|
end;
|
|
- FIELD_TYPE_LONGLONG:
|
|
|
|
|
|
+ ftLargeInt:
|
|
begin
|
|
begin
|
|
- if (Src<>'') then
|
|
|
|
|
|
+ {$IFDEF MYSQL50_UP}
|
|
|
|
+ if AField^.ftype = FIELD_TYPE_BIT then
|
|
|
|
+ begin
|
|
|
|
+ VL := 0;
|
|
|
|
+ for VI := 0 to Len-1 do
|
|
|
|
+ VL := VL * 256 + PByte(Source+VI)^;
|
|
|
|
+ end
|
|
|
|
+ else
|
|
|
|
+ {$ENDIF}
|
|
|
|
+ if Src <> '' then
|
|
VL := StrToInt64(Src)
|
|
VL := StrToInt64(Src)
|
|
else
|
|
else
|
|
VL := 0;
|
|
VL := 0;
|
|
Move(VL, Dest^, SizeOf(LargeInt));
|
|
Move(VL, Dest^, SizeOf(LargeInt));
|
|
end;
|
|
end;
|
|
-{$ifdef mysql50_up}
|
|
|
|
- FIELD_TYPE_NEWDECIMAL,
|
|
|
|
-{$endif}
|
|
|
|
- FIELD_TYPE_DECIMAL, FIELD_TYPE_FLOAT, FIELD_TYPE_DOUBLE:
|
|
|
|
- case FieldDef.DataType of
|
|
|
|
- ftBCD:
|
|
|
|
- begin
|
|
|
|
- VC := InternalStrToCurrency(Src);
|
|
|
|
- Move(VC, Dest^, SizeOf(Currency));
|
|
|
|
- end;
|
|
|
|
- ftFmtBCD:
|
|
|
|
- begin
|
|
|
|
- VB := StrToBCD(Src, FSQLFormatSettings);
|
|
|
|
- Move(VB, Dest^, SizeOf(TBCD));
|
|
|
|
- end
|
|
|
|
- else
|
|
|
|
- begin
|
|
|
|
- if Src <> '' then
|
|
|
|
- VF := InternalStrToFloat(Src)
|
|
|
|
- else
|
|
|
|
- VF := 0;
|
|
|
|
- Move(VF, Dest^, SizeOf(Double));
|
|
|
|
- end;
|
|
|
|
- end;
|
|
|
|
- FIELD_TYPE_TIMESTAMP:
|
|
|
|
|
|
+ ftFloat:
|
|
begin
|
|
begin
|
|
if Src <> '' then
|
|
if Src <> '' then
|
|
- VD := InternalStrToTimeStamp(Src)
|
|
|
|
|
|
+ VF := InternalStrToFloat(Src)
|
|
else
|
|
else
|
|
- VD := 0;
|
|
|
|
- Move(VD, Dest^, SizeOf(TDateTime));
|
|
|
|
|
|
+ VF := 0;
|
|
|
|
+ Move(VF, Dest^, SizeOf(Double));
|
|
|
|
+ end;
|
|
|
|
+ ftBCD:
|
|
|
|
+ begin
|
|
|
|
+ VC := InternalStrToCurrency(Src);
|
|
|
|
+ Move(VC, Dest^, SizeOf(Currency));
|
|
|
|
+ end;
|
|
|
|
+ ftFmtBCD:
|
|
|
|
+ begin
|
|
|
|
+ VB := StrToBCD(Src, FSQLFormatSettings);
|
|
|
|
+ Move(VB, Dest^, SizeOf(TBCD));
|
|
end;
|
|
end;
|
|
- FIELD_TYPE_DATETIME:
|
|
|
|
|
|
+ ftDate:
|
|
begin
|
|
begin
|
|
if Src <> '' then
|
|
if Src <> '' then
|
|
- VD := InternalStrToDateTime(Src)
|
|
|
|
|
|
+ VD := InternalStrToDate(Src)
|
|
else
|
|
else
|
|
VD := 0;
|
|
VD := 0;
|
|
Move(VD, Dest^, SizeOf(TDateTime));
|
|
Move(VD, Dest^, SizeOf(TDateTime));
|
|
end;
|
|
end;
|
|
- FIELD_TYPE_DATE:
|
|
|
|
|
|
+ ftTime:
|
|
begin
|
|
begin
|
|
if Src <> '' then
|
|
if Src <> '' then
|
|
- VD := InternalStrToDate(Src)
|
|
|
|
|
|
+ VD := InternalStrToTime(Src)
|
|
else
|
|
else
|
|
VD := 0;
|
|
VD := 0;
|
|
Move(VD, Dest^, SizeOf(TDateTime));
|
|
Move(VD, Dest^, SizeOf(TDateTime));
|
|
end;
|
|
end;
|
|
- FIELD_TYPE_TIME:
|
|
|
|
|
|
+ ftDateTime:
|
|
begin
|
|
begin
|
|
if Src <> '' then
|
|
if Src <> '' then
|
|
- VD := InternalStrToTime(Src)
|
|
|
|
|
|
+ if AField^.ftype = FIELD_TYPE_TIMESTAMP then
|
|
|
|
+ VD := InternalStrToTimeStamp(Src)
|
|
|
|
+ else
|
|
|
|
+ VD := InternalStrToDateTime(Src)
|
|
else
|
|
else
|
|
VD := 0;
|
|
VD := 0;
|
|
Move(VD, Dest^, SizeOf(TDateTime));
|
|
Move(VD, Dest^, SizeOf(TDateTime));
|
|
end;
|
|
end;
|
|
- FIELD_TYPE_VAR_STRING, FIELD_TYPE_STRING, FIELD_TYPE_ENUM, FIELD_TYPE_SET:
|
|
|
|
|
|
+ ftString, ftFixedChar:
|
|
|
|
+ // String-fields which can contain more then dsMaxStringSize characters
|
|
|
|
+ // are mapped to ftBlob fields, while their mysql-datatype is FIELD_TYPE_BLOB
|
|
begin
|
|
begin
|
|
-{ Write('Moving string of size ',asize,' : ');
|
|
|
|
- P:=Source;
|
|
|
|
- If (P<>nil) then
|
|
|
|
- While P[0]<>#0 do
|
|
|
|
- begin
|
|
|
|
- Write(p[0]);
|
|
|
|
- inc(p);
|
|
|
|
- end;
|
|
|
|
- Writeln;
|
|
|
|
-}
|
|
|
|
- if Len > FieldDef.Size then
|
|
|
|
- Len := FieldDef.Size;
|
|
|
|
- case FieldDef.DataType of
|
|
|
|
- // String-fields which can contain more then dsMaxStringSize characters
|
|
|
|
- // are mapped to ftBlob fields, while their mysql-datatype is FIELD_TYPE_BLOB
|
|
|
|
- ftBlob, ftMemo:
|
|
|
|
- CreateBlob := True;
|
|
|
|
- ftVarBytes:
|
|
|
|
- begin
|
|
|
|
- PWord(Dest)^ := Len;
|
|
|
|
- Move(Source^, (Dest+sizeof(Word))^, Len);
|
|
|
|
- end;
|
|
|
|
- ftBytes:
|
|
|
|
- Move(Source^, Dest^, Len);
|
|
|
|
- else // ftString, ftFixedChar
|
|
|
|
- begin
|
|
|
|
- Move(Source^, Dest^, Len);
|
|
|
|
- (Dest+Len)^ := #0;
|
|
|
|
- end;
|
|
|
|
|
|
+ Move(Source^, Dest^, Len);
|
|
|
|
+ (Dest+Len)^ := #0;
|
|
end;
|
|
end;
|
|
- end;
|
|
|
|
- FIELD_TYPE_TINY_BLOB..FIELD_TYPE_BLOB:
|
|
|
|
- CreateBlob := True;
|
|
|
|
-{$IFDEF MYSQL50_UP}
|
|
|
|
- FIELD_TYPE_BIT:
|
|
|
|
|
|
+ ftVarBytes:
|
|
begin
|
|
begin
|
|
- VL := 0;
|
|
|
|
- for VI := 0 to Len-1 do
|
|
|
|
- VL := VL * 256 + PByte(Source+VI)^;
|
|
|
|
- move(VL, Dest^, sizeof(LargeInt));
|
|
|
|
|
|
+ PWord(Dest)^ := Len;
|
|
|
|
+ Move(Source^, (Dest+sizeof(Word))^, Len);
|
|
end;
|
|
end;
|
|
-{$ENDIF}
|
|
|
|
|
|
+ ftBytes:
|
|
|
|
+ Move(Source^, Dest^, Len);
|
|
|
|
+ ftBlob, ftMemo:
|
|
|
|
+ CreateBlob := True;
|
|
end;
|
|
end;
|
|
Result := True;
|
|
Result := True;
|
|
end;
|
|
end;
|