From aa9087a0d397584a3098bf20897ac82934cf5cda Mon Sep 17 00:00:00 2001 From: serge-rider Date: Sat, 26 Sep 2020 10:50:16 +0300 Subject: [PATCH] #9293 Export as SQL: support native fetch in native date/time format --- .../OSGI-INF/l10n/bundle.properties | 2 ++ .../plugin.xml | 2 +- .../stream/exporter/DataExporterSQL.java | 32 ++++++++++--------- .../OracleTemporalAccessorValueHandler.java | 15 +++++++++ .../data/OracleTimestampValueHandler.java | 14 ++++++++ 5 files changed, 49 insertions(+), 16 deletions(-) diff --git a/plugins/org.jkiss.dbeaver.data.transfer/OSGI-INF/l10n/bundle.properties b/plugins/org.jkiss.dbeaver.data.transfer/OSGI-INF/l10n/bundle.properties index 7bf6cf3854..f51d9b11fd 100644 --- a/plugins/org.jkiss.dbeaver.data.transfer/OSGI-INF/l10n/bundle.properties +++ b/plugins/org.jkiss.dbeaver.data.transfer/OSGI-INF/l10n/bundle.properties @@ -74,6 +74,8 @@ dataTransfer.processor.sql.property.omitSchema.name=Omit schema name dataTransfer.processor.sql.property.omitSchema.description=Omit schema/catalog name in INSERT statements dataTransfer.processor.sql.property.rowsInStatement.name=Data rows per statement dataTransfer.processor.sql.property.rowsInStatement.description=Number of data rows per single insert statement +dataTransfer.processor.sql.property.nativeFormat.name=Native date/time format +dataTransfer.processor.sql.property.nativeFormat.description=Use native date/time format in INSERT statements dataTransfer.processor.xml.name=XML dataTransfer.processor.xml.description=Export to XML file(s) dataTransfer.processor.xml.propertyGroup.general.label = General diff --git a/plugins/org.jkiss.dbeaver.data.transfer/plugin.xml b/plugins/org.jkiss.dbeaver.data.transfer/plugin.xml index b9fa3d18d3..df6d2b7568 100644 --- a/plugins/org.jkiss.dbeaver.data.transfer/plugin.xml +++ b/plugins/org.jkiss.dbeaver.data.transfer/plugin.xml @@ -164,7 +164,7 @@ - + diff --git a/plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/stream/exporter/DataExporterSQL.java b/plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/stream/exporter/DataExporterSQL.java index 4a1f458a7b..4b1934eee4 100644 --- a/plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/stream/exporter/DataExporterSQL.java +++ b/plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/stream/exporter/DataExporterSQL.java @@ -48,12 +48,14 @@ public class DataExporterSQL extends StreamExporterAbstract { private static final String PROP_INCLUDE_AUTO_GENERATED = "includeAutoGenerated"; private static final String PROP_OMIT_SCHEMA = "omitSchema"; private static final String PROP_ROWS_IN_STATEMENT = "rowsInStatement"; + private static final String PROP_DATA_FORMAT = "nativeFormat"; private static final char STRING_QUOTE = '\''; private boolean includeAutoGenerated; private String rowDelimiter; private boolean omitSchema; private int rowsInStatement; + private boolean useNativeDataFormat = true; private String tableName; private DBDAttributeBinding[] columns; @@ -67,8 +69,7 @@ public class DataExporterSQL extends StreamExporterAbstract { } @Override - public void init(IStreamDataExporterSite site) throws DBException - { + public void init(IStreamDataExporterSite site) throws DBException { super.init(site); if (site.getProperties().containsKey(PROP_INCLUDE_AUTO_GENERATED)) { @@ -82,19 +83,23 @@ public class DataExporterSQL extends StreamExporterAbstract { } catch (NumberFormatException e) { rowsInStatement = 10; } + useNativeDataFormat = CommonUtils.toBoolean(site.getProperties().get(PROP_DATA_FORMAT)); rowDelimiter = GeneralUtils.getDefaultLineSeparator(); dialect = SQLUtils.getDialectFromObject(site.getSource()); } @Override - public void dispose() - { + public void dispose() { super.dispose(); } @Override - public void exportHeader(DBCSession session) throws DBException, IOException - { + public void exportHeader(DBCSession session) throws DBException, IOException { + if (useNativeDataFormat) { + if (session instanceof DBDFormatSettingsExt) { + ((DBDFormatSettingsExt) session).setUseNativeDateTimeFormat(true); + } + } columns = getSite().getAttributes(); DBPNamedObject source = getSite().getSource(); tableName = DTUtils.getTableName(session.getDataSource(), source, omitSchema); @@ -103,8 +108,7 @@ public class DataExporterSQL extends StreamExporterAbstract { } @Override - public void exportRow(DBCSession session, DBCResultSet resultSet, Object[] row) throws DBException, IOException - { + public void exportRow(DBCSession session, DBCResultSet resultSet, Object[] row) throws DBException, IOException { PrintWriter out = getWriter(); SQLDialect.MultiValueInsertMode insertMode = rowsInStatement == 1 ? SQLDialect.MultiValueInsertMode.NOT_SUPPORTED : getMultiValueInsertMode(); if (insertMode == SQLDialect.MultiValueInsertMode.NOT_SUPPORTED) { @@ -168,7 +172,7 @@ public class DataExporterSQL extends StreamExporterAbstract { // just skip it out.write(SQLConstants.NULL_VALUE); } else if (row[i] instanceof DBDContent) { - DBDContent content = (DBDContent)row[i]; + DBDContent content = (DBDContent) row[i]; try { if (column.getValueHandler() instanceof DBDContentValueHandler) { ((DBDContentValueHandler) column.getValueHandler()).writeStreamValue(session.getProgressMonitor(), session.getDataSource(), column, content, out); @@ -193,7 +197,7 @@ public class DataExporterSQL extends StreamExporterAbstract { } } else if (value instanceof File) { out.write("@"); - out.write(((File)value).getAbsolutePath()); + out.write(((File) value).getAbsolutePath()); } else { out.write(SQLUtils.convertValueToSQL(session.getDataSource(), column, row[i])); } @@ -225,8 +229,7 @@ public class DataExporterSQL extends StreamExporterAbstract { } } - private void writeStringValue(String value) - { + private void writeStringValue(String value) { PrintWriter out = getWriter(); out.write(STRING_QUOTE); if (dialect != null) { @@ -237,14 +240,13 @@ public class DataExporterSQL extends StreamExporterAbstract { out.write(STRING_QUOTE); } - private void writeStringValue(Reader reader) throws IOException - { + private void writeStringValue(Reader reader) throws IOException { try { PrintWriter out = getWriter(); out.write(STRING_QUOTE); // Copy reader char buffer[] = new char[2000]; - for (;;) { + for (; ; ) { int count = reader.read(buffer); if (count <= 0) { break; diff --git a/plugins/org.jkiss.dbeaver.ext.oracle/src/org/jkiss/dbeaver/ext/oracle/data/OracleTemporalAccessorValueHandler.java b/plugins/org.jkiss.dbeaver.ext.oracle/src/org/jkiss/dbeaver/ext/oracle/data/OracleTemporalAccessorValueHandler.java index 826da151d5..2ec7bd3ddd 100644 --- a/plugins/org.jkiss.dbeaver.ext.oracle/src/org/jkiss/dbeaver/ext/oracle/data/OracleTemporalAccessorValueHandler.java +++ b/plugins/org.jkiss.dbeaver.ext.oracle/src/org/jkiss/dbeaver/ext/oracle/data/OracleTemporalAccessorValueHandler.java @@ -16,9 +16,11 @@ */ package org.jkiss.dbeaver.ext.oracle.data; +import org.jkiss.code.NotNull; import org.jkiss.code.Nullable; import org.jkiss.dbeaver.ext.oracle.model.OracleConstants; import org.jkiss.dbeaver.model.data.DBDDataFormatter; +import org.jkiss.dbeaver.model.data.DBDDisplayFormat; import org.jkiss.dbeaver.model.data.DBDFormatSettings; import org.jkiss.dbeaver.model.impl.jdbc.data.handlers.JDBCTemporalAccessorValueHandler; import org.jkiss.dbeaver.model.struct.DBSTypedObject; @@ -40,6 +42,19 @@ public class OracleTemporalAccessorValueHandler extends JDBCTemporalAccessorValu super(formatSettings); } + @NotNull + @Override + public String getValueDisplayString(@NotNull DBSTypedObject column, Object value, @NotNull DBDDisplayFormat format) { + if (format == DBDDisplayFormat.NATIVE && value instanceof String) { + if (!((String) value).startsWith("TIMESTAMP")) { + return "TIMESTAMP'" + value + "'"; + } else { + return (String) value; + } + } + return super.getValueDisplayString(column, value, format); + } + @Nullable @Override public DateTimeFormatter getNativeValueFormat(DBSTypedObject type) { diff --git a/plugins/org.jkiss.dbeaver.ext.oracle/src/org/jkiss/dbeaver/ext/oracle/data/OracleTimestampValueHandler.java b/plugins/org.jkiss.dbeaver.ext.oracle/src/org/jkiss/dbeaver/ext/oracle/data/OracleTimestampValueHandler.java index 406bb91e02..0d02956602 100644 --- a/plugins/org.jkiss.dbeaver.ext.oracle/src/org/jkiss/dbeaver/ext/oracle/data/OracleTimestampValueHandler.java +++ b/plugins/org.jkiss.dbeaver.ext.oracle/src/org/jkiss/dbeaver/ext/oracle/data/OracleTimestampValueHandler.java @@ -20,6 +20,7 @@ import org.jkiss.code.NotNull; import org.jkiss.code.Nullable; import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.ext.oracle.model.OracleConstants; +import org.jkiss.dbeaver.model.data.DBDDisplayFormat; import org.jkiss.dbeaver.model.data.DBDFormatSettings; import org.jkiss.dbeaver.model.exec.DBCException; import org.jkiss.dbeaver.model.exec.DBCSession; @@ -65,6 +66,19 @@ public class OracleTimestampValueHandler extends JDBCDateTimeValueHandler { return super.getValueFromObject(session, type, object, copy, validateValue); } + @NotNull + @Override + public String getValueDisplayString(@NotNull DBSTypedObject column, Object value, @NotNull DBDDisplayFormat format) { + if (format == DBDDisplayFormat.NATIVE && value instanceof String) { + if (!((String) value).startsWith("TIMESTAMP")) { + return "TIMESTAMP'" + value + "'"; + } else { + return (String) value; + } + } + return super.getValueDisplayString(column, value, format); + } + private static Object getTimestampReadMethod(Class aClass, Connection connection, Object object) throws Exception { switch (aClass.getName()) { case OracleConstants.TIMESTAMP_CLASS_NAME: -- GitLab