|
From: <na...@us...> - 2009-08-28 07:35:05
|
Revision: 867
http://instantobjects.svn.sourceforge.net/instantobjects/revision/?rev=867&view=rev
Author: nandod
Date: 2009-08-28 07:34:57 +0000 (Fri, 28 Aug 2009)
Log Message:
-----------
* Fixed: ORDER BY was only working correctly under the default connector in XML broker. Test case added.
* Fixed: XML broker didn't catch up totally with new XML pretty formatting.
Modified Paths:
--------------
trunk/Source/Brokers/XML/InstantXML.pas
trunk/Tests/TestXMLBroker.pas
Modified: trunk/Source/Brokers/XML/InstantXML.pas
===================================================================
--- trunk/Source/Brokers/XML/InstantXML.pas 2009-08-26 15:45:12 UTC (rev 866)
+++ trunk/Source/Brokers/XML/InstantXML.pas 2009-08-28 07:34:57 UTC (rev 867)
@@ -325,8 +325,8 @@
implementation
uses
- SysUtils, InstantConsts, InstantClasses, TypInfo, InstantXMLCatalog,
- InstantXMLConnectionDefEdit, InstantUtils,
+ SysUtils, InstantConsts, InstantClasses,
+ TypInfo, InstantXMLCatalog, InstantXMLConnectionDefEdit, InstantUtils,
{$IFDEF MSWINDOWS}
{$IFNDEF D6+}
FileCtrl,
@@ -421,6 +421,14 @@
Result := StrToIntDef(S, 0);
end;
+function GetXMLLineBreak: string;
+begin
+ if InstantXMLIndentationSize > 0 then
+ Result := sLineBreak
+ else
+ Result := '';
+end;
+
{ TInstantXMLConnectionDef }
class function TInstantXMLConnectionDef.ConnectionTypeName: string;
@@ -1055,12 +1063,12 @@
P := (L + R) shr 1;
repeat
while Compare(nil,
- TInstantObjectReference(List[I]).Dereference,
- TInstantObjectReference(List[P]).Dereference) < 0 do
+ TInstantObjectReference(List[I]).Dereference(Connector),
+ TInstantObjectReference(List[P]).Dereference(Connector)) < 0 do
Inc(I);
while Compare(nil,
- TInstantObjectReference(List[J]).Dereference,
- TInstantObjectReference(List[P]).Dereference) > 0 do
+ TInstantObjectReference(List[J]).Dereference(Connector),
+ TInstantObjectReference(List[P]).Dereference(Connector)) > 0 do
Dec(J);
if I <= J then
begin
@@ -1140,7 +1148,7 @@
strstream := TStringStream.Create('', TEncoding.UTF8);
try
InstantWriteObject(strStream, sfXML, AObject);
- DataStr := XML_UTF8_HEADER + UTF8String(strStream.DataString);
+ DataStr := XML_UTF8_HEADER + UTF8String(GetXMLLineBreak) + UTF8String(strStream.DataString);
finally
strStream.Free;
end;
@@ -1164,9 +1172,9 @@
InstantWriteObject(strStream, sfXML, AObject);
{$IFDEF D6+}
if FXMLFileFormat = xffUtf8 then
- DataStr := AnsiToUtf8(XML_UTF8_HEADER + strStream.DataString)
+ DataStr := AnsiToUtf8(XML_UTF8_HEADER + GetXMLLineBreak + strStream.DataString)
else
- DataStr := XML_ISO_HEADER + strStream.DataString;
+ DataStr := XML_ISO_HEADER + GetXMLLineBreak + strStream.DataString;
{$ELSE}
DataStr := strStream.DataString;
{$ENDIF}
Modified: trunk/Tests/TestXMLBroker.pas
===================================================================
--- trunk/Tests/TestXMLBroker.pas 2009-08-26 15:45:12 UTC (rev 866)
+++ trunk/Tests/TestXMLBroker.pas 2009-08-28 07:34:57 UTC (rev 867)
@@ -45,19 +45,21 @@
procedure TearDown; override;
published
procedure TestStoreAndRetrieveContact;
+ procedure TestOrderBy;
end;
implementation
uses
- SysUtils, InstantPersistence, TestModel;
+ SysUtils, ShellAPI, InstantPersistence, TestModel;
{ TTestXMLBroker }
procedure TTestXMLBroker.SetUp;
begin
FAcc := TXMLFilesAccessor.Create(nil);
- FAcc.RootFolder := ExtractFilePath(ParamStr(0));
+ FAcc.RootFolder := ExtractFilePath(ParamStr(0)) + 'XMLDB';
+ ForceDirectories(FAcc.RootFolder);
FConn := TInstantXMLConnector.Create(nil);
FConn.Connection := FAcc;
@@ -67,13 +69,99 @@
end;
procedure TTestXMLBroker.TearDown;
+
+ function DelTree(DirName: string): Boolean;
+ var
+ SHFileOpStruct : TSHFileOpStruct;
+ begin
+ try
+ Fillchar(SHFileOpStruct,Sizeof(SHFileOpStruct),0) ;
+ with SHFileOpStruct do begin
+ Wnd := 0;
+ pFrom := PChar(ExcludeTrailingPathDelimiter(DirName) + #0);
+ wFunc := FO_DELETE;
+ fFlags := FOF_ALLOWUNDO;
+ fFlags := fFlags or FOF_NOCONFIRMATION;
+ fFlags := fFlags or FOF_SILENT;
+ end;
+ Result := (SHFileOperation(SHFileOpStruct) = 0) ;
+ except
+ Result := False;
+ end;
+ end;
+
begin
inherited;
InstantModel.ClassMetadatas.Clear;
FreeAndNil(FConn);
+ DelTree(FAcc.RootFolder);
FreeAndNil(FAcc);
end;
+procedure TTestXMLBroker.TestOrderBy;
+var
+ c1, c2: TContact;
+ t: TPhone;
+ LQuery: TInstantQuery;
+begin
+ FConn.IsDefault := True;
+
+ c1 := TContact.Create;
+ try
+ c1.Name := 'ZZTop';
+ c1.Address.City := 'Dallas';
+ t := TPhone.Create;
+ t.Name := 'Home';
+ t.Number := '012 12345678';
+ c1.AddPhone(t);
+ AssertEquals(1, c1.PhoneCount);
+ t := TPhone.Create;
+ t.Name := 'Office';
+ t.Number := '012 23456781';
+ c1.AddPhone(t);
+ AssertEquals(2, c1.PhoneCount);
+ c1.Store;
+ finally
+ FreeAndNil(c1);
+ end;
+
+ c2 := TContact.Create;
+ try
+ c2.Name := 'Aaronson';
+ c2.Address.City := 'Las Vegas';
+ t := TPhone.Create;
+ t.Name := 'Home';
+ t.Number := '012 12345678';
+ c2.AddPhone(t);
+ AssertEquals(1, c2.PhoneCount);
+ t := TPhone.Create;
+ t.Name := 'Office';
+ t.Number := '012 23456781';
+ c2.AddPhone(t);
+ AssertEquals(2, c2.PhoneCount);
+ c2.Store;
+ finally
+ FreeAndNil(c2);
+ end;
+
+ LQuery := InstantDefaultConnector.CreateQuery;
+ try
+ LQuery.Command := 'select * from TContact order by Name';
+ LQuery.Open;
+ AssertEquals(LQuery.ObjectCount, 2);
+ AssertEquals((LQuery.Objects[0] as TContact).Name, 'Aaronson');
+ LQuery.Close;
+
+ LQuery.Command := 'select * from TContact order by Name desc';
+ LQuery.Open;
+ AssertEquals(LQuery.ObjectCount, 2);
+ AssertEquals((LQuery.Objects[0] as TContact).Name, 'ZZTop');
+ LQuery.Close;
+ finally
+ FreeAndNil(LQuery);
+ end;
+end;
+
procedure TTestXMLBroker.TestStoreAndRetrieveContact;
const
DEF_NAME = 'Mike Art\xF9';
|