Reworking DataRecords and DataFlow
This commit is contained in:
+42
-11
@@ -12,7 +12,7 @@ type
|
||||
TDataRecord = record
|
||||
public
|
||||
type
|
||||
TFieldType = (dfFloat, dfInteger, dfString, dfTimestamp);
|
||||
TFieldType = (dfFloat, dfInteger, dfString, dfTimestamp, dfRecord);
|
||||
|
||||
TField = record
|
||||
private
|
||||
@@ -66,9 +66,6 @@ type
|
||||
FLayout: TLayout;
|
||||
FBuffer: TBytes;
|
||||
|
||||
const
|
||||
DataSize: array[TFieldType] of Integer = (sizeof(Double), sizeof(Int64), sizeof(String), sizeof(TDateTime));
|
||||
|
||||
public
|
||||
constructor Create(const ALayout: TLayout; const ABuffer: TBytes = nil);
|
||||
class operator Finalize(var Dest: TDataRecord);
|
||||
@@ -87,6 +84,10 @@ type
|
||||
property Layout: TLayout read FLayout;
|
||||
end;
|
||||
|
||||
const
|
||||
DataSize: array[TDataRecord.TFieldType] of Integer =
|
||||
(sizeof(Double), sizeof(Int64), sizeof(String), sizeof(TDateTime), sizeof(TDataRecord));
|
||||
|
||||
implementation
|
||||
|
||||
uses
|
||||
@@ -152,6 +153,7 @@ begin
|
||||
dfInteger: Int64(Value) := PInt64(Value)^;
|
||||
dfString: String(Value) := PString(Value)^;
|
||||
dfTimestamp: TDateTime(Value) := PDateTime(Value)^;
|
||||
dfRecord: TDataRecord(Value) := TDataRecord(Value);
|
||||
else
|
||||
Assert(false);
|
||||
end;
|
||||
@@ -165,6 +167,7 @@ begin
|
||||
dfInteger: PInt64(P)^ := Int64(Value);
|
||||
dfString: PString(P)^ := String(Value);
|
||||
dfTimestamp: PDateTime(P)^ := TDateTime(Value);
|
||||
dfRecord: TDataRecord(P^) := TDataRecord(Value);
|
||||
else
|
||||
Assert(false);
|
||||
end;
|
||||
@@ -199,7 +202,7 @@ end;
|
||||
|
||||
procedure TDataRecord.TField.Finalize(const [ref] Buffer: TBytes);
|
||||
begin
|
||||
if not (FFieldType in [dfString]) then
|
||||
if not (FFieldType in [dfString, dfRecord]) then
|
||||
exit;
|
||||
|
||||
Assert(FOffset + Size <= Length(Buffer));
|
||||
@@ -207,6 +210,7 @@ begin
|
||||
var P := @Buffer[FOffset];
|
||||
case FFieldType of
|
||||
dfString: PString(P)^ := '';
|
||||
dfRecord: TDataRecord(P^) := Default(TDataRecord);
|
||||
end;
|
||||
end;
|
||||
|
||||
@@ -245,8 +249,15 @@ begin
|
||||
dfTimestamp:
|
||||
begin
|
||||
Assert(SrcType.Kind = tkFloat);
|
||||
Assert(SrcType.Name = PTypeInfo(TypeInfo(TDateTime)).Name);
|
||||
PDateTime(Dst)^ := PDateTime(@Src)^;
|
||||
end;
|
||||
dfRecord:
|
||||
begin
|
||||
Assert(SrcType = TypeInfo(TDataRecord));
|
||||
Assert(SrcType.Name = PTypeInfo(TypeInfo(TDataRecord)).Name);
|
||||
TDataRecord(Dst^) := TDataRecord(Src);
|
||||
end;
|
||||
else
|
||||
Assert(false);
|
||||
end;
|
||||
@@ -293,8 +304,14 @@ begin
|
||||
dfTimestamp:
|
||||
begin
|
||||
Assert(DstType.Kind = tkFloat);
|
||||
Assert(DstType.Name = PTypeInfo(TypeInfo(TDateTime)).Name);
|
||||
PDateTime(@Dst)^ := PDateTime(Src)^;
|
||||
end;
|
||||
dfRecord:
|
||||
begin
|
||||
Assert(DstType = TypeInfo(TDataRecord));
|
||||
TDataRecord(Dst) := TDataRecord(Src^);
|
||||
end;
|
||||
else
|
||||
Assert(false);
|
||||
end;
|
||||
@@ -312,6 +329,7 @@ begin
|
||||
dfInteger: PInt64(Dst)^ := PInt64(@Src)^;
|
||||
dfString: PString(Dst)^ := PString(@Src)^;
|
||||
dfTimestamp: PDateTime(Dst)^ := PDateTime(@Src)^;
|
||||
dfRecord: TDataRecord(Dst^) := TDataRecord(Src);
|
||||
else
|
||||
Assert(false);
|
||||
end;
|
||||
@@ -350,19 +368,32 @@ begin
|
||||
for var i := 0 to High(rttiFields) do
|
||||
begin
|
||||
var rf := rttiFields[i];
|
||||
var ft: TFieldType := Default(TFieldType);
|
||||
var supported := true;
|
||||
|
||||
case rf.FieldType.TypeKind of
|
||||
tkInteger, tkInt64: fields[i] := TField.Create(rf.Name, dfInteger, ofs);
|
||||
tkInteger, tkInt64: ft := dfInteger;
|
||||
tkFloat:
|
||||
if SameText(rf.FieldType.Name, 'TDateTime') then
|
||||
fields[i] := TField.Create(rf.Name, dfTimestamp, ofs)
|
||||
if rf.FieldType.HasName(GetTypeName(TypeInfo(TDateTime))) then
|
||||
ft := dfTimestamp
|
||||
else
|
||||
fields[i] := TField.Create(rf.Name, dfFloat, ofs);
|
||||
tkString, tkWString, tkLString, tkUString: fields[i] := TField.Create(rf.Name, dfString, ofs);
|
||||
ft := dfFloat;
|
||||
tkString, tkWString, tkLString, tkUString: ft := dfString;
|
||||
tkMRecord:
|
||||
begin
|
||||
if rf.FieldType.HasName(GetTypeName(TypeInfo(TDataRecord))) then
|
||||
ft := dfRecord
|
||||
else
|
||||
supported := false;
|
||||
end;
|
||||
else
|
||||
raise Exception.Create('Type ' + rf.FieldType.Name + ' not supported in data records');
|
||||
supported := false;
|
||||
end;
|
||||
|
||||
if not supported then
|
||||
raise Exception.Create('Type ' + rf.FieldType.Name + ' not supported in data records');
|
||||
|
||||
fields[i] := TField.Create(rf.Name, ft, ofs);
|
||||
inc(ofs, fields[i].AlignedSize);
|
||||
end;
|
||||
|
||||
|
||||
@@ -242,6 +242,7 @@ uses
|
||||
System.RTTI,
|
||||
System.DateUtils,
|
||||
System.Math,
|
||||
Winapi.Windows,
|
||||
Myc.TaskManager;
|
||||
|
||||
{ TMycProcessor<T> }
|
||||
|
||||
Reference in New Issue
Block a user