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'; |