summaryrefslogtreecommitdiff
path: root/dbaccess
diff options
context:
space:
mode:
authorAndrzej J.R. Hunt <andrzej@ahunt.org>2013-09-17 15:34:36 +0100
committerAndrzej J.R. Hunt <andrzej@ahunt.org>2013-09-27 18:09:18 +0100
commit7c87a5383ae03df0f9ad0e39cfbd6f83645a659a (patch)
tree32b502dbc3e9f36e120a8f4baf59d72585d1fe5a /dbaccess
parent2fe4dd1e8b5dbcab7e313ad007ea35bf7ff01724 (diff)
Implement firebird/hsqldb performance comparison test.
Change-Id: Iaf28b0fcb04ee713ccae6a593e56653eac6e2eba
Diffstat (limited to 'dbaccess')
-rw-r--r--dbaccess/CppunitTest_dbaccess_embeddeddb_performancetest.mk81
-rw-r--r--dbaccess/Module_dbaccess.mk10
-rw-r--r--dbaccess/qa/unit/embeddeddb_performancetest.cxx274
3 files changed, 365 insertions, 0 deletions
diff --git a/dbaccess/CppunitTest_dbaccess_embeddeddb_performancetest.mk b/dbaccess/CppunitTest_dbaccess_embeddeddb_performancetest.mk
new file mode 100644
index 000000000000..a20712b7981c
--- /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 ce439c042a0b..e9eb146a6ddc 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 000000000000..7d511029a59b
--- /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: */