summaryrefslogtreecommitdiff
path: root/dbaccess
diff options
context:
space:
mode:
authorTamas Bunth <tamas.bunth@collabora.co.uk>2018-03-11 11:54:36 +0100
committerTamás Bunth <btomi96@gmail.com>2018-03-11 16:58:47 +0100
commit813296d4a21163ffba86f1f4c0bec6ddb0511e6c (patch)
tree50cddaea21ff1b4fbf4c43c2a54dd9920f1047e6 /dbaccess
parent7fbb96c2fbf99c47eca6f493f54fc3974f55cf86 (diff)
dbahsql: import DATE and DATETIME columns
Change-Id: Ibfd9340fad40efab891cba5b77ce3496424a3525 Reviewed-on: https://gerrit.libreoffice.org/51076 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Tamás Bunth <btomi96@gmail.com>
Diffstat (limited to 'dbaccess')
-rw-r--r--dbaccess/source/filter/hsqldb/fbcreateparser.cxx4
-rw-r--r--dbaccess/source/filter/hsqldb/hsqlimport.cxx23
-rw-r--r--dbaccess/source/filter/hsqldb/rowinputbinary.cxx34
3 files changed, 53 insertions, 8 deletions
diff --git a/dbaccess/source/filter/hsqldb/fbcreateparser.cxx b/dbaccess/source/filter/hsqldb/fbcreateparser.cxx
index f69580423cf2..b92be4af6812 100644
--- a/dbaccess/source/filter/hsqldb/fbcreateparser.cxx
+++ b/dbaccess/source/filter/hsqldb/fbcreateparser.cxx
@@ -113,7 +113,9 @@ OUString FbCreateStmtParser::compose() const
lcl_appendWithSpace(sSql, lcl_DataTypetoFbTypeName(columnIter->getDataType()));
const std::vector<sal_Int32> params = columnIter->getParams();
- if (params.size() > 0)
+
+ // Firebird SQL dialect does not like paremeters for TIMESTAMP
+ if (params.size() > 0 && columnIter->getDataType() != DataType::TIMESTAMP)
{
sSql.append("(");
auto it = params.cbegin();
diff --git a/dbaccess/source/filter/hsqldb/hsqlimport.cxx b/dbaccess/source/filter/hsqldb/hsqlimport.cxx
index 7f6426231b06..95f7de3a878a 100644
--- a/dbaccess/source/filter/hsqldb/hsqlimport.cxx
+++ b/dbaccess/source/filter/hsqldb/hsqlimport.cxx
@@ -22,6 +22,7 @@
#include <com/sun/star/uno/Exception.hpp>
#include <com/sun/star/io/XInputStream.hpp>
#include <com/sun/star/io/WrongFormatException.hpp>
+#include <com/sun/star/util/Date.hpp>
#include <com/sun/star/sdbc/XConnection.hpp>
#include <com/sun/star/sdbc/XParameters.hpp>
@@ -154,8 +155,14 @@ void lcl_setParams(const RowVector& row, Reference<XParameters>& xParam,
}
break;
case DataType::DATE:
- // TODO
- break;
+ {
+ css::util::Date date;
+ if (row.at(i) >>= date)
+ {
+ xParam->setDate(i + 1, date);
+ }
+ }
+ break;
case DataType::TIME:
{
css::util::Time time;
@@ -163,11 +170,17 @@ void lcl_setParams(const RowVector& row, Reference<XParameters>& xParam,
{
xParam->setTime(i + 1, time);
}
- break;
}
+ break;
case DataType::TIMESTAMP:
- // TODO
- break;
+ {
+ css::util::DateTime dateTime;
+ if (row.at(i) >>= dateTime)
+ {
+ xParam->setTimestamp(i + 1, dateTime);
+ }
+ }
+ break;
case DataType::BOOLEAN:
{
bool bVal = false;
diff --git a/dbaccess/source/filter/hsqldb/rowinputbinary.cxx b/dbaccess/source/filter/hsqldb/rowinputbinary.cxx
index 0bcd0109e304..7b6fd4eff94c 100644
--- a/dbaccess/source/filter/hsqldb/rowinputbinary.cxx
+++ b/dbaccess/source/filter/hsqldb/rowinputbinary.cxx
@@ -22,10 +22,13 @@
#include <com/sun/star/io/WrongFormatException.hpp>
#include <com/sun/star/io/XConnectable.hpp>
#include <com/sun/star/util/Time.hpp>
+#include <com/sun/star/util/Date.hpp>
+#include <com/sun/star/util/DateTime.hpp>
#include <unotools/ucbstreamhelper.hxx>
#include <tools/stream.hxx>
#include <rtl/ustrbuf.hxx>
+#include <ctime>
namespace
{
@@ -299,7 +302,16 @@ std::vector<Any> HsqlRowInputStream::readOneRow(const ColumnTypeVector& nColType
}
break;
case DataType::DATE:
- break;
+ {
+ sal_Int64 value = 0;
+ m_pStream->ReadInt64(value); // in millisec, from 1970
+ sal_Int64 nEpochSec = value / 1000;
+ std::tm* tm = std::gmtime(&nEpochSec);
+ css::util::Date date(tm->tm_mday, tm->tm_mon + 1,
+ tm->tm_year + 1900); // day, month, year
+ aData.push_back(makeAny(date));
+ }
+ break;
case DataType::TIME:
{
sal_Int64 value = 0;
@@ -309,7 +321,25 @@ std::vector<Any> HsqlRowInputStream::readOneRow(const ColumnTypeVector& nColType
}
break;
case DataType::TIMESTAMP:
- break;
+ {
+ sal_Int64 nEpochMillis = 0;
+ m_pStream->ReadInt64(nEpochMillis);
+ sal_Int64 nEpochSec = nEpochMillis / 1000;
+ std::tm* tm = std::gmtime(&nEpochSec);
+
+ sal_Int32 nNanos = 0;
+ m_pStream->ReadInt32(nNanos);
+ css::util::DateTime dateTime;
+ dateTime.NanoSeconds = nNanos;
+ dateTime.Seconds = tm->tm_sec;
+ dateTime.Minutes = tm->tm_min;
+ dateTime.Hours = tm->tm_hour;
+ dateTime.Day = tm->tm_mday;
+ dateTime.Month = tm->tm_mon + 1; // indexed from 0
+ dateTime.Year = 1900 + tm->tm_year;
+ aData.push_back(makeAny(dateTime));
+ }
+ break;
case DataType::BOOLEAN:
{
sal_uInt8 nBool = 0;