|
From: <na...@us...> - 2009-08-14 19:28:51
|
Revision: 826
http://instantobjects.svn.sourceforge.net/instantobjects/revision/?rev=826&view=rev
Author: nandod
Date: 2009-08-14 19:28:40 +0000 (Fri, 14 Aug 2009)
Log Message:
-----------
* XML I/O formatting and indentation rewritted. The former implementation broke a few tests.
* Changed a few calls to WriteStr to WriteUTF8Str in order to avoid warnings and better support unicode identifiers; added TInstantWriter.WriteUTF8Str for D<2009.
Modified Paths:
--------------
trunk/Source/Core/InstantClasses.pas
trunk/Source/Core/InstantConsts.pas
trunk/Source/Core/InstantMetadata.pas
trunk/Source/Core/InstantPersistence.pas
trunk/Tests/TestIO.mdx
trunk/Tests/TestIO.mdxt
trunk/Tests/TestIO_D2009.mdx
trunk/Tests/TestIO_D2009.mdxt
trunk/Tests/TestInstantClasses.pas
trunk/Tests/TestMinimalModel.pas
Modified: trunk/Source/Core/InstantClasses.pas
===================================================================
--- trunk/Source/Core/InstantClasses.pas 2009-08-14 09:20:30 UTC (rev 825)
+++ trunk/Source/Core/InstantClasses.pas 2009-08-14 19:28:40 UTC (rev 826)
@@ -200,6 +200,7 @@
procedure WriteProperties(AObject: TPersistent);
{$IFNDEF UNICODE}
procedure WriteString(const Value: string);
+ procedure WriteUTF8Str(const Value: string); inline;
{$ENDIF}
procedure WriteValue(Value: TValueType);
property Stream: TStream read FStream;
@@ -262,27 +263,29 @@
end;
{$ENDIF}
+ TInstantXMLToken = (xtNone, xtStartTag, xtEndTag, xtAnyTag, xtData);
+
TInstantXMLProducer = class(TObject)
private
FStream: TStream;
FTagStack: TStringList;
FWriter: TAbstractWriter;
- FCurrentIndentationSize: Integer;
+ FIndentationSize: Integer;
+ FLastToken: TInstantXMLToken;
function GetCurrentTag: string;
function GetEof: Boolean;
function GetPosition: Integer;
function GetTagStack: TStringList;
function GetWriter: TAbstractWriter;
procedure SetPosition(Value: Integer);
+ protected
+ function IsPrettyXMLEnabled: Boolean;
procedure WriteString(const S: string);
- protected
property TagStack: TStringList read GetTagStack;
property Writer: TAbstractWriter read GetWriter;
- public
- procedure Indent;
- procedure Unindent;
procedure WriteIndentation;
procedure WriteLineBreak;
+ public
constructor Create(Stream: TStream);
destructor Destroy; override;
procedure WriteEscapedData(const Data: string);
@@ -295,8 +298,6 @@
property Stream: TStream read FStream;
end;
- TInstantXMLToken = (xtTag, xtData);
-
TInstantXMLProcessor = class(TObject)
private
FReader: TAbstractReader;
@@ -310,6 +311,7 @@
protected
procedure CheckToken(AToken: TInstantXMLToken);
function PeekChar: Char;
+ function PeekCharSkippingBlanks: Char;
function ReadChar: Char;
procedure SkipBlanks;
property Reader: TAbstractReader read GetReader;
@@ -1073,7 +1075,7 @@
procedure TInstantWriter.WriteObject(AObject: TPersistent);
begin
- WriteStr(AObject.ClassName);
+ WriteUTF8Str(AObject.ClassName);
if AObject is TInstantStreamable then
TInstantStreamable(AObject).WriteObject(Self)
else if AObject is TInstantCollection then
@@ -1093,6 +1095,11 @@
WriteListEnd;
end;
+procedure TInstantWriter.WriteValue(Value: TValueType);
+begin
+ inherited WriteValue(Value);
+end;
+
{$IFNDEF UNICODE}
procedure TInstantWriter.WriteString(const Value: string);
var
@@ -1110,12 +1117,22 @@
end;
Write(Pointer(Value)^, L);
end;
-{$ENDIF}
-procedure TInstantWriter.WriteValue(Value: TValueType);
+procedure TInstantWriter.WriteUTF8Str(const Value: string);
+var
+ U: UTF8String;
+ L: Integer;
begin
- inherited;
+ // Note: in versions of Delphi that don't have AnsiToUtf8, just use:
+ // WriteStr(Value);
+ // as the body for this function.
+ U := AnsiToUtf8(Value);
+ L := Length(U);
+ if L > 255 then L := 255;
+ Write(L, SizeOf(Byte));
+ Write(U[1], L);
end;
+{$ENDIF}
{ TInstantStream }
@@ -1348,26 +1365,17 @@
{ TInstantXMLProducer }
-procedure TInstantXMLProducer.Indent;
+function TInstantXMLProducer.IsPrettyXMLEnabled: Boolean;
begin
- Inc(FCurrentIndentationSize, InstantXMLIndentationSize);
+ Result := FIndentationSize > 0;
end;
-procedure TInstantXMLProducer.Unindent;
-begin
- Dec(FCurrentIndentationSize, InstantXMLIndentationSize);
- if InstantXMLIndentationSize >= 0 then
- begin
- WriteLineBreak;
- WriteIndentation;
- end;
-end;
-
-
constructor TInstantXMLProducer.Create(Stream: TStream);
begin
inherited Create;
FStream := Stream;
+ FLastToken := xtNone;
+ FIndentationSize := InstantXMLIndentationSize;
end;
destructor TInstantXMLProducer.Destroy;
@@ -1415,15 +1423,39 @@
procedure TInstantXMLProducer.WriteData(const Data: string);
begin
WriteString(Data);
+ FLastToken := xtData;
end;
+procedure TInstantXMLProducer.WriteStartTag(const Tag: string);
+begin
+ if IsPrettyXMLEnabled then
+ begin
+ if FLastToken = xtStartTag then
+ WriteLineBreak;
+ WriteIndentation;
+ end;
+ WriteString(InstantBuildStartTag(Tag));
+ TagStack.Add(Tag);
+ FLastToken := xtStartTag;
+end;
+
procedure TInstantXMLProducer.WriteEndTag;
var
- Index: Integer;
+ LTagName: string;
begin
- Index := TagStack.Count - 1;
- WriteString(InstantBuildEndTag(TagStack[Index]));
- TagStack.Delete(Index);
+ LTagName := TagStack[TagStack.Count - 1];
+ TagStack.Delete(TagStack.Count - 1);
+ if IsPrettyXMLEnabled then
+ begin
+ if FLastToken = xtStartTag then
+ WriteLineBreak;
+ if FLastToken in [xtStartTag, xtEndTag] then
+ WriteIndentation;
+ end;
+ WriteString(InstantBuildEndTag(LTagName));
+ if IsPrettyXMLEnabled then
+ WriteLineBreak;
+ FLastToken := xtEndTag;
end;
procedure TInstantXMLProducer.WriteEscapedData(const Data: string);
@@ -1453,28 +1485,13 @@
end;
Esc := Format(EscStr, [Esc]);
WriteString(Esc);
- end else//MC if C in [#32..#126] then
+ end
+ else
WriteString(C);
-(* MC
- else begin
- Esc := Format(EscStr, [Format('#%d', [Ord(C)])]);
- WriteString(Esc);
- end;
-*)
end;
+ FLastToken := xtData;
end;
-procedure TInstantXMLProducer.WriteStartTag(const Tag: string);
-begin
- if InstantXMLIndentationSize >= 0 then
- begin
- WriteLineBreak;
- WriteIndentation;
- end;
- WriteString(InstantBuildStartTag(Tag));
- TagStack.Add(Tag);
-end;
-
procedure TInstantXMLProducer.WriteLineBreak;
begin
WriteString(sLineBreak);
@@ -1482,8 +1499,7 @@
procedure TInstantXMLProducer.WriteIndentation;
begin
- if FCurrentIndentationSize > 0 then
- WriteString(DupeString(' ' , FCurrentIndentationSize));
+ WriteString(DupeString(' ' , TagStack.Count * FIndentationSize));
end;
procedure TInstantXMLProducer.WriteString(const S: string);
@@ -1534,8 +1550,8 @@
function TInstantXMLProcessor.GetToken: TInstantXMLToken;
begin
- if PeekChar = InstantTagStart then
- Result := xtTag
+ if PeekCharSkippingBlanks = InstantTagStart then
+ Result := xtAnyTag
else
Result := xtData;
end;
@@ -1552,6 +1568,19 @@
end;
end;
+function TInstantXMLProcessor.PeekCharSkippingBlanks: Char;
+var
+ Pos: Integer;
+begin
+ Pos := Position;
+ try
+ SkipBlanks;
+ Result := ReadChar;
+ finally
+ Position := Pos;
+ end;
+end;
+
function TInstantXMLProcessor.PeekTag: string;
var
Pos: Integer;
@@ -1645,7 +1674,7 @@
Pos := Position;
try
SkipBlanks;
- CheckToken(xtTag);
+ CheckToken(xtAnyTag);
except
Position := Pos;
raise;
@@ -1687,7 +1716,7 @@
EndTag := InstantBuildEndTag(TagName);
Level := 1;
repeat
- if Token = xtTag then
+ if Token = xtAnyTag then
begin
TagName := ReadTag;
if SameText(TagName, StartTag) then
@@ -1789,7 +1818,6 @@
Result := Reader.Stream;
end;
-
function TInstantBinaryToTextConverter.GetOutput: TStream;
begin
Result := Producer.Stream;
@@ -1800,7 +1828,6 @@
PushObjectClass(FindClass(Reader.ReadStr));
try
Producer.WriteStartTag(ObjectClassName);
- Producer.Indent;
if ObjectClass.InheritsFrom(TInstantStreamable) then
TInstantStreamableClass(ObjectClass).ConvertToText(Self)
else if ObjectClass.InheritsFrom(TInstantCollection) then
@@ -1808,7 +1835,6 @@
else if ObjectClass.InheritsFrom(TInstantCollectionItem) then
TInstantCollectionItemClass(ObjectClass).ConvertToText(Self);
Reader.ReadListEnd;
- Producer.Unindent;
Producer.WriteEndTag;
finally
PopObjectClass;
@@ -1878,7 +1904,6 @@
end;
begin
- Producer.Indent;
while not Reader.EndOfList do
begin
Producer.WriteStartTag(Reader.ReadStr);
@@ -1886,7 +1911,6 @@
Producer.WriteEndTag;
end;
Reader.ReadListEnd;
- Producer.Unindent;
end;
{ TInstantToTextToBinaryConverter }
@@ -1934,7 +1958,7 @@
begin
PropName := Processor.ReadTagName;
ValueStr := Processor.ReadData;
- Writer.WriteStr(PropName);
+ Writer.WriteUTF8Str(PropName);
case GetTypeInfo(PropInfo)^.Kind of //PropInfo^.PropType^^.Kind of
tkInteger:
Writer.WriteInteger(StrToInt(ValueStr));
@@ -1966,7 +1990,7 @@
try
InstantStrToList(ValueStr, S, [',']);
for I := 0 to Pred(S.Count) do
- Writer.WriteStr(S[I]);
+ Writer.WriteUTF8Str(S[I]);
finally
S.Free;
end;
@@ -2012,7 +2036,7 @@
begin
PushObjectClass(FindClass(Processor.ReadTagName));
try
- Writer.WriteStr(ObjectClassName);
+ Writer.WriteUTF8Str(ObjectClassName);
if ObjectClass.InheritsFrom(TInstantStreamable) then
TInstantStreamableClass(ObjectClass).ConvertToBinary(Self)
else if ObjectClass.InheritsFrom(TInstantCollection) then
Modified: trunk/Source/Core/InstantConsts.pas
===================================================================
--- trunk/Source/Core/InstantConsts.pas 2009-08-14 09:20:30 UTC (rev 825)
+++ trunk/Source/Core/InstantConsts.pas 2009-08-14 19:28:40 UTC (rev 826)
@@ -79,7 +79,7 @@
{$ENDIF}
var
- InstantXMLIndentationSize: Integer = 2;
+ InstantXMLIndentationSize: Byte = 2;
resourcestring
SAccessError = 'Cannot access attribute %s(''%s'') as type: %s';
Modified: trunk/Source/Core/InstantMetadata.pas
===================================================================
--- trunk/Source/Core/InstantMetadata.pas 2009-08-14 09:20:30 UTC (rev 825)
+++ trunk/Source/Core/InstantMetadata.pas 2009-08-14 19:28:40 UTC (rev 826)
@@ -623,8 +623,8 @@
with Converter do
begin
ConvertProperties(InstantBuildStartTag(InstantAttributeMetadatasTagName));
- Processor.ReadTag;
- if (Processor.Token = xtTag) and not SameText(Processor.PeekTag,
+ Assert(Processor.ReadTagName = InstantAttributeMetadatasTagName);
+ if (Processor.Token = xtAnyTag) and not SameText(Processor.PeekTag,
InstantBuildEndTag(InstantAttributeMetadatasTagName)) then
Convert;
Processor.ReadTag;
@@ -1942,28 +1942,5 @@
inherited Items[Index] := Value;
end;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
end.
+
Modified: trunk/Source/Core/InstantPersistence.pas
===================================================================
--- trunk/Source/Core/InstantPersistence.pas 2009-08-14 09:20:30 UTC (rev 825)
+++ trunk/Source/Core/InstantPersistence.pas 2009-08-14 19:28:40 UTC (rev 826)
@@ -2265,8 +2265,8 @@
begin
with Writer do
begin
- WriteStr(ObjectClassName);
- WriteStr(ObjectId);
+ WriteUTF8Str(ObjectClassName);
+ WriteUTF8Str(ObjectId);
WriteListEnd;
WriteListEnd;
end;
@@ -2277,8 +2277,8 @@
inherited;
Writer.WriteStr('');
Writer.WriteStr('');
- Writer.WriteStr(ObjectClassName);
- Writer.WriteStr(ObjectId);
+ Writer.WriteUTF8Str(ObjectClassName);
+ Writer.WriteUTF8Str(ObjectId);
end;
{ TInstantAttribute }
@@ -2550,7 +2550,7 @@
procedure TInstantAttribute.WriteName(Writer: TInstantWriter);
begin
- Writer.WriteStr(Name);
+ Writer.WriteUTF8Str(Name);
end;
{ TInstantSimple }
@@ -5522,7 +5522,7 @@
with Converter do
begin
AttributeName := Processor.ReadTagName;
- Writer.WriteStr(AttributeName);
+ Writer.WriteUTF8Str(AttributeName);
case AttributeMetadata.AttributeType of
atInteger:
Writer.WriteInteger(StrToInt(Processor.ReadData));
@@ -5599,11 +5599,11 @@
if Processor.PeekTagName = InstantIdFieldName then
begin
Processor.ReadTag;
- if (Processor.Token = xtTag) and SameText(Processor.ReadTagName,
+ if (Processor.Token = xtAnyTag) and SameText(Processor.ReadTagName,
InstantBuildEndTag(InstantIdFieldName)) then
Writer.WriteStr('')
else begin
- Writer.WriteStr(Processor.ReadData);
+ Writer.WriteUTF8Str(Processor.ReadData);
Processor.ReadTag;
end;
end else
@@ -5642,9 +5642,7 @@
vaIdent:
begin
Reader.ReadIdent;
- Producer.Indent;
Convert;
- Producer.Unindent;
end;
vaFalse:
begin
@@ -5669,11 +5667,9 @@
vaCollection:
begin
Reader.ReadValue;
- Producer.Indent;
- while not Reader.EndOfList do
- Convert;
- Producer.Unindent;
- Reader.ReadListEnd;
+ while not Reader.EndOfList do
+ Convert;
+ Reader.ReadListEnd;
end;
else
raise EInstantStreamError.CreateFmt(SInvalidValueType,
@@ -6831,7 +6827,7 @@
procedure TInstantObject.WriteObject(Writer: TInstantWriter);
begin
- Writer.WriteStr(Id);
+ Writer.WriteUTF8Str(Id);
WriteAttributes(Writer);
end;
Modified: trunk/Tests/TestIO.mdx
===================================================================
--- trunk/Tests/TestIO.mdx 2009-08-14 09:20:30 UTC (rev 825)
+++ trunk/Tests/TestIO.mdx 2009-08-14 19:28:40 UTC (rev 826)
@@ -1 +1,461 @@
-<TInstantClassMetadatas><TInstantClassMetadata><Name>TAddress</Name><Persistence>peEmbedded</Persistence><AttributeMetadatas><TInstantAttributeMetadatas><TInstantAttributeMetadata><Name>City</Name><AttributeType>atString</AttributeType><IsIndexed>TRUE</IsIndexed><IsRequired>FALSE</IsRequired><Size>30</Size></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>Country</Name><AttributeType>atReference</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><ObjectClassName>TCountry</ObjectClassName></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>State</Name><AttributeType>atString</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><Size>4</Size></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>Street</Name><AttributeType>atMemo</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>Zip</Name><AttributeType>atString</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><Size>10</Size></TInstantAttributeMetadata></TInstantAttributeMetadatas></AttributeMetadatas></TInstantClassMetadata><TInstantClassMetadata><Name>TCountry</Name><Persistence>peStored</Persistence><AttributeMetadatas><TInstantAttributeMetadatas><TInstantAttributeMetadata><Name>Name</Name><AttributeType>atString</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><Size>30</Size></TInstantAttributeMetadata></TInstantAttributeMetadatas></AttributeMetadatas></TInstantClassMetadata><TInstantClassMetadata><Name>TPhone</Name><Persistence>peEmbedded</Persistence><AttributeMetadatas><TInstantAttributeMetadatas><TInstantAttributeMetadata><Name>Name</Name><AttributeType>atString</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><Size>20</Size></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>Name</Name><AttributeType>atString</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><Size>30</Size></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>Number</Name><AttributeType>atString</AttributeType><EditMask>(000) 000-0000;0;_</EditMask><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><Size>20</Size></TInstantAttributeMetadata></TInstantAttributeMetadatas></AttributeMetadatas></TInstantClassMetadata><TInstantClassMetadata><Name>TEmail</Name><Persistence>peStored</Persistence><AttributeMetadatas><TInstantAttributeMetadatas><TInstantAttributeMetadata><Name>Address</Name><AttributeType>atString</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><Size>100</Size></TInstantAttributeMetadata></TInstantAttributeMetadatas></AttributeMetadatas></TInstantClassMetadata><TInstantClassMetadata><Name>TCategory</Name><Persistence>peStored</Persistence><StorageName>Categories</StorageName><AttributeMetadatas><TInstantAttributeMetadatas><TInstantAttributeMetadata><Name>Name</Name><AttributeType>atString</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><Size>30</Size></TInstantAttributeMetadata></TInstantAttributeMetadatas></AttributeMetadatas></TInstantClassMetadata><TInstantClassMetadata><Name>TContact</Name><Persistence>peStored</Persistence><AttributeMetadatas><TInstantAttributeMetadatas><TInstantAttributeMetadata><Name>Address</Name><AttributeType>atPart</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><ObjectClassName>TAddress</ObjectClassName></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>Category</Name><AttributeType>atReference</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><ObjectClassName>TCategory</ObjectClassName></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>City</Name><AttributeType>atString</AttributeType><IsIndexed>TRUE</IsIndexed><IsRequired>FALSE</IsRequired><Size>30</Size></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>Name</Name><AttributeType>atString</AttributeType><IsIndexed>TRUE</IsIndexed><IsRequired>FALSE</IsRequired><Size>50</Size></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>Phones</Name><AttributeType>atParts</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><ObjectClassName>TPhone</ObjectClassName></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>Projects</Name><AttributeType>atReferences</AttributeType><ExternalStorageName>Contact_Projects</ExternalStorageName><StorageKind>skExternal</StorageKind><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><ObjectClassName>TProject</ObjectClassName></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>ExternalAddress</Name><AttributeType>atPart</AttributeType><StorageKind>skExternal</StorageKind><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><ObjectClassName>TExternalAddress</ObjectClassName></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>ExternalPhones</Name><AttributeType>atParts</AttributeType><ExternalStorageName>Contact_ExternalPhones</ExternalStorageName><StorageKind>skExternal</StorageKind><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><ObjectClassName>TExternalPhone</ObjectClassName></TInstantAttributeMetadata></TInstantAttributeMetadatas></AttributeMetadatas></TInstantClassMetadata><TInstantClassMetadata><Name>TContactFilter</Name><ParentName>TContact</ParentName><Persistence>peEmbedded</Persistence><AttributeMetadatas></AttributeMetadatas></TInstantClassMetadata><TInstantClassMetadata><Name>TPerson</Name><ParentName>TContact</ParentName><Persistence>peStored</Persistence><AttributeMetadatas><TInstantAttributeMetadatas><TInstantAttributeMetadata><Name>BirthDate</Name><AttributeType>atDateTime</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>Emails</Name><AttributeType>atParts</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><ObjectClassName>TEmail</ObjectClassName></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>Employer</Name><AttributeType>atReference</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><ObjectClassName>TCompany</ObjectClassName></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>Picture</Name><AttributeType>atBlob</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>Salary</Name><AttributeType>atCurrency</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><ValidCharsString>,.0..9\x82\xAC\xE2</ValidCharsString></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>Employed</Name><AttributeType>atBoolean</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>AL_hours</Name><AttributeType>atFloat</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>EmploymentDate</Name><AttributeType>atDate</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>BirthTime</Name><AttributeType>atTime</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired></TInstantAttributeMetadata></TInstantAttributeMetadatas></AttributeMetadatas></TInstantClassMetadata><TInstantClassMetadata><Name>TCompany</Name><ParentName>TContact</ParentName><Persistence>peStored</Persistence><AttributeMetadatas><TInstantAttributeMetadatas><TInstantAttributeMetadata><Name>Employees</Name><AttributeType>atReferences</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><ObjectClassName>TPerson</ObjectClassName></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>NoOfBranches</Name><AttributeType>atInteger</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>Subsidiaries</Name><AttributeType>atReferences</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><ObjectClassName>TCompany</ObjectClassName></TInstantAttributeMetadata></TInstantAttributeMetadatas></AttributeMetadatas></TInstantClassMetadata><TInstantClassMetadata><Name>TProject</Name><Persistence>peStored</Persistence><StorageName>Projects</StorageName><AttributeMetadatas><TInstantAttributeMetadatas><TInstantAttributeMetadata><Name>Name</Name><AttributeType>atString</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><Size>30</Size></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>SubProjects</Name><AttributeType>atParts</AttributeType><ExternalStorageName>Project_SubProjects</ExternalStorageName><StorageKind>skExternal</StorageKind><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><ObjectClassName>TProject</ObjectClassName></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>Addresses</Name><AttributeType>atParts</AttributeType><ExternalStorageName>Project_Addresses</ExternalStorageName><StorageKind>skExternal</StorageKind><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><ObjectClassName>TExternalAddress</ObjectClassName></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>Manager</Name><AttributeType>atReference</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><ObjectClassName>TContact</ObjectClassName></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>Participants</Name><AttributeType>atReferences</AttributeType><ExternalStorageName>Project_Participants</ExternalStorageName><StorageKind>skExternal</StorageKind><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><ObjectClassName>TContact</ObjectClassName></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>Items</Name><AttributeType>atPart</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><ObjectClassName>TProjectItems</ObjectClassName></TInstantAttributeMetadata></TInstantAttributeMetadatas></AttributeMetadatas></TInstantClassMetadata><TInstantClassMetadata><Name>TExternalAddress</Name><Persistence>peStored</Persistence><StorageName>ExternalAddresses</StorageName><AttributeMetadatas><TInstantAttributeMetadatas><TInstantAttributeMetadata><Name>Name</Name><AttributeType>atString</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><Size>30</Size></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>Category</Name><AttributeType>atReference</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><ObjectClassName>TCategory</ObjectClassName></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>Site_Contact</Name><AttributeType>atReference</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><ObjectClassName>TPerson</ObjectClassName></TInstantAttributeMetadata></TInstantAttributeMetadatas></AttributeMetadatas></TInstantClassMetadata><TInstantClassMetadata><Name>TExternalPhone</Name><Persistence>peStored</Persistence><StorageName>ExternalPhones</StorageName><AttributeMetadatas><TInstantAttributeMetadatas><TInstantAttributeMetadata><Name>Name</Name><AttributeType>atString</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><Size>20</Size></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>Number</Name><AttributeType>atString</AttributeType><EditMask>(000) 000-0000;0;_</EditMask><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><Size>20</Size></TInstantAttributeMetadata></TInstantAttributeMetadatas></AttributeMetadatas></TInstantClassMetadata><TInstantClassMetadata><Name>TProjectBox</Name><Persistence>peStored</Persistence><AttributeMetadatas><TInstantAttributeMetadatas><TInstantAttributeMetadata><Name>Project</Name><AttributeType>atPart</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><ObjectClassName>TProject</ObjectClassName></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>RelatedProjectBoxes</Name><AttributeType>atReferences</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><ObjectClassName>TProjectBox</ObjectClassName></TInstantAttributeMetadata></TInstantAttributeMetadatas></AttributeMetadatas></TInstantClassMetadata><TInstantClassMetadata><Name>TProjectItem</Name><Persistence>peStored</Persistence><AttributeMetadatas><TInstantAttributeMetadatas><TInstantAttributeMetadata><Name>Description</Name><AttributeType>atString</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><Size>50</Size></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>Country</Name><AttributeType>atReference</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><ObjectClassName>TCountry</ObjectClassName></TInstantAttributeMetadata></TInstantAttributeMetadatas></AttributeMetadatas></TInstantClassMetadata><TInstantClassMetadata><Name>TProjectItems</Name><Persistence>peStored</Persistence><AttributeMetadatas><TInstantAttributeMetadatas><TInstantAttributeMetadata><Name>Items</Name><AttributeType>atParts</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><ObjectClassName>TProjectItem</ObjectClassName></TInstantAttributeMetadata></TInstantAttributeMetadatas></AttributeMetadatas></TInstantClassMetadata></TInstantClassMetadatas>
\ No newline at end of file
+<TInstantClassMetadatas>
+ <TInstantClassMetadata>
+ <Name>TAddress</Name>
+ <Persistence>peEmbedded</Persistence>
+ <AttributeMetadatas>
+ <TInstantAttributeMetadatas>
+ <TInstantAttributeMetadata>
+ <Name>City</Name>
+ <AttributeType>atString</AttributeType>
+ <IsIndexed>TRUE</IsIndexed>
+ <IsRequired>FALSE</IsRequired>
+ <Size>30</Size>
+ </TInstantAttributeMetadata>
+ <TInstantAttributeMetadata>
+ <Name>Country</Name>
+ <AttributeType>atReference</AttributeType>
+ <IsIndexed>FALSE</IsIndexed>
+ <IsRequired>FALSE</IsRequired>
+ <ObjectClassName>TCountry</ObjectClassName>
+ </TInstantAttributeMetadata>
+ <TInstantAttributeMetadata>
+ <Name>State</Name>
+ <AttributeType>atString</AttributeType>
+ <IsIndexed>FALSE</IsIndexed>
+ <IsRequired>FALSE</IsRequired>
+ <Size>4</Size>
+ </TInstantAttributeMetadata>
+ <TInstantAttributeMetadata>
+ <Name>Street</Name>
+ <AttributeType>atMemo</AttributeType>
+ <IsIndexed>FALSE</IsIndexed>
+ <IsRequired>FALSE</IsRequired>
+ </TInstantAttributeMetadata>
+ <TInstantAttributeMetadata>
+ <Name>Zip</Name>
+ <AttributeType>atString</AttributeType>
+ <IsIndexed>FALSE</IsIndexed>
+ <IsRequired>FALSE</IsRequired>
+ <Size>10</Size>
+ </TInstantAttributeMetadata>
+ </TInstantAttributeMetadatas>
+ </AttributeMetadatas>
+ </TInstantClassMetadata>
+ <TInstantClassMetadata>
+ <Name>TCountry</Name>
+ <Persistence>peStored</Persistence>
+ <AttributeMetadatas>
+ <TInstantAttributeMetadatas>
+ <TInstantAttributeMetadata>
+ <Name>Name</Name>
+ <AttributeType>atString</AttributeType>
+ <IsIndexed>FALSE</IsIndexed>
+ <IsRequired>FALSE</IsRequired>
+ <Size>30</Size>
+ </TInstantAttributeMetadata>
+ </TInstantAttributeMetadatas>
+ </AttributeMetadatas>
+ </TInstantClassMetadata>
+ <TInstantClassMetadata>
+ <Name>TPhone</Name>
+ <Persistence>peEmbedded</Persistence>
+ <AttributeMetadatas>
+ <TInstantAttributeMetadatas>
+ <TInstantAttributeMetadata>
+ <Name>Name</Name>
+ <AttributeType>atString</AttributeType>
+ <IsIndexed>FALSE</IsIndexed>
+ <IsRequired>FALSE</IsRequired>
+ <Size>20</Size>
+ </TInstantAttributeMetadata>
+ <TInstantAttributeMetadata>
+ <Name>Name</Name>
+ <AttributeType>atString</AttributeType>
+ <IsIndexed>FALSE</IsIndexed>
+ <IsRequired>FALSE</IsRequired>
+ <Size>30</Size>
+ </TInstantAttributeMetadata>
+ <TInstantAttributeMetadata>
+ <Name>Number</Name>
+ <AttributeType>atString</AttributeType>
+ <EditMask>(000) 000-0000;0;_</EditMask>
+ <IsIndexed>FALSE</IsIndexed>
+ <IsRequired>FALSE</IsRequired>
+ <Size>20</Size>
+ </TInstantAttributeMetadata>
+ </TInstantAttributeMetadatas>
+ </AttributeMetadatas>
+ </TInstantClassMetadata>
+ <TInstantClassMetadata>
+ <Name>TEmail</Name>
+ <Persistence>peStored</Persistence>
+ <AttributeMetadatas>
+ <TInstantAttributeMetadatas>
+ <TInstantAttributeMetadata>
+ <Name>Address</Name>
+ <AttributeType>atString</AttributeType>
+ <IsIndexed>FALSE</IsIndexed>
+ <IsRequired>FALSE</IsRequired>
+ <Size>100</Size>
+ </TInstantAttributeMetadata>
+ </TInstantAttributeMetadatas>
+ </AttributeMetadatas>
+ </TInstantClassMetadata>
+ <TInstantClassMetadata>
+ <Name>TCategory</Name>
+ <Persistence>peStored</Persistence>
+ <StorageName>Categories</StorageName>
+ <AttributeMetadatas>
+ <TInstantAttributeMetadatas>
+ <TInstantAttributeMetadata>
+ <Name>Name</Name>
+ <AttributeType>atString</AttributeType>
+ <IsIndexed>FALSE</IsIndexed>
+ <IsRequired>FALSE</IsRequired>
+ <Size>30</Size>
+ </TInstantAttributeMetadata>
+ </TInstantAttributeMetadatas>
+ </AttributeMetadatas>
+ </TInstantClassMetadata>
+ <TInstantClassMetadata>
+ <Name>TContact</Name>
+ <Persistence>peStored</Persistence>
+ <AttributeMetadatas>
+ <TInstantAttributeMetadatas>
+ <TInstantAttributeMetadata>
+ <Name>Address</Name>
+ <AttributeType>atPart</AttributeType>
+ <IsIndexed>FALSE</IsIndexed>
+ <IsRequired>FALSE</IsRequired>
+ <ObjectClassName>TAddress</ObjectClassName>
+ </TInstantAttributeMetadata>
+ <TInstantAttributeMetadata>
+ <Name>Category</Name>
+ <AttributeType>atReference</AttributeType>
+ <IsIndexed>FALSE</IsIndexed>
+ <IsRequired>FALSE</IsRequired>
+ <ObjectClassName>TCategory</ObjectClassName>
+ </TInstantAttributeMetadata>
+ <TInstantAttributeMetadata>
+ <Name>City</Name>
+ <AttributeType>atString</AttributeType>
+ <IsIndexed>TRUE</IsIndexed>
+ <IsRequired>FALSE</IsRequired>
+ <Size>30</Size>
+ </TInstantAttributeMetadata>
+ <TInstantAttributeMetadata>
+ <Name>Name</Name>
+ <AttributeType>atString</AttributeType>
+ <IsIndexed>TRUE</IsIndexed>
+ <IsRequired>FALSE</IsRequired>
+ <Size>50</Size>
+ </TInstantAttributeMetadata>
+ <TInstantAttributeMetadata>
+ <Name>Phones</Name>
+ <AttributeType>atParts</AttributeType>
+ <IsIndexed>FALSE</IsIndexed>
+ <IsRequired>FALSE</IsRequired>
+ <ObjectClassName>TPhone</ObjectClassName>
+ </TInstantAttributeMetadata>
+ <TInstantAttributeMetadata>
+ <Name>Projects</Name>
+ <AttributeType>atReferences</AttributeType>
+ <ExternalStorageName>Contact_Projects</ExternalStorageName>
+ <StorageKind>skExternal</StorageKind>
+ <IsIndexed>FALSE</IsIndexed>
+ <IsRequired>FALSE</IsRequired>
+ <ObjectClassName>TProject</ObjectClassName>
+ </TInstantAttributeMetadata>
+ <TInstantAttributeMetadata>
+ <Name>ExternalAddress</Name>
+ <AttributeType>atPart</AttributeType>
+ <StorageKind>skExternal</StorageKind>
+ <IsIndexed>FALSE</IsIndexed>
+ <IsRequired>FALSE</IsRequired>
+ <ObjectClassName>TExternalAddress</ObjectClassName>
+ </TInstantAttributeMetadata>
+ <TInstantAttributeMetadata>
+ <Name>ExternalPhones</Name>
+ <AttributeType>atParts</AttributeType>
+ <ExternalStorageName>Contact_ExternalPhones</ExternalStorageName>
+ <StorageKind>skExternal</StorageKind>
+ <IsIndexed>FALSE</IsIndexed>
+ <IsRequired>FALSE</IsRequired>
+ <ObjectClassName>TExternalPhone</ObjectClassName>
+ </TInstantAttributeMetadata>
+ </TInstantAttributeMetadatas>
+ </AttributeMetadatas>
+ </TInstantClassMetadata>
+ <TInstantClassMetadata>
+ <Name>TContactFilter</Name>
+ <ParentName>TContact</ParentName>
+ <Persistence>peEmbedded</Persistence>
+ <AttributeMetadatas>
+ </AttributeMetadatas>
+ </TInstantClassMetadata>
+ <TInstantClassMetadata>
+ <Name>TPerson</Name>
+ <ParentName>TContact</ParentName>
+ <Persistence>peStored</Persistence>
+ <AttributeMetadatas>
+ <TInstantAttributeMetadatas>
+ <TInstantAttributeMetadata>
+ <Name>BirthDate</Name>
+ <AttributeType>atDateTime</AttributeType>
+ <IsIndexed>FALSE</IsIndexed>
+ <IsRequired>FALSE</IsRequired>
+ </TInstantAttributeMetadata>
+ <TInstantAttributeMetadata>
+ <Name>Emails</Name>
+ <AttributeType>atParts</AttributeType>
+ <IsIndexed>FALSE</IsIndexed>
+ <IsRequired>FALSE</IsRequired>
+ <ObjectClassName>TEmail</ObjectClassName>
+ </TInstantAttributeMetadata>
+ <TInstantAttributeMetadata>
+ <Name>Employer</Name>
+ <AttributeType>atReference</AttributeType>
+ <IsIndexed>FALSE</IsIndexed>
+ <IsRequired>FALSE</IsRequired>
+ <ObjectClassName>TCompany</ObjectClassName>
+ </TInstantAttributeMetadata>
+ <TInstantAttributeMetadata>
+ <Name>Picture</Name>
+ <AttributeType>atBlob</AttributeType>
+ <IsIndexed>FALSE</IsIndexed>
+ <IsRequired>FALSE</IsRequired>
+ </TInstantAttributeMetadata>
+ <TInstantAttributeMetadata>
+ <Name>Salary</Name>
+ <AttributeType>atCurrency</AttributeType>
+ <IsIndexed>FALSE</IsIndexed>
+ <IsRequired>FALSE</IsRequired>
+ <ValidCharsString>,.0..9\x82\xAC\xE2</ValidCharsString>
+ </TInstantAttributeMetadata>
+ <TInstantAttributeMetadata>
+ <Name>Employed</Name>
+ <AttributeType>atBoolean</AttributeType>
+ <IsIndexed>FALSE</IsIndexed>
+ <IsRequired>FALSE</IsRequired>
+ </TInstantAttributeMetadata>
+ <TInstantAttributeMetadata>
+ <Name>AL_hours</Name>
+ <AttributeType>atFloat</AttributeType>
+ <IsIndexed>FALSE</IsIndexed>
+ <IsRequired>FALSE</IsRequired>
+ </TInstantAttributeMetadata>
+ <TInstantAttributeMetadata>
+ <Name>EmploymentDate</Name>
+ <AttributeType>atDate</AttributeType>
+ <IsIndexed>FALSE</IsIndexed>
+ <IsRequired>FALSE</IsRequired>
+ </TInstantAttributeMetadata>
+ <TInstantAttributeMetadata>
+ <Name>BirthTime</Name>
+ <AttributeType>atTime</AttributeType>
+ <IsIndexed>FALSE</IsIndexed>
+ <IsRequired>FALSE</IsRequired>
+ </TInstantAttributeMetadata>
+ </TInstantAttributeMetadatas>
+ </AttributeMetadatas>
+ </TInstantClassMetadata>
+ <TInstantClassMetadata>
+ <Name>TCompany</Name>
+ <ParentName>TContact</ParentName>
+ <Persistence>peStored</Persistence>
+ <AttributeMetadatas>
+ <TInstantAttributeMetadatas>
+ <TInstantAttributeMetadata>
+ <Name>Employees</Name>
+ <AttributeType>atReferences</AttributeType>
+ <IsIndexed>FALSE</IsIndexed>
+ <IsRequired>FALSE</IsRequired>
+ <ObjectClassName>TPerson</ObjectClassName>
+ </TInstantAttributeMetadata>
+ <TInstantAttributeMetadata>
+ <Name>NoOfBranches</Name>
+ <AttributeType>atInteger</AttributeType>
+ <IsIndexed>FALSE</IsIndexed>
+ <IsRequired>FALSE</IsRequired>
+ </TInstantAttributeMetadata>
+ <TInstantAttributeMetadata>
+ <Name>Subsidiaries</Name>
+ <AttributeType>atReferences</AttributeType>
+ <IsIndexed>FALSE</IsIndexed>
+ <IsRequired>FALSE</IsRequired>
+ <ObjectClassName>TCompany</ObjectClassName>
+ </TInstantAttributeMetadata>
+ </TInstantAttributeMetadatas>
+ </AttributeMetadatas>
+ </TInstantClassMetadata>
+ <TInstantClassMetadata>
+ <Name>TProject</Name>
+ <Persistence>peStored</Persistence>
+ <StorageName>Projects</StorageName>
+ <AttributeMetadatas>
+ <TInstantAttributeMetadatas>
+ <TInstantAttributeMetadata>
+ <Name>Name</Name>
+ <AttributeType>atString</AttributeType>
+ <IsIndexed>FALSE</IsIndexed>
+ <IsRequired>FALSE</IsRequired>
+ <Size>30</Size>
+ </TInstantAttributeMetadata>
+ <TInstantAttributeMetadata>
+ <Name>SubProjects</Name>
+ <AttributeType>atParts</AttributeType>
+ <ExternalStorageName>Project_SubProjects</ExternalStorageName>
+ <StorageKind>skExternal</StorageKind>
+ <IsIndexed>FALSE</IsIndexed>
+ <IsRequired>FALSE</IsRequired>
+ <ObjectClassName>TProject</ObjectClassName>
+ </TInstantAttributeMetadata>
+ <TInstantAttributeMetadata>
+ <Name>Addresses</Name>
+ <AttributeType>atParts</AttributeType>
+ <ExternalStorageName>Project_Addresses</ExternalStorageName>
+ <StorageKind>skExternal</StorageKind>
+ <IsIndexed>FALSE</IsIndexed>
+ <IsRequired>FALSE</IsRequired>
+ <ObjectClassName>TExternalAddress</ObjectClassName>
+ </TInstantAttributeMetadata>
+ <TInstantAttributeMetadata>
+ <Name>Manager</Name>
+ <AttributeType>atReference</AttributeType>
+ <IsIndexed>FALSE</IsIndexed>
+ <IsRequired>FALSE</IsRequired>
+ <ObjectClassName>TContact</ObjectClassName>
+ </TInstantAttributeMetadata>
+ <TInstantAttributeMetadata>
+ <Name>Participants</Name>
+ <AttributeType>atReferences</AttributeType>
+ <ExternalStorageName>Project_Participants</ExternalStorageName>
+ <StorageKind>skExternal</StorageKind>
+ <IsIndexed>FALSE</IsIndexed>
+ <IsRequired>FALSE</IsRequired>
+ <ObjectClassName>TContact</ObjectClassName>
+ </TInstantAttributeMetadata>
+ <TInstantAttributeMetadata>
+ <Name>Items</Name>
+ <AttributeType>atPart</AttributeType>
+ <IsIndexed>FALSE</IsIndexed>
+ <IsRequired>FALSE</IsRequired>
+ <ObjectClassName>TProjectItems</ObjectClassName>
+ </TInstantAttributeMetadata>
+ </TInstantAttributeMetadatas>
+ </AttributeMetadatas>
+ </TInstantClassMetadata>
+ <TInstantClassMetadata>
+ <Name>TExternalAddress</Name>
+ <Persistence>peStored</Persistence>
+ <StorageName>ExternalAddresses</StorageName>
+ <AttributeMetadatas>
+ <TInstantAttributeMetadatas>
+ <TInstantAttributeMetadata>
+ <Name>Name</Name>
+ <AttributeType>atString</AttributeType>
+ <IsIndexed>FALSE</IsIndexed>
+ <IsRequired>FALSE</IsRequired>
+ <Size>30</Size>
+ </TInstantAttributeMetadata>
+ <TInstantAttributeMetadata>
+ <Name>Category</Name>
+ <AttributeType>atReference</AttributeType>
+ <IsIndexed>FALSE</IsIndexed>
+ <IsRequired>FALSE</IsRequired>
+ <ObjectClassName>TCategory</ObjectClassName>
+ </TInstantAttributeMetadata>
+ <TInstantAttributeMetadata>
+ <Name>Site_Contact</Name>
+ <AttributeType>atReference</AttributeType>
+ <IsIndexed>FALSE</IsIndexed>
+ <IsRequired>FALSE</IsRequired>
+ <ObjectClassName>TPerson</ObjectClassName>
+ </TInstantAttributeMetadata>
+ </TInstantAttributeMetadatas>
+ </AttributeMetadatas>
+ </TInstantClassMetadata>
+ <TInstantClassMetadata>
+ <Name>TExternalPhone</Name>
+ <Persistence>peStored</Persistence>
+ <StorageName>ExternalPhones</StorageName>
+ <AttributeMetadatas>
+ <TInstantAttributeMetadatas>
+ <TInstantAttributeMetadata>
+ <Name>Name</Name>
+ <AttributeType>atString</AttributeType>
+ <IsIndexed>FALSE</IsIndexed>
+ <IsRequired>FALSE</IsRequired>
+ <Size>20</Size>
+ </TInstantAttributeMetadata>
+ <TInstantAttributeMetadata>
+ <Name>Number</Name>
+ <AttributeType>atString</AttributeType>
+ <EditMask>(000) 000-0000;0;_</EditMask>
+ <IsIndexed>FALSE</IsIndexed>
+ <IsRequired>FALSE</IsRequired>
+ <Size>20</Size>
+ </TInstantAttributeMetadata>
+ </TInstantAttributeMetadatas>
+ </AttributeMetadatas>
+ </TInstantClassMetadata>
+ <TInstantClassMetadata>
+ <Name>TProjectBox</Name>
+ <Persistence>peStored</Persistence>
+ <AttributeMetadatas>
+ <TInstantAttributeMetadatas>
+ <TInstantAttributeMetadata>
+ <Name>Project</Name>
+ <AttributeType>atPart</AttributeType>
+ <IsIndexed>FALSE</IsIndexed>
+ <IsRequired>FALSE</IsRequired>
+ <ObjectClassName>TProject</ObjectClassName>
+ </TInstantAttributeMetadata>
+ <TInstantAttributeMetadata>
+ <Name>RelatedProjectBoxes</Name>
+ <AttributeType>atReferences</AttributeType>
+ <IsIndexed>FALSE</IsIndexed>
+ <IsRequired>FALSE</IsRequired>
+ <ObjectClassName>TProjectBox</ObjectClassName>
+ </TInstantAttributeMetadata>
+ </TInstantAttributeMetadatas>
+ </AttributeMetadatas>
+ </TInstantClassMetadata>
+ <TInstantClassMetadata>
+ <Name>TProjectItem</Name>
+ <Persistence>peStored</Persistence>
+ <AttributeMetadatas>
+ <TInstantAttributeMetadatas>
+ <TInstantAttributeMetadata>
+ <Name>Description</Name>
+ <AttributeType>atString</AttributeType>
+ <IsIndexed>FALSE</IsIndexed>
+ <IsRequired>FALSE</IsRequired>
+ <Size>50</Size>
+ </TInstantAttributeMetadata>
+ <TInstantAttributeMetadata>
+ <Name>Country</Name>
+ <AttributeType>atReference</AttributeType>
+ <IsIndexed>FALSE</IsIndexed>
+ <IsRequired>FALSE</IsRequired>
+ <ObjectClassName>TCountry</ObjectClassName>
+ </TInstantAttributeMetadata>
+ </TInstantAttributeMetadatas>
+ </AttributeMetadatas>
+ </TInstantClassMetadata>
+ <TInstantClassMetadata>
+ <Name>TProjectItems</Name>
+ <Persistence>peStored</Persistence>
+ <AttributeMetadatas>
+ <TInstantAttributeMetadatas>
+ <TInstantAttributeMetadata>
+ <Name>Items</Name>
+ <AttributeType>atParts</AttributeType>
+ <IsIndexed>FALSE</IsIndexed>
+ <IsRequired>FALSE</IsRequired>
+ <ObjectClassName>TProjectItem</ObjectClassName>
+ </TInstantAttributeMetadata>
+ </TInstantAttributeMetadatas>
+ </AttributeMetadatas>
+ </TInstantClassMetadata>
+</TInstantClassMetadatas>
Modified: trunk/Tests/TestIO.mdxt
===================================================================
--- trunk/Tests/TestIO.mdxt 2009-08-14 09:20:30 UTC (rev 825)
+++ trunk/Tests/TestIO.mdxt 2009-08-14 19:28:40 UTC (rev 826)
@@ -1 +1,445 @@
-<TInstantClassMetadatas><TInstantClassMetadata><Name>TAddress</Name><Persistence>peEmbedded</Persistence><AttributeMetadatas><TInstantAttributeMetadatas><TInstantAttributeMetadata><Name>City</Name><AttributeType>atString</AttributeType><IsIndexed>TRUE</IsIndexed><IsRequired>FALSE</IsRequired><Size>30</Size></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>Country</Name><AttributeType>atReference</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><ObjectClassName>TCountry</ObjectClassName></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>State</Name><AttributeType>atString</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><Size>4</Size></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>Street</Name><AttributeType>atMemo</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>Zip</Name><AttributeType>atString</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><Size>10</Size></TInstantAttributeMetadata></TInstantAttributeMetadatas></AttributeMetadatas></TInstantClassMetadata><TInstantClassMetadata><Name>TCountry</Name><Persistence>peStored</Persistence><AttributeMetadatas><TInstantAttributeMetadatas><TInstantAttributeMetadata><Name>Name</Name><AttributeType>atString</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><Size>30</Size></TInstantAttributeMetadata></TInstantAttributeMetadatas></AttributeMetadatas></TInstantClassMetadata><TInstantClassMetadata><Name>TPhone</Name><Persistence>peEmbedded</Persistence><AttributeMetadatas><TInstantAttributeMetadatas><TInstantAttributeMetadata><Name>Name</Name><AttributeType>atString</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><Size>20</Size></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>Name</Name><AttributeType>atString</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><Size>30</Size></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>Number</Name><AttributeType>atString</AttributeType><EditMask>(000) 000-0000;0;_</EditMask><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><Size>20</Size></TInstantAttributeMetadata></TInstantAttributeMetadatas></AttributeMetadatas></TInstantClassMetadata><TInstantClassMetadata><Name>TEmail</Name><Persistence>peStored</Persistence><AttributeMetadatas><TInstantAttributeMetadatas><TInstantAttributeMetadata><Name>Address</Name><AttributeType>atString</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><Size>100</Size></TInstantAttributeMetadata></TInstantAttributeMetadatas></AttributeMetadatas></TInstantClassMetadata><TInstantClassMetadata><Name>TContact</Name><Persistence>peStored</Persistence><AttributeMetadatas><TInstantAttributeMetadatas><TInstantAttributeMetadata><Name>Address</Name><AttributeType>atPart</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><ObjectClassName>TAddress</ObjectClassName></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>Category</Name><AttributeType>atReference</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><ObjectClassName>TCategory</ObjectClassName></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>City</Name><AttributeType>atString</AttributeType><IsIndexed>TRUE</IsIndexed><IsRequired>FALSE</IsRequired><Size>30</Size></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>Name</Name><AttributeType>atString</AttributeType><IsIndexed>TRUE</IsIndexed><IsRequired>FALSE</IsRequired><Size>50</Size></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>Phones</Name><AttributeType>atParts</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><ObjectClassName>TPhone</ObjectClassName></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>Projects</Name><AttributeType>atReferences</AttributeType><ExternalStorageName>Contact_Projects</ExternalStorageName><StorageKind>skExternal</StorageKind><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><ObjectClassName>TProject</ObjectClassName></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>ExternalAddress</Name><AttributeType>atPart</AttributeType><StorageKind>skExternal</StorageKind><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><ObjectClassName>TExternalAddress</ObjectClassName></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>ExternalPhones</Name><AttributeType>atParts</AttributeType><ExternalStorageName>Contact_ExternalPhones</ExternalStorageName><StorageKind>skExternal</StorageKind><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><ObjectClassName>TExternalPhone</ObjectClassName></TInstantAttributeMetadata></TInstantAttributeMetadatas></AttributeMetadatas></TInstantClassMetadata><TInstantClassMetadata><Name>TContactFilter</Name><ParentName>TContact</ParentName><Persistence>peEmbedded</Persistence><AttributeMetadatas></AttributeMetadatas></TInstantClassMetadata><TInstantClassMetadata><Name>TPerson</Name><ParentName>TContact</ParentName><Persistence>peStored</Persistence><AttributeMetadatas><TInstantAttributeMetadatas><TInstantAttributeMetadata><Name>BirthDate</Name><AttributeType>atDateTime</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>Emails</Name><AttributeType>atParts</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><ObjectClassName>TEmail</ObjectClassName></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>Employer</Name><AttributeType>atReference</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><ObjectClassName>TCompany</ObjectClassName></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>Picture</Name><AttributeType>atBlob</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>Salary</Name><AttributeType>atCurrency</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><ValidCharsString>,.0..9\x82\xAC\xE2</ValidCharsString></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>Employed</Name><AttributeType>atBoolean</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>AL_hours</Name><AttributeType>atFloat</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>EmploymentDate</Name><AttributeType>atDate</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>BirthTime</Name><AttributeType>atTime</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired></TInstantAttributeMetadata></TInstantAttributeMetadatas></AttributeMetadatas></TInstantClassMetadata><TInstantClassMetadata><Name>TCompany</Name><ParentName>TContact</ParentName><Persistence>peStored</Persistence><AttributeMetadatas><TInstantAttributeMetadatas><TInstantAttributeMetadata><Name>Employees</Name><AttributeType>atReferences</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><ObjectClassName>TPerson</ObjectClassName></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>NoOfBranches</Name><AttributeType>atInteger</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>Subsidiaries</Name><AttributeType>atReferences</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><ObjectClassName>TCompany</ObjectClassName></TInstantAttributeMetadata></TInstantAttributeMetadatas></AttributeMetadatas></TInstantClassMetadata><TInstantClassMetadata><Name>TProject</Name><Persistence>peStored</Persistence><StorageName>Projects</StorageName><AttributeMetadatas><TInstantAttributeMetadatas><TInstantAttributeMetadata><Name>Name</Name><AttributeType>atString</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><Size>30</Size></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>SubProjects</Name><AttributeType>atParts</AttributeType><ExternalStorageName>Project_SubProjects</ExternalStorageName><StorageKind>skExternal</StorageKind><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><ObjectClassName>TProject</ObjectClassName></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>Addresses</Name><AttributeType>atParts</AttributeType><ExternalStorageName>Project_Addresses</ExternalStorageName><StorageKind>skExternal</StorageKind><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><ObjectClassName>TExternalAddress</ObjectClassName></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>Manager</Name><AttributeType>atReference</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><ObjectClassName>TContact</ObjectClassName></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>Participants</Name><AttributeType>atReferences</AttributeType><ExternalStorageName>Project_Participants</ExternalStorageName><StorageKind>skExternal</StorageKind><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><ObjectClassName>TContact</ObjectClassName></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>Items</Name><AttributeType>atPart</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><ObjectClassName>TProjectItems</ObjectClassName></TInstantAttributeMetadata></TInstantAttributeMetadatas></AttributeMetadatas></TInstantClassMetadata><TInstantClassMetadata><Name>TExternalAddress</Name><Persistence>peStored</Persistence><StorageName>ExternalAddresses</StorageName><AttributeMetadatas><TInstantAttributeMetadatas><TInstantAttributeMetadata><Name>Name</Name><AttributeType>atString</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><Size>30</Size></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>Category</Name><AttributeType>atReference</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><ObjectClassName>TCategory</ObjectClassName></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>Site_Contact</Name><AttributeType>atReference</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><ObjectClassName>TPerson</ObjectClassName></TInstantAttributeMetadata></TInstantAttributeMetadatas></AttributeMetadatas></TInstantClassMetadata><TInstantClassMetadata><Name>TExternalPhone</Name><Persistence>peStored</Persistence><StorageName>ExternalPhones</StorageName><AttributeMetadatas><TInstantAttributeMetadatas><TInstantAttributeMetadata><Name>Name</Name><AttributeType>atString</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><Size>20</Size></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>Number</Name><AttributeType>atString</AttributeType><EditMask>(000) 000-0000;0;_</EditMask><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><Size>20</Size></TInstantAttributeMetadata></TInstantAttributeMetadatas></AttributeMetadatas></TInstantClassMetadata><TInstantClassMetadata><Name>TProjectBox</Name><Persistence>peStored</Persistence><AttributeMetadatas><TInstantAttributeMetadatas><TInstantAttributeMetadata><Name>Project</Name><AttributeType>atPart</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><ObjectClassName>TProject</ObjectClassName></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>RelatedProjectBoxes</Name><AttributeType>atReferences</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><ObjectClassName>TProjectBox</ObjectClassName></TInstantAttributeMetadata></TInstantAttributeMetadatas></AttributeMetadatas></TInstantClassMetadata><TInstantClassMetadata><Name>TProjectItem</Name><Persistence>peStored</Persistence><AttributeMetadatas><TInstantAttributeMetadatas><TInstantAttributeMetadata><Name>Description</Name><AttributeType>atString</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><Size>50</Size></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>Country</Name><AttributeType>atReference</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><ObjectClassName>TCountry</ObjectClassName></TInstantAttributeMetadata></TInstantAttributeMetadatas></AttributeMetadatas></TInstantClassMetadata><TInstantClassMetadata><Name>TProjectItems</Name><Persistence>peStored</Persistence><AttributeMetadatas><TInstantAttributeMetadatas><TInstantAttributeMetadata><Name>Items</Name><AttributeType>atParts</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><ObjectClassName>TProjectItem</ObjectClassName></TInstantAttributeMetadata></TInstantAttributeMetadatas></AttributeMetadatas></TInstantClassMetadata></TInstantClassMetadatas>
\ No newline at end of file
+<TInstantClassMetadatas>
+ <TInstantClassMetadata>
+ <Name>TAddress</Name>
+ <Persistence>peEmbedded</Persistence>
+ <AttributeMetadatas>
+ <TInstantAttributeMetadatas>
+ <TInstantAttributeMetadata>
+ <Name>City</Name>
+ <AttributeType>atString</AttributeType>
+ <IsIndexed>TRUE</IsIndexed>
+ <IsRequired>FALSE</IsRequired>
+ <Size>30</Size>
+ </TInstantAttributeMetadata>
+ <TInstantAttributeMetadata>
+ <Name>Country</Name>
+ <AttributeType>atReference</AttributeType>
+ <IsIndexed>FALSE</IsIndexed>
+ <IsRequired>FALSE</IsRequired>
+ <ObjectClassName>TCountry</ObjectClassName>
+ </TInstantAttributeMetadata>
+ <TInstantAttributeMetadata>
+ <Name>State</Name>
+ <AttributeType>atString</AttributeType>
+ <IsIndexed>FALSE</IsIndexed>
+ <IsRequired>FALSE</IsRequired>
+ <Size>4</Size>
+ </TInstantAttributeMetadata>
+ <TInstantAttributeMetadata>
+ <Name>Street</Name>
+ <AttributeType>atMemo</AttributeType>
+ <IsIndexed>FALSE</IsIndexed>
+ <IsRequired>FALSE</IsRequired>
+ </TInstantAttributeMetadata>
+ <TInstantAttributeMetadata>
+ <Name>Zip</Name>
+ <AttributeType>atString</AttributeType>
+ <IsIndexed>FALSE</IsIndexed>
+ <IsRequired>FALSE</IsRequired>
+ <Size>10</Size>
+ </TInstantAttributeMetadata>
+ </TInstantAttributeMetadatas>
+ </AttributeMetadatas>
+ </TInstantClassMetadata>
+ <TInstantClassMetadata>
+ <Name>TCountry</Name>
+ <Persistence>peStored</Persistence>
+ <AttributeMetadatas>
+ <TInstantAttributeMetadatas>
+ <TInstantAttributeMetadata>
+ <Name>Name</Name>
+ <AttributeType>atString</AttributeType>
+ <IsIndexed>FALSE</IsIndexed>
+ <IsRequired>FALSE</IsRequired>
+ <Size>30</Size>
+ </TInstantAttributeMetadata>
+ </TInstantAttributeMetadatas>
+ </AttributeMetadatas>
+ </TInstantClassMetadata>
+ <TInstantClassMetadata>
+ <Name>TPhone</Name>
+ <Persistence>peEmbedded</Persistence>
+ <AttributeMetadatas>
+ <TInstantAttributeMeta...
[truncated message content] |