diff --git a/plugins/org.jkiss.dbeaver.data.transfer.ui/src/org/jkiss/dbeaver/tools/transfer/ui/pages/database/DatabaseConsumerPageMapping.java b/plugins/org.jkiss.dbeaver.data.transfer.ui/src/org/jkiss/dbeaver/tools/transfer/ui/pages/database/DatabaseConsumerPageMapping.java index dee7a5508d9d9ac4b93ac6e2996d15c696e90443..8cc49036081b936cdc230638396febf4eda0c834 100644 --- a/plugins/org.jkiss.dbeaver.data.transfer.ui/src/org/jkiss/dbeaver/tools/transfer/ui/pages/database/DatabaseConsumerPageMapping.java +++ b/plugins/org.jkiss.dbeaver.data.transfer.ui/src/org/jkiss/dbeaver/tools/transfer/ui/pages/database/DatabaseConsumerPageMapping.java @@ -34,7 +34,6 @@ import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.model.*; import org.jkiss.dbeaver.model.app.DBPProject; import org.jkiss.dbeaver.model.edit.DBEPersistAction; -import org.jkiss.dbeaver.model.exec.DBCException; import org.jkiss.dbeaver.model.exec.DBCExecutionContext; import org.jkiss.dbeaver.model.exec.DBCSession; import org.jkiss.dbeaver.model.impl.DBObjectNameCaseTransformer; @@ -164,7 +163,7 @@ public class DatabaseConsumerPageMapping extends ActiveWizardPage targetAttributes = targetEntity.getAttributes(monitor); + if (source instanceof StreamDataImporterColumnInfo && targetAttributes != null && source.getOrdinalPosition() < targetAttributes.size()) { + StreamDataImporterColumnInfo source = (StreamDataImporterColumnInfo) this.source; + DBSEntityAttribute targetAttribute = targetAttributes.get(source.getOrdinalPosition()); + source.setDataKind(targetAttribute.getDataKind()); + if (!source.isMappingMetadataPresent()) { + targetName = targetAttribute.getName(); + } + } + this.target = DBUtils.findObject(targetAttributes, DBUtils.getUnQuotedIdentifier(targetEntity.getDataSource(), targetName), true); if (this.target != null) { mappingType = DatabaseMappingType.existing; } else { diff --git a/plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/database/DatabaseTransferProducer.java b/plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/database/DatabaseTransferProducer.java index 1db4da2fc107322b73fdc292f15a739231d06be4..e870e95f10bb5a7fda0ee00233ed6a3ca6c50826 100644 --- a/plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/database/DatabaseTransferProducer.java +++ b/plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/database/DatabaseTransferProducer.java @@ -37,6 +37,8 @@ import org.jkiss.dbeaver.model.sql.SQLScriptElement; import org.jkiss.dbeaver.model.sql.data.SQLQueryDataContainer; import org.jkiss.dbeaver.model.struct.DBSDataContainer; import org.jkiss.dbeaver.model.struct.DBSEntity; +import org.jkiss.dbeaver.model.struct.rdb.DBSCatalog; +import org.jkiss.dbeaver.model.struct.rdb.DBSSchema; import org.jkiss.dbeaver.model.task.DBTTask; import org.jkiss.dbeaver.model.task.DBTaskUtils; import org.jkiss.dbeaver.runtime.DBWorkbench; @@ -289,9 +291,21 @@ public class DatabaseTransferProducer implements IDataTransferProducer properties, String propName) { - String delimString = String.valueOf(properties.get(propName)); - if (delimString == null || delimString.isEmpty()) { - delimString = String.valueOf(DEF_DELIMITER); + String delimString = CommonUtils.toString(properties.get(propName), null); + if (CommonUtils.isEmpty(delimString)) { + return DEF_DELIMITER; } else { - delimString = delimString + return delimString .replace("\\t", "\t") .replace("\\n", "\n") .replace("\\r", "\r"); } - return delimString; } } diff --git a/plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/stream/importer/DataImporterCSV.java b/plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/stream/importer/DataImporterCSV.java index eb3e0fa9dc0024604aee32435cd3fe8a1a44ef97..ee3df39adcd67a756d104c48d09a92f0a0603cae 100644 --- a/plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/stream/importer/DataImporterCSV.java +++ b/plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/stream/importer/DataImporterCSV.java @@ -19,6 +19,7 @@ package org.jkiss.dbeaver.tools.transfer.stream.importer; import au.com.bytecode.opencsv.CSVReader; import org.jkiss.code.NotNull; import org.jkiss.dbeaver.DBException; +import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.model.DBPDataKind; import org.jkiss.dbeaver.model.DBPDataSource; import org.jkiss.dbeaver.model.DBUtils; @@ -31,6 +32,7 @@ import org.jkiss.dbeaver.tools.transfer.IDataTransferConsumer; import org.jkiss.dbeaver.tools.transfer.stream.*; import org.jkiss.dbeaver.utils.GeneralUtils; import org.jkiss.utils.CommonUtils; +import org.jkiss.utils.Pair; import java.io.*; import java.util.ArrayList; @@ -41,6 +43,7 @@ import java.util.Map; * CSV importer */ public class DataImporterCSV extends StreamImporterAbstract { + private static final Log log = Log.getLog(DataImporterCSV.class); private static final String PROP_ENCODING = "encoding"; private static final String PROP_HEADER = "header"; @@ -49,8 +52,16 @@ public class DataImporterCSV extends StreamImporterAbstract { private static final String PROP_NULL_STRING = "nullString"; private static final String PROP_EMPTY_STRING_NULL = "emptyStringNull"; private static final String PROP_ESCAPE_CHAR = "escapeChar"; + private static final int MAX_COLUMN_LENGTH = 1024; - enum HeaderPosition { + private static final int MAX_DATA_TYPE_SAMPLES = 1000; + private static final Pair DATA_TYPE_UNKNOWN = new Pair<>(DBPDataKind.UNKNOWN, null); + private static final Pair DATA_TYPE_INTEGER = new Pair<>(DBPDataKind.NUMERIC, "INTEGER"); + private static final Pair DATA_TYPE_REAL = new Pair<>(DBPDataKind.NUMERIC, "REAL"); + private static final Pair DATA_TYPE_BOOLEAN = new Pair<>(DBPDataKind.BOOLEAN, "BOOLEAN"); + private static final Pair DATA_TYPE_STRING = new Pair<>(DBPDataKind.STRING, "VARCHAR"); + + public enum HeaderPosition { none, top, } @@ -67,26 +78,62 @@ public class DataImporterCSV extends StreamImporterAbstract { try (Reader reader = openStreamReader(inputStream, processorProperties)) { try (CSVReader csvReader = openCSVReader(reader, processorProperties)) { - for (;;) { - String[] line = csvReader.readNext(); - if (line == null) { - break; + String[] header = getNextLine(csvReader); + if (header == null) { + return columnsInfo; + } + + for (int i = 0; i < header.length; i++) { + String column = header[i]; + if (headerPosition == HeaderPosition.none) { + column = "Column" + (i + 1); + } else { + column = DBUtils.getUnQuotedIdentifier(entityMapping.getDataSource(), column); } - if (line.length == 0) { - continue; + StreamDataImporterColumnInfo columnInfo = new StreamDataImporterColumnInfo(entityMapping, i, column, null, MAX_COLUMN_LENGTH, DBPDataKind.UNKNOWN); + columnInfo.setMappingMetadataPresent(headerPosition != HeaderPosition.none); + columnsInfo.add(columnInfo); + } + + for (int sample = 0; sample < MAX_DATA_TYPE_SAMPLES; sample++) { + String[] line; + + if (sample == 0 && headerPosition == HeaderPosition.none) { + // Include first line (header that does not exist) for sampling + line = header; + } else { + line = getNextLine(csvReader); + if (line == null) { + break; + } } - for (int i = 0; i < line.length; i++) { - String column = line[i]; - if (headerPosition == HeaderPosition.none) { - column = "Column" + (i + 1); - } else { - column = DBUtils.getUnQuotedIdentifier(entityMapping.getDataSource(), column); + + for (int i = 0; i < Math.min(line.length, header.length); i++) { + Pair dataType = getDataType(line[i]); + StreamDataImporterColumnInfo columnInfo = columnsInfo.get(i); + + switch (dataType.getFirst()) { + case STRING: + columnInfo.setDataKind(dataType.getFirst()); + columnInfo.setTypeName(dataType.getSecond()); + break; + case NUMERIC: + case BOOLEAN: + if (columnInfo.getDataKind() == DBPDataKind.UNKNOWN) { + columnInfo.setDataKind(dataType.getFirst()); + columnInfo.setTypeName(dataType.getSecond()); + } + break; } - columnsInfo.add( - new StreamDataImporterColumnInfo( - entityMapping, i, column, "VARCHAR", 1024, DBPDataKind.STRING)); } - break; + } + + for (StreamDataImporterColumnInfo columnInfo : columnsInfo) { + if (columnInfo.getDataKind() == DBPDataKind.UNKNOWN) { + log.warn("Cannot guess data type for column '" + columnInfo.getName() + "', defaulting to VARCHAR"); + columnInfo.setDataKind(DBPDataKind.STRING); + columnInfo.setTypeName("VARCHAR"); + } } } } catch (IOException e) { @@ -118,6 +165,43 @@ public class DataImporterCSV extends StreamImporterAbstract { return new InputStreamReader(inputStream, encoding); } + private String[] getNextLine(CSVReader csvReader) throws IOException { + while (true) { + String[] line = csvReader.readNext(); + if (line == null) { + return null; + } + if (line.length == 0) { + continue; + } + return line; + } + } + + private Pair getDataType(String value) { + if (CommonUtils.isEmpty(value)) { + return DATA_TYPE_UNKNOWN; + } + + try { + Integer.parseInt(value); + return DATA_TYPE_INTEGER; + } catch (NumberFormatException ignored) { + } + + try { + Double.parseDouble(value); + return DATA_TYPE_REAL; + } catch (NumberFormatException ignored) { + } + + if (value.equalsIgnoreCase("true") || value.equalsIgnoreCase("false")) { + return DATA_TYPE_BOOLEAN; + } + + return DATA_TYPE_STRING; + } + @Override public void runImport(@NotNull DBRProgressMonitor monitor, @NotNull DBPDataSource streamDataSource, @NotNull InputStream inputStream, @NotNull IDataTransferConsumer consumer) throws DBException { IStreamDataImporterSite site = getSite(); diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql/plugin.xml b/plugins/org.jkiss.dbeaver.ext.postgresql/plugin.xml index adedc37096d64a6235e37b2f141bc098a5dd579b..649f154b3d159e93e55675a39f455dfa4ad0b2d3 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql/plugin.xml +++ b/plugins/org.jkiss.dbeaver.ext.postgresql/plugin.xml @@ -126,7 +126,7 @@ - + diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreTable.java b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreTable.java index 2439324ea6f08091f2016dedd3abc55763eeb88c..c20451fafcf0b3aa05bb1b0c30b1bcf2de349270 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreTable.java +++ b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreTable.java @@ -417,16 +417,16 @@ public abstract class PostgreTable extends PostgreTableReal implements PostgreTa @Nullable @Association - public Collection getPartitions(DBRProgressMonitor monitor) throws DBException { + public List getPartitions(DBRProgressMonitor monitor) throws DBException { final List si = getSubInheritance(monitor); if (CommonUtils.isEmpty(si)) { return null; } - List result = new ArrayList<>(si.size()); - for (int i1 = 0; i1 < si.size(); i1++) { - PostgreTableBase table = si.get(i1).getParentObject(); - if (table.isPartition()) { - result.add(table); + List result = new ArrayList<>(si.size()); + for (PostgreTableInheritance postgreTableInheritance : si) { + PostgreTableBase table = postgreTableInheritance.getParentObject(); + if (table instanceof PostgreTablePartition) { + result.add((PostgreTablePartition) table); } } return result; diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/data/PostgreArrayValueHandler.java b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/data/PostgreArrayValueHandler.java index 31cefc92622be1075aafbf2af42c065cfab80d1d..18594044696cbe2cf3849a7922b72901f0bdab5f 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/data/PostgreArrayValueHandler.java +++ b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/data/PostgreArrayValueHandler.java @@ -133,6 +133,10 @@ public class PostgreArrayValueHandler extends JDBCArrayValueHandler { @NotNull @Override public String getValueDisplayString(@NotNull DBSTypedObject column, Object value, @NotNull DBDDisplayFormat format) { + return convertArrayToString(column, value, format, false); + } + + private String convertArrayToString(@NotNull DBSTypedObject column, Object value, @NotNull DBDDisplayFormat format, boolean nested) { if (!DBUtils.isNullValue(value) && value instanceof DBDCollection) { DBDCollection collection = (DBDCollection) value; boolean isNativeFormat = format == DBDDisplayFormat.NATIVE; @@ -140,7 +144,7 @@ public class PostgreArrayValueHandler extends JDBCArrayValueHandler { DBDValueHandler valueHandler = collection.getComponentValueHandler(); StringBuilder str = new StringBuilder(); - if (isNativeFormat) { + if (isNativeFormat && !nested) { str.append("'"); } str.append("{"); @@ -152,21 +156,21 @@ public class PostgreArrayValueHandler extends JDBCArrayValueHandler { String itemString; if (item instanceof JDBCCollection) { // Multi-dimensional arrays case - itemString = getValueDisplayString(column, item, format); + itemString = convertArrayToString(column, item, format, true); } else { itemString = valueHandler.getValueDisplayString(collection.getComponentType(), item, format); } - if (isNativeFormat && isStringArray) str.append('"'); - if (format == DBDDisplayFormat.NATIVE) { + if (isNativeFormat) { + if (item instanceof String) str.append('"'); str.append(SQLUtils.escapeString(collection.getComponentType().getDataSource(), itemString)); + if (item instanceof String) str.append('"'); } else { str.append(itemString); } - if (isNativeFormat && isStringArray) str.append('"'); } str.append("}"); - if (format == DBDDisplayFormat.NATIVE) { + if (isNativeFormat && !nested) { str.append("'"); } diff --git a/plugins/org.jkiss.dbeaver.net.ssh.jsch/src/org/jkiss/dbeaver/model/net/ssh/SSHImplementationJsch.java b/plugins/org.jkiss.dbeaver.net.ssh.jsch/src/org/jkiss/dbeaver/model/net/ssh/SSHImplementationJsch.java index b17b29bde7713eff9b45e40521871f3363bc7d9e..aefbfc6cfbbda84818fe7363ce3457b0dd7b178b 100644 --- a/plugins/org.jkiss.dbeaver.net.ssh.jsch/src/org/jkiss/dbeaver/model/net/ssh/SSHImplementationJsch.java +++ b/plugins/org.jkiss.dbeaver.net.ssh.jsch/src/org/jkiss/dbeaver/model/net/ssh/SSHImplementationJsch.java @@ -164,7 +164,7 @@ public class SSHImplementationJsch extends SSHImplementationAbstract { * algorithm will fail if the 'ssh-keygen' cannot be found (#5845) */ if (header.equals("-----BEGIN OPENSSH PRIVATE KEY-----")) { - log.debug("Attempting to convert unsupported key"); + log.debug("Attempting to convert an unsupported key into suitable format"); String id = dataSource != null ? dataSource.getId() : "profile"; File dir = DBWorkbench.getPlatform().getTempFolder(monitor, "openssh-pkey"); @@ -176,10 +176,11 @@ public class SSHImplementationJsch extends SSHImplementationAbstract { .command( "ssh-keygen", "-p", + "-P", '"' + (CommonUtils.isEmpty(password) ? "" : password) + '"', + "-N", '"' + (CommonUtils.isEmpty(password) ? "" : password) + '"', "-m", "PEM", "-f", tmp.getAbsolutePath(), - "-q", - "-N", '"' + (CommonUtils.isEmpty(password) ? "" : password) + '"') + "-q") .start(); try { diff --git a/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetFilterContentAdapter.java b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetFilterContentAdapter.java index f6d36afe5b683c61345584598efaf8eaedb9d5ea..1e84c23bddb6c739f69dee746069ae7b41265d76 100644 --- a/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetFilterContentAdapter.java +++ b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetFilterContentAdapter.java @@ -47,7 +47,7 @@ public class ResultSetFilterContentAdapter extends StyledTextContentAdapter { for (int i = selection.x - 1; i >= 0; i--) { String prefix = curValue.substring(i, selection.x); if (contentsUC.startsWith(prefix)) { - if (i == 0 || curValue.substring(i - 1, selection.x).startsWith(" ")) { + if (i == 0 || !Character.isJavaIdentifierPart(curValue.charAt(i - 1))) { text.setSelection(i, selection.x); break; } diff --git a/plugins/org.jkiss.dbeaver.ui.editors.sql/OSGI-INF/l10n/bundle.properties b/plugins/org.jkiss.dbeaver.ui.editors.sql/OSGI-INF/l10n/bundle.properties index c1c93d7b37a45cf58d536c8c61c35339502564af..5fa1517dffae44e1acff0139ee762c945a788404 100644 --- a/plugins/org.jkiss.dbeaver.ui.editors.sql/OSGI-INF/l10n/bundle.properties +++ b/plugins/org.jkiss.dbeaver.ui.editors.sql/OSGI-INF/l10n/bundle.properties @@ -155,17 +155,19 @@ colorDefinition.org.jkiss.dbeaver.sql.editor.color.disabled.background.label = S colorDefinition.org.jkiss.dbeaver.sql.editor.color.disabled.background.description = SQL text background page.org.jkiss.dbeaver.preferences.main.sqleditor.name = SQL Editor -page.org.jkiss.dbeaver.preferences.main.sql.completion.name = SQL Completion / Folding -page.org.jkiss.dbeaver.preferences.main.sql.format.name = SQL Formatting -page.org.jkiss.dbeaver.preferences.main.sql.dialects.name = SQL Dialect Settings +page.org.jkiss.dbeaver.preferences.main.sql.completion.name = Code Completion +page.org.jkiss.dbeaver.preferences.main.sql.codeeditor.name = Code Editor +page.org.jkiss.dbeaver.preferences.main.sql.format.name = Formatting +page.org.jkiss.dbeaver.preferences.main.sql.dialects.name = Dialect Settings page.org.jkiss.dbeaver.preferences.main.sql.resources.name = Scripts page.org.jkiss.dbeaver.preferences.main.sqlexecute.name = SQL Processing page.org.jkiss.dbeaver.preferences.main.sql.templates.name = Templates -pref.page.name.sql.completion = SQL Completion pref.page.name.sql.editor = SQL Editor -pref.page.name.sql.dialects = SQL Dialects +pref.page.name.sql.completion = Code Completion +pref.page.name.sql.codeeditor = Code Editor +pref.page.name.sql.dialects = Dialects pref.page.name.sql.execute = SQL Processing -pref.page.name.sql.format = SQL Formatting +pref.page.name.sql.format = Formatting pref.page.name.sql.resources = Scripts pref.page.name.sql.templates = Templates diff --git a/plugins/org.jkiss.dbeaver.ui.editors.sql/OSGI-INF/l10n/bundle_ru.properties b/plugins/org.jkiss.dbeaver.ui.editors.sql/OSGI-INF/l10n/bundle_ru.properties index 1258e7715682fb06f729c507ac8273f48c1acc09..7a0c10a7919fbc2543e94fa000855bf226a186c6 100644 --- a/plugins/org.jkiss.dbeaver.ui.editors.sql/OSGI-INF/l10n/bundle_ru.properties +++ b/plugins/org.jkiss.dbeaver.ui.editors.sql/OSGI-INF/l10n/bundle_ru.properties @@ -103,13 +103,15 @@ sql.plan.view.simple.name=\u041F\u0440\u043E\u0441\u0442\u043E\u0439 sql.plan.view.simple.tip=\u041F\u0440\u043E\u0441\u0442\u043E\u0435 \u043F\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u043F\u043B\u0430\u043D\u0430 \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u044F page.org.jkiss.dbeaver.preferences.main.sqleditor.name = \u0420\u0435\u0434\u0430\u043A\u0442\u043E\u0440 SQL -page.org.jkiss.dbeaver.preferences.main.sql.completion.name = \u0414\u043E\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u0435 SQL -page.org.jkiss.dbeaver.preferences.main.sql.format.name = \u0424\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435 SQL +page.org.jkiss.dbeaver.preferences.main.sql.completion.name = \u0410\u0432\u0442\u043E-\u0434\u043E\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u0435 +page.org.jkiss.dbeaver.preferences.main.sql.codeeditor.name = \u0420\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u043A\u043E\u0434\u0430 +page.org.jkiss.dbeaver.preferences.main.sql.format.name = \u0424\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435 page.org.jkiss.dbeaver.preferences.main.sqlexecute.name = \u0412\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u0435 SQL page.org.jkiss.dbeaver.preferences.main.sql.templates.name = \u0428\u0430\u0431\u043B\u043E\u043D\u044B pref.page.name.sql.editor = \u0420\u0435\u0434\u0430\u043A\u0442\u043E\u0440 SQL -pref.page.name.sql.execute = \u0412\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u0435 \u0437\u0430\u043F\u0440\u043E\u0441\u043E\u0432 -pref.page.name.sql.format = \u0424\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435 SQL -pref.page.name.sql.completion = \u0410\u0432\u0442\u043E-\u0434\u043E\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u0435 SQL -pref.page.name.sql.resources = \u0421\u043A\u0440\u0438\u043F\u0442\u044B SQL +pref.page.name.sql.codeeditor = \u0420\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u043A\u043E\u0434\u0430 +pref.page.name.sql.execute = \u0412\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u0435 SQL +pref.page.name.sql.format = \u0424\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435 +pref.page.name.sql.completion = \u0410\u0432\u0442\u043E-\u0434\u043E\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u0435 +pref.page.name.sql.resources = \u0421\u043A\u0440\u0438\u043F\u0442\u044B diff --git a/plugins/org.jkiss.dbeaver.ui.editors.sql/plugin.xml b/plugins/org.jkiss.dbeaver.ui.editors.sql/plugin.xml index 3b1a9105ae6c7ab83d0b0cecfb3e2e4192e7382f..ad7bb3afe6d38e52e03b273b9a91d0737c9c6e39 100644 --- a/plugins/org.jkiss.dbeaver.ui.editors.sql/plugin.xml +++ b/plugins/org.jkiss.dbeaver.ui.editors.sql/plugin.xml @@ -878,6 +878,9 @@ + + + @@ -915,6 +918,10 @@ --> + + + + diff --git a/plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/SQLEditorBase.java b/plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/SQLEditorBase.java index 5f0e1bbebeb0a09805b25825ef95cd2e57038d8c..dce5f93beee05e4da3f3270a427c2a0e7578ea60 100644 --- a/plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/SQLEditorBase.java +++ b/plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/SQLEditorBase.java @@ -70,6 +70,7 @@ import org.jkiss.dbeaver.ui.editors.sql.syntax.SQLRuleScanner; import org.jkiss.dbeaver.ui.editors.sql.templates.SQLTemplatesPage; import org.jkiss.dbeaver.ui.editors.sql.util.SQLSymbolInserter; import org.jkiss.dbeaver.ui.editors.text.BaseTextEditor; +import org.jkiss.utils.ArrayUtils; import org.jkiss.utils.CommonUtils; import org.jkiss.utils.Pair; @@ -159,6 +160,8 @@ public abstract class SQLEditorBase extends BaseTextEditor implements DBPContext setKeyBindingScopes(getKeyBindingContexts()); //$NON-NLS-1$ completionContext = new SQLEditorCompletionContext(this); + + DBWorkbench.getPlatform().getPreferenceStore().addPropertyChangeListener(this); } @Override @@ -474,6 +477,7 @@ public abstract class SQLEditorBase extends BaseTextEditor implements DBPContext @Override public void dispose() { + DBWorkbench.getPlatform().getPreferenceStore().removePropertyChangeListener(this); this.occurrencesHighlighter.dispose(); /* if (this.activationListener != null) { @@ -737,15 +741,15 @@ public abstract class SQLEditorBase extends BaseTextEditor implements DBPContext protected String[] collectContextMenuPreferencePages() { String[] ids = super.collectContextMenuPreferencePages(); - String[] more = new String[ids.length + 6]; - more[ids.length] = PrefPageSQLEditor.PAGE_ID; - more[ids.length + 1] = PrefPageSQLExecute.PAGE_ID; - more[ids.length + 2] = PrefPageSQLCompletion.PAGE_ID; - more[ids.length + 3] = PrefPageSQLFormat.PAGE_ID; - more[ids.length + 4] = PrefPageSQLResources.PAGE_ID; - more[ids.length + 5] = PrefPageSQLTemplates.PAGE_ID; - System.arraycopy(ids, 0, more, 0, ids.length); - return more; + return ArrayUtils.concatArrays(ids, new String[] { + PrefPageSQLEditor.PAGE_ID, + PrefPageSQLExecute.PAGE_ID, + PrefPageSQLCodeEditing.PAGE_ID, + PrefPageSQLCompletion.PAGE_ID, + PrefPageSQLFormat.PAGE_ID, + PrefPageSQLResources.PAGE_ID, + PrefPageSQLTemplates.PAGE_ID + }); } @Override @@ -868,6 +872,11 @@ public abstract class SQLEditorBase extends BaseTextEditor implements DBPContext sourceViewer.unconfigure(); annotationModel.removeAllAnnotations(); sourceViewer.configure(configuration); + return; + case SQLPreferenceConstants.MARK_OCCURRENCES_UNDER_CURSOR: + case SQLPreferenceConstants.MARK_OCCURRENCES_FOR_SELECTION: + occurrencesHighlighter.updateInput(getEditorInput()); + return; } } diff --git a/plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/preferences/PrefPageSQLCodeEditing.java b/plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/preferences/PrefPageSQLCodeEditing.java new file mode 100644 index 0000000000000000000000000000000000000000..bb1d12395a74a2ab084a3fee37e9c88c6c87ecfd --- /dev/null +++ b/plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/preferences/PrefPageSQLCodeEditing.java @@ -0,0 +1,166 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2020 DBeaver Corp and others + * Copyright (C) 2011-2012 Eugene Fradkin (eugene.fradkin@gmail.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jkiss.dbeaver.ui.editors.sql.preferences; + +import org.eclipse.core.runtime.IAdaptable; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.ui.IWorkbench; +import org.eclipse.ui.IWorkbenchPreferencePage; +import org.eclipse.ui.IWorkbenchPropertyPage; +import org.jkiss.dbeaver.Log; +import org.jkiss.dbeaver.model.preferences.DBPPreferenceStore; +import org.jkiss.dbeaver.runtime.DBWorkbench; +import org.jkiss.dbeaver.ui.UIUtils; +import org.jkiss.dbeaver.ui.editors.sql.SQLPreferenceConstants; +import org.jkiss.dbeaver.ui.editors.sql.internal.SQLEditorMessages; +import org.jkiss.dbeaver.ui.preferences.AbstractPrefPage; +import org.jkiss.dbeaver.utils.PrefUtils; + +/** + * PrefPageSQLCodeEditing + */ +public class PrefPageSQLCodeEditing extends AbstractPrefPage implements IWorkbenchPreferencePage, IWorkbenchPropertyPage +{ + private static final Log log = Log.getLog(PrefPageSQLCodeEditing.class); + + public static final String PAGE_ID = "org.jkiss.dbeaver.preferences.main.sql.codeeditor"; //$NON-NLS-1$ + + // Folding + private Button csFoldingEnabled; + // Highlighting + private Button csMarkOccurrencesUnderCursor; + private Button csMarkOccurrencesForSelection; + // Auto-close + private Button acSingleQuotesCheck; + private Button acDoubleQuotesCheck; + private Button acBracketsCheck; + // Auto-Format + private Button afKeywordCase; + private Button afExtractFromSource; + + + public PrefPageSQLCodeEditing() + { + super(); + } + + @Override + protected Control createContents(Composite parent) { + Composite composite = UIUtils.createComposite(parent, 1); + + // Folding + { + Composite foldingGroup = UIUtils.createControlGroup(composite, SQLEditorMessages.pref_page_sql_completion_group_misc, 2, GridData.VERTICAL_ALIGN_BEGINNING | GridData.HORIZONTAL_ALIGN_BEGINNING, 0); + + csMarkOccurrencesUnderCursor = UIUtils.createCheckbox(foldingGroup, SQLEditorMessages.pref_page_sql_completion_label_mark_occurrences, SQLEditorMessages.pref_page_sql_completion_label_mark_occurrences_tip, false, 2); + csMarkOccurrencesForSelection = UIUtils.createCheckbox(foldingGroup, SQLEditorMessages.pref_page_sql_completion_label_mark_occurrences_for_selections, SQLEditorMessages.pref_page_sql_completion_label_mark_occurrences_for_selections_tip, false, 2); + csFoldingEnabled = UIUtils.createCheckbox(foldingGroup, SQLEditorMessages.pref_page_sql_completion_label_folding_enabled, SQLEditorMessages.pref_page_sql_completion_label_folding_enabled_tip, false, 2); + } + + // Autoclose + { + Composite acGroup = UIUtils.createControlGroup(composite, SQLEditorMessages.pref_page_sql_format_group_auto_close, 1, GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.VERTICAL_ALIGN_BEGINNING, 0); + + acSingleQuotesCheck = UIUtils.createCheckbox(acGroup, SQLEditorMessages.pref_page_sql_format_label_single_quotes, false); + acDoubleQuotesCheck = UIUtils.createCheckbox(acGroup, SQLEditorMessages.pref_page_sql_format_label_double_quotes, false); + acBracketsCheck = UIUtils.createCheckbox(acGroup, SQLEditorMessages.pref_page_sql_format_label_brackets, false); + } + + { + // Formatting + Composite afGroup = UIUtils.createControlGroup(composite, SQLEditorMessages.pref_page_sql_format_group_auto_format, 1, GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.VERTICAL_ALIGN_BEGINNING, 0); + afKeywordCase = UIUtils.createCheckbox( + afGroup, + SQLEditorMessages.pref_page_sql_format_label_convert_keyword_case, + SQLEditorMessages.pref_page_sql_format_label_convert_keyword_case_tip, + false, 1); + afExtractFromSource = UIUtils.createCheckbox( + afGroup, + SQLEditorMessages.pref_page_sql_format_label_extract_sql_from_source_code, + SQLEditorMessages.pref_page_sql_format_label_extract_sql_from_source_code_tip, false, 1); + } + + performDefaults(); + + return composite; + } + + @Override + protected void performDefaults() + { + DBPPreferenceStore store = DBWorkbench.getPlatform().getPreferenceStore(); + try { + csFoldingEnabled.setSelection(store.getBoolean(SQLPreferenceConstants.FOLDING_ENABLED)); + csMarkOccurrencesUnderCursor.setSelection(store.getBoolean(SQLPreferenceConstants.MARK_OCCURRENCES_UNDER_CURSOR)); + csMarkOccurrencesForSelection.setSelection(store.getBoolean(SQLPreferenceConstants.MARK_OCCURRENCES_FOR_SELECTION)); + + acSingleQuotesCheck.setSelection(store.getBoolean(SQLPreferenceConstants.SQLEDITOR_CLOSE_SINGLE_QUOTES)); + acDoubleQuotesCheck.setSelection(store.getBoolean(SQLPreferenceConstants.SQLEDITOR_CLOSE_DOUBLE_QUOTES)); + acBracketsCheck.setSelection(store.getBoolean(SQLPreferenceConstants.SQLEDITOR_CLOSE_BRACKETS)); + + afKeywordCase.setSelection(store.getBoolean(SQLPreferenceConstants.SQL_FORMAT_KEYWORD_CASE_AUTO)); + afExtractFromSource.setSelection(store.getBoolean(SQLPreferenceConstants.SQL_FORMAT_EXTRACT_FROM_SOURCE)); + } catch (Exception e) { + log.warn(e); + } + } + + @Override + public boolean performOk() + { + DBPPreferenceStore store = DBWorkbench.getPlatform().getPreferenceStore(); + try { + store.setValue(SQLPreferenceConstants.FOLDING_ENABLED, csFoldingEnabled.getSelection()); + store.setValue(SQLPreferenceConstants.MARK_OCCURRENCES_UNDER_CURSOR, csMarkOccurrencesUnderCursor.getSelection()); + store.setValue(SQLPreferenceConstants.MARK_OCCURRENCES_FOR_SELECTION, csMarkOccurrencesForSelection.getSelection()); + + store.setValue(SQLPreferenceConstants.SQLEDITOR_CLOSE_SINGLE_QUOTES, acSingleQuotesCheck.getSelection()); + store.setValue(SQLPreferenceConstants.SQLEDITOR_CLOSE_DOUBLE_QUOTES, acDoubleQuotesCheck.getSelection()); + store.setValue(SQLPreferenceConstants.SQLEDITOR_CLOSE_BRACKETS, acBracketsCheck.getSelection()); + + store.setValue(SQLPreferenceConstants.SQL_FORMAT_KEYWORD_CASE_AUTO, afKeywordCase.getSelection()); + store.setValue(SQLPreferenceConstants.SQL_FORMAT_EXTRACT_FROM_SOURCE, afExtractFromSource.getSelection()); + } catch (Exception e) { + log.warn(e); + } + PrefUtils.savePreferenceStore(store); + + PrefUtils.savePreferenceStore(store); + + return super.performOk(); + } + + @Override + public void init(IWorkbench workbench) { + + } + + @Override + public IAdaptable getElement() { + return null; + } + + @Override + public void setElement(IAdaptable element) { + + } + +} \ No newline at end of file diff --git a/plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/preferences/PrefPageSQLCompletion.java b/plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/preferences/PrefPageSQLCompletion.java index 602abe583cc5d714963317c43c680db44ff2d4a7..6188d309a844080206a6f860777f653623bbbe97 100644 --- a/plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/preferences/PrefPageSQLCompletion.java +++ b/plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/preferences/PrefPageSQLCompletion.java @@ -33,7 +33,7 @@ import org.jkiss.dbeaver.ui.preferences.TargetPrefPage; import org.jkiss.dbeaver.utils.PrefUtils; /** - * PrefPageSQLEditor + * PrefPageSQLCompletion */ public class PrefPageSQLCompletion extends TargetPrefPage { @@ -59,14 +59,6 @@ public class PrefPageSQLCompletion extends TargetPrefPage private Button csUseGlobalSearch; private Button csShowColumnProcedures; - // Auto-close - private Button acSingleQuotesCheck; - private Button acDoubleQuotesCheck; - private Button acBracketsCheck; - // Auto-Format - private Button afKeywordCase; - private Button afExtractFromSource; - public PrefPageSQLCompletion() { super(); @@ -93,13 +85,7 @@ public class PrefPageSQLCompletion extends TargetPrefPage store.contains(SQLPreferenceConstants.PROPOSALS_MATCH_CONTAINS) || store.contains(SQLPreferenceConstants.USE_GLOBAL_ASSISTANT) || store.contains(SQLPreferenceConstants.SHOW_COLUMN_PROCEDURES) || - store.contains(SQLPreferenceConstants.SHOW_SERVER_HELP_TOPICS) || - - store.contains(SQLPreferenceConstants.SQLEDITOR_CLOSE_SINGLE_QUOTES) || - store.contains(SQLPreferenceConstants.SQLEDITOR_CLOSE_DOUBLE_QUOTES) || - store.contains(SQLPreferenceConstants.SQLEDITOR_CLOSE_BRACKETS) || - store.contains(SQLPreferenceConstants.SQL_FORMAT_KEYWORD_CASE_AUTO) || - store.contains(SQLPreferenceConstants.SQL_FORMAT_EXTRACT_FROM_SOURCE) + store.contains(SQLPreferenceConstants.SHOW_SERVER_HELP_TOPICS) ; } @@ -167,28 +153,6 @@ public class PrefPageSQLCompletion extends TargetPrefPage csUseGlobalSearch = UIUtils.createCheckbox(assistGroup, SQLEditorMessages.pref_page_sql_completion_label_use_global_search, SQLEditorMessages.pref_page_sql_completion_label_use_global_search_tip, false, 2); csShowColumnProcedures = UIUtils.createCheckbox(assistGroup, SQLEditorMessages.pref_page_sql_completion_label_show_column_procedures, SQLEditorMessages.pref_page_sql_completion_label_show_column_procedures_tip, false, 2); } - // Autoclose - { - Composite acGroup = UIUtils.createControlGroup(rightPanel, SQLEditorMessages.pref_page_sql_format_group_auto_close, 1, GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING, 0); - - acSingleQuotesCheck = UIUtils.createCheckbox(acGroup, SQLEditorMessages.pref_page_sql_format_label_single_quotes, false); - acDoubleQuotesCheck = UIUtils.createCheckbox(acGroup, SQLEditorMessages.pref_page_sql_format_label_double_quotes, false); - acBracketsCheck = UIUtils.createCheckbox(acGroup, SQLEditorMessages.pref_page_sql_format_label_brackets, false); - } - - { - // Formatting - Composite afGroup = UIUtils.createControlGroup(rightPanel, SQLEditorMessages.pref_page_sql_format_group_auto_format, 1, GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING, 0); - afKeywordCase = UIUtils.createCheckbox( - afGroup, - SQLEditorMessages.pref_page_sql_format_label_convert_keyword_case, - SQLEditorMessages.pref_page_sql_format_label_convert_keyword_case_tip, - false, 1); - afExtractFromSource = UIUtils.createCheckbox( - afGroup, - SQLEditorMessages.pref_page_sql_format_label_extract_sql_from_source_code, - SQLEditorMessages.pref_page_sql_format_label_extract_sql_from_source_code_tip, false, 1); - } return composite; } @@ -216,12 +180,6 @@ public class PrefPageSQLCompletion extends TargetPrefPage csUseGlobalSearch.setSelection(store.getBoolean(SQLPreferenceConstants.USE_GLOBAL_ASSISTANT)); csShowColumnProcedures.setSelection(store.getBoolean(SQLPreferenceConstants.SHOW_COLUMN_PROCEDURES)); - acSingleQuotesCheck.setSelection(store.getBoolean(SQLPreferenceConstants.SQLEDITOR_CLOSE_SINGLE_QUOTES)); - acDoubleQuotesCheck.setSelection(store.getBoolean(SQLPreferenceConstants.SQLEDITOR_CLOSE_DOUBLE_QUOTES)); - acBracketsCheck.setSelection(store.getBoolean(SQLPreferenceConstants.SQLEDITOR_CLOSE_BRACKETS)); - afKeywordCase.setSelection(store.getBoolean(SQLPreferenceConstants.SQL_FORMAT_KEYWORD_CASE_AUTO)); - afExtractFromSource.setSelection(store.getBoolean(SQLPreferenceConstants.SQL_FORMAT_EXTRACT_FROM_SOURCE)); - } catch (Exception e) { log.warn(e); } @@ -248,13 +206,6 @@ public class PrefPageSQLCompletion extends TargetPrefPage store.setValue(SQLPreferenceConstants.PROPOSALS_MATCH_CONTAINS, csMatchContains.getSelection()); store.setValue(SQLPreferenceConstants.USE_GLOBAL_ASSISTANT, csUseGlobalSearch.getSelection()); store.setValue(SQLPreferenceConstants.SHOW_COLUMN_PROCEDURES, csShowColumnProcedures.getSelection()); - - store.setValue(SQLPreferenceConstants.SQLEDITOR_CLOSE_SINGLE_QUOTES, acSingleQuotesCheck.getSelection()); - store.setValue(SQLPreferenceConstants.SQLEDITOR_CLOSE_DOUBLE_QUOTES, acDoubleQuotesCheck.getSelection()); - store.setValue(SQLPreferenceConstants.SQLEDITOR_CLOSE_BRACKETS, acBracketsCheck.getSelection()); - - store.setValue(SQLPreferenceConstants.SQL_FORMAT_KEYWORD_CASE_AUTO, afKeywordCase.getSelection()); - store.setValue(SQLPreferenceConstants.SQL_FORMAT_EXTRACT_FROM_SOURCE, afExtractFromSource.getSelection()); } catch (Exception e) { log.warn(e); } @@ -282,12 +233,6 @@ public class PrefPageSQLCompletion extends TargetPrefPage store.setToDefault(SQLPreferenceConstants.PROPOSALS_MATCH_CONTAINS); store.setToDefault(SQLPreferenceConstants.USE_GLOBAL_ASSISTANT); store.setToDefault(SQLPreferenceConstants.SHOW_COLUMN_PROCEDURES); - - store.setToDefault(SQLPreferenceConstants.SQLEDITOR_CLOSE_SINGLE_QUOTES); - store.setToDefault(SQLPreferenceConstants.SQLEDITOR_CLOSE_DOUBLE_QUOTES); - store.setToDefault(SQLPreferenceConstants.SQLEDITOR_CLOSE_BRACKETS); - store.setToDefault(SQLPreferenceConstants.SQL_FORMAT_KEYWORD_CASE_AUTO); - store.setToDefault(SQLPreferenceConstants.SQL_FORMAT_EXTRACT_FROM_SOURCE); } @Override diff --git a/plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/preferences/PrefPageSQLEditor.java b/plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/preferences/PrefPageSQLEditor.java index a9dcd91a1c6264c80996b4d95a2f3cf7c340ece2..3ee829ee957a9b83430ee15c87ba106988843f08 100644 --- a/plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/preferences/PrefPageSQLEditor.java +++ b/plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/preferences/PrefPageSQLEditor.java @@ -53,10 +53,6 @@ public class PrefPageSQLEditor extends TargetPrefPage private Button autoSaveOnClose; private Button autoSaveActiveSchema; - private Button csFoldingEnabled; - private Button csMarkOccurrencesUnderCursor; - private Button csMarkOccurrencesForSelection; - private Button closeTabOnErrorCheck; private Combo resultsOrientationCombo; @@ -78,9 +74,6 @@ public class PrefPageSQLEditor extends TargetPrefPage store.contains(SQLPreferenceConstants.AUTO_SAVE_ON_EXECUTE) || store.contains(SQLPreferenceConstants.AUTO_SAVE_ACTIVE_SCHEMA) || - store.contains(SQLPreferenceConstants.FOLDING_ENABLED) || - store.contains(SQLPreferenceConstants.MARK_OCCURRENCES_UNDER_CURSOR) || - store.contains(SQLPreferenceConstants.RESULT_SET_CLOSE_ON_ERROR) ; } @@ -113,15 +106,6 @@ public class PrefPageSQLEditor extends TargetPrefPage autoSaveActiveSchema = UIUtils.createCheckbox(autoSaveGroup, SQLEditorMessages.pref_page_sql_editor_label_save_active_schema, false); } - // Folding - { - Composite foldingGroup = UIUtils.createControlGroup(composite, SQLEditorMessages.pref_page_sql_completion_group_misc, 2, GridData.VERTICAL_ALIGN_BEGINNING | GridData.FILL_HORIZONTAL, 0); - - csMarkOccurrencesUnderCursor = UIUtils.createCheckbox(foldingGroup, SQLEditorMessages.pref_page_sql_completion_label_mark_occurrences, SQLEditorMessages.pref_page_sql_completion_label_mark_occurrences_tip, false, 2); - csMarkOccurrencesForSelection = UIUtils.createCheckbox(foldingGroup, SQLEditorMessages.pref_page_sql_completion_label_mark_occurrences_for_selections, SQLEditorMessages.pref_page_sql_completion_label_mark_occurrences_for_selections_tip, false, 2); - csFoldingEnabled = UIUtils.createCheckbox(foldingGroup, SQLEditorMessages.pref_page_sql_completion_label_folding_enabled, SQLEditorMessages.pref_page_sql_completion_label_folding_enabled_tip, false, 2); - } - { Composite layoutGroup = UIUtils.createControlGroup(composite, SQLEditorMessages.pref_page_sql_editor_group_result_view, 2, GridData.FILL_HORIZONTAL, 0); ((GridData)layoutGroup.getLayoutData()).horizontalSpan = 2; @@ -160,10 +144,6 @@ public class PrefPageSQLEditor extends TargetPrefPage saveOnQueryExecution.setSelection(store.getBoolean(SQLPreferenceConstants.AUTO_SAVE_ON_EXECUTE)); autoSaveActiveSchema.setSelection(store.getBoolean(SQLPreferenceConstants.AUTO_SAVE_ACTIVE_SCHEMA)); - csFoldingEnabled.setSelection(store.getBoolean(SQLPreferenceConstants.FOLDING_ENABLED)); - csMarkOccurrencesUnderCursor.setSelection(store.getBoolean(SQLPreferenceConstants.MARK_OCCURRENCES_UNDER_CURSOR)); - csMarkOccurrencesForSelection.setSelection(store.getBoolean(SQLPreferenceConstants.MARK_OCCURRENCES_FOR_SELECTION)); - closeTabOnErrorCheck.setSelection(store.getBoolean(SQLPreferenceConstants.RESULT_SET_CLOSE_ON_ERROR)); SQLEditor.ResultSetOrientation orientation = SQLEditor.ResultSetOrientation.valueOf( DBWorkbench.getPlatform().getPreferenceStore().getString(SQLPreferenceConstants.RESULT_SET_ORIENTATION)); @@ -185,10 +165,6 @@ public class PrefPageSQLEditor extends TargetPrefPage store.setValue(SQLPreferenceConstants.AUTO_SAVE_ON_CLOSE, autoSaveOnClose.getSelection()); store.setValue(SQLPreferenceConstants.AUTO_SAVE_ON_EXECUTE, saveOnQueryExecution.getSelection()); - store.setValue(SQLPreferenceConstants.FOLDING_ENABLED, csFoldingEnabled.getSelection()); - store.setValue(SQLPreferenceConstants.MARK_OCCURRENCES_UNDER_CURSOR, csMarkOccurrencesUnderCursor.getSelection()); - store.setValue(SQLPreferenceConstants.MARK_OCCURRENCES_FOR_SELECTION, csMarkOccurrencesForSelection.getSelection()); - store.setValue(SQLPreferenceConstants.RESULT_SET_CLOSE_ON_ERROR, closeTabOnErrorCheck.getSelection()); String orientationLabel = resultsOrientationCombo.getText(); for (SQLEditor.ResultSetOrientation orientation : SQLEditor.ResultSetOrientation.values()) { @@ -214,10 +190,6 @@ public class PrefPageSQLEditor extends TargetPrefPage store.setToDefault(SQLPreferenceConstants.AUTO_SAVE_ON_CLOSE); store.setToDefault(SQLPreferenceConstants.AUTO_SAVE_ON_EXECUTE); - store.setToDefault(SQLPreferenceConstants.FOLDING_ENABLED); - store.setToDefault(SQLPreferenceConstants.MARK_OCCURRENCES_UNDER_CURSOR); - store.setToDefault(SQLPreferenceConstants.MARK_OCCURRENCES_FOR_SELECTION); - store.setToDefault(SQLPreferenceConstants.RESULT_SET_CLOSE_ON_ERROR); DBWorkbench.getPlatform().getPreferenceStore().setToDefault(SQLPreferenceConstants.RESULT_SET_ORIENTATION); } diff --git a/test/org.jkiss.dbeaver.ext.postgresql.test/src/org/jkiss/dbeaver/ext/postgresql/PostgreValueParserTest.java b/test/org.jkiss.dbeaver.ext.postgresql.test/src/org/jkiss/dbeaver/ext/postgresql/PostgreValueParserTest.java index 0d76d83ab8776283dd7d84fc44b47b2ae1e6c955..533242321200bf6906ba85981070612544ea38b5 100644 --- a/test/org.jkiss.dbeaver.ext.postgresql.test/src/org/jkiss/dbeaver/ext/postgresql/PostgreValueParserTest.java +++ b/test/org.jkiss.dbeaver.ext.postgresql.test/src/org/jkiss/dbeaver/ext/postgresql/PostgreValueParserTest.java @@ -16,9 +16,13 @@ */ package org.jkiss.dbeaver.ext.postgresql; +import org.jkiss.dbeaver.ext.postgresql.model.PostgreDataSource; import org.jkiss.dbeaver.ext.postgresql.model.PostgreDataType; +import org.jkiss.dbeaver.ext.postgresql.model.PostgreDialect; +import org.jkiss.dbeaver.ext.postgresql.model.data.PostgreArrayValueHandler; import org.jkiss.dbeaver.model.DBPDataKind; 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.exec.DBCException; import org.jkiss.dbeaver.model.exec.DBCSession; @@ -44,41 +48,35 @@ import java.util.Locale; @RunWith(MockitoJUnitRunner.class) public class PostgreValueParserTest { + private final PostgreDialect sqlDialect = new PostgreDialect(); + + @Mock + private PostgreDataSource dataSource; @Mock private DBCSession session; @Mock private PostgreDataType arrayDoubleItemType; - @Mock private PostgreDataType arrayIntItemType; - @Mock private PostgreDataType arrayStringItemType; - @Mock private PostgreDataType arrayBooleanItemType; - @Mock private PostgreDataType arrayStructItemType; - @Mock private PostgreDataType stringItemType; - @Mock private PostgreDataType intItemType; - @Mock private PostgreDataType booleanItemType; - @Mock private PostgreDataType doubleItemType; - @Mock private PostgreDataType structItemType; private NumberDataFormatter numberDataFormatter = new NumberDataFormatter(); - @Mock private DataFormatterProfile dataFormatterProfile = new DataFormatterProfile("test_profile", new TestPreferenceStore()); @@ -168,6 +166,20 @@ public class PostgreValueParserTest { PostgreValueParser.generateObjectString(new Object[]{new Double[][]{{1.1, 2.22, 3.333},{1.1, 2.22, 3.333}},"qwerty"})); } + @Test + public void convertArrayToString() { + PostgreArrayValueHandler arrayVH = new PostgreArrayValueHandler(); + String[] stringItems = new String[] { + "one", "two", " four with spaces ", "f{i,v}e" + }; + JDBCCollection array = new JDBCCollection(stringItemType, arrayVH, stringItems); + JDBCCollection array3D = new JDBCCollection(stringItemType, arrayVH, new Object[] { array, array} ); + String arrayString = arrayVH.getValueDisplayString(arrayStringItemType, array, DBDDisplayFormat.NATIVE); + Assert.assertEquals("'{\"one\",\"two\",\" four with spaces \",\"f{i,v}e\"}'", arrayString); + String arrayString3D = arrayVH.getValueDisplayString(arrayStringItemType, array3D, DBDDisplayFormat.NATIVE); + Assert.assertEquals("'{{\"one\",\"two\",\" four with spaces \",\"f{i,v}e\"},{\"one\",\"two\",\" four with spaces \",\"f{i,v}e\"}}'", arrayString3D); + } + @Test public void parseArrayString() { List stringList = new ArrayList<>(); @@ -212,6 +224,7 @@ public class PostgreValueParserTest { } private void setupGeneralWhenMocks() throws Exception { + Mockito.when(dataSource.getSQLDialect()).thenReturn(sqlDialect); Mockito.when(session.getProgressMonitor()).thenReturn(new VoidProgressMonitor()); Mockito.when(intItemType.getFullTypeName()).thenReturn("test_intItemType"); @@ -233,6 +246,7 @@ public class PostgreValueParserTest { Mockito.when(stringItemType.getFullTypeName()).thenReturn("test_stringItemType"); Mockito.when(stringItemType.getDataKind()).thenReturn(DBPDataKind.STRING); Mockito.when(stringItemType.getTypeID()).thenReturn(Types.VARCHAR); + Mockito.when(stringItemType.getDataSource()).thenReturn(dataSource); Mockito.when(arrayStringItemType.getFullTypeName()).thenReturn("test_arrayStringItemType"); Mockito.when(arrayStringItemType.getDataKind()).thenReturn(DBPDataKind.ARRAY); diff --git a/test/org.jkiss.dbeaver.test.platform/META-INF/MANIFEST.MF b/test/org.jkiss.dbeaver.test.platform/META-INF/MANIFEST.MF index dc087a8eb991a90da7ea5d1c024c486253ae0d4f..83ca4ac20e1e346e504192e1f7c1aeecb52c33fd 100644 --- a/test/org.jkiss.dbeaver.test.platform/META-INF/MANIFEST.MF +++ b/test/org.jkiss.dbeaver.test.platform/META-INF/MANIFEST.MF @@ -10,6 +10,7 @@ Require-Bundle: org.eclipse.core.runtime, org.mockito.mockito-all, org.jkiss.dbeaver.model, org.jkiss.dbeaver.model.sql, + org.jkiss.dbeaver.data.transfer, org.jkiss.dbeaver.registry, org.jkiss.dbeaver.headless, org.jkiss.dbeaver.ext.postgresql, diff --git a/test/org.jkiss.dbeaver.test.platform/src/org/jkiss/dbeaver/data/transfer/StreamTransferUtilsTest.java b/test/org.jkiss.dbeaver.test.platform/src/org/jkiss/dbeaver/data/transfer/StreamTransferUtilsTest.java new file mode 100644 index 0000000000000000000000000000000000000000..700b31e8e8f436dfe7f0790da1aa4abd9369c1ce --- /dev/null +++ b/test/org.jkiss.dbeaver.test.platform/src/org/jkiss/dbeaver/data/transfer/StreamTransferUtilsTest.java @@ -0,0 +1,37 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2020 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jkiss.dbeaver.data.transfer; + +import org.jkiss.dbeaver.tools.transfer.stream.StreamTransferUtils; +import org.junit.Assert; +import org.junit.Test; + +import java.util.HashMap; +import java.util.Map; + +public class StreamTransferUtilsTest { + @Test + public void testDelimiterString() { + Map props = new HashMap<>(); + props.put("delimiter", " \\t\\n\\r"); + Assert.assertEquals(" \t\n\r", StreamTransferUtils.getDelimiterString(props, "delimiter")); + props.put("delimiter", ""); + Assert.assertEquals(",", StreamTransferUtils.getDelimiterString(props, "delimiter")); + props.put("delimiter", null); + Assert.assertEquals(",", StreamTransferUtils.getDelimiterString(props, "delimiter")); + } +} diff --git a/test/org.jkiss.dbeaver.test.platform/src/org/jkiss/dbeaver/tools/transfer/CSVImporterTest.java b/test/org.jkiss.dbeaver.test.platform/src/org/jkiss/dbeaver/tools/transfer/CSVImporterTest.java new file mode 100644 index 0000000000000000000000000000000000000000..d146282655e70ac208f88aef2bad9c0f481558ee --- /dev/null +++ b/test/org.jkiss.dbeaver.test.platform/src/org/jkiss/dbeaver/tools/transfer/CSVImporterTest.java @@ -0,0 +1,110 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2020 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jkiss.dbeaver.tools.transfer; + +import org.jkiss.dbeaver.DBException; +import org.jkiss.dbeaver.model.DBPDataKind; +import org.jkiss.dbeaver.tools.transfer.stream.IStreamDataImporterSite; +import org.jkiss.dbeaver.tools.transfer.stream.StreamDataImporterColumnInfo; +import org.jkiss.dbeaver.tools.transfer.stream.StreamEntityMapping; +import org.jkiss.dbeaver.tools.transfer.stream.importer.DataImporterCSV; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.runners.MockitoJUnitRunner; + +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@RunWith(MockitoJUnitRunner.class) +public class CSVImporterTest { + private static final File DUMMY_FILE = new File("dummy"); + + private final DataImporterCSV importer = new DataImporterCSV(); + private final StreamEntityMapping mapping = new StreamEntityMapping(DUMMY_FILE); + private final Map properties = new HashMap<>(); + + @Mock + private IStreamDataImporterSite site; + + @Before + public void init() throws DBException { + importer.init(site); + Mockito.when(site.getProcessorProperties()).thenReturn(properties); + } + + @Test + public void generateColumnNames() throws DBException, IOException { + List columnsInfo = readColumnsInfo("a,b,c,d", false); + Assert.assertEquals(4, columnsInfo.size()); + Assert.assertEquals("Column1", columnsInfo.get(0).getName()); + Assert.assertEquals("Column2", columnsInfo.get(1).getName()); + Assert.assertEquals("Column3", columnsInfo.get(2).getName()); + Assert.assertEquals("Column4", columnsInfo.get(3).getName()); + } + + @Test + public void readColumnNames() throws DBException, IOException { + List columnsInfo = readColumnsInfo("a,b,c,d", true); + Assert.assertEquals(4, columnsInfo.size()); + Assert.assertEquals("a", columnsInfo.get(0).getName()); + Assert.assertEquals("b", columnsInfo.get(1).getName()); + Assert.assertEquals("c", columnsInfo.get(2).getName()); + Assert.assertEquals("d", columnsInfo.get(3).getName()); + } + + @Test + public void guessColumnTypes() throws DBException, IOException { + List columnsInfo = readColumnsInfo("1,2.0,abc,false", false); + Assert.assertEquals(4, columnsInfo.size()); + Assert.assertEquals(DBPDataKind.NUMERIC, columnsInfo.get(0).getDataKind()); + Assert.assertEquals("INTEGER", columnsInfo.get(0).getTypeName()); + Assert.assertEquals(DBPDataKind.NUMERIC, columnsInfo.get(1).getDataKind()); + Assert.assertEquals("REAL", columnsInfo.get(1).getTypeName()); + Assert.assertEquals(DBPDataKind.STRING, columnsInfo.get(2).getDataKind()); + Assert.assertEquals(DBPDataKind.BOOLEAN, columnsInfo.get(3).getDataKind()); + } + + @Test + public void guessColumnTypesOverSamples() throws DBException, IOException { + List columnsInfo = readColumnsInfo("1\n\n2\n3\ntest", false); + Assert.assertEquals(1, columnsInfo.size()); + Assert.assertEquals(DBPDataKind.STRING, columnsInfo.get(0).getDataKind()); + } + + @Test + public void guessColumnTypesDefault() throws DBException, IOException { + List columnsInfo = readColumnsInfo(",", false); + Assert.assertEquals(2, columnsInfo.size()); + Assert.assertEquals(DBPDataKind.STRING, columnsInfo.get(0).getDataKind()); + Assert.assertEquals(DBPDataKind.STRING, columnsInfo.get(1).getDataKind()); + } + + private List readColumnsInfo(String data, boolean isHeaderPresent) throws DBException, IOException { + properties.put("header", isHeaderPresent ? DataImporterCSV.HeaderPosition.top : DataImporterCSV.HeaderPosition.none); + try (ByteArrayInputStream is = new ByteArrayInputStream(data.getBytes())) { + return importer.readColumnsInfo(mapping, is); + } + } +}