mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-11-01 21:09:32 +01:00
698 lines
14 KiB
PHP
698 lines
14 KiB
PHP
|
|
{ TParams }
|
|
|
|
Function TParams.GetItem(Index: Integer): TParam;
|
|
begin
|
|
Result:=(Inherited GetItem(Index)) as TParam;
|
|
end;
|
|
|
|
Function TParams.GetParamValue(const ParamName: string): Variant;
|
|
begin
|
|
Result:=ParamByName(ParamName).Value;
|
|
end;
|
|
|
|
Procedure TParams.SetItem(Index: Integer; Value: TParam);
|
|
begin
|
|
Inherited SetItem(Index,Value);
|
|
end;
|
|
|
|
Procedure TParams.SetParamValue(const ParamName: string; const Value: Variant);
|
|
begin
|
|
ParamByName(ParamName).Value:=Value;
|
|
end;
|
|
|
|
Procedure TParams.AssignTo(Dest: TPersistent);
|
|
begin
|
|
if (Dest is TParams) then
|
|
TParams(Dest).Assign(Self)
|
|
else
|
|
inherited AssignTo(Dest);
|
|
end;
|
|
|
|
Function TParams.GetDataSet: TDataSet;
|
|
begin
|
|
If (FOwner is TDataset) Then
|
|
Result:=TDataset(FOwner)
|
|
else
|
|
Result:=Nil;
|
|
end;
|
|
|
|
Function TParams.GetOwner: TPersistent;
|
|
begin
|
|
Result:=FOwner;
|
|
end;
|
|
|
|
|
|
constructor TParams.Create(AOwner: TPersistent);
|
|
begin
|
|
Inherited Create(TParam);
|
|
Fowner:=AOwner;
|
|
end;
|
|
|
|
constructor TParams.Create;
|
|
begin
|
|
Create(TPersistent(Nil));
|
|
end;
|
|
|
|
Procedure TParams.AddParam(Value: TParam);
|
|
begin
|
|
Value.Collection:=Self;
|
|
end;
|
|
|
|
Procedure TParams.AssignValues(Value: TParams);
|
|
|
|
Var
|
|
I : Integer;
|
|
P,PS : TParam;
|
|
|
|
begin
|
|
For I:=0 to Value.Count-1 do
|
|
begin
|
|
PS:=Value[i];
|
|
P:=FindParam(PS.Name);
|
|
If Assigned(P) then
|
|
P.Assign(PS);
|
|
end;
|
|
end;
|
|
|
|
Function TParams.CreateParam(FldType: TFieldType; const ParamName: string;
|
|
ParamType: TParamType): TParam;
|
|
|
|
begin
|
|
Result:=Add as TParam;
|
|
With Result do
|
|
begin
|
|
Name:=ParamName;
|
|
DataType:=FldType;
|
|
ParamType:=ParamType;
|
|
end;
|
|
end;
|
|
|
|
Function TParams.FindParam(const Value: string): TParam;
|
|
|
|
Var
|
|
I : Integer;
|
|
|
|
begin
|
|
Result:=Nil;
|
|
I:=Count-1;
|
|
While (Result=Nil) and (I>=0) do
|
|
If (CompareText(Value,Items[i].Name)=0) then
|
|
Result:=Items[i]
|
|
else
|
|
Dec(i);
|
|
end;
|
|
|
|
Procedure TParams.GetParamList(List: TList; const ParamNames: string);
|
|
|
|
Function NextName(Var S : String) : String;
|
|
Var
|
|
P : Integer;
|
|
begin
|
|
P:=Pos(';',S);
|
|
If (P=0) then
|
|
P:=Length(S)+1;
|
|
Result:=Copy(S,1,P-1);
|
|
system.Delete(S,1,P);
|
|
end;
|
|
|
|
Var
|
|
L,N : String;
|
|
|
|
begin
|
|
L:=ParamNames;
|
|
While (Length(L)>0) do
|
|
begin
|
|
N:=NextName(L);
|
|
List.Add(ParamByName(N));
|
|
end;
|
|
end;
|
|
|
|
Function TParams.IsEqual(Value: TParams): Boolean;
|
|
|
|
Var
|
|
I : Integer;
|
|
|
|
begin
|
|
Result:=(Value.Count=Count);
|
|
I:=Count-1;
|
|
While Result and (I>=0) do
|
|
begin
|
|
Result:=Items[I].IsEqual(Value[i]);
|
|
Dec(I);
|
|
end;
|
|
end;
|
|
|
|
Function TParams.ParamByName(const Value: string): TParam;
|
|
begin
|
|
Result:=FindParam(Value);
|
|
If (Result=Nil) then
|
|
DatabaseErrorFmt(SParameterNotFound,[Value],Dataset);
|
|
end;
|
|
|
|
Function TParams.ParseSQL(SQL: String; DoCreate: Boolean): String;
|
|
begin
|
|
|
|
end;
|
|
|
|
Procedure TParams.RemoveParam(Value: TParam);
|
|
begin
|
|
Value.Collection:=Nil;
|
|
end;
|
|
|
|
{ TParam }
|
|
|
|
Function TParam.GetDataSet: TDataSet;
|
|
begin
|
|
If Assigned(Collection) and (Collection is TParams) then
|
|
Result:=TParams(Collection).GetDataset
|
|
else
|
|
Result:=Nil;
|
|
end;
|
|
|
|
Function TParam.IsParamStored: Boolean;
|
|
begin
|
|
Result:=Bound;
|
|
end;
|
|
|
|
Procedure TParam.AssignParam(Param: TParam);
|
|
begin
|
|
if Not Assigned(Param) then
|
|
begin
|
|
Clear;
|
|
FDataType:=ftunknown;
|
|
FParamType:=ptUnknown;
|
|
Name:='';
|
|
Size:=0;
|
|
Precision:=0;
|
|
NumericScale:=0;
|
|
end
|
|
else
|
|
begin
|
|
FDataType:=Param.DataType;
|
|
if Param.IsNull then
|
|
Clear
|
|
else
|
|
FValue:=Param.FValue;
|
|
FBound:=Param.Bound;
|
|
Name:=Param.Name;
|
|
if (ParamType=ptUnknown) then
|
|
ParamType:=Param.ParamType;
|
|
Size:=Param.Size;
|
|
Precision:=Param.Precision;
|
|
NumericScale:=Param.NumericScale;
|
|
end;
|
|
end;
|
|
|
|
Procedure TParam.AssignTo(Dest: TPersistent);
|
|
begin
|
|
if (Dest is TField) then
|
|
AssignToField(TField(Dest))
|
|
else
|
|
inherited AssignTo(Dest);
|
|
end;
|
|
|
|
Function TParam.GetAsBoolean: Boolean;
|
|
begin
|
|
If IsNull then
|
|
Result:=False
|
|
else
|
|
Result:=FValue;
|
|
end;
|
|
|
|
Function TParam.GetAsCurrency: Currency;
|
|
begin
|
|
If IsNull then
|
|
Result:=0.0
|
|
else
|
|
Result:=FValue;
|
|
end;
|
|
|
|
Function TParam.GetAsDateTime: TDateTime;
|
|
begin
|
|
If IsNull then
|
|
Result:=0.0
|
|
else
|
|
Result:=FValue;
|
|
end;
|
|
|
|
Function TParam.GetAsFloat: Double;
|
|
begin
|
|
If IsNull then
|
|
Result:=0.0
|
|
else
|
|
Result:=FValue;
|
|
end;
|
|
|
|
Function TParam.GetAsInteger: Longint;
|
|
begin
|
|
If IsNull then
|
|
Result:=0
|
|
else
|
|
Result:=FValue;
|
|
end;
|
|
|
|
Function TParam.GetAsMemo: string;
|
|
begin
|
|
If IsNull then
|
|
Result:=''
|
|
else
|
|
Result:=FValue;
|
|
end;
|
|
|
|
Function TParam.GetAsString: string;
|
|
begin
|
|
If IsNull then
|
|
Result:=''
|
|
else
|
|
Result:=FValue;
|
|
end;
|
|
|
|
Function TParam.GetAsVariant: Variant;
|
|
begin
|
|
if IsNull then
|
|
Result:=Null
|
|
else
|
|
Result:=FValue;
|
|
end;
|
|
|
|
Function TParam.GetDisplayName: string;
|
|
begin
|
|
if (FName<>'') then
|
|
Result:=FName
|
|
else
|
|
Result:=inherited GetDisplayName
|
|
end;
|
|
|
|
Function TParam.GetIsNull: Boolean;
|
|
begin
|
|
Result:= VarIsNull(FValue) or VarIsClear(FValue);
|
|
end;
|
|
|
|
Function TParam.IsEqual(AValue: TParam): Boolean;
|
|
begin
|
|
Result:=(Name=AValue.Name)
|
|
and (IsNull=AValue.IsNull)
|
|
and (Bound=AValue.Bound)
|
|
and (DataType=AValue.DataType)
|
|
and (ParamType=AValue.ParamType)
|
|
and (VarType(FValue)=VarType(AValue.FValue))
|
|
and (FValue=AValue.FValue);
|
|
end;
|
|
|
|
Procedure TParam.SetAsBlob(const AValue: TBlobData);
|
|
begin
|
|
FValue:=AValue;
|
|
FDataType:=ftBlob;
|
|
end;
|
|
|
|
Procedure TParam.SetAsBoolean(AValue: Boolean);
|
|
begin
|
|
FValue:=AValue;
|
|
FDataType:=ftBoolean;
|
|
end;
|
|
|
|
Procedure TParam.SetAsCurrency(const AValue: Currency);
|
|
begin
|
|
FValue:=Avalue;
|
|
FDataType:=ftCurrency;
|
|
end;
|
|
|
|
Procedure TParam.SetAsDate(const AValue: TDateTime);
|
|
begin
|
|
FValue:=Avalue;
|
|
FDataType:=ftDate;
|
|
end;
|
|
|
|
Procedure TParam.SetAsDateTime(const AValue: TDateTime);
|
|
begin
|
|
FValue:=AValue;
|
|
FDataType:=ftDateTime;
|
|
end;
|
|
|
|
Procedure TParam.SetAsFloat(const AValue: Double);
|
|
begin
|
|
FValue:=AValue;
|
|
FDataType:=ftFloat;
|
|
end;
|
|
|
|
Procedure TParam.SetAsInteger(AValue: Longint);
|
|
begin
|
|
FValue:=AValue;
|
|
FDataType:=ftInteger;
|
|
end;
|
|
|
|
Procedure TParam.SetAsMemo(const AValue: string);
|
|
begin
|
|
FValue:=AValue;
|
|
FDataType:=ftMemo;
|
|
end;
|
|
|
|
|
|
Procedure TParam.SetAsSmallInt(AValue: LongInt);
|
|
begin
|
|
FValue:=AValue;
|
|
FDataType:=ftSmallInt;
|
|
end;
|
|
|
|
Procedure TParam.SetAsString(const AValue: string);
|
|
begin
|
|
FValue:=AValue;
|
|
FDataType:=ftString;
|
|
end;
|
|
|
|
Procedure TParam.SetAsTime(const AValue: TDateTime);
|
|
begin
|
|
FValue:=AValue;
|
|
FDataType:=ftTime;
|
|
end;
|
|
|
|
Procedure TParam.SetAsVariant(const AValue: Variant);
|
|
begin
|
|
FValue:=AValue;
|
|
FBound:=not VarIsClear(Value);
|
|
if FDataType = ftUnknown then
|
|
case VarType(Value) of
|
|
varBoolean : FDataType:=ftBoolean;
|
|
varSmallint,
|
|
varShortInt,
|
|
varByte : FDataType:=ftSmallInt;
|
|
varWord,
|
|
varInteger : FDataType:=ftInteger;
|
|
varCurrency : FDataType:=ftCurrency;
|
|
varLongWord,
|
|
varSingle,
|
|
varDouble : FDataType:=ftFloat;
|
|
varDate : FDataType:=ftDateTime;
|
|
varString,
|
|
varOleStr : if (FDataType<>ftFixedChar) then
|
|
FDataType:=ftString;
|
|
varInt64 : FDataType:=ftLargeInt;
|
|
else
|
|
FDataType:=ftUnknown;
|
|
end;
|
|
end;
|
|
|
|
Procedure TParam.SetAsWord(AValue: LongInt);
|
|
begin
|
|
FValue:=AValue;
|
|
FDataType:=ftWord;
|
|
end;
|
|
|
|
|
|
Procedure TParam.SetDataType(AValue: TFieldType);
|
|
|
|
Var
|
|
VT : Integer;
|
|
|
|
begin
|
|
FDataType:=AValue;
|
|
VT:=FieldTypetoVariantMap[AValue];
|
|
If (VT=varError) then
|
|
clear
|
|
else
|
|
Try
|
|
FValue:=VarAsType(AValue,VT)
|
|
except
|
|
Clear;
|
|
end;
|
|
end;
|
|
|
|
Procedure TParam.SetText(const AValue: string);
|
|
begin
|
|
Value:=AValue;
|
|
end;
|
|
|
|
constructor TParam.Create(ACollection: TCollection);
|
|
begin
|
|
inherited Create(ACollection);
|
|
ParamType:=ptUnknown;
|
|
DataType:=ftUnknown;
|
|
FValue:=Unassigned;
|
|
end;
|
|
|
|
constructor TParam.Create(AParams: TParams; AParamType: TParamType);
|
|
begin
|
|
Create(AParams);
|
|
ParamType:=AParamType;
|
|
end;
|
|
|
|
Procedure TParam.Assign(Source: TPersistent);
|
|
begin
|
|
if (Source is TParam) then
|
|
AssignParam(TParam(Source))
|
|
else if (Source is TField) then
|
|
AssignField(TField(Source))
|
|
else if (source is TStrings) then
|
|
AsMemo:=TStrings(Source).Text
|
|
else
|
|
inherited Assign(Source);
|
|
end;
|
|
|
|
Procedure TParam.AssignField(Field: TField);
|
|
begin
|
|
if Assigned(Field) then
|
|
begin
|
|
// Need TField.Value
|
|
// AssignFieldValue(Field,Field.Value);
|
|
Name:=Field.FieldName;
|
|
end
|
|
else
|
|
begin
|
|
Clear;
|
|
Name:='';
|
|
end
|
|
end;
|
|
|
|
procedure TParam.AssignToField(Field : TField);
|
|
|
|
begin
|
|
if Assigned(Field) then
|
|
case FDataType of
|
|
ftUnknown : DatabaseErrorFmt(SUnknownParamFieldType,[Name],DataSet);
|
|
// Need TField.AsSmallInt
|
|
ftSmallint : Field.AsInteger:=AsSmallInt;
|
|
// Need TField.AsWord
|
|
ftWord : Field.AsInteger:=AsWord;
|
|
ftInteger,
|
|
ftAutoInc : Field.AsInteger:=AsInteger;
|
|
// Need TField.AsCurrency
|
|
ftCurrency : Field.asFloat:=AsCurrency;
|
|
ftFloat : Field.asFloat:=AsFloat;
|
|
ftBoolean : Field.AsBoolean:=AsBoolean;
|
|
ftBlob,
|
|
ftGraphic..ftTypedBinary,
|
|
ftOraBlob,
|
|
ftOraClob,
|
|
ftString,
|
|
ftMemo,
|
|
ftAdt,
|
|
ftFixedChar: Field.AsString:=AsString;
|
|
ftTime,
|
|
ftDate,
|
|
ftDateTime : Field.AsDateTime:=AsDateTime;
|
|
ftBytes,
|
|
ftVarBytes : ; // Todo.
|
|
else
|
|
If not (DataType in [ftCursor, ftArray, ftDataset,ftReference]) then
|
|
DatabaseErrorFmt(SBadParamFieldType, [Name], DataSet);
|
|
end;
|
|
end;
|
|
|
|
Procedure TParam.AssignFieldValue(Field: TField; const AValue: Variant);
|
|
begin
|
|
If Assigned(Field) then
|
|
begin
|
|
// Need TField.FixedChar property.
|
|
if (Field.DataType = ftString) {and TStringField(Field).FixedChar} then
|
|
DataType:=ftFixedChar
|
|
else if (Field.DataType = ftMemo) and (Field.Size > 255) then
|
|
DataType:=ftString
|
|
else
|
|
DataType:=Field.DataType;
|
|
if VarIsNull(AValue) then
|
|
Clear
|
|
else
|
|
Value:=AValue;
|
|
Size:=Field.DataSize;
|
|
FBound:=True;
|
|
end;
|
|
end;
|
|
|
|
Procedure TParam.Clear;
|
|
begin
|
|
FValue:=UnAssigned;
|
|
end;
|
|
|
|
Procedure TParam.GetData(Buffer: Pointer);
|
|
|
|
Var
|
|
P : Pointer;
|
|
S : String;
|
|
|
|
begin
|
|
case FDataType of
|
|
ftUnknown : DatabaseErrorFmt(SUnknownParamFieldType,[Name],DataSet);
|
|
ftSmallint : PSmallint(Buffer)^:=AsSmallInt;
|
|
ftWord : PWord(Buffer)^:=AsWord;
|
|
ftInteger,
|
|
ftAutoInc : PInteger(Buffer)^:=AsInteger;
|
|
ftCurrency : PDouble(Buffer)^:=AsCurrency;
|
|
ftFloat : PDouble(Buffer)^:=AsFloat;
|
|
ftBoolean : PWordBool(Buffer)^:=AsBoolean;
|
|
ftString,
|
|
ftMemo,
|
|
ftAdt,
|
|
ftFixedChar:
|
|
begin
|
|
S:=AsString;
|
|
StrMove(PChar(Buffer),Pchar(S),Length(S)+1);
|
|
end;
|
|
ftTime : PInteger(Buffer)^:=DateTimeToTimeStamp(AsTime).Time;
|
|
ftDate : PInteger(Buffer)^:=DateTimeToTimeStamp(AsTime).Date;
|
|
ftDateTime : PDouble(Buffer)^:=TimeStampToMSecs(DateTimeToTimeStamp(AsDateTime));
|
|
ftBlob,
|
|
ftGraphic..ftTypedBinary,
|
|
ftOraBlob,
|
|
ftOraClob :
|
|
begin
|
|
S:=GetAsString;
|
|
Move(PChar(S)^, Buffer^, Length(S));
|
|
end;
|
|
ftBytes, ftVarBytes:
|
|
begin
|
|
if VarIsArray(FValue) then
|
|
begin
|
|
P:=VarArrayLock(FValue);
|
|
try
|
|
Move(P^, Buffer^, VarArrayHighBound(FValue, 1) + 1);
|
|
finally
|
|
VarArrayUnlock(FValue);
|
|
end;
|
|
end;
|
|
end;
|
|
else
|
|
If not (DataType in [ftCursor, ftArray, ftDataset,ftReference]) then
|
|
DatabaseErrorFmt(SBadParamFieldType, [Name], DataSet);
|
|
end;
|
|
end;
|
|
|
|
Function TParam.GetDataSize: Integer;
|
|
begin
|
|
Result:=0;
|
|
case DataType of
|
|
ftUnknown : DatabaseErrorFmt(SUnknownParamFieldType,[Name],DataSet);
|
|
ftBoolean : Result:=SizeOf(WordBool);
|
|
ftInteger,
|
|
ftAutoInc : Result:=SizeOf(Integer);
|
|
ftSmallint : Result:=SizeOf(SmallInt);
|
|
ftWord : Result:=SizeOf(Word);
|
|
ftTime,
|
|
ftDate : Result:=SizeOf(Integer);
|
|
ftDateTime,
|
|
ftCurrency,
|
|
ftFloat : Result:=SizeOf(Double);
|
|
ftString,
|
|
ftFixedChar,
|
|
ftMemo,
|
|
ftADT : Result:=Length(AsString)+1;
|
|
ftBytes,
|
|
ftVarBytes : if VarIsArray(FValue) then
|
|
Result:=VarArrayHighBound(FValue,1)+1
|
|
else
|
|
Result:=0;
|
|
ftBlob,
|
|
ftGraphic..ftTypedBinary,
|
|
ftOraClob,
|
|
ftOraBlob : Result:=Length(AsString);
|
|
ftArray,
|
|
ftDataSet,
|
|
ftReference,
|
|
ftCursor : Result:=0;
|
|
else
|
|
DatabaseErrorFmt(SBadParamFieldType,[Name],DataSet);
|
|
end;
|
|
|
|
|
|
end;
|
|
|
|
Procedure TParam.LoadFromFile(const FileName: string; BlobType: TBlobType);
|
|
|
|
Var
|
|
S : TFileStream;
|
|
|
|
begin
|
|
S:=TFileStream.Create(FileName,fmOpenRead);
|
|
Try
|
|
LoadFromStream(S,BlobType);
|
|
Finally
|
|
FreeAndNil(S);
|
|
end;
|
|
end;
|
|
|
|
Procedure TParam.LoadFromStream(Stream: TStream; BlobType: TBlobType);
|
|
|
|
Var
|
|
Temp : String;
|
|
|
|
begin
|
|
FDataType:=BlobType;
|
|
With Stream do
|
|
begin
|
|
Position:=0;
|
|
SetLength(Temp,Size);
|
|
ReadBuffer(Pointer(Temp)^,Size);
|
|
FValue:=Temp;
|
|
end;
|
|
end;
|
|
|
|
Procedure TParam.SetBlobData(Buffer: Pointer; Size: Integer);
|
|
|
|
Var
|
|
Temp : String;
|
|
|
|
begin
|
|
SetLength(Temp,Size);
|
|
Move(Buffer^,Temp,Size);
|
|
AsBlob:=Temp;
|
|
end;
|
|
|
|
Procedure TParam.SetData(Buffer: Pointer);
|
|
|
|
Function FromTimeStamp(T,D : Integer) : TDateTime;
|
|
|
|
Var TS : TTimeStamp;
|
|
|
|
begin
|
|
TS.Time:=T;
|
|
TS.Date:=D;
|
|
Result:=TimeStampToDateTime(TS);
|
|
end;
|
|
|
|
begin
|
|
case FDataType of
|
|
ftUnknown : DatabaseErrorFmt(SUnknownParamFieldType,[Name],DataSet);
|
|
ftSmallint : AsSmallInt:=PSmallint(Buffer)^;
|
|
ftWord : AsWord:=PWord(Buffer)^;
|
|
ftInteger,
|
|
ftAutoInc : AsInteger:=PInteger(Buffer)^;
|
|
ftCurrency : AsCurrency:= PDouble(Buffer)^;
|
|
ftFloat : AsFloat:=PDouble(Buffer)^;
|
|
ftBoolean : AsBoolean:=PWordBool(Buffer)^;
|
|
ftString,
|
|
ftFixedChar: AsString:=StrPas(Buffer);
|
|
ftMemo : AsMemo:=StrPas(Buffer);
|
|
ftTime : AsTime:=FromTimeStamp(PInteger(Buffer)^,DateDelta);
|
|
ftDate : Asdate:=FromTimeStamp(0,PInteger(Buffer)^);
|
|
ftDateTime : AsDateTime:=TimeStampToDateTime(MSecsToTimeStamp(trunc(PDouble(Buffer)^)));
|
|
ftCursor : FValue:=0;
|
|
ftBlob,
|
|
ftGraphic..ftTypedBinary,
|
|
ftOraBlob,
|
|
ftOraClob : SetBlobData(Buffer, StrLen(PChar(Buffer)));
|
|
else
|
|
DatabaseErrorFmt(SBadParamFieldType,[Name],DataSet);
|
|
end;
|
|
end;
|
|
|