提交 aa9087a0 编写于 作者: S serge-rider

#9293 Export as SQL: support native fetch in native date/time format

上级 f5ec3da3
......@@ -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
......
......@@ -164,7 +164,7 @@
<propertyGroup label="%dataTransfer.processor.sql.propertyGroup.general.label">
<property id="includeAutoGenerated" label="%dataTransfer.processor.sql.property.includeAutoGenerated.label" description="%dataTransfer.processor.sql.property.includeAutoGenerated.description" type="boolean" defaultValue="false"/>
<property id="extension" label="%dataTransfer.processor.sql.property.extension.label" type="string" defaultValue="sql"/>
<property id="format" label="%dataTransfer.processor.xml.property.format.label" type="string" defaultValue="native" validValues="ui,edit,native"/>
<property id="nativeFormat" label="%dataTransfer.processor.sql.property.nativeFormat.name" type="boolean" description="%dataTransfer.processor.sql.property.nativeFormat.description" defaultValue="true" />
<property id="omitSchema" label="%dataTransfer.processor.sql.property.omitSchema.name" type="boolean" description="%dataTransfer.processor.sql.property.omitSchema.description" required="false" defaultValue="false"/>
<property id="rowsInStatement" label="%dataTransfer.processor.sql.property.rowsInStatement.name" type="integer" description="%dataTransfer.processor.sql.property.rowsInStatement.description" defaultValue="10" required="true"/>
</propertyGroup>
......
......@@ -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;
......
......@@ -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) {
......
......@@ -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:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册