[Libreoffice-commits] .: connectivity/CppunitTest_connectivity_mork.mk connectivity/Module_connectivity.mk connectivity/qa connectivity/source

Libreoffice Gerrit user logerrit at kemper.freedesktop.org
Wed Oct 10 01:06:28 PDT 2012


 connectivity/CppunitTest_connectivity_mork.mk                |   57 +++
 connectivity/Module_connectivity.mk                          |    6 
 connectivity/qa/connectivity/mork/DriverTest.cxx             |  173 +++++++++++
 connectivity/qa/connectivity/mork/abook_10_john_does.mab     |  159 ++++++++++
 connectivity/source/drivers/mork/MColumnAlias.cxx            |    4 
 connectivity/source/drivers/mork/MColumnAlias.hxx            |    3 
 connectivity/source/drivers/mork/MConnection.cxx             |   28 +
 connectivity/source/drivers/mork/MDatabaseMetaDataHelper.cxx |   31 +
 connectivity/source/drivers/mork/MQueryHelper.cxx            |   46 ++
 connectivity/source/drivers/mork/MQueryHelper.hxx            |    3 
 connectivity/source/drivers/mork/MResultSet.cxx              |    4 
 connectivity/source/drivers/mork/MorkParser.cxx              |  133 ++++++++
 connectivity/source/drivers/mork/MorkParser.hxx              |    6 
 13 files changed, 621 insertions(+), 32 deletions(-)

New commits:
commit 36026a6ae5d2f42db5fa262a358a3bc8e33e036c
Author: David Ostrovsky <david at ostrovsky.org>
Date:   Sun Sep 30 19:53:40 2012 +0200

    mork driver: add list tables and unit test
    
    Change-Id: I594b24341eb38c05523f578c1dc2e43d90544f30

diff --git a/connectivity/CppunitTest_connectivity_mork.mk b/connectivity/CppunitTest_connectivity_mork.mk
new file mode 100644
index 0000000..987dd57
--- /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 3cd7daa..ae5932d 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 0000000..1db1d9f
--- /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 at doe.org!", mail.equalsAscii("john at 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 at doe10.org!", mail.equalsAscii("john at 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 at doe9.org!", mail.equalsAscii("john at 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 at doe5.org!", mail.equalsAscii("john at 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 0000000..41aac4c
--- /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 at doe.org)
+  (87=generic)(88=John Doe2)(89=Doe2)(8A=john at doe2.org)(8B=2)(8C=John Doe3)
+  (8D=Doe3)(8E=john at doe3.org)(8F=3)(90=John Doe4)(91=Doe4)(92
+    =john at doe4.org)(93=4)(94=John Doe5)(95=Doe5)(96=john at doe5.org)(97=5)
+  (98=John Doe6)(99=Doe6)(9A=john at doe6.org)(9B=6)(9C=John Doe7)(9D=Doe7)
+  (9E=john at doe7.org)(9F=7)(A0=John Doe8)(A1=Doe8)(A2=john at doe8.org)
+  (A3=8)(A4=John Doe9)(A5=Doe9)(A6=john at doe9.org)(A7=9)(A8=John Doe10)
+  (A9=Doe10)(AA=john at 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 624b5ab..ba653c3 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 45f6f78..21f2196 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 a35badd..47525d2 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 a22b660..1507b8b 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 9091d10..efd56f4 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 28b1e07..de1fff0 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 49ee90a..03f1c1b 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 da772a1..0637331 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 7654441..8ac7584 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


More information about the Libreoffice-commits mailing list