Kaydet (Commit) 4d7dd4e1 authored tarafından Terrence Enger's avatar Terrence Enger Kaydeden (comit) Tamás Bunth

tdf#119625: coerce migrated Time between 0 and 24 hours

    Coincidentally, remove unwarranted addition of one hour
    Added unit test dbaccess_tdf119625

Change-Id: I84a47c7abd4ab8e2c80d3faaf8cf4f11e1b81df3
Reviewed-on: https://gerrit.libreoffice.org/60048
Tested-by: Jenkins
Reviewed-by: 's avatarTamás Bunth <btomi96@gmail.com>
Tested-by: 's avatarTamás Bunth <btomi96@gmail.com>
üst 2606f2bc
# -*- 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_tdf119625))
$(eval $(call gb_CppunitTest_add_exception_objects,dbaccess_tdf119625, \
dbaccess/qa/unit/tdf119625 \
))
$(eval $(call gb_CppunitTest_use_libraries,dbaccess_tdf119625, \
basegfx \
comphelper \
cppu \
cppuhelper \
dba \
dbahsql \
dbu \
sdbt \
drawinglayer \
editeng \
for \
forui \
i18nlangtag \
msfilter \
oox \
sal \
salhelper \
sax \
sb \
sfx \
sot \
svl \
svt \
svx \
svxcore \
test \
subsequenttest \
tl \
tk \
ucbhelper \
unotest \
utl \
vbahelper \
vcl \
xo \
))
$(eval $(call gb_CppunitTest_use_ure,dbaccess_tdf119625))
$(eval $(call gb_CppunitTest_use_vcl,dbaccess_tdf119625))
$(eval $(call gb_CppunitTest_set_include,dbaccess_tdf119625,\
-I$(SRCDIR)/dbaccess/source/filter/hsqldb \
$$(INCLUDE) \
))
$(eval $(call gb_CppunitTest_use_api,dbaccess_tdf119625,\
offapi \
oovbaapi \
udkapi \
))
$(eval $(call gb_CppunitTest_use_components,dbaccess_tdf119625,\
basic/util/sb \
comphelper/util/comphelp \
configmgr/source/configmgr \
connectivity/source/drivers/hsqldb/hsqldb \
connectivity/source/drivers/firebird/firebird_sdbc \
connectivity/source/manager/sdbc2 \
dbaccess/util/dba \
dbaccess/util/dbu \
dbaccess/util/sdbt \
dbaccess/source/filter/xml/dbaxml \
filter/source/config/cache/filterconfig1 \
forms/util/frm \
framework/util/fwk \
i18npool/util/i18npool \
linguistic/source/lng \
oox/util/oox \
package/source/xstor/xstor \
package/util/package2 \
sax/source/expatwrap/expwrap \
scripting/source/basprov/basprov \
scripting/util/scriptframe \
sfx2/util/sfx \
sot/util/sot \
svl/source/fsstor/fsstorage \
svl/util/svl \
toolkit/util/tk \
ucb/source/core/ucb1 \
ucb/source/ucp/file/ucpfile1 \
ucb/source/ucp/tdoc/ucptdoc1 \
unotools/util/utl \
unoxml/source/rdf/unordf \
unoxml/source/service/unoxml \
uui/util/uui \
xmloff/util/xo \
))
$(eval $(call gb_CppunitTest_use_configuration,dbaccess_tdf119625))
# vim: set noet sw=4 ts=4:
......@@ -46,6 +46,7 @@ $(eval $(call gb_Module_add_check_targets,dbaccess,\
endif
$(eval $(call gb_Module_add_check_targets,dbaccess,\
CppunitTest_dbaccess_firebird_test \
CppunitTest_dbaccess_tdf119625 \
))
endif
......
/* -*- 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 <hsqlimport.hxx>
#include <osl/process.h>
#include <cppunit/plugin/TestPlugIn.h>
#include <com/sun/star/sdbc/DataType.hpp>
#include <com/sun/star/sdbc/XRow.hpp>
#include <cppunit/TestFixture.h>
#include <cppunit/extensions/HelperMacros.h>
#include <test/unoapi_test.hxx>
#include <svtools/miscopt.hxx>
#include <com/sun/star/util/Time.hpp>
using namespace dbahsql;
class Tdf119625Test : public DBTestBase
{
public:
void testTime();
virtual void setUp() override;
CPPUNIT_TEST_SUITE(Tdf119625Test);
CPPUNIT_TEST(testTime);
CPPUNIT_TEST_SUITE_END();
};
void Tdf119625Test::setUp()
{
DBTestBase::setUp();
SvtMiscOptions aMiscOptions;
osl_setEnvironment(OUString{ "DBACCESS_HSQL_MIGRATION" }.pData, OUString{ "1" }.pData);
}
struct expect_t
{
sal_Int16 id;
sal_Int16 h, m, s;
};
/* The values here assume that our results are in UTC. However,
tdf#119675 "Firebird: Migration: User dialog to set treatment of
datetime and time values during migration" is going to change the
finaly result of migration. If that change is implemented below
the level we are testing, this test will have to allow for or set
the destination timezone.
*/
static const expect_t expect[]
= { { 0, 15, 10, 10 }, { 1, 23, 30, 30 }, { 2, 5, 0, 0 }, { 3, 4, 30, 0 },
{ 4, 3, 15, 10 }, { 5, 5, 0, 0 }, { 6, 3, 22, 22 } };
void Tdf119625Test::testTime()
{
uno::Reference<XOfficeDatabaseDocument> xDocument = getDocumentForFileName("tdf119625.odb");
uno::Reference<XConnection> xConnection = getConnectionForDocument(xDocument);
// at this point migration is already done
/* In the presence of tdf#119625, terminal already has messages
*value exceeds the range for a valid time
caused by
'isc_dsql_execute'
warn:dbaccess:22435:22435:dbaccess/source/filter/hsqldb/hsqlimport.cxx:373: Error during migratio
In this case, we do not expect anything good from the following
code, but I (tje, 2018-09-04) do not know how to detect this
situation. In particular, the migration has been observed to
create the destination table (but truncated after the first
row), and xConnection.is() returns true.
*/
// select basically everything from the .odb
uno::Reference<XStatement> statement = xConnection->createStatement();
OUString sql{ " SELECT id, tst_dt, tst_d, tst_t "
" FROM tst_data "
"ORDER BY id" };
uno::Reference<XResultSet> xRes = statement->executeQuery(sql);
uno::Reference<XRow> xRow(xRes, UNO_QUERY_THROW);
// check result
for (auto& e : expect)
{
CPPUNIT_ASSERT(xRes->next());
CPPUNIT_ASSERT_EQUAL(xRow->getShort(1), e.id);
auto time_got = xRow->getTime(4);
auto time_expected = com::sun::star::util::Time(0, e.s, e.m, e.h, false);
auto equal_times = time_got == time_expected;
CPPUNIT_ASSERT(equal_times);
}
CPPUNIT_ASSERT(!xRes->next());
closeDocument(uno::Reference<lang::XComponent>(xDocument, uno::UNO_QUERY));
}
CPPUNIT_TEST_SUITE_REGISTRATION(Tdf119625Test);
CPPUNIT_PLUGIN_IMPLEMENT();
......@@ -333,15 +333,13 @@ std::vector<Any> HsqlRowInputStream::readOneRow(const ColumnTypeVector& nColType
sal_Int64 value = 0;
m_pStream->ReadInt64(value);
auto valueInSecs = value / 1000;
sal_uInt16 nHours = 0;
// in negative case value is comprised between
// -24 * 60 * 60 and -1
// so add 24 * 60 * 60 in order the rest of calculus is ok
if (valueInSecs < 0)
valueInSecs += 24 * 60 * 60;
else
nHours = (valueInSecs / 3600) + 1;
/* Observed valueInSecs fall in the range from
negative one day to positive two days. Coerce
valueInSecs between zero and positive one day.*/
const int secPerDay = 24 * 60 * 60;
valueInSecs = (valueInSecs + secPerDay) % secPerDay;
auto nHours = valueInSecs / (60 * 60);
valueInSecs = valueInSecs % 3600;
const sal_uInt16 nMins = valueInSecs / 60;
const sal_uInt16 nSecs = valueInSecs % 60;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment