dbaccess/CppunitTest_dbaccess_embeddeddb_performancetest.mk | 81 ++ dbaccess/CppunitTest_dbaccess_firebird_test.mk | 2 dbaccess/CppunitTest_dbaccess_hsqldb_test.mk | 79 ++ dbaccess/Module_dbaccess.mk | 15 dbaccess/qa/unit/data/hsqldb_empty.odb |binary dbaccess/qa/unit/dbtest_base.cxx | 6 dbaccess/qa/unit/embeddeddb_performancetest.cxx | 371 ++++++++++++ dbaccess/qa/unit/hsqldb.cxx | 52 + 8 files changed, 603 insertions(+), 3 deletions(-)
New commits: commit 981b73c98576ea297cf8244c1cbe1ece783e5ca9 Author: Andrzej J.R. Hunt <andr...@ahunt.org> Date: Wed Sep 18 13:51:55 2013 +0100 Add normal (non PreparedStatement) insert test. Change-Id: I0f6220917d8a9e8ecce30acbabf8386e73372ed3 diff --git a/dbaccess/qa/unit/embeddeddb_performancetest.cxx b/dbaccess/qa/unit/embeddeddb_performancetest.cxx index 7832cfc..0ba4ac4 100644 --- a/dbaccess/qa/unit/embeddeddb_performancetest.cxx +++ b/dbaccess/qa/unit/embeddeddb_performancetest.cxx @@ -15,7 +15,11 @@ #include <osl/time.h> #include <rtl/ustrbuf.hxx> #include <tools/stream.hxx> +#include <unotools/tempfile.hxx> +#include <com/sun/star/beans/XPropertySet.hpp> +#include <com/sun/star/frame/XStorable.hpp> +#include <com/sun/star/lang/XComponent.hpp> #include <com/sun/star/sdb/XOfficeDatabaseDocument.hpp> #include <com/sun/star/sdbc/XColumnLocate.hpp> #include <com/sun/star/sdbc/XConnection.hpp> @@ -24,8 +28,12 @@ #include <com/sun/star/sdbc/XResultSet.hpp> #include <com/sun/star/sdbc/XRow.hpp> #include <com/sun/star/sdbc/XStatement.hpp> +#include <com/sun/star/util/XCloseable.hpp> using namespace ::com::sun::star; +using namespace ::com::sun::star::beans; +using namespace ::com::sun::star::frame; +using namespace ::com::sun::star::lang; using namespace ::com::sun::star::sdb; using namespace ::com::sun::star::sdbc; using namespace ::com::sun::star::uno; @@ -61,8 +69,11 @@ OUString getPrintableTimeValue(const TimeValue* pTimeValue) * 'SAL_LOG="" DBA_PERFTEST=YES make CppunitTest_dbaccess_embeddeddb_performancetest' * This blocks the unnecessary exception output and show only the performance data. * - * You also need to create the file dbacess/qa/unit/data/wordlist, one easy way - * of generating a list is using 'aspell dump master > dbacess/qa/unit/data/wordlist' + * You also need to create the file dbacess/qa/unit/data/wordlist, this list cannot + * contain any unescaped apostrophes (since the words are used directly to assemble + * sql statement), apostrophes are escaped using a double apostrophe, i.e. ''. + * one easy way of generating a list is using: + * 'for WORD in $(aspell dump master); do echo ${WORD//\'/\'\'}; done > dbaccess/qa/unit/data/wordlist' * * Note that wordlist cannot have more than 220580 lines, this is due to a hard * limit in our hsqldb version. @@ -83,7 +94,9 @@ private: void printTimes(const TimeValue* pTime1, const TimeValue* pTime2, const TimeValue* pTime3); - void doPerformanceTestOnODB(const OUString& rFileName, const OUString& rDBName); + void doPerformanceTestOnODB(const OUString& rDriverURL, + const OUString& rDBName, + const bool bUsePreparedStatement); void setupTestTable(uno::Reference< XConnection >& xConnection); @@ -91,6 +104,9 @@ private: void performPreparedStatementInsertTest( uno::Reference< XConnection >& xConnection, const OUString& rDBName); + void performStatementInsertTest( + uno::Reference< XConnection >& xConnection, + const OUString& rDBName); void performReadTest( uno::Reference< XConnection >& xConnection, const OUString& rDBName); @@ -152,13 +168,19 @@ void EmbeddedDBPerformanceTest::testPerformance() void EmbeddedDBPerformanceTest::testFirebird() { - doPerformanceTestOnODB("firebird_empty.odb", "Firebird"); + m_aOutputBuffer.append("Standard Insert\n"); + doPerformanceTestOnODB("sdbc:embedded:firebird", "Firebird", false); + m_aOutputBuffer.append("PreparedStatement Insert\n"); + doPerformanceTestOnODB("sdbc:embedded:firebird", "Firebird", true); } void EmbeddedDBPerformanceTest::testHSQLDB() { - doPerformanceTestOnODB("hsqldb_empty.odb", "HSQLDB"); + m_aOutputBuffer.append("Standard Insert\n"); + doPerformanceTestOnODB("sdbc:embedded:hsqldb", "HSQLDB", false); + m_aOutputBuffer.append("PreparedStatement Insert\n"); + doPerformanceTestOnODB("sdbc:embedded:hsqldb", "HSQLDB", true); } /** @@ -166,22 +188,40 @@ void EmbeddedDBPerformanceTest::testHSQLDB() * a table of the name PFTESTTABLE. */ void EmbeddedDBPerformanceTest::doPerformanceTestOnODB( - const OUString& rFileName, - const OUString& rDBName) + const OUString& rDriverURL, + const OUString& rDBName, + const bool bUsePreparedStatement) { - uno::Reference< XOfficeDatabaseDocument > xDocument = - getDocumentForFileName(rFileName); + ::utl::TempFile aFile; + aFile.EnableKillingFile(); + + { + uno::Reference< XOfficeDatabaseDocument > xDocument( + m_xSFactory->createInstance("com.sun.star.sdb.OfficeDatabaseDocument"), + UNO_QUERY_THROW); + uno::Reference< XStorable > xStorable(xDocument, UNO_QUERY_THROW); + + uno::Reference< XDataSource > xDataSource = xDocument->getDataSource(); + uno::Reference< XPropertySet > xPropertySet(xDataSource, UNO_QUERY_THROW); + xPropertySet->setPropertyValue("URL", Any(rDriverURL)); + + xStorable->storeAsURL(aFile.GetURL(), uno::Sequence< beans::PropertyValue >()); + } + + uno::Reference< XOfficeDatabaseDocument > xDocument( + loadFromDesktop(aFile.GetURL()), UNO_QUERY_THROW); uno::Reference< XConnection > xConnection = getConnectionForDocument(xDocument); setupTestTable(xConnection); - performPreparedStatementInsertTest(xConnection, rDBName); - performReadTest(xConnection, rDBName); - -// xConnection.dispose(); + if (bUsePreparedStatement) + performPreparedStatementInsertTest(xConnection, rDBName); + else + performStatementInsertTest(xConnection, rDBName); + performReadTest(xConnection, rDBName); } void EmbeddedDBPerformanceTest::setupTestTable( @@ -243,7 +283,53 @@ void EmbeddedDBPerformanceTest::performPreparedStatementInsertTest( getTimeDifference(&aStart, &aMiddle, &aTimeInsert); getTimeDifference(&aMiddle, &aEnd, &aTimeCommit); getTimeDifference(&aStart, &aEnd, &aTimeTotal); - m_aOutputBuffer.append("PreparedStatement Insert: " + rDBName + "\n"); + m_aOutputBuffer.append("Insert: " + rDBName + "\n"); + printTimes(&aTimeInsert, &aTimeCommit, &aTimeTotal); + + pFile->Close(); +} + +void EmbeddedDBPerformanceTest::performStatementInsertTest( + uno::Reference< XConnection >& xConnection, + const OUString& rDBName) +{ + uno::Reference< XStatement > xStatement = + xConnection->createStatement(); + + ::boost::scoped_ptr< SvFileStream > pFile(new SvFileStream( + getSrcRootURL() + our_sFilePath + "wordlist", + STREAM_READ)); + + if (!pFile) + { + fprintf(stderr, "Please ensure the wordlist is present\n"); + CPPUNIT_ASSERT(false); + } + + OUString aWord; + sal_Int32 aID = 0; + + TimeValue aStart, aMiddle, aEnd; + osl_getSystemTime(&aStart); + + while (pFile->ReadByteStringLine(aWord, RTL_TEXTENCODING_UTF8)) + { + xStatement->execute( + "INSERT INTO \"PFTESTTABLE\" ( \"ID\", " + "\"STRINGCOLUMNA\" " + ") VALUES ( " + + OUString::number(aID++) + ", '" + aWord + "' )" + ); + } + osl_getSystemTime(&aMiddle); + xConnection->commit(); + osl_getSystemTime(&aEnd); + + TimeValue aTimeInsert, aTimeCommit, aTimeTotal; + getTimeDifference(&aStart, &aMiddle, &aTimeInsert); + getTimeDifference(&aMiddle, &aEnd, &aTimeCommit); + getTimeDifference(&aStart, &aEnd, &aTimeTotal); + m_aOutputBuffer.append("Insert: " + rDBName + "\n"); printTimes(&aTimeInsert, &aTimeCommit, &aTimeTotal); pFile->Close(); commit c058510595812af9254c7e95ca97e3a84c8d354d Author: Andrzej J.R. Hunt <andr...@ahunt.org> Date: Wed Sep 18 09:42:16 2013 +0100 Refactor performance test. This is to allow for comparing the use of Prepared/Normal statements. Change-Id: I6e120892f1c66f8b1c59bda309e88b2b7f39d230 diff --git a/dbaccess/qa/unit/embeddeddb_performancetest.cxx b/dbaccess/qa/unit/embeddeddb_performancetest.cxx index 7d51102..7832cfc 100644 --- a/dbaccess/qa/unit/embeddeddb_performancetest.cxx +++ b/dbaccess/qa/unit/embeddeddb_performancetest.cxx @@ -85,6 +85,17 @@ private: void doPerformanceTestOnODB(const OUString& rFileName, const OUString& rDBName); + void setupTestTable(uno::Reference< XConnection >& xConnection); + + // Individual Tests + void performPreparedStatementInsertTest( + uno::Reference< XConnection >& xConnection, + const OUString& rDBName); + void performReadTest( + uno::Reference< XConnection >& xConnection, + const OUString& rDBName); + + // Perform all tests on a given DB. void testFirebird(); void testHSQLDB(); @@ -164,107 +175,107 @@ void EmbeddedDBPerformanceTest::doPerformanceTestOnODB( uno::Reference< XConnection > xConnection = getConnectionForDocument(xDocument); - // Create Table + setupTestTable(xConnection); + + performPreparedStatementInsertTest(xConnection, rDBName); + performReadTest(xConnection, rDBName); + +// xConnection.dispose(); + +} + +void EmbeddedDBPerformanceTest::setupTestTable( + uno::Reference< XConnection >& xConnection) +{ + uno::Reference< XStatement > xStatement = xConnection->createStatement(); + + // Although not strictly necessary we use quoted identifiers to reflect + // the fact that Base always uses quoted identifiers. + xStatement->execute( + "CREATE TABLE \"PFTESTTABLE\" ( \"ID\" INTEGER NOT NULL PRIMARY KEY " + ", \"STRINGCOLUMNA\" VARCHAR (50) " + ")"); + + xConnection->commit(); +} + +void EmbeddedDBPerformanceTest::performPreparedStatementInsertTest( + uno::Reference< XConnection >& xConnection, + const OUString& rDBName) +{ + uno::Reference< XPreparedStatement > xPreparedStatement = + xConnection->prepareStatement( + "INSERT INTO \"PFTESTTABLE\" ( \"ID\", " + "\"STRINGCOLUMNA\" " + ") VALUES ( ?, ? )" + ); + + uno::Reference< XParameters > xParameters(xPreparedStatement, UNO_QUERY_THROW); + + ::boost::scoped_ptr< SvFileStream > pFile(new SvFileStream( + getSrcRootURL() + our_sFilePath + "wordlist", + STREAM_READ)); + + if (!pFile) { - uno::Reference< XStatement > xStatement = xConnection->createStatement(); - CPPUNIT_ASSERT(xStatement.is()); - - // Although not strictly necessary we use quoted identifiers to reflect - // the fact that Base always uses quoted identifiers. - xStatement->execute( - "CREATE TABLE \"PFTESTTABLE\" ( \"ID\" INTEGER NOT NULL PRIMARY KEY " - ", \"STRINGCOLUMNA\" VARCHAR (50) " -// ", \"STRINGCOLUMNB\" VARCHAR (50) " -// ", \"STRINGCOLUMNC\" VARCHAR (50) " -// ", \"STRINGCOLUMND\" VARCHAR (50) " - ")"); - xConnection->commit(); + fprintf(stderr, "Please ensure the wordlist is present\n"); + CPPUNIT_ASSERT(false); } - // Writing test + OUString aWord; + sal_Int32 aID = 0; + + TimeValue aStart, aMiddle, aEnd; + osl_getSystemTime(&aStart); + + while (pFile->ReadByteStringLine(aWord, RTL_TEXTENCODING_UTF8)) { - uno::Reference< XPreparedStatement > xPreparedStatement = - xConnection->prepareStatement( - "INSERT INTO \"PFTESTTABLE\" ( \"ID\", " - "\"STRINGCOLUMNA\" " -// ", \"STRINGCOLUMNB\" " -// ", \"STRINGCOLUMNC\" " -// ", \"STRINGCOLUMND\" " - ") VALUES ( ?, ?" -// ", ?, ?, ? " - ")"); - - uno::Reference< XParameters > xParameters(xPreparedStatement, UNO_QUERY_THROW); - - ::boost::scoped_ptr< SvFileStream > pFile(new SvFileStream( - getSrcRootURL() + our_sFilePath + "wordlist", - STREAM_READ)); - - if (!pFile) - { - fprintf(stderr, "Please ensure the wordlist is present\n"); - CPPUNIT_ASSERT(false); - } - - OUString aWord; - sal_Int32 aID = 0; - - TimeValue aStart, aMiddle, aEnd; - osl_getSystemTime(&aStart); - - while (pFile->ReadByteStringLine(aWord, RTL_TEXTENCODING_UTF8)) - { - xParameters->setInt(1, aID++); - xParameters->setString(2, aWord); -// xParameters->setString(3, aWord); -// xParameters->setString(4, aWord); -// xParameters->setString(5, aWord); - xPreparedStatement->execute(); - } - osl_getSystemTime(&aMiddle); - xConnection->commit(); - osl_getSystemTime(&aEnd); - - - TimeValue aTimeInsert, aTimeCommit, aTimeTotal; - getTimeDifference(&aStart, &aMiddle, &aTimeInsert); - getTimeDifference(&aMiddle, &aEnd, &aTimeCommit); - getTimeDifference(&aStart, &aEnd, &aTimeTotal); - m_aOutputBuffer.append("Write to: " + rDBName + "\n"); - printTimes(&aTimeInsert, &aTimeCommit, &aTimeTotal); - - pFile->Close(); + xParameters->setInt(1, aID++); + xParameters->setString(2, aWord); + xPreparedStatement->execute(); } + osl_getSystemTime(&aMiddle); + xConnection->commit(); + osl_getSystemTime(&aEnd); - // Read test - { - uno::Reference< XStatement > xStatement = xConnection->createStatement(); - TimeValue aStart, aMiddle, aEnd; - osl_getSystemTime(&aStart); + TimeValue aTimeInsert, aTimeCommit, aTimeTotal; + getTimeDifference(&aStart, &aMiddle, &aTimeInsert); + getTimeDifference(&aMiddle, &aEnd, &aTimeCommit); + getTimeDifference(&aStart, &aEnd, &aTimeTotal); + m_aOutputBuffer.append("PreparedStatement Insert: " + rDBName + "\n"); + printTimes(&aTimeInsert, &aTimeCommit, &aTimeTotal); - uno::Reference< XResultSet > xResults = xStatement->executeQuery("SELECT * FROM PFTESTTABLE"); + pFile->Close(); +} + +void EmbeddedDBPerformanceTest::performReadTest( + uno::Reference< XConnection >& xConnection, + const OUString& rDBName) +{ + uno::Reference< XStatement > xStatement = xConnection->createStatement(); + + TimeValue aStart, aMiddle, aEnd; + osl_getSystemTime(&aStart); - osl_getSystemTime(&aMiddle); + uno::Reference< XResultSet > xResults = xStatement->executeQuery("SELECT * FROM PFTESTTABLE"); - uno::Reference< XRow > xRow(xResults, UNO_QUERY_THROW); + osl_getSystemTime(&aMiddle); - while (xResults->next()) - { - xRow->getString(2); -// xRow->getString(3); -// xRow->getString(4); -// xRow->getString(5); - } - osl_getSystemTime(&aEnd); + uno::Reference< XRow > xRow(xResults, UNO_QUERY_THROW); - TimeValue aTimeSelect, aTimeIterate, aTimeTotal; - getTimeDifference(&aStart, &aMiddle, &aTimeSelect); - getTimeDifference(&aMiddle, &aEnd, &aTimeIterate); - getTimeDifference(&aStart, &aEnd, &aTimeTotal); - m_aOutputBuffer.append("Read from: " + rDBName + "\n"); - printTimes(&aTimeSelect, &aTimeIterate, &aTimeTotal); + while (xResults->next()) + { + xRow->getString(2); } + osl_getSystemTime(&aEnd); + + TimeValue aTimeSelect, aTimeIterate, aTimeTotal; + getTimeDifference(&aStart, &aMiddle, &aTimeSelect); + getTimeDifference(&aMiddle, &aEnd, &aTimeIterate); + getTimeDifference(&aStart, &aEnd, &aTimeTotal); + m_aOutputBuffer.append("Read from: " + rDBName + "\n"); + printTimes(&aTimeSelect, &aTimeIterate, &aTimeTotal); } CPPUNIT_TEST_SUITE_REGISTRATION(EmbeddedDBPerformanceTest); commit 7c87a5383ae03df0f9ad0e39cfbd6f83645a659a Author: Andrzej J.R. Hunt <andr...@ahunt.org> Date: Tue Sep 17 15:34:36 2013 +0100 Implement firebird/hsqldb performance comparison test. Change-Id: Iaf28b0fcb04ee713ccae6a593e56653eac6e2eba diff --git a/dbaccess/CppunitTest_dbaccess_embeddeddb_performancetest.mk b/dbaccess/CppunitTest_dbaccess_embeddeddb_performancetest.mk new file mode 100644 index 0000000..a20712b --- /dev/null +++ b/dbaccess/CppunitTest_dbaccess_embeddeddb_performancetest.mk @@ -0,0 +1,81 @@ +# -*- 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,dbaccess_embeddeddb_performancetest)) + +$(eval $(call gb_CppunitTest_use_external,dbaccess_embeddeddb_performancetest,boost_headers)) + +$(eval $(call gb_CppunitTest_add_exception_objects,dbaccess_embeddeddb_performancetest, \ + dbaccess/qa/unit/embeddeddb_performancetest \ +)) + +$(eval $(call gb_CppunitTest_use_libraries,dbaccess_embeddeddb_performancetest, \ + comphelper \ + cppu \ + cppuhelper \ + dbaxml \ + dbtools \ + firebird_sdbc \ + jvmfwk \ + sal \ + subsequenttest \ + utl \ + test \ + tk \ + tl \ + unotest \ + xo \ + $(gb_UWINAPI) \ +)) + +$(eval $(call gb_CppunitTest_use_api,dbaccess_embeddeddb_performancetest,\ + offapi \ + oovbaapi \ + udkapi \ +)) + +$(eval $(call gb_CppunitTest_use_ure,dbaccess_embeddeddb_performancetest)) + +$(eval $(call gb_CppunitTest_use_components,dbaccess_embeddeddb_performancetest,\ + basic/util/sb \ + comphelper/util/comphelp \ + configmgr/source/configmgr \ + connectivity/source/cpool/dbpool2 \ + connectivity/source/drivers/firebird/firebird_sdbc \ + connectivity/source/drivers/hsqldb/hsqldb \ + connectivity/source/drivers/jdbc/jdbc \ + connectivity/source/manager/sdbc2 \ + dbaccess/util/dba \ + dbaccess/source/filter/xml/dbaxml \ + dbaccess/util/dbu \ + fileaccess/source/fileacc \ + filter/source/config/cache/filterconfig1 \ + framework/util/fwk \ + i18npool/util/i18npool \ + linguistic/source/lng \ + package/source/xstor/xstor \ + package/util/package2 \ + sax/source/expatwrap/expwrap \ + sfx2/util/sfx \ + svl/source/fsstor/fsstorage \ + svl/util/svl \ + toolkit/util/tk \ + ucb/source/core/ucb1 \ + ucb/source/ucp/file/ucpfile1 \ + unotools/util/utl \ + xmloff/util/xo \ +)) + +$(eval $(call gb_CppunitTest_use_configuration,dbaccess_embeddeddb_performancetest)) + +$(eval $(call gb_CppunitTest_use_filter_configuration,dbaccess_embeddeddb_performancetest)) + +$(eval $(call gb_CppunitTest_use_unittest_configuration,dbaccess_embeddeddb_performancetest)) + +# vim: set noet sw=4 ts=4: diff --git a/dbaccess/Module_dbaccess.mk b/dbaccess/Module_dbaccess.mk index ce439c0..e9eb146 100644 --- a/dbaccess/Module_dbaccess.mk +++ b/dbaccess/Module_dbaccess.mk @@ -47,6 +47,16 @@ $(eval $(call gb_Module_add_check_targets,dbaccess,\ )) endif +# This runs a suite of peformance tests on embedded firebird and HSQLDB. +# Instructions on running the test can be found in qa/unit/embeddedb_performancetest +ifeq ($(ENABLE_FIREBIRD_SDBC),TRUE) +ifeq ($(ENABLE_JAVA),TRUE) +$(eval $(call gb_Module_add_check_targets,dbaccess,\ + CppunitTest_dbaccess_embeddeddb_performancetest \ +)) +endif +endif + # disable test because it still fails in some situations # CppunitTest_dbaccess_macros_test \ # diff --git a/dbaccess/qa/unit/embeddeddb_performancetest.cxx b/dbaccess/qa/unit/embeddeddb_performancetest.cxx new file mode 100644 index 0000000..7d51102 --- /dev/null +++ b/dbaccess/qa/unit/embeddeddb_performancetest.cxx @@ -0,0 +1,274 @@ +/* -*- 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 "dbtest_base.cxx" + +#include <boost/scoped_ptr.hpp> +#include <osl/file.hxx> +#include <osl/process.h> +#include <osl/time.h> +#include <rtl/ustrbuf.hxx> +#include <tools/stream.hxx> + +#include <com/sun/star/sdb/XOfficeDatabaseDocument.hpp> +#include <com/sun/star/sdbc/XColumnLocate.hpp> +#include <com/sun/star/sdbc/XConnection.hpp> +#include <com/sun/star/sdbc/XParameters.hpp> +#include <com/sun/star/sdbc/XPreparedStatement.hpp> +#include <com/sun/star/sdbc/XResultSet.hpp> +#include <com/sun/star/sdbc/XRow.hpp> +#include <com/sun/star/sdbc/XStatement.hpp> + +using namespace ::com::sun::star; +using namespace ::com::sun::star::sdb; +using namespace ::com::sun::star::sdbc; +using namespace ::com::sun::star::uno; + +void normaliseTimeValue(TimeValue* pVal) +{ + pVal->Seconds += pVal->Nanosec / 1000000000; + pVal->Nanosec %= 1000000000; +} + +void getTimeDifference(const TimeValue* pTimeStart, + const TimeValue* pTimeEnd, + TimeValue* pTimeDifference) +{ + // We add 1 second to the nanoseconds to ensure that we get a positive number + // We have to normalise anyway so this doesn't cause any harm. + // (Seconds/Nanosec are both unsigned) + pTimeDifference->Seconds = pTimeEnd->Seconds - pTimeStart->Seconds - 1; + pTimeDifference->Nanosec = 1000000000 + pTimeEnd->Nanosec - pTimeStart->Nanosec; + normaliseTimeValue(pTimeDifference); +} + +OUString getPrintableTimeValue(const TimeValue* pTimeValue) +{ + return OUString::number( + (sal_uInt64(pTimeValue->Seconds) * SAL_CONST_UINT64(1000000000) + + sal_uInt64(pTimeValue->Nanosec))/ 1000000 + ); +} + +/* + * The reccomended way to run this test is: + * 'SAL_LOG="" DBA_PERFTEST=YES make CppunitTest_dbaccess_embeddeddb_performancetest' + * This blocks the unnecessary exception output and show only the performance data. + * + * You also need to create the file dbacess/qa/unit/data/wordlist, one easy way + * of generating a list is using 'aspell dump master > dbacess/qa/unit/data/wordlist' + * + * Note that wordlist cannot have more than 220580 lines, this is due to a hard + * limit in our hsqldb version. + * + * Also note that this unit test "fails" when doing performance testing, this is + * since by default unit test output is hidden, and thus there is no way of + * reading the results. + */ +class EmbeddedDBPerformanceTest + : public DBTestBase +{ +private: + const static OUString our_sEnableTestEnvVar; + + // We store the results and print them at the end due to the amount of warning + // noise present which otherwise obscures the results. + OUStringBuffer m_aOutputBuffer; + + void printTimes(const TimeValue* pTime1, const TimeValue* pTime2, const TimeValue* pTime3); + + void doPerformanceTestOnODB(const OUString& rFileName, const OUString& rDBName); + + void testFirebird(); + void testHSQLDB(); + +public: + void testPerformance(); + + CPPUNIT_TEST_SUITE(EmbeddedDBPerformanceTest); + CPPUNIT_TEST(testPerformance); + CPPUNIT_TEST_SUITE_END(); +}; + +void EmbeddedDBPerformanceTest::printTimes( + const TimeValue* pTime1, + const TimeValue* pTime2, + const TimeValue* pTime3) +{ + m_aOutputBuffer.append( + getPrintableTimeValue(pTime1) + "\t" + + getPrintableTimeValue(pTime2) + "\t" + + getPrintableTimeValue(pTime3) + "\t" + "\n" + ); +} + +const OUString EmbeddedDBPerformanceTest::our_sEnableTestEnvVar("DBA_PERFTEST"); + +// TODO: we probably should create a document from scratch instead? + +void EmbeddedDBPerformanceTest::testPerformance() +{ + OUString sEnabled; + osl_getEnvironment(our_sEnableTestEnvVar.pData, &sEnabled.pData); + + if (sEnabled.isEmpty()) + return; + + m_aOutputBuffer.append("---------------------\n"); + testFirebird(); + m_aOutputBuffer.append("---------------------\n"); + testHSQLDB(); + m_aOutputBuffer.append("---------------------\n"); + + fprintf(stdout, "Performance Test Results:\n"); + fprintf(stdout, "%s", + OUStringToOString(m_aOutputBuffer.makeStringAndClear(), + RTL_TEXTENCODING_UTF8) + .getStr() + ); + + // We want the results printed, but unit test output is only printed on failure + // Hence we deliberately fail the test. + CPPUNIT_ASSERT(false); +} + +void EmbeddedDBPerformanceTest::testFirebird() +{ + doPerformanceTestOnODB("firebird_empty.odb", "Firebird"); + +} + +void EmbeddedDBPerformanceTest::testHSQLDB() +{ + doPerformanceTestOnODB("hsqldb_empty.odb", "HSQLDB"); +} + +/** + * Use an existing .odb to do performance tests on. The database cannot have + * a table of the name PFTESTTABLE. + */ +void EmbeddedDBPerformanceTest::doPerformanceTestOnODB( + const OUString& rFileName, + const OUString& rDBName) +{ + uno::Reference< XOfficeDatabaseDocument > xDocument = + getDocumentForFileName(rFileName); + + uno::Reference< XConnection > xConnection = + getConnectionForDocument(xDocument); + + // Create Table + { + uno::Reference< XStatement > xStatement = xConnection->createStatement(); + CPPUNIT_ASSERT(xStatement.is()); + + // Although not strictly necessary we use quoted identifiers to reflect + // the fact that Base always uses quoted identifiers. + xStatement->execute( + "CREATE TABLE \"PFTESTTABLE\" ( \"ID\" INTEGER NOT NULL PRIMARY KEY " + ", \"STRINGCOLUMNA\" VARCHAR (50) " +// ", \"STRINGCOLUMNB\" VARCHAR (50) " +// ", \"STRINGCOLUMNC\" VARCHAR (50) " +// ", \"STRINGCOLUMND\" VARCHAR (50) " + ")"); + xConnection->commit(); + } + + // Writing test + { + uno::Reference< XPreparedStatement > xPreparedStatement = + xConnection->prepareStatement( + "INSERT INTO \"PFTESTTABLE\" ( \"ID\", " + "\"STRINGCOLUMNA\" " +// ", \"STRINGCOLUMNB\" " +// ", \"STRINGCOLUMNC\" " +// ", \"STRINGCOLUMND\" " + ") VALUES ( ?, ?" +// ", ?, ?, ? " + ")"); + + uno::Reference< XParameters > xParameters(xPreparedStatement, UNO_QUERY_THROW); + + ::boost::scoped_ptr< SvFileStream > pFile(new SvFileStream( + getSrcRootURL() + our_sFilePath + "wordlist", + STREAM_READ)); + + if (!pFile) + { + fprintf(stderr, "Please ensure the wordlist is present\n"); + CPPUNIT_ASSERT(false); + } + + OUString aWord; + sal_Int32 aID = 0; + + TimeValue aStart, aMiddle, aEnd; + osl_getSystemTime(&aStart); + + while (pFile->ReadByteStringLine(aWord, RTL_TEXTENCODING_UTF8)) + { + xParameters->setInt(1, aID++); + xParameters->setString(2, aWord); +// xParameters->setString(3, aWord); +// xParameters->setString(4, aWord); +// xParameters->setString(5, aWord); + xPreparedStatement->execute(); + } + osl_getSystemTime(&aMiddle); + xConnection->commit(); + osl_getSystemTime(&aEnd); + + + TimeValue aTimeInsert, aTimeCommit, aTimeTotal; + getTimeDifference(&aStart, &aMiddle, &aTimeInsert); + getTimeDifference(&aMiddle, &aEnd, &aTimeCommit); + getTimeDifference(&aStart, &aEnd, &aTimeTotal); + m_aOutputBuffer.append("Write to: " + rDBName + "\n"); + printTimes(&aTimeInsert, &aTimeCommit, &aTimeTotal); + + pFile->Close(); + } + + // Read test + { + uno::Reference< XStatement > xStatement = xConnection->createStatement(); + + TimeValue aStart, aMiddle, aEnd; + osl_getSystemTime(&aStart); + + uno::Reference< XResultSet > xResults = xStatement->executeQuery("SELECT * FROM PFTESTTABLE"); + + osl_getSystemTime(&aMiddle); + + uno::Reference< XRow > xRow(xResults, UNO_QUERY_THROW); + + while (xResults->next()) + { + xRow->getString(2); +// xRow->getString(3); +// xRow->getString(4); +// xRow->getString(5); + } + osl_getSystemTime(&aEnd); + + TimeValue aTimeSelect, aTimeIterate, aTimeTotal; + getTimeDifference(&aStart, &aMiddle, &aTimeSelect); + getTimeDifference(&aMiddle, &aEnd, &aTimeIterate); + getTimeDifference(&aStart, &aEnd, &aTimeTotal); + m_aOutputBuffer.append("Read from: " + rDBName + "\n"); + printTimes(&aTimeSelect, &aTimeIterate, &aTimeTotal); + } +} + +CPPUNIT_TEST_SUITE_REGISTRATION(EmbeddedDBPerformanceTest); + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ commit 2fe4dd1e8b5dbcab7e313ad007ea35bf7ff01724 Author: Andrzej J.R. Hunt <andr...@ahunt.org> Date: Mon Sep 16 11:15:45 2013 +0100 Make our_sFilePath protected to allow reuse. Change-Id: Id760cfd196bb25aa1d982efa0b2b47211680c77e diff --git a/dbaccess/qa/unit/dbtest_base.cxx b/dbaccess/qa/unit/dbtest_base.cxx index 4b4e3a3..633a144 100644 --- a/dbaccess/qa/unit/dbtest_base.cxx +++ b/dbaccess/qa/unit/dbtest_base.cxx @@ -27,8 +27,8 @@ class DBTestBase : public ::test::BootstrapFixture , public ::unotest::MacrosTest { -private: - static OUString our_sFilePath; +protected: + static const OUString our_sFilePath; public: virtual void setUp(); virtual void tearDown(); @@ -41,7 +41,7 @@ public: uno::Reference< XOfficeDatabaseDocument >& xDocument); }; -OUString DBTestBase::our_sFilePath("/dbaccess/qa/unit/data/"); +const OUString DBTestBase::our_sFilePath("/dbaccess/qa/unit/data/"); uno::Reference< XOfficeDatabaseDocument > DBTestBase::getDocumentForFileName(OUString sFileName) commit 24320dca8565a1b801dd6cc578e9592dff4d972d Author: Andrzej J.R. Hunt <andr...@ahunt.org> Date: Fri Sep 13 14:00:09 2013 +0100 Implement hsqldb loading test. Change-Id: I7dc6390b1061585054d1fa435414cae245122a1c diff --git a/dbaccess/CppunitTest_dbaccess_hsqldb_test.mk b/dbaccess/CppunitTest_dbaccess_hsqldb_test.mk new file mode 100644 index 0000000..66b4401 --- /dev/null +++ b/dbaccess/CppunitTest_dbaccess_hsqldb_test.mk @@ -0,0 +1,79 @@ +# -*- 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,dbaccess_hsqldb_test)) + +$(eval $(call gb_CppunitTest_use_external,dbaccess_hsqldb_test,boost_headers)) + +$(eval $(call gb_CppunitTest_add_exception_objects,dbaccess_hsqldb_test, \ + dbaccess/qa/unit/hsqldb \ +)) + +$(eval $(call gb_CppunitTest_use_libraries,dbaccess_hsqldb_test, \ + comphelper \ + cppu \ + cppuhelper \ + dbaxml \ + dbtools \ + firebird_sdbc \ + jvmfwk \ + sal \ + subsequenttest \ + utl \ + test \ + tk \ + unotest \ + xo \ + $(gb_UWINAPI) \ +)) + +$(eval $(call gb_CppunitTest_use_api,dbaccess_hsqldb_test,\ + offapi \ + oovbaapi \ + udkapi \ +)) + +$(eval $(call gb_CppunitTest_use_ure,dbaccess_hsqldb_test)) + +$(eval $(call gb_CppunitTest_use_components,dbaccess_hsqldb_test,\ + basic/util/sb \ + comphelper/util/comphelp \ + configmgr/source/configmgr \ + connectivity/source/cpool/dbpool2 \ + connectivity/source/drivers/hsqldb/hsqldb \ + connectivity/source/drivers/jdbc/jdbc \ + connectivity/source/manager/sdbc2 \ + dbaccess/util/dba \ + dbaccess/source/filter/xml/dbaxml \ + dbaccess/util/dbu \ + fileaccess/source/fileacc \ + filter/source/config/cache/filterconfig1 \ + framework/util/fwk \ + i18npool/util/i18npool \ + linguistic/source/lng \ + package/source/xstor/xstor \ + package/util/package2 \ + sax/source/expatwrap/expwrap \ + sfx2/util/sfx \ + svl/source/fsstor/fsstorage \ + svl/util/svl \ + toolkit/util/tk \ + ucb/source/core/ucb1 \ + ucb/source/ucp/file/ucpfile1 \ + unotools/util/utl \ + xmloff/util/xo \ +)) + +$(eval $(call gb_CppunitTest_use_configuration,dbaccess_hsqldb_test)) + +$(eval $(call gb_CppunitTest_use_filter_configuration,dbaccess_hsqldb_test)) + +$(eval $(call gb_CppunitTest_use_unittest_configuration,dbaccess_hsqldb_test)) + +# vim: set noet sw=4 ts=4: diff --git a/dbaccess/Module_dbaccess.mk b/dbaccess/Module_dbaccess.mk index eb1dbbc..ce439c0 100644 --- a/dbaccess/Module_dbaccess.mk +++ b/dbaccess/Module_dbaccess.mk @@ -41,6 +41,11 @@ $(eval $(call gb_Module_add_check_targets,dbaccess,\ CppunitTest_dbaccess_dialog_save \ )) +ifeq ($(ENABLE_JAVA),TRUE) +$(eval $(call gb_Module_add_check_targets,dbaccess,\ + CppunitTest_dbaccess_hsqldb_test \ +)) +endif # disable test because it still fails in some situations # CppunitTest_dbaccess_macros_test \ diff --git a/dbaccess/qa/unit/data/hsqldb_empty.odb b/dbaccess/qa/unit/data/hsqldb_empty.odb new file mode 100644 index 0000000..087c261 Binary files /dev/null and b/dbaccess/qa/unit/data/hsqldb_empty.odb differ diff --git a/dbaccess/qa/unit/hsqldb.cxx b/dbaccess/qa/unit/hsqldb.cxx new file mode 100644 index 0000000..5ac7b45 --- /dev/null +++ b/dbaccess/qa/unit/hsqldb.cxx @@ -0,0 +1,52 @@ +/* -*- 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 "dbtest_base.cxx" + +#include <com/sun/star/sdb/XOfficeDatabaseDocument.hpp> +#include <com/sun/star/sdbc/XColumnLocate.hpp> +#include <com/sun/star/sdbc/XConnection.hpp> +#include <com/sun/star/sdbc/XResultSet.hpp> +#include <com/sun/star/sdbc/XRow.hpp> +#include <com/sun/star/sdbc/XStatement.hpp> + +using namespace ::com::sun::star; +using namespace ::com::sun::star::sdb; +using namespace ::com::sun::star::sdbc; +using namespace ::com::sun::star::uno; + +class HSQLDBTest + : public DBTestBase +{ +public: + void testEmptyDBConnection(); + void testIntegerDatabase(); + + CPPUNIT_TEST_SUITE(HSQLDBTest); + CPPUNIT_TEST(testEmptyDBConnection); + CPPUNIT_TEST_SUITE_END(); +}; + +/** + * Test the loading of an "empty" file, i.e. the embedded database has not yet + * been initialised (as occurs when a new .odb is created and opened by base). + */ +void HSQLDBTest::testEmptyDBConnection() +{ + uno::Reference< XOfficeDatabaseDocument > xDocument = + getDocumentForFileName("hsqldb_empty.odb"); + + getConnectionForDocument(xDocument); +} + +CPPUNIT_TEST_SUITE_REGISTRATION(HSQLDBTest); + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ commit 1301f29e108fa5ba1e59c7c1fedf907a75756d15 Author: Andrzej J.R. Hunt <andr...@ahunt.org> Date: Fri Sep 13 09:47:55 2013 +0100 Silence some (irrelevant) exceptions in firebird unit test. Change-Id: I0639b2c69f5f111e37e5566bf4cbea6719de8789 diff --git a/dbaccess/CppunitTest_dbaccess_firebird_test.mk b/dbaccess/CppunitTest_dbaccess_firebird_test.mk index 4237e0d..9d4173c 100644 --- a/dbaccess/CppunitTest_dbaccess_firebird_test.mk +++ b/dbaccess/CppunitTest_dbaccess_firebird_test.mk @@ -37,6 +37,7 @@ $(eval $(call gb_CppunitTest_use_api,dbaccess_firebird_test,\ $(eval $(call gb_CppunitTest_use_ure,dbaccess_firebird_test)) $(eval $(call gb_CppunitTest_use_components,dbaccess_firebird_test,\ + basic/util/sb \ comphelper/util/comphelp \ configmgr/source/configmgr \ connectivity/source/drivers/firebird/firebird_sdbc \ @@ -58,6 +59,7 @@ $(eval $(call gb_CppunitTest_use_components,dbaccess_firebird_test,\ toolkit/util/tk \ ucb/source/core/ucb1 \ ucb/source/ucp/file/ucpfile1 \ + unotools/util/utl \ xmloff/util/xo \ )) _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits