diff options
author | David Ostrovsky <david@ostrovsky.org> | 2012-09-30 19:53:40 +0200 |
---|---|---|
committer | Muthu Subramanian <sumuthu@suse.com> | 2012-10-10 13:35:13 +0530 |
commit | 36026a6ae5d2f42db5fa262a358a3bc8e33e036c (patch) | |
tree | b27b7da466dde7e719f1c4db0fb50516470021dc /connectivity | |
parent | f6739073edc1b593035f25becbd0e9d6d536ef0c (diff) |
mork driver: add list tables and unit test
Change-Id: I594b24341eb38c05523f578c1dc2e43d90544f30
Diffstat (limited to 'connectivity')
-rw-r--r-- | connectivity/CppunitTest_connectivity_mork.mk | 57 | ||||
-rw-r--r-- | connectivity/Module_connectivity.mk | 6 | ||||
-rw-r--r-- | connectivity/qa/connectivity/mork/DriverTest.cxx | 173 | ||||
-rw-r--r-- | connectivity/qa/connectivity/mork/abook_10_john_does.mab | 159 | ||||
-rw-r--r-- | connectivity/source/drivers/mork/MColumnAlias.cxx | 4 | ||||
-rw-r--r-- | connectivity/source/drivers/mork/MColumnAlias.hxx | 3 | ||||
-rw-r--r-- | connectivity/source/drivers/mork/MConnection.cxx | 28 | ||||
-rw-r--r-- | connectivity/source/drivers/mork/MDatabaseMetaDataHelper.cxx | 31 | ||||
-rw-r--r-- | connectivity/source/drivers/mork/MQueryHelper.cxx | 46 | ||||
-rw-r--r-- | connectivity/source/drivers/mork/MQueryHelper.hxx | 3 | ||||
-rw-r--r-- | connectivity/source/drivers/mork/MResultSet.cxx | 4 | ||||
-rw-r--r-- | connectivity/source/drivers/mork/MorkParser.cxx | 133 | ||||
-rw-r--r-- | connectivity/source/drivers/mork/MorkParser.hxx | 6 |
13 files changed, 621 insertions, 32 deletions
diff --git a/connectivity/CppunitTest_connectivity_mork.mk b/connectivity/CppunitTest_connectivity_mork.mk new file mode 100644 index 000000000000..987dd5773fa6 --- /dev/null +++ b/connectivity/CppunitTest_connectivity_mork.mk @@ -0,0 +1,57 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +$(eval $(call gb_CppunitTest_CppunitTest,connectivity_mork)) + +$(eval $(call gb_CppunitTest_set_include,connectivity_mork,\ + -I$(SRCDIR)/connectivity/source/inc \ + -I$(SRCDIR)/connectivity/source/drivers/mork \ + $$(INCLUDE) \ +)) + +$(eval $(call gb_CppunitTest_use_api,connectivity_mork,\ + udkapi \ + offapi \ +)) + +$(eval $(call gb_CppunitTest_use_ure,connectivity_mork)) + +$(eval $(call gb_CppunitTest_use_sdk_api,connectivity_mork)) + +$(eval $(call gb_CppunitTest_add_exception_objects,connectivity_mork, \ + connectivity/qa/connectivity/mork/DriverTest \ +)) + +$(eval $(call gb_CppunitTest_use_libraries,connectivity_mork, \ + comphelper \ + cppu \ + cppuhelper \ + i18nisolang1 \ + mork \ + sal \ + salhelper \ + sb \ + test \ + unotest \ + ucbhelper \ + utl \ + $(gb_UWINAPI) \ +)) + +$(eval $(call gb_CppunitTest_use_components,connectivity_mork,\ + configmgr/source/configmgr \ + i18npool/util/i18npool \ + connectivity/source/drivers/mork/mork \ + ucb/source/core/ucb1 \ + ucb/source/ucp/file/ucpfile1 \ +)) + +$(eval $(call gb_CppunitTest_use_configuration,connectivity_mork)) + +# vim: set noet sw=4 ts=4: diff --git a/connectivity/Module_connectivity.mk b/connectivity/Module_connectivity.mk index 3cd7daa38b48..ae5932d3a873 100644 --- a/connectivity/Module_connectivity.mk +++ b/connectivity/Module_connectivity.mk @@ -145,10 +145,14 @@ $(eval $(call gb_Module_add_subsequentcheck_targets,connectivity,\ Jar_ConnectivityTools \ )) # FIXME: Does not work. Convert to JUnit. - # JunitTest_complex \ +# JunitTest_complex \ endif +$(eval $(call gb_Module_add_check_targets,connectivity,\ + CppunitTest_connectivity_mork \ +)) + endif # vim: set noet sw=4 ts=4: diff --git a/connectivity/qa/connectivity/mork/DriverTest.cxx b/connectivity/qa/connectivity/mork/DriverTest.cxx new file mode 100644 index 000000000000..1db1d9f7c1e0 --- /dev/null +++ b/connectivity/qa/connectivity/mork/DriverTest.cxx @@ -0,0 +1,173 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include <test/bootstrapfixture.hxx> + +#include "MColumnAlias.hxx" +#include "MQueryHelper.hxx" +#include "MConnection.hxx" + +#include <com/sun/star/sdbc/XDriver.hpp> + +using namespace ::com::sun::star::beans; +using namespace ::com::sun::star::sdbc; +using namespace ::com::sun::star::uno; + +namespace connectivity { namespace mork { + + +class MorkDriverTest: public test::BootstrapFixture +{ +public: + MorkDriverTest() : test::BootstrapFixture(false, false) {}; + + void test_metadata(); + void test_select_default_all(); + void test_select_list_table_joe_doe_5(); + + virtual void setUp(); + virtual void tearDown(); + + CPPUNIT_TEST_SUITE(MorkDriverTest); + + CPPUNIT_TEST(test_metadata); + CPPUNIT_TEST(test_select_default_all); + CPPUNIT_TEST(test_select_list_table_joe_doe_5); + CPPUNIT_TEST_SUITE_END(); + +private: + Reference<XInterface> m_xMorkComponent; + Reference<XConnection> m_xConnection; +}; + +void MorkDriverTest::setUp() +{ + test::BootstrapFixture::setUp(); + m_xMorkComponent = getMultiServiceFactory()->createInstance("com.sun.star.comp.sdbc.MorkDriver"); + CPPUNIT_ASSERT_MESSAGE("no mork component!", m_xMorkComponent.is()); + + // is this the best way to pass test file through URL? + // may be take a custom Sequence< PropertyValue > route? + OUString url = OUString("sdbc:address:thunderbird:unittest:") + + getPathFromSrc("/connectivity/qa/connectivity/mork/abook_10_john_does.mab"); + + Sequence< PropertyValue > info; + Reference< XDriver> xDriver(m_xMorkComponent, UNO_QUERY); + if (!xDriver.is()) + { + CPPUNIT_ASSERT_MESSAGE("cannot connect to mork driver!", xDriver.is()); + } + + m_xConnection = xDriver->connect(url, info); + if (!m_xConnection.is()) + { + CPPUNIT_ASSERT_MESSAGE("cannot connect to address book data soure!", m_xConnection.is()); + } +} + +void MorkDriverTest::tearDown() +{ +// how to make dispose() work? +// Reference< com::sun::star::lang::XComponent >( m_xMorkComponent, UNO_QUERY_THROW )->dispose(); + test::BootstrapFixture::tearDown(); +} + +void MorkDriverTest::test_metadata() +{ + Reference< XDatabaseMetaData > xDatabaseMetaData = m_xConnection->getMetaData(); + if (!xDatabaseMetaData.is()) + { + CPPUNIT_ASSERT_MESSAGE("cannot retrieve meta data!", xDatabaseMetaData.is()); + } + + const Any catalog; + const OUString schemaPattern = "%"; + const OUString tableNamePattern = "%"; + const Sequence< OUString > types; + + Reference< XResultSet > xResultSet = + xDatabaseMetaData->getTables(catalog, schemaPattern, tableNamePattern, types); + if (!xResultSet.is()) + { + CPPUNIT_ASSERT_MESSAGE("cannot retrieve tables!", xResultSet.is()); + } + + // TODO: how to access that result set and check the tables? + // it should be 3 tables inside: AddressBook, does_5 and does_10 +} + +void MorkDriverTest::test_select_default_all() +{ + const OUString sql = "select \"E-mail\" from \"AddressBook\" ORDER BY \"E-mail\""; + Reference< XPreparedStatement > xStatement = m_xConnection->prepareStatement(sql); + if (!xStatement.is()) + { + CPPUNIT_ASSERT_MESSAGE("cannot create prepared statement!", xStatement.is()); + } + + Reference< XResultSet > xResultSet = xStatement->executeQuery(); + if (!xResultSet.is()) + { + CPPUNIT_ASSERT_MESSAGE("cannot execure sql statement!", xResultSet.is()); + } + + Reference< XRow > xDelegatorRow(xResultSet, UNO_QUERY); + if (!xDelegatorRow.is()) + { + CPPUNIT_ASSERT_MESSAGE("cannot extract row from result set!", xDelegatorRow.is()); + } + + sal_Bool result = xResultSet->first(); + CPPUNIT_ASSERT_MESSAGE("fetch first row failed!", result); + OUString mail = xDelegatorRow->getString(1); + CPPUNIT_ASSERT_MESSAGE("first row is not john@doe.org!", mail.equalsAscii("john@doe.org")); + + result = xResultSet->next(); + CPPUNIT_ASSERT_MESSAGE("fetch second row failed!", result); + mail = xDelegatorRow->getString(1); + CPPUNIT_ASSERT_MESSAGE("second row is not john@doe10.org!", mail.equalsAscii("john@doe10.org")); + + result = xResultSet->last(); + CPPUNIT_ASSERT_MESSAGE("fetch last row failed!", result); + mail = xDelegatorRow->getString(1); + CPPUNIT_ASSERT_MESSAGE("last row is not john@doe9.org!", mail.equalsAscii("john@doe9.org")); +} + +void MorkDriverTest::test_select_list_table_joe_doe_5() +{ + const OUString sql = "select \"E-mail\" from \"does_5\" where \"E-mail\" LIKE '%doe5.org' "; + Reference< XPreparedStatement > xStatement = m_xConnection->prepareStatement(sql); + if (!xStatement.is()) + { + CPPUNIT_ASSERT_MESSAGE("cannot create prepared statement!", xStatement.is()); + } + + Reference< XResultSet > xResultSet = xStatement->executeQuery(); + if (!xResultSet.is()) + { + CPPUNIT_ASSERT_MESSAGE("cannot execure sql statement!", xResultSet.is()); + } + + Reference< XRow > xDelegatorRow(xResultSet, UNO_QUERY); + if (!xDelegatorRow.is()) + { + CPPUNIT_ASSERT_MESSAGE("cannot extract row from result set!", xDelegatorRow.is()); + } + + sal_Bool result = xResultSet->first(); + CPPUNIT_ASSERT_MESSAGE("fetch first row failed!", result); + OUString mail = xDelegatorRow->getString(1); + CPPUNIT_ASSERT_MESSAGE("last row is not john@doe5.org!", mail.equalsAscii("john@doe5.org")); +} + +CPPUNIT_TEST_SUITE_REGISTRATION(MorkDriverTest); + +}} + +CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/connectivity/qa/connectivity/mork/abook_10_john_does.mab b/connectivity/qa/connectivity/mork/abook_10_john_does.mab new file mode 100644 index 000000000000..41aac4c3e42c --- /dev/null +++ b/connectivity/qa/connectivity/mork/abook_10_john_does.mab @@ -0,0 +1,159 @@ +// <!-- <mdb:mork:z v="1.4"/> --> +< <(a=c)> // (f=iso-8859-1) + (B8=LastModifiedDate)(B9=RecordKey)(BA=AddrCharSet)(BB=LastRecordKey) + (BC=ns:addrbk:db:table:kind:pab)(BD=ListName)(BE=ListNickName) + (BF=ListDescription)(C0=ListTotalAddresses)(C1=LowercaseListName) + (C2=ns:addrbk:db:table:kind:deleted)(C3=_Yahoo)(C4=_MSN) + (C5=_GoogleTalk)(C6=_Skype)(C7=_JabberId)(C8=PreferDisplayName) + (C9=PhotoURI)(CA=PhotoType)(CB=PhotoName)(CC=DbRowID)(CD=_QQ)(CE=_ICQ) + (80=ns:addrbk:db:row:scope:card:all) + (81=ns:addrbk:db:row:scope:list:all) + (82=ns:addrbk:db:row:scope:data:all)(83=FirstName)(84=LastName) + (85=PhoneticFirstName)(86=PhoneticLastName)(87=DisplayName) + (88=NickName)(89=PrimaryEmail)(8A=LowercasePrimaryEmail) + (8B=SecondEmail)(8C=PreferMailFormat)(8D=PopularityIndex) + (8E=AllowRemoteContent)(8F=WorkPhone)(90=HomePhone)(91=FaxNumber) + (92=PagerNumber)(93=CellularNumber)(94=WorkPhoneType)(95=HomePhoneType) + (96=FaxNumberType)(97=PagerNumberType)(98=CellularNumberType) + (99=HomeAddress)(9A=HomeAddress2)(9B=HomeCity)(9C=HomeState) + (9D=HomeZipCode)(9E=HomeCountry)(9F=WorkAddress)(A0=WorkAddress2) + (A1=WorkCity)(A2=WorkState)(A3=WorkZipCode)(A4=WorkCountry) + (A5=JobTitle)(A6=Department)(A7=Company)(A8=_AimScreenName) + (A9=AnniversaryYear)(AA=AnniversaryMonth)(AB=AnniversaryDay) + (AC=SpouseName)(AD=FamilyName)(AE=WebPage1)(AF=WebPage2)(B0=BirthYear) + (B1=BirthMonth)(B2=BirthDay)(B3=Custom1)(B4=Custom2)(B5=Custom3) + (B6=Custom4)(B7=Notes)> + +<(AF=b)(81=John Doe)(82=)(80=0)(83=John)(84=1)(85=Doe)(86=john@doe.org) + (87=generic)(88=John Doe2)(89=Doe2)(8A=john@doe2.org)(8B=2)(8C=John Doe3) + (8D=Doe3)(8E=john@doe3.org)(8F=3)(90=John Doe4)(91=Doe4)(92 + =john@doe4.org)(93=4)(94=John Doe5)(95=Doe5)(96=john@doe5.org)(97=5) + (98=John Doe6)(99=Doe6)(9A=john@doe6.org)(9B=6)(9C=John Doe7)(9D=Doe7) + (9E=john@doe7.org)(9F=7)(A0=John Doe8)(A1=Doe8)(A2=john@doe8.org) + (A3=8)(A4=John Doe9)(A5=Doe9)(A6=john@doe9.org)(A7=9)(A8=John Doe10) + (A9=Doe10)(AA=john@doe10.org)(AB=10)(AC=a)(AD=Does_5)(AE=does_5)> +{1:^80 {(k^BC:c)(s=9)} + [1:^82(^BB=b)] + [1(^87^81)(^86=)(^C3=)(^A1=)(^AE=)(^C4=)(^C5=)(^B2=)(^A7=)(^9A=)(^B3=) + (^C6=)(^A6=)(^A4=)(^A5=)(^A3=)(^9E=)(^85=)(^B0=)(^8D=0)(^C7=)(^A0=) + (^A2=)(^B7=)(^8C=0)(^B8=0)(^83^83)(^A8=)(^C8=1)(^84^85)(^92=)(^C9=) + (^B6=)(^9D=)(^89^86)(^8E=0)(^AF=)(^CA^87)(^8F=)(^CB=)(^8B=)(^93=) + (^90=)(^CC=1)(^B1=)(^CD=)(^9B=)(^9C=)(^91=)(^B4=)(^9F=)(^99=)(^88=) + (^CE=)(^B5=)(^8A^86)(^B9=1)] + [2(^87^88)(^86=)(^C3=)(^A1=)(^AE=)(^C4=)(^C5=)(^B2=)(^A7=)(^9A=)(^B3=) + (^C6=)(^A6=)(^A4=)(^A5=)(^A3=)(^9E=)(^85=)(^B0=)(^8D=0)(^C7=)(^A0=) + (^A2=)(^B7=)(^8C=0)(^B8=0)(^83^83)(^A8=)(^C8=1)(^84^89)(^92=)(^C9=) + (^B6=)(^9D=)(^89^8A)(^8E=0)(^AF=)(^CA^87)(^8F=)(^CB=)(^8B=)(^93=) + (^90=)(^CC=2)(^B1=)(^CD=)(^9B=)(^9C=)(^91=)(^B4=)(^9F=)(^99=)(^88=) + (^CE=)(^B5=)(^8A^8A)(^B9=2)] + [3(^87^8C)(^86=)(^C3=)(^A1=)(^AE=)(^C4=)(^C5=)(^B2=)(^A7=)(^9A=)(^B3=) + (^C6=)(^A6=)(^A4=)(^A5=)(^A3=)(^9E=)(^85=)(^B0=)(^8D=0)(^C7=)(^A0=) + (^A2=)(^B7=)(^8C=0)(^B8=0)(^83^83)(^A8=)(^C8=1)(^84^8D)(^92=)(^C9=) + (^B6=)(^9D=)(^89^8E)(^8E=0)(^AF=)(^CA^87)(^8F=)(^CB=)(^8B=)(^93=) + (^90=)(^CC=3)(^B1=)(^CD=)(^9B=)(^9C=)(^91=)(^B4=)(^9F=)(^99=)(^88=) + (^CE=)(^B5=)(^8A^8E)(^B9=3)] + [4(^87^90)(^86=)(^C3=)(^A1=)(^AE=)(^C4=)(^C5=)(^B2=)(^A7=)(^9A=)(^B3=) + (^C6=)(^A6=)(^A4=)(^A5=)(^A3=)(^9E=)(^85=)(^B0=)(^8D=0)(^C7=)(^A0=) + (^A2=)(^B7=)(^8C=0)(^B8=0)(^83^83)(^A8=)(^C8=1)(^84^91)(^92=)(^C9=) + (^B6=)(^9D=)(^89^92)(^8E=0)(^AF=)(^CA^87)(^8F=)(^CB=)(^8B=)(^93=) + (^90=)(^CC=4)(^B1=)(^CD=)(^9B=)(^9C=)(^91=)(^B4=)(^9F=)(^99=)(^88=) + (^CE=)(^B5=)(^8A^92)(^B9=4)] + [5(^87^94)(^86=)(^C3=)(^A1=)(^AE=)(^C4=)(^C5=)(^B2=)(^A7=)(^9A=)(^B3=) + (^C6=)(^A6=)(^A4=)(^A5=)(^A3=)(^9E=)(^85=)(^B0=)(^8D=0)(^C7=)(^A0=) + (^A2=)(^B7=)(^8C=0)(^B8=0)(^83^83)(^A8=)(^C8=1)(^84^95)(^92=)(^C9=) + (^B6=)(^9D=)(^89^96)(^8E=0)(^AF=)(^CA^87)(^8F=)(^CB=)(^8B=)(^93=) + (^90=)(^CC=5)(^B1=)(^CD=)(^9B=)(^9C=)(^91=)(^B4=)(^9F=)(^99=)(^88=) + (^CE=)(^B5=)(^8A^96)(^B9=5)] + [6(^87^98)(^86=)(^C3=)(^A1=)(^AE=)(^C4=)(^C5=)(^B2=)(^A7=)(^9A=)(^B3=) + (^C6=)(^A6=)(^A4=)(^A5=)(^A3=)(^9E=)(^85=)(^B0=)(^8D=0)(^C7=)(^A0=) + (^A2=)(^B7=)(^8C=0)(^B8=0)(^83^83)(^A8=)(^C8=1)(^84^99)(^92=)(^C9=) + (^B6=)(^9D=)(^89^9A)(^8E=0)(^AF=)(^CA^87)(^8F=)(^CB=)(^8B=)(^93=) + (^90=)(^CC=6)(^B1=)(^CD=)(^9B=)(^9C=)(^91=)(^B4=)(^9F=)(^99=)(^88=) + (^CE=)(^B5=)(^8A^9A)(^B9=6)] + [7(^87^9C)(^86=)(^C3=)(^A1=)(^AE=)(^C4=)(^C5=)(^B2=)(^A7=)(^9A=)(^B3=) + (^C6=)(^A6=)(^A4=)(^A5=)(^A3=)(^9E=)(^85=)(^B0=)(^8D=0)(^C7=)(^A0=) + (^A2=)(^B7=)(^8C=0)(^B8=0)(^83^83)(^A8=)(^C8=1)(^84^9D)(^92=)(^C9=) + (^B6=)(^9D=)(^89^9E)(^8E=0)(^AF=)(^CA^87)(^8F=)(^CB=)(^8B=)(^93=) + (^90=)(^CC=7)(^B1=)(^CD=)(^9B=)(^9C=)(^91=)(^B4=)(^9F=)(^99=)(^88=) + (^CE=)(^B5=)(^8A^9E)(^B9=7)] + [8(^87^A0)(^86=)(^C3=)(^A1=)(^AE=)(^C4=)(^C5=)(^B2=)(^A7=)(^9A=)(^B3=) + (^C6=)(^A6=)(^A4=)(^A5=)(^A3=)(^9E=)(^85=)(^B0=)(^8D=0)(^C7=)(^A0=) + (^A2=)(^B7=)(^8C=0)(^B8=0)(^83^83)(^A8=)(^C8=1)(^84^A1)(^92=)(^C9=) + (^B6=)(^9D=)(^89^A2)(^8E=0)(^AF=)(^CA^87)(^8F=)(^CB=)(^8B=)(^93=) + (^90=)(^CC=8)(^B1=)(^CD=)(^9B=)(^9C=)(^91=)(^B4=)(^9F=)(^99=)(^88=) + (^CE=)(^B5=)(^8A^A2)(^B9=8)] + [9(^87^A4)(^86=)(^C3=)(^A1=)(^AE=)(^C4=)(^C5=)(^B2=)(^A7=)(^9A=)(^B3=) + (^C6=)(^A6=)(^A4=)(^A5=)(^A3=)(^9E=)(^85=)(^B0=)(^8D=0)(^C7=)(^A0=) + (^A2=)(^B7=)(^8C=0)(^B8=0)(^83^83)(^A8=)(^C8=1)(^84^A5)(^92=)(^C9=) + (^B6=)(^9D=)(^89^A6)(^8E=0)(^AF=)(^CA^87)(^8F=)(^CB=)(^8B=)(^93=) + (^90=)(^CC=9)(^B1=)(^CD=)(^9B=)(^9C=)(^91=)(^B4=)(^9F=)(^99=)(^88=) + (^CE=)(^B5=)(^8A^A6)(^B9=9)] + [A(^87^A8)(^86=)(^C3=)(^A1=)(^AE=)(^C4=)(^C5=)(^B2=)(^A7=)(^9A=)(^B3=) + (^C6=)(^A6=)(^A4=)(^A5=)(^A3=)(^9E=)(^85=)(^B0=)(^8D=0)(^C7=)(^A0=) + (^A2=)(^B7=)(^8C=0)(^B8=0)(^83^83)(^A8=)(^C8=1)(^84^A9)(^92=)(^C9=) + (^B6=)(^9D=)(^89^AA)(^8E=0)(^AF=)(^CA^87)(^8F=)(^CB=)(^8B=)(^93=) + (^90=)(^CC=10)(^B1=)(^CD=)(^9B=)(^9C=)(^91=)(^B4=)(^9F=)(^99=)(^88=) + (^CE=)(^B5=)(^8A^AA)(^B9=a)] + [1:^81(^BD^AD)(^C1^AE)(^BE=)(^BF=)(^C0=0)(^B9=b)]} + +@$${9{@ + +<(B2=c)(B0=Does_10)(B1=does_10)> +{1:^80 {(k^BC:c)(s=9)} + [-2:^81(^BD^B0)(^C1^B1)(^BE=)(^BF=)(^C0=0)(^B9=c)]} +[1:^82(^BB=c)] +@$$}9}@ + +@$${A{@ +< <(a=c)> // (f=iso-8859-1) + (CF=Address1)> +[-1:^81(^BD^AD)(^C1^AE)(^BE=)(^BF=)(^C0=1)(^B9=b)(^CF=1)] +@$$}A}@ + +@$${B{@ +< <(a=c)> // (f=iso-8859-1) + (D0=Address2)> +[-1:^81(^BD^AD)(^C1^AE)(^BE=)(^BF=)(^C0=2)(^B9=b)(^CF=1)(^D0=2)] +@$$}B}@ + +@$${C{@ +< <(a=c)> // (f=iso-8859-1) + (D1=Address3)> +[-1:^81(^BD^AD)(^C1^AE)(^BE=)(^BF=)(^C0=3)(^B9=b)(^CF=1)(^D0=2)(^D1=3)] +@$$}C}@ + +@$${D{@ +< <(a=c)> // (f=iso-8859-1) + (D2=Address4)> +[-1:^81(^BD^AD)(^C1^AE)(^BE=)(^BF=)(^C0=4)(^B9=b)(^CF=1)(^D0=2)(^D1=3) + (^D2=4)] +@$$}D}@ + +@$${E{@ +< <(a=c)> // (f=iso-8859-1) + (D3=Address5)> +[-1:^81(^BD^AD)(^C1^AE)(^BE=)(^BF=)(^C0=5)(^B9=b)(^CF=1)(^D0=2)(^D1=3) + (^D2=4)(^D3=5)] +@$$}E}@ + +@$${F{@ +[-2:^81(^BD^B0)(^C1^B1)(^BE=)(^BF=)(^C0=1)(^B9=c)(^CF=a)] +@$$}F}@ + +@$${10{@ +[-2:^81(^BD^B0)(^C1^B1)(^BE=)(^BF=)(^C0=2)(^B9=c)(^CF=a)(^D0=6)] +@$$}10}@ + +@$${11{@ +[-2:^81(^BD^B0)(^C1^B1)(^BE=)(^BF=)(^C0=3)(^B9=c)(^CF=a)(^D0=6)(^D1=7)] +@$$}11}@ + +@$${12{@ +[-2:^81(^BD^B0)(^C1^B1)(^BE=)(^BF=)(^C0=4)(^B9=c)(^CF=a)(^D0=6)(^D1=7) + (^D2=8)] +@$$}12}@ + +@$${13{@ +[-2:^81(^BD^B0)(^C1^B1)(^BE=)(^BF=)(^C0=5)(^B9=c)(^CF=a)(^D0=6)(^D1=7) + (^D2=8)(^D3=9)] +@$$}13}@ diff --git a/connectivity/source/drivers/mork/MColumnAlias.cxx b/connectivity/source/drivers/mork/MColumnAlias.cxx index 624b5ab88e43..ba653c3e9009 100644 --- a/connectivity/source/drivers/mork/MColumnAlias.cxx +++ b/connectivity/source/drivers/mork/MColumnAlias.cxx @@ -87,6 +87,10 @@ OColumnAlias::OColumnAlias( const ::com::sun::star::uno::Reference< ::com::sun:: initialize( _rxORB ); } +OColumnAlias::OColumnAlias() +{ +} + //------------------------------------------------------------------------------ void OColumnAlias::initialize( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxORB ) { diff --git a/connectivity/source/drivers/mork/MColumnAlias.hxx b/connectivity/source/drivers/mork/MColumnAlias.hxx index 45f6f780c966..21f21963fc81 100644 --- a/connectivity/source/drivers/mork/MColumnAlias.hxx +++ b/connectivity/source/drivers/mork/MColumnAlias.hxx @@ -31,7 +31,7 @@ namespace connectivity { namespace mork { - class OColumnAlias + class SAL_DLLPUBLIC_EXPORT OColumnAlias { public: struct AliasEntry @@ -57,6 +57,7 @@ namespace connectivity public: OColumnAlias( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > & ); + OColumnAlias(); inline bool hasAlias( const ::rtl::OUString& _rAlias ) const { diff --git a/connectivity/source/drivers/mork/MConnection.cxx b/connectivity/source/drivers/mork/MConnection.cxx index a35badddc2c8..47525d2f946b 100644 --- a/connectivity/source/drivers/mork/MConnection.cxx +++ b/connectivity/source/drivers/mork/MConnection.cxx @@ -85,11 +85,11 @@ void OConnection::construct(const ::rtl::OUString& url,const Sequence< PropertyV nLen = url.indexOf(':',nLen+1); OSL_ENSURE( url.copy( 0, nLen ) == "sdbc:address", "OConnection::construct: invalid start of the URI - should never have survived XDriver::acceptsURL!" ); - ::rtl::OUString aAddrbookURI(url.copy(nLen+1)); + OUString aAddrbookURI(url.copy(nLen+1)); // Get Scheme nLen = aAddrbookURI.indexOf(':'); - ::rtl::OUString aAddrbookScheme; - ::rtl::OUString sAdditionalInfo; + OUString aAddrbookScheme; + OUString sAdditionalInfo; if ( nLen == -1 ) { // There isn't any subschema: - but could be just subschema @@ -112,13 +112,23 @@ void OConnection::construct(const ::rtl::OUString& url,const Sequence< PropertyV SAL_INFO("connectivity.mork", "URI = " << aAddrbookURI ); SAL_INFO("connectivity.mork", "Scheme = " << aAddrbookScheme ); - ::rtl::OUString defaultProfile = m_pProfileAccess->getDefaultProfile(::com::sun::star::mozilla::MozillaProductType_Thunderbird); - SAL_INFO("connectivity.mork", "DefaultProfile: " << defaultProfile); + OUString path; + const OUString UNITTEST_URL = "thunderbird:unittest:"; + sal_Int32 unittestIndex = url.indexOf(UNITTEST_URL); - ::rtl::OUString path = m_pProfileAccess->getProfilePath(::com::sun::star::mozilla::MozillaProductType_Thunderbird, defaultProfile); - SAL_INFO("connectivity.mork", "ProfilePath: " << path); - - path += rtl::OUString( "/abook.mab" ); + // production? + if (unittestIndex == -1) + { + OUString defaultProfile = m_pProfileAccess->getDefaultProfile(::com::sun::star::mozilla::MozillaProductType_Thunderbird); + path = m_pProfileAccess->getProfilePath(::com::sun::star::mozilla::MozillaProductType_Thunderbird, defaultProfile); + SAL_INFO("connectivity.mork", "DefaultProfile: " << defaultProfile); + SAL_INFO("connectivity.mork", "ProfilePath: " << path); + path += rtl::OUString( "/abook.mab" ); + } + else + { + path = aAddrbookURI.replaceFirst(UNITTEST_URL, ""); + } SAL_INFO("connectivity.mork", "AdressbookPath: " << path); diff --git a/connectivity/source/drivers/mork/MDatabaseMetaDataHelper.cxx b/connectivity/source/drivers/mork/MDatabaseMetaDataHelper.cxx index a22b660650a8..1507b8b6ec2e 100644 --- a/connectivity/source/drivers/mork/MDatabaseMetaDataHelper.cxx +++ b/connectivity/source/drivers/mork/MDatabaseMetaDataHelper.cxx @@ -31,6 +31,8 @@ static ::osl::Mutex m_aMetaMutex; #include <com/sun/star/sdb/ErrorCondition.hpp> #include <comphelper/processfactory.hxx> +#include "MorkParser.hxx" + using namespace connectivity; using namespace connectivity::mork; @@ -52,11 +54,21 @@ sal_Bool MDatabaseMetaDataHelper::getTableStrings( OConnection* ::rtl::OString sAbURIString; SAL_INFO("connectivity.mork", "=> MDatabaseMetaDataHelper::getTableStrings()"); - _pCon->getMorkParser(); - // TODO: retrieve Tables from MorkParser - // only put for now the private adress book - rtl::OUString table = rtl::OUString::createFromAscii( "AddressBook"); + + /* add default table */ + OUString table = "AddressBook"; _rStrings.push_back(table); + + /* retrieve list table names */ + std::set<std::string> lists; + _pCon->getMorkParser()->retrieveLists(lists); + for (::std::set<std::string>::iterator iter = lists.begin(); iter != lists.end(); ++iter) { + OUString groupTableName = OStringToOUString((*iter).c_str(), RTL_TEXTENCODING_UTF8); + SAL_INFO("connectivity.mork", "add Table " << groupTableName); + + _rStrings.push_back(groupTableName); + } + return( sal_True ); } @@ -70,14 +82,14 @@ sal_Bool MDatabaseMetaDataHelper::getTables( OConnection* _pCon, static ODatabaseMetaDataResultSet::ORows aRows; SAL_INFO("connectivity.mork", "=> MDatabaseMetaDataHelper::getTables()" ); + SAL_INFO("connectivity.mork", "tableNamePattern : " << tableNamePattern); ::osl::MutexGuard aGuard( m_aMetaMutex ); ODatabaseMetaDataResultSet::ORows().swap(aRows); // this makes real clear where memory is freed as well aRows.clear(); ::std::vector< ::rtl::OUString > tables; -// ::std::vector< ::rtl::OUString > tabletypes; - ::rtl::OUString matchAny = rtl::OUString::createFromAscii("%"); + OUString matchAny = "%"; if ( !getTableStrings( _pCon, tables ) ) return sal_False; @@ -86,21 +98,20 @@ sal_Bool MDatabaseMetaDataHelper::getTables( OConnection* _pCon, ODatabaseMetaDataResultSet::ORow aRow(3); ::rtl::OUString aTableName = tables[i]; - //::rtl::OUString aTableType = tabletypes[i]; SAL_INFO("connectivity.mork", "TableName: " << aTableName ); // return tables to caller if (match( tableNamePattern, aTableName, '\0' )) - { + { if ( aTableName.isEmpty() ) { - aTableName = rtl::OUString::createFromAscii("AddressBook"); + aTableName = "AddressBook"; } SAL_INFO("connectivity.mork", "TableName: " << aTableName); aRow.push_back( new ORowSetValueDecorator( aTableName ) ); // Table name - aRow.push_back( new ORowSetValueDecorator( rtl::OUString::createFromAscii("TABLE") ) ); // Table type + aRow.push_back( new ORowSetValueDecorator( OUString::createFromAscii("TABLE") ) ); // Table type aRow.push_back( ODatabaseMetaDataResultSet::getEmptyValue() ); // Remarks aRows.push_back(aRow); } diff --git a/connectivity/source/drivers/mork/MQueryHelper.cxx b/connectivity/source/drivers/mork/MQueryHelper.cxx index 9091d108e0ae..efd56f42b49a 100644 --- a/connectivity/source/drivers/mork/MQueryHelper.cxx +++ b/connectivity/source/drivers/mork/MQueryHelper.cxx @@ -26,6 +26,8 @@ #include <stdlib.h> #include <sstream> #include <string> +#include <vector> +#include <algorithm> #include <string.h> #include "resource/mork_res.hrc" @@ -239,7 +241,18 @@ sal_Int32 MQueryHelper::executeQuery(OConnection* xConnection) SAL_INFO("connectivity.mork", "MQueryHelper::executeQuery()" ); reset(); - //dumpExpression(this, &m_aExpr); + rtl::OString oStringTable = OUStringToOString( m_aAddressbook, RTL_TEXTENCODING_UTF8 ); + std::set<int> listRecords; + bool handleListTable = false; + + // check if we are retrieving the default table + if (oStringTable != "AddressBook") + { + handleListTable = true; + // retrieve row ids for that list table + std::string listTable = oStringTable.getStr(); + xConnection->getMorkParser()->getRecordKeysForListTable(listTable, listRecords); + } MorkTableMap::iterator tableIter; MorkTableMap *Tables = xConnection->getMorkParser()->getTables( 0x80 ); MorkRowMap *Rows = 0; @@ -249,38 +262,53 @@ sal_Int32 MQueryHelper::executeQuery(OConnection* xConnection) for ( tableIter = Tables->begin(); tableIter != Tables->end(); ++tableIter ) { if (tableIter->first != 1) break; - Rows = xConnection->getMorkParser()->getRows( 0x80, &tableIter->second ); + Rows = xConnection->getMorkParser()->getRows( 0x80, &tableIter->second ); if ( Rows ) { // Iterate all rows for ( rowIter = Rows->begin(); rowIter != Rows->end(); ++rowIter ) { + // list specific table + // only retrieve rowIds that belong to that list table. + if (handleListTable) + { + int rowId = rowIter->first; + // belongs this row id to the list table? + if (listRecords.end() == std::find(listRecords.begin(), listRecords.end(), rowId)) + { + // no, skip it + continue; + } + } + MQueryHelperResultEntry* entry = new MQueryHelperResultEntry(); for (MorkCells::iterator CellsIter = rowIter->second.begin(); CellsIter != rowIter->second.end(); ++CellsIter ) { std::string column = xConnection->getMorkParser()->getColumn(CellsIter->first); std::string value = xConnection->getMorkParser()->getValue(CellsIter->second); - - //SAL_INFO("connectivity.mork", "key: " << column << " value: " << value); - OString key(column.c_str(), static_cast<sal_Int32>(column.size())); OString valueOString(value.c_str(), static_cast<sal_Int32>(value.size())); - rtl::OUString valueOUString = ::rtl::OStringToOUString( valueOString, RTL_TEXTENCODING_UTF8 ); + rtl::OUString valueOUString = OStringToOUString( valueOString, RTL_TEXTENCODING_UTF8 ); entry->setValue(key, valueOUString); } ::std::vector< sal_Bool > vector = entryMatchedByExpression(this, &m_aExpr, entry); sal_Bool result = sal_True; - for (::std::vector<sal_Bool>::iterator iter = vector.begin(); iter != vector.end(); ++iter) { + for (::std::vector<sal_Bool>::iterator iter = vector.begin(); iter != vector.end(); ++iter) + { result = result && *iter; } - if (result) { + if (result) + { append(entry); } + else + { + delete entry; + } } } } - return 0; } diff --git a/connectivity/source/drivers/mork/MQueryHelper.hxx b/connectivity/source/drivers/mork/MQueryHelper.hxx index 28b1e0739e9e..de1fff09d8cf 100644 --- a/connectivity/source/drivers/mork/MQueryHelper.hxx +++ b/connectivity/source/drivers/mork/MQueryHelper.hxx @@ -185,6 +185,9 @@ namespace connectivity void getCardValues(nsIAbCard *card,sal_uInt32 rowIndex=0); */ + sal_Int32 doQueryDefaultTable(OConnection* xConnection); + sal_Int32 doQueryListTable(OConnection* xConnection, rtl::OString& ouStringTable); + public: MQueryHelper(const OColumnAlias& _ca); virtual ~MQueryHelper(); diff --git a/connectivity/source/drivers/mork/MResultSet.cxx b/connectivity/source/drivers/mork/MResultSet.cxx index 49ee90a0f387..03f1c1bfba49 100644 --- a/connectivity/source/drivers/mork/MResultSet.cxx +++ b/connectivity/source/drivers/mork/MResultSet.cxx @@ -70,8 +70,8 @@ using namespace com::sun::star::util; Sequence< ::rtl::OUString > SAL_CALL OResultSet::getSupportedServiceNames( ) throw( RuntimeException) { ::com::sun::star::uno::Sequence< ::rtl::OUString > aSupported(2); - aSupported[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.sdbc.ResultSet")); - aSupported[1] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.sdbcx.ResultSet")); + aSupported[0] = OUString("com.sun.star.sdbc.ResultSet"); + aSupported[1] = OUString("com.sun.star.sdbcx.ResultSet"); return aSupported; } // ------------------------------------------------------------------------- diff --git a/connectivity/source/drivers/mork/MorkParser.cxx b/connectivity/source/drivers/mork/MorkParser.cxx index da772a101f49..06373310e3d5 100644 --- a/connectivity/source/drivers/mork/MorkParser.cxx +++ b/connectivity/source/drivers/mork/MorkParser.cxx @@ -39,6 +39,7 @@ #include <stdexcept> #include <fstream> #include <iostream> +#include <algorithm> std::string g_Empty = ""; @@ -598,6 +599,138 @@ std::string &MorkParser::getColumn( int oid ) return foundIter->second; } +void MorkParser::retrieveLists(std::set<std::string>& lists) +{ + MorkTableMap* tables = getTables(defaultScope_); + if (!tables) return; + for (MorkTableMap::iterator TableIter = tables->begin(); + TableIter != tables->end(); TableIter++ ) + { +#ifdef VERBOSE + std::cout << "\t Table:" + << ( ( int ) TableIter->first < 0 ? "-" : " " ) + << std::hex << std::uppercase << TableIter->first << std::endl; +#endif + MorkRowMap* rows = getRows( defaultListScope_, &TableIter->second ); + if (!rows) return; + for ( MorkRowMap::iterator RowIter = rows->begin(); + RowIter != rows->end(); RowIter++ ) + { +#ifdef VERBOSE + std::cout << "\t\t\t Row Id:" + << ( ( int ) RowIter->first < 0 ? "-" : " ") + << std::hex << std::uppercase << RowIter->first << std::endl; + std::cout << "\t\t\t\t Cells:\r\n"; +#endif + // Get cells + for ( MorkCells::iterator cellsIter = RowIter->second.begin(); + cellsIter != RowIter->second.end(); cellsIter++ ) + { + if (cellsIter->first == 0xC1) + { + lists.insert(getValue( cellsIter->second )); + break; + } + } + } + } +} + +void MorkParser::getRecordKeys4List(std::string& listName, std::vector<std::string>& records) +{ + MorkTableMap* tables = getTables(defaultScope_); + if (!tables) return; + for (MorkTableMap::iterator TableIter = tables->begin(); + TableIter != tables->end(); TableIter++ ) + { +#ifdef VERBOSE + std::cout << "\t Table:" + << ( ( int ) TableIter->first < 0 ? "-" : " " ) + << std::hex << std::uppercase << TableIter->first << std::endl; +#endif + MorkRowMap* rows = getRows( 0x81, &TableIter->second ); + if (!rows) return; + for ( MorkRowMap::iterator RowIter = rows->begin(); + RowIter != rows->end(); RowIter++ ) + { +#ifdef VERBOSE + std::cout << "\t\t\t Row Id:" + << ( ( int ) RowIter->first < 0 ? "-" : " ") + << std::hex << std::uppercase << RowIter->first << std::endl; + std::cout << "\t\t\t\t Cells:\r\n"; +#endif + // Get cells + bool listFound = false; + for ( MorkCells::iterator cellsIter = RowIter->second.begin(); + cellsIter != RowIter->second.end(); cellsIter++ ) + { + if (listFound) + { + if (cellsIter->first >= 0xC7) + { + std::string value = getValue(cellsIter->second); + records.push_back(value); + } + } + else if ((cellsIter->first == 0xC1) && + listName == getValue( cellsIter->second )) + { + listFound = true; + } + } + + } + } +} + +void MorkParser::getRecordKeysForListTable(std::string& listName, std::set<int>& records) +{ + MorkTableMap* tables = getTables(defaultScope_); + if (!tables) return; + for (MorkTableMap::iterator TableIter = tables->begin(); + TableIter != tables->end(); TableIter++ ) + { +#ifdef VERBOSE + std::cout << "\t Table:" + << ( ( int ) TableIter->first < 0 ? "-" : " " ) + << std::hex << std::uppercase << TableIter->first << std::endl; +#endif + MorkRowMap* rows = getRows( 0x81, &TableIter->second ); + if (!rows) return; + for ( MorkRowMap::iterator RowIter = rows->begin(); + RowIter != rows->end(); RowIter++ ) + { +#ifdef VERBOSE + std::cout << "\t\t\t Row Id:" + << ( ( int ) RowIter->first < 0 ? "-" : " ") + << std::hex << std::uppercase << RowIter->first << std::endl; + std::cout << "\t\t\t\t Cells:\r\n"; +#endif + // Get cells + bool listFound = false; + for ( MorkCells::iterator cellsIter = RowIter->second.begin(); + cellsIter != RowIter->second.end(); cellsIter++ ) + { + if (listFound) + { + if (cellsIter->first >= 0xC7) + { + std::string value = getValue(cellsIter->second); + int id = strtoul(value.c_str(), 0, 16); + records.insert(id); + } + } + else if ((cellsIter->first == 0xC1) && + listName == getValue( cellsIter->second )) + { + listFound = true; + } + } + + } + } +} + void MorkParser::dump() { std::cout << "Column Dict:\r\n"; diff --git a/connectivity/source/drivers/mork/MorkParser.hxx b/connectivity/source/drivers/mork/MorkParser.hxx index 76544411264a..8ac7584a3d66 100644 --- a/connectivity/source/drivers/mork/MorkParser.hxx +++ b/connectivity/source/drivers/mork/MorkParser.hxx @@ -38,6 +38,8 @@ #include <string> #include <map> +#include <set> +#include <vector> #include "dllapi.h" @@ -111,6 +113,10 @@ public: std::string &getColumn( int oid ); + void retrieveLists(std::set<std::string>& lists); + void getRecordKeys4List(std::string& listName, std::vector<std::string>& records); + void getRecordKeysForListTable(std::string& listName, std::set<int>& records); + void dump(); protected: // Members |