|
From: <na...@us...> - 2009-08-25 15:04:37
|
Revision: 859
http://instantobjects.svn.sourceforge.net/instantobjects/revision/?rev=859&view=rev
Author: nandod
Date: 2009-08-25 15:04:20 +0000 (Tue, 25 Aug 2009)
Log Message:
-----------
* Fixed: writing a class name with wrong capitalization in an IQL query would prevent objects from being retrieved on case-sensitive databases. The fix also does the class existence check earlier than before. A test was added to TestIO.
Modified Paths:
--------------
trunk/Source/Core/InstantCommand.pas
trunk/Tests/TestMockBroker.pas
Modified: trunk/Source/Core/InstantCommand.pas
===================================================================
--- trunk/Source/Core/InstantCommand.pas 2009-08-25 14:35:18 UTC (rev 858)
+++ trunk/Source/Core/InstantCommand.pas 2009-08-25 15:04:20 UTC (rev 859)
@@ -1505,7 +1505,11 @@
FAny := SameText(Token, 'ANY');
if FAny then
Token := Reader.ReadToken;
- FObjectClassName := Token;
+ // This call has the double effect of checking that the class exists early
+ // during statement parsing, and correcting the class name if it's written
+ // with wrong capitalization (something that would create problems with
+ // case-sensitive databases).
+ FObjectClassName := FindClass(Token).ClassName;
end;
procedure TInstantIQLClassRef.WriteObject(Writer: TInstantIQLWriter);
Modified: trunk/Tests/TestMockBroker.pas
===================================================================
--- trunk/Tests/TestMockBroker.pas 2009-08-25 14:35:18 UTC (rev 858)
+++ trunk/Tests/TestMockBroker.pas 2009-08-25 15:04:20 UTC (rev 859)
@@ -38,7 +38,6 @@
type
TTestMockBroker = class(TTestCase)
- private
protected
FConn: TInstantMockConnector;
procedure SetUp; override;
@@ -53,7 +52,6 @@
end;
TTestMockRelationalBroker = class(TTestCase)
- private
protected
FConn: TInstantMockConnector;
procedure SetUp; override;
@@ -64,6 +62,15 @@
procedure TestStoreAndRetrieveContact;
end;
+ TTestMockSQLbroker = class(TTestCase)
+ protected
+ FConn: TInstantMockConnector;
+ procedure SetUp; override;
+ procedure TearDown; override;
+ published
+ procedure TestQuery;
+ end;
+
implementation
uses InstantMetadata;
@@ -285,8 +292,40 @@
brok.MockManager.Verify;
end;
+{ TTestMockSQLbroker }
+
+procedure TTestMockSQLbroker.SetUp;
+begin
+ FConn := TInstantMockConnector.Create(nil);
+ FConn.BrokerClass := TInstantMockSQLBroker;
+
+ if InstantModel.ClassMetadatas.Count > 0 then
+ InstantModel.ClassMetadatas.Clear;
+ InstantModel.LoadFromResFile(ChangeFileExt(ParamStr(0), '.mdr'));
+end;
+
+procedure TTestMockSQLbroker.TearDown;
+begin
+ InstantModel.ClassMetadatas.Clear;
+ FreeAndNil(FConn);
+end;
+
+procedure TTestMockSQLbroker.TestQuery;
+var
+ LQuery: TInstantQuery;
+begin
+ LQuery := FConn.CreateQuery;
+ try
+ LQuery.Command := 'select * from tcountry';
+ AssertTrue(LQuery.ObjectClass = TCountry);
+ AssertTrue(LQuery.ObjectClassName = 'TCountry');
+ finally
+ LQuery.Free;
+ end;
+end;
+
initialization
{$IFNDEF CURR_TESTS}
- RegisterTests([TTestMockBroker, TTestMockRelationalBroker]);
+ RegisterTests([TTestMockBroker, TTestMockRelationalBroker, TTestMockSQLbroker]);
{$ENDIF}
end.
\ No newline at end of file
|