未验证 提交 ff019900 编写于 作者: N Nikita Akilov 提交者: GitHub

Merge branch 'devel' into folding#2156

......@@ -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<DataTransferWi
autoAssignButton = UIUtils.createDialogButton(buttonsPanel,
DTMessages.data_transfer_db_consumer_auto_assign,
UIIcon.ASTERISK,
"Auto-assign table and column mappings",
DTMessages.data_transfer_db_consumer_auto_assign_description,
new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e)
......@@ -178,7 +177,7 @@ public class DatabaseConsumerPageMapping extends ActiveWizardPage<DataTransferWi
final Button mapTableButton = UIUtils.createDialogButton(buttonsPanel,
DTMessages.data_transfer_db_consumer_existing_table,
DBIcon.TREE_TABLE,
"Select target table",
DTMessages.data_transfer_db_consumer_existing_table_description,
new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e)
......@@ -191,7 +190,7 @@ public class DatabaseConsumerPageMapping extends ActiveWizardPage<DataTransferWi
final Button createNewButton = UIUtils.createDialogButton(buttonsPanel,
DTMessages.data_transfer_db_consumer_new_table,
DBIcon.TREE_VIEW,
"Set target table name",
DTMessages.data_transfer_db_consumer_new_table_description,
new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e)
......@@ -204,7 +203,7 @@ public class DatabaseConsumerPageMapping extends ActiveWizardPage<DataTransferWi
final Button columnsButton = UIUtils.createDialogButton(buttonsPanel,
DTMessages.data_transfer_db_consumer_column_mappings,
DBIcon.TREE_COLUMNS,
"Configure column mappings (advanced)",
DTMessages.data_transfer_db_consumer_column_mappings_description,
new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e)
......
......@@ -32,14 +32,17 @@ import org.jkiss.dbeaver.model.DBPObject;
import org.jkiss.dbeaver.model.DBUtils;
import org.jkiss.dbeaver.model.app.DBPProject;
import org.jkiss.dbeaver.model.data.DBDCollection;
import org.jkiss.dbeaver.model.exec.DBExecUtils;
import org.jkiss.dbeaver.model.impl.DataSourceContextProvider;
import org.jkiss.dbeaver.model.navigator.*;
import org.jkiss.dbeaver.model.runtime.DBRRunnableContext;
import org.jkiss.dbeaver.model.runtime.VoidProgressMonitor;
import org.jkiss.dbeaver.model.sql.SQLQuery;
import org.jkiss.dbeaver.model.sql.SQLScriptContext;
import org.jkiss.dbeaver.model.sql.data.SQLQueryDataContainer;
import org.jkiss.dbeaver.model.struct.*;
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.DBTTaskType;
import org.jkiss.dbeaver.model.task.DBTaskUtils;
......@@ -172,9 +175,9 @@ public class DataTransferTaskConfigurator implements DBTTaskConfigurator {
DTUIMessages.data_transfer_task_configurator_tables_title_choose_source,
rootNode,
rootNode,
new Class[]{DBPDataSource.class, DBSObjectContainer.class, DBSCatalog.class},
null,
new Class[]{DBPDataSource.class, DBSObjectContainer.class, DBSCatalog.class});
new Class[]{DBSObjectContainer.class, DBSDataContainer.class},
new Class[]{DBSDataContainer.class, DBSSchema.class},
new Class[]{DBSSchema.class});
if (node != null) {
if (node instanceof DBNDataSource) {
......@@ -209,9 +212,22 @@ public class DataTransferTaskConfigurator implements DBTTaskConfigurator {
return;
}
}
DataSourceContextProvider contextProvider = new DataSourceContextProvider(dataSourceObject);
try {
DBExecUtils.setExecutionContextDefaults(
new VoidProgressMonitor(),
dataSource,
contextProvider.getExecutionContext(),
dataSourceObject instanceof DBSSchema ? DBUtils.getObjectOwnerInstance(dataSourceObject).getName() : null,
null,
dataSourceObject.getName()
);
} catch (DBException ex) {
log.error("Error setting context defaults", ex);
return;
}
UIServiceSQL serviceSQL = DBWorkbench.getService(UIServiceSQL.class);
if (serviceSQL != null) {
DataSourceContextProvider contextProvider = new DataSourceContextProvider(dataSourceObject);
String query = serviceSQL.openSQLEditor(contextProvider, DTUIMessages.data_transfer_task_configurator_sql_query_title, UIIcon.SQL_SCRIPT, "");
if (query != null) {
SQLScriptContext scriptContext = new SQLScriptContext(null, contextProvider, null, new PrintWriter(System.err, true), null);
......
......@@ -24,8 +24,10 @@ import org.jkiss.dbeaver.model.impl.DBObjectNameCaseTransformer;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.runtime.VoidProgressMonitor;
import org.jkiss.dbeaver.model.struct.*;
import org.jkiss.dbeaver.tools.transfer.stream.StreamDataImporterColumnInfo;
import org.jkiss.utils.CommonUtils;
import java.util.List;
import java.util.Map;
/**
......@@ -123,8 +125,16 @@ public class DatabaseMappingAttribute implements DatabaseMappingObject {
targetName = source.getName();
}
DBSEntity targetEntity = (DBSEntity) parent.getTarget();
this.target = DBUtils.findObject(
targetEntity.getAttributes(monitor), DBUtils.getUnQuotedIdentifier(targetEntity.getDataSource(), targetName), true);
List<? extends DBSEntityAttribute> 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 {
......
......@@ -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<DatabaseP
state.put("type", "query");
SQLQueryContainer queryContainer = (SQLQueryContainer) dataContainer;
DBPDataSourceContainer dataSource = queryContainer.getDataSourceContainer();
DBCExecutionContext executionContext = queryContainer.getExecutionContext();
if (dataSource != null) {
state.put("project", dataSource.getProject().getName());
state.put("dataSource", dataSource.getId());
if (executionContext instanceof DBCExecutionContextDefaults) {
DBCExecutionContextDefaults contextDefaults = ((DBCExecutionContextDefaults) executionContext);
DBSCatalog defaultCatalog = contextDefaults.getDefaultCatalog();
if (defaultCatalog != null) {
state.put("defaultCatalog", defaultCatalog.getName());
}
DBSSchema defaultSchema = contextDefaults.getDefaultSchema();
if (defaultSchema != null) {
state.put("defaultSchema", defaultSchema.getName());
}
}
}
SQLScriptElement query = queryContainer.getQuery();
state.put("query", query.getOriginalText());
......@@ -340,6 +354,14 @@ public class DatabaseTransferProducer implements IDataTransferProducer<DatabaseP
DBPDataSource dataSource = ds.getDataSource();
SQLQuery query = new SQLQuery(dataSource, queryText);
TaskContextProvider taskContextProvider = new TaskContextProvider(runnableContext, dataSource, objectContext);
DBExecUtils.setExecutionContextDefaults(
monitor,
dataSource,
taskContextProvider.getExecutionContext(),
CommonUtils.toString(state.get("defaultCatalog"), null),
null,
CommonUtils.toString(state.get("defaultSchema"), null)
);
SQLScriptContext scriptContext = new SQLScriptContext(null,
taskContextProvider, null, new PrintWriter(System.err, true), null);
scriptContext.setVariables(DBTaskUtils.getVariables(objectContext));
......
......@@ -97,9 +97,13 @@ public class DTMessages extends NLS {
public static String data_transfer_db_consumer_target_container;
public static String data_transfer_db_consumer_choose_container;
public static String data_transfer_db_consumer_auto_assign;
public static String data_transfer_db_consumer_auto_assign_description;
public static String data_transfer_db_consumer_existing_table;
public static String data_transfer_db_consumer_existing_table_description;
public static String data_transfer_db_consumer_new_table;
public static String data_transfer_db_consumer_new_table_description;
public static String data_transfer_db_consumer_column_mappings;
public static String data_transfer_db_consumer_column_mappings_description;
public static String data_transfer_db_consumer_ddl;
public static String sql_script_task_title;
......
......@@ -74,9 +74,13 @@ data_transfer_wizard_settings_column_mapping_type = Mapping type
data_transfer_db_consumer_target_container = Target container
data_transfer_db_consumer_choose_container = Choose container
data_transfer_db_consumer_auto_assign = Auto assign
data_transfer_db_consumer_auto_assign_description = Auto-assign table and column mappings
data_transfer_db_consumer_existing_table = Browse ...
data_transfer_db_consumer_existing_table_description = Select target table
data_transfer_db_consumer_new_table = New ...
data_transfer_db_consumer_new_table_description = Set target table name
data_transfer_db_consumer_column_mappings = Columns ...
data_transfer_db_consumer_column_mappings_description = Configure column mappings (advanced)
data_transfer_db_consumer_ddl = Schema ...
sql_script_task_title = SQL Script execute
......
......@@ -81,10 +81,14 @@ sql_script_task_page_settings_description = \u0412\u044B\u0431\u0435\u0440\u0438
sql_script_task_page_settings_title = \u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u044F SQL \u0441\u043A\u0440\u0438\u043F\u0442\u0430
sql_script_task_title = \u0412\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u0435 SQL \u0441\u043A\u0440\u0438\u043F\u0442\u0430
data_transfer_db_consumer_ddl = \u0421\u0445\u0435\u043C\u0430 ...
data_transfer_db_consumer_column_mappings = \u0421\u0442\u043E\u043B\u0431\u0446\u044B ...
data_transfer_db_consumer_new_table = \u041D\u043E\u0432\u043E\u0435 ...
data_transfer_db_consumer_auto_assign = \u0410\u0432\u0442\u043E\u043F\u0440\u0438\u0441\u0432\u043E\u0435\u043D\u0438\u0435
data_transfer_db_consumer_auto_assign_description = \u0410\u0432\u0442\u043E\u043F\u0440\u0438\u0441\u0432\u043E\u0435\u043D\u0438\u0435 \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0439 \u0442\u0430\u0431\u043B\u0438\u0446 \u0438 \u0441\u0442\u043E\u043B\u0431\u0446\u043E\u0432
data_transfer_db_consumer_existing_table = \u041E\u0431\u0437\u043E\u0440 ...
data_transfer_db_consumer_auto_assign = \u0410\u0432\u0442\u043E-\u043F\u0440\u0438\u0441\u0432\u043E\u0435\u043D\u0438\u0435
data_transfer_db_consumer_existing_table_description = \u0412\u044B\u0431\u0440\u0430\u0442\u044C \u0446\u0435\u043B\u0435\u0432\u0443\u044E \u0442\u0430\u0431\u043B\u0438\u0446\u0443
data_transfer_db_consumer_new_table = \u0421\u043E\u0437\u0434\u0430\u0442\u044C ...
data_transfer_db_consumer_new_table_description = \u0421\u043E\u0437\u0434\u0430\u0442\u044C \u043D\u043E\u0432\u0443\u044E \u0446\u0435\u043B\u0435\u0432\u0443\u044E \u0442\u0430\u0431\u043B\u0438\u0446\u0443
data_transfer_db_consumer_column_mappings = \u0421\u0442\u043E\u043B\u0431\u0446\u044B ...
data_transfer_db_consumer_column_mappings_description = \u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430 \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0439 \u0441\u0442\u043E\u043B\u0431\u0446\u043E\u0432
data_transfer_db_consumer_choose_container = \u0412\u044B\u0431\u043E\u0440 \u043A\u043E\u043D\u0442\u0435\u0439\u043D\u0435\u0440\u0430
database_consumer_settings_option_use_transactions = \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u0442\u0440\u0430\u043D\u0437\u0430\u043A\u0446\u0438\u0438
database_consumer_settings_option_commit_after = \u0412\u044B\u043F\u043E\u043B\u043D\u044F\u0442\u044C Commit \u043F\u043E\u0441\u043B\u0435 \u0432\u0441\u0442\u0430\u0432\u043A\u0438 \u0441\u0442\u0440\u043E\u043A
......
......@@ -29,6 +29,10 @@ public class StreamDataImporterColumnInfo extends AbstractAttribute implements D
private StreamEntityMapping entityMapping;
private DBPDataKind dataKind;
// Determines whether the mapping metadata,
// such as the column name, is present or not.
private boolean mappingMetadataPresent;
public StreamDataImporterColumnInfo(StreamEntityMapping entity, int columnIndex, String columnName, String typeName, int maxLength, DBPDataKind dataKind) {
super(columnName, typeName, -1, columnIndex, maxLength, null, null, false, false);
this.entityMapping = entity;
......@@ -61,4 +65,12 @@ public class StreamDataImporterColumnInfo extends AbstractAttribute implements D
public void setDataKind(DBPDataKind dataKind) {
this.dataKind = dataKind;
}
public boolean isMappingMetadataPresent() {
return mappingMetadataPresent;
}
public void setMappingMetadataPresent(boolean mappingMetadataPresent) {
this.mappingMetadataPresent = mappingMetadataPresent;
}
}
......@@ -18,6 +18,7 @@
package org.jkiss.dbeaver.tools.transfer.stream;
import org.jkiss.dbeaver.Log;
import org.jkiss.utils.CommonUtils;
import java.util.Map;
......@@ -28,18 +29,17 @@ public class StreamTransferUtils {
private static final Log log = Log.getLog(StreamTransferUtils.class);
private static final char DEF_DELIMITER = ',';
private static final String DEF_DELIMITER = ",";
public static String getDelimiterString(Map<String, Object> 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;
}
}
......@@ -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<DBPDataKind, String> DATA_TYPE_UNKNOWN = new Pair<>(DBPDataKind.UNKNOWN, null);
private static final Pair<DBPDataKind, String> DATA_TYPE_INTEGER = new Pair<>(DBPDataKind.NUMERIC, "INTEGER");
private static final Pair<DBPDataKind, String> DATA_TYPE_REAL = new Pair<>(DBPDataKind.NUMERIC, "REAL");
private static final Pair<DBPDataKind, String> DATA_TYPE_BOOLEAN = new Pair<>(DBPDataKind.BOOLEAN, "BOOLEAN");
private static final Pair<DBPDataKind, String> 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<DBPDataKind, String> 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<DBPDataKind, String> 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();
......
......@@ -126,7 +126,7 @@
</items>
</folder>
<folder type="org.jkiss.dbeaver.ext.postgresql.model.PostgreTablePartition" label="%tree.partitions.node.name" icon="#folder_table" description="%tree.partitions.node.tip" visibleIf="object.dataSource.serverType.supportsPartitions()">
<items label="%tree.partitions.node.name" path="partition" property="partitions" icon="#partition" recursive="../..">
<items label="%tree.partition.node.name" path="partition" property="partitions" icon="#partition" recursive="../..">
</items>
</folder>
<folder type="org.jkiss.dbeaver.ext.postgresql.model.PostgreTableReal" label="%tree.tablechildren.node.name" icon="#folder_table" description="Table children" virtual="true" visibleIf="object.hasSubClasses() &amp;&amp; !object.isPartition()">
......
......@@ -417,16 +417,16 @@ public abstract class PostgreTable extends PostgreTableReal implements PostgreTa
@Nullable
@Association
public Collection<PostgreTableBase> getPartitions(DBRProgressMonitor monitor) throws DBException {
public List<PostgreTablePartition> getPartitions(DBRProgressMonitor monitor) throws DBException {
final List<PostgreTableInheritance> si = getSubInheritance(monitor);
if (CommonUtils.isEmpty(si)) {
return null;
}
List<PostgreTableBase> 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<PostgreTablePartition> result = new ArrayList<>(si.size());
for (PostgreTableInheritance postgreTableInheritance : si) {
PostgreTableBase table = postgreTableInheritance.getParentObject();
if (table instanceof PostgreTablePartition) {
result.add((PostgreTablePartition) table);
}
}
return result;
......
......@@ -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("'");
}
......
......@@ -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 {
......
......@@ -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;
}
......
......@@ -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
......@@ -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
......@@ -878,6 +878,9 @@
<page category="org.jkiss.dbeaver.preferences.editors" class="org.jkiss.dbeaver.ui.editors.sql.preferences.PrefPageSQLEditor" id="org.jkiss.dbeaver.preferences.main.sqleditor" name="%page.org.jkiss.dbeaver.preferences.main.sqleditor.name">
<enabledWhen><reference definitionId="org.jkiss.dbeaver.core.preferences.datasource"/></enabledWhen>
</page>
<page category="org.jkiss.dbeaver.preferences.main.sqleditor" id="org.jkiss.dbeaver.preferences.main.sql.codeeditor" class="org.jkiss.dbeaver.ui.editors.sql.preferences.PrefPageSQLCodeEditing" name="%page.org.jkiss.dbeaver.preferences.main.sql.codeeditor.name">
<enabledWhen><reference definitionId="org.jkiss.dbeaver.core.preferences.datasource"/></enabledWhen>
</page>
<page category="org.jkiss.dbeaver.preferences.main.sqleditor" id="org.jkiss.dbeaver.preferences.main.sql.completion" class="org.jkiss.dbeaver.ui.editors.sql.preferences.PrefPageSQLCompletion" name="%page.org.jkiss.dbeaver.preferences.main.sql.completion.name">
<enabledWhen><reference definitionId="org.jkiss.dbeaver.core.preferences.datasource"/></enabledWhen>
</page>
......@@ -915,6 +918,10 @@
<keywordReference id="org.jkiss.dbeaver.core.keyword.dbeaver"/>
</page>
-->
<page category="org.jkiss.dbeaver.preferences.main.sqleditor" id="org.jkiss.dbeaver.preferences.main.sql.codeeditor" class="org.jkiss.dbeaver.ui.editors.sql.preferences.PrefPageSQLCodeEditing" name="%pref.page.name.sql.codeeditor">
<keywordReference id="org.jkiss.dbeaver.core.keyword.pref.editor.sql"/>
<keywordReference id="org.jkiss.dbeaver.core.keyword.dbeaver"/>
</page>
<page category="org.jkiss.dbeaver.preferences.main.sqleditor" id="org.jkiss.dbeaver.preferences.main.sql.completion" class="org.jkiss.dbeaver.ui.editors.sql.preferences.PrefPageSQLCompletion" name="%pref.page.name.sql.completion">
<keywordReference id="org.jkiss.dbeaver.core.keyword.pref.editor.sql"/>
<keywordReference id="org.jkiss.dbeaver.core.keyword.dbeaver"/>
......
......@@ -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;
}
}
......
/*
* 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
......@@ -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
......
......@@ -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);
}
......
......@@ -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<String> 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);
......
......@@ -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,
......
/*
* 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<String, Object> 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"));
}
}
/*
* 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<String, Object> 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<StreamDataImporterColumnInfo> 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<StreamDataImporterColumnInfo> 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<StreamDataImporterColumnInfo> 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<StreamDataImporterColumnInfo> 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<StreamDataImporterColumnInfo> 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<StreamDataImporterColumnInfo> 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);
}
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册