提交 bb262cd3 编写于 作者: S Serge Rider

Merge remote-tracking branch 'origin/devel' into devel

......@@ -916,4 +916,18 @@ public class CommonUtils {
public static boolean isValidIndex(int index, int length) {
return index >= 0 || index < length;
}
@NotNull
public static String escapeHtml(@Nullable String text) {
if (text == null) {
return "&nbsp;";
}
return text
.replace("&", "&amp;")
.replace("<", "&lt;")
.replace(">", "&gt;")
.replace("\r\n", "<br>")
.replace("\r", "<br>")
.replace("\n", "<br>");
}
}
......@@ -47,6 +47,7 @@ import org.jkiss.dbeaver.ui.SharedTextColors;
import org.jkiss.dbeaver.ui.UIUtils;
import org.jkiss.dbeaver.ui.controls.CustomComboBoxCellEditor;
import org.jkiss.dbeaver.ui.controls.ListContentProvider;
import org.jkiss.dbeaver.ui.controls.ViewerColumnController;
import org.jkiss.dbeaver.ui.dialogs.BaseDialog;
import org.jkiss.utils.CommonUtils;
......@@ -135,199 +136,174 @@ class ColumnsMappingDialog extends BaseDialog {
}
});
{
TableViewerColumn columnSource = new TableViewerColumn(mappingViewer, SWT.LEFT);
columnSource.setLabelProvider(new CellLabelProvider() {
@Override
public void update(ViewerCell cell)
{
DatabaseMappingAttribute attrMapping = (DatabaseMappingAttribute) cell.getElement();
cell.setText(DBUtils.getObjectFullName(attrMapping.getSource(), DBPEvaluationContext.UI));
if (attrMapping.getIcon() != null) {
cell.setImage(DBeaverIcons.getImage(attrMapping.getIcon()));
}
}
});
columnSource.getColumn().setText(DTUIMessages.columns_mapping_dialog_column_source_text);
columnSource.getColumn().setWidth(170);
}
{
TableViewerColumn columnSourceType = new TableViewerColumn(mappingViewer, SWT.LEFT);
columnSourceType.setLabelProvider(new CellLabelProvider() {
@Override
public void update(ViewerCell cell)
{
cell.setText(((DatabaseMappingAttribute) cell.getElement()).getSourceType());
final ViewerColumnController<?, ?> columnController = new ViewerColumnController<>(getClass().getName(), mappingViewer);
columnController.addColumn(DTUIMessages.columns_mapping_dialog_column_source_text, null, SWT.LEFT, true, false, new ColumnLabelProvider() {
@Override
public void update(ViewerCell cell) {
DatabaseMappingAttribute mapping = (DatabaseMappingAttribute) cell.getElement();
cell.setText(DBUtils.getObjectFullName(mapping.getSource(), DBPEvaluationContext.UI));
if (mapping.getIcon() != null) {
cell.setImage(DBeaverIcons.getImage(mapping.getIcon()));
}
});
columnSourceType.getColumn().setText(DTUIMessages.columns_mapping_dialog_column_source_type_text);
columnSourceType.getColumn().setWidth(100);
}
}
});
{
TableViewerColumn columnTarget = new TableViewerColumn(mappingViewer, SWT.LEFT);
columnTarget.setLabelProvider(new CellLabelProvider() {
@Override
public void update(ViewerCell cell)
{
DatabaseMappingAttribute mapping = (DatabaseMappingAttribute) cell.getElement();
cell.setText(mapping.getTargetName());
if (mapping.getMappingType() == DatabaseMappingType.unspecified) {
cell.setBackground(UIUtils.getSharedTextColors().getColor(SharedTextColors.COLOR_WARNING));
} else {
cell.setBackground(null);
}
cell.setFont(boldFont);
columnController.addColumn(DTUIMessages.columns_mapping_dialog_column_source_type_text, null, SWT.LEFT, true, false, new ColumnLabelProvider() {
@Override
public void update(ViewerCell cell) {
cell.setText(((DatabaseMappingAttribute) cell.getElement()).getSourceType());
}
});
columnController.addColumn(DTUIMessages.columns_mapping_dialog_column_target_text, null, SWT.LEFT, true, false, false, null, new ColumnLabelProvider() {
@Override
public void update(ViewerCell cell) {
DatabaseMappingAttribute mapping = (DatabaseMappingAttribute) cell.getElement();
cell.setText(mapping.getTargetName());
if (mapping.getMappingType() == DatabaseMappingType.unspecified) {
cell.setBackground(UIUtils.getSharedTextColors().getColor(SharedTextColors.COLOR_WARNING));
} else {
cell.setBackground(null);
}
});
columnTarget.getColumn().setText(DTUIMessages.columns_mapping_dialog_column_target_text);
columnTarget.getColumn().setWidth(170);
columnTarget.setEditingSupport(new EditingSupport(mappingViewer) {
@Override
protected CellEditor getCellEditor(Object element)
{
try {
java.util.List<String> items = new ArrayList<>();
DatabaseMappingAttribute mapping = (DatabaseMappingAttribute) element;
if (mapping.getParent().getMappingType() == DatabaseMappingType.existing &&
mapping.getParent().getTarget() instanceof DBSEntity)
{
DBSEntity parentEntity = (DBSEntity)mapping.getParent().getTarget();
for (DBSEntityAttribute attr : CommonUtils.safeCollection(parentEntity.getAttributes(new VoidProgressMonitor()))) {
items.add(attr.getName());
}
cell.setFont(boldFont);
}
}, new EditingSupport(mappingViewer) {
@Override
protected CellEditor getCellEditor(Object element)
{
try {
java.util.List<String> items = new ArrayList<>();
DatabaseMappingAttribute mapping = (DatabaseMappingAttribute) element;
if (mapping.getParent().getMappingType() == DatabaseMappingType.existing &&
mapping.getParent().getTarget() instanceof DBSEntity)
{
DBSEntity parentEntity = (DBSEntity)mapping.getParent().getTarget();
for (DBSEntityAttribute attr : CommonUtils.safeCollection(parentEntity.getAttributes(new VoidProgressMonitor()))) {
items.add(attr.getName());
}
items.add(DatabaseMappingAttribute.TARGET_NAME_SKIP);
return new CustomComboBoxCellEditor(
mappingViewer,
mappingViewer.getTable(),
items.toArray(new String[0]),
SWT.DROP_DOWN);
} catch (DBException e) {
DBWorkbench.getPlatformUI().showError("Bad value", "Wrong target column", e);
return null;
}
}
@Override
protected boolean canEdit(Object element)
{
return true;
items.add(DatabaseMappingAttribute.TARGET_NAME_SKIP);
return new CustomComboBoxCellEditor(
mappingViewer,
mappingViewer.getTable(),
items.toArray(new String[0]),
SWT.DROP_DOWN);
} catch (DBException e) {
DBWorkbench.getPlatformUI().showError("Bad value", "Wrong target column", e);
return null;
}
}
@Override
protected Object getValue(Object element)
{
return ((DatabaseMappingAttribute)element).getTargetName();
}
@Override
protected boolean canEdit(Object element)
{
return true;
}
@Override
protected void setValue(Object element, Object value)
{
try {
String name = CommonUtils.toString(value);
DatabaseMappingAttribute attrMapping = (DatabaseMappingAttribute) element;
if (DatabaseMappingAttribute.TARGET_NAME_SKIP.equals(name)) {
attrMapping.setMappingType(DatabaseMappingType.skip);
} else {
if (attrMapping.getParent().getMappingType() == DatabaseMappingType.existing &&
attrMapping.getParent().getTarget() instanceof DBSEntity)
{
DBSEntity parentEntity = (DBSEntity)attrMapping.getParent().getTarget();
for (DBSEntityAttribute attr : CommonUtils.safeCollection(parentEntity.getAttributes(new VoidProgressMonitor()))) {
if (name.equalsIgnoreCase(attr.getName())) {
attrMapping.setTarget(attr);
attrMapping.setMappingType(DatabaseMappingType.existing);
attrMapping.setTargetName(name);
return;
}
@Override
protected Object getValue(Object element)
{
return ((DatabaseMappingAttribute)element).getTargetName();
}
@Override
protected void setValue(Object element, Object value)
{
try {
String name = CommonUtils.toString(value);
DatabaseMappingAttribute attrMapping = (DatabaseMappingAttribute) element;
if (DatabaseMappingAttribute.TARGET_NAME_SKIP.equals(name)) {
attrMapping.setMappingType(DatabaseMappingType.skip);
} else {
if (attrMapping.getParent().getMappingType() == DatabaseMappingType.existing &&
attrMapping.getParent().getTarget() instanceof DBSEntity)
{
DBSEntity parentEntity = (DBSEntity)attrMapping.getParent().getTarget();
for (DBSEntityAttribute attr : CommonUtils.safeCollection(parentEntity.getAttributes(new VoidProgressMonitor()))) {
if (name.equalsIgnoreCase(attr.getName())) {
attrMapping.setTarget(attr);
attrMapping.setMappingType(DatabaseMappingType.existing);
attrMapping.setTargetName(name);
return;
}
}
attrMapping.setMappingType(DatabaseMappingType.create);
attrMapping.setTargetName(name);
}
} catch (DBException e) {
DBWorkbench.getPlatformUI().showError("Bad value", "Wrong target", e);
} finally {
mappingViewer.refresh();
attrMapping.setMappingType(DatabaseMappingType.create);
attrMapping.setTargetName(name);
}
} catch (DBException e) {
DBWorkbench.getPlatformUI().showError("Bad value", "Wrong target", e);
} finally {
mappingViewer.refresh();
}
});
}
}
});
{
TableViewerColumn columnTargetType = new TableViewerColumn(mappingViewer, SWT.LEFT);
columnTargetType.setLabelProvider(new CellLabelProvider() {
@Override
public void update(ViewerCell cell)
{
DatabaseMappingAttribute attrMapping = (DatabaseMappingAttribute) cell.getElement();
DBPDataSource dataSource = settings.getTargetDataSource(attrMapping);
cell.setText(attrMapping.getTargetType(dataSource, true));
cell.setFont(boldFont);
}
});
columnTargetType.getColumn().setText(DTUIMessages.columns_mapping_dialog_column_target_type_text);
columnTargetType.getColumn().setWidth(100);
columnTargetType.setEditingSupport(new EditingSupport(mappingViewer) {
@Override
protected CellEditor getCellEditor(Object element)
{
DatabaseMappingAttribute attrMapping = (DatabaseMappingAttribute) element;
columnController.addColumn(DTUIMessages.columns_mapping_dialog_column_target_type_text, null, SWT.LEFT, true, false, false, null, new ColumnLabelProvider() {
@Override
public void update(ViewerCell cell) {
DatabaseMappingAttribute attrMapping = (DatabaseMappingAttribute) cell.getElement();
DBPDataSource dataSource = settings.getTargetDataSource(attrMapping);
cell.setText(attrMapping.getTargetType(dataSource, true));
cell.setFont(boldFont);
}
}, new EditingSupport(mappingViewer) {
@Override
protected CellEditor getCellEditor(Object element)
{
DatabaseMappingAttribute attrMapping = (DatabaseMappingAttribute) element;
Set<String> types = new TreeSet<>();
DBPDataTypeProvider dataTypeProvider = DBUtils.getParentOfType(DBPDataTypeProvider.class, settings.getContainer());
if (dataTypeProvider != null) {
for (DBSDataType type : dataTypeProvider.getLocalDataTypes()) {
types.add(type.getName());
}
Set<String> types = new TreeSet<>();
DBPDataTypeProvider dataTypeProvider = DBUtils.getParentOfType(DBPDataTypeProvider.class, settings.getContainer());
if (dataTypeProvider != null) {
for (DBSDataType type : dataTypeProvider.getLocalDataTypes()) {
types.add(type.getName());
}
types.add(attrMapping.getTargetType(settings.getTargetDataSource(attrMapping), true));
return new CustomComboBoxCellEditor(mappingViewer, mappingViewer.getTable(), types.toArray(new String[0]), SWT.BORDER);
}
@Override
protected boolean canEdit(Object element)
{
return true;
}
@Override
protected Object getValue(Object element)
{
DatabaseMappingAttribute attrMapping = (DatabaseMappingAttribute) element;
return attrMapping.getTargetType(settings.getTargetDataSource(attrMapping), true);
}
@Override
protected void setValue(Object element, Object value)
{
DatabaseMappingAttribute attrMapping = (DatabaseMappingAttribute) element;
attrMapping.setTargetType(CommonUtils.toString(value));
mappingViewer.refresh(element);
}
});
}
types.add(attrMapping.getTargetType(settings.getTargetDataSource(attrMapping), true));
{
TableViewerColumn columnType = new TableViewerColumn(mappingViewer, SWT.LEFT);
columnType.setLabelProvider(new CellLabelProvider() {
@Override
public void update(ViewerCell cell)
{
DatabaseMappingAttribute mapping = (DatabaseMappingAttribute) cell.getElement();
String text = "";
switch (mapping.getMappingType()) {
case unspecified: text = "?"; break;
case existing: text = DTUIMessages.columns_mapping_dialog_cell_text_existing; break;
case create: text = DTUIMessages.columns_mapping_dialog_cell_text_new; break;
case skip: text = DTUIMessages.columns_mapping_dialog_cell_text_skip; break;
}
cell.setText(text);
return new CustomComboBoxCellEditor(mappingViewer, mappingViewer.getTable(), types.toArray(new String[0]), SWT.BORDER);
}
@Override
protected boolean canEdit(Object element)
{
return true;
}
@Override
protected Object getValue(Object element)
{
DatabaseMappingAttribute attrMapping = (DatabaseMappingAttribute) element;
return attrMapping.getTargetType(settings.getTargetDataSource(attrMapping), true);
}
@Override
protected void setValue(Object element, Object value)
{
DatabaseMappingAttribute attrMapping = (DatabaseMappingAttribute) element;
attrMapping.setTargetType(CommonUtils.toString(value));
mappingViewer.refresh(element);
}
});
columnController.addColumn(DTUIMessages.columns_mapping_dialog_column_type_text_mapping, null, SWT.LEFT, true, false, new ColumnLabelProvider() {
@Override
public String getText(Object element) {
DatabaseMappingAttribute mapping = (DatabaseMappingAttribute) element;
switch (mapping.getMappingType()) {
case existing:
return DTUIMessages.columns_mapping_dialog_cell_text_existing;
case create:
return DTUIMessages.columns_mapping_dialog_cell_text_new;
case skip:
return DTUIMessages.columns_mapping_dialog_cell_text_skip;
default:
return "?";
}
});
columnType.getColumn().setText(DTUIMessages.columns_mapping_dialog_column_type_text_mapping);
columnType.getColumn().setWidth(60);
}
}
});
columnController.createColumns();
mappingViewer.setInput(attributeMappings);
......
......@@ -31,10 +31,7 @@ import org.jkiss.utils.CommonUtils;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.Reader;
import java.io.*;
import java.util.Map;
/**
......@@ -164,24 +161,14 @@ public class DataExporterHTML extends StreamExporterAbstract {
private void writeTableTitle(String value, int columns) {
PrintWriter out = getWriter();
out.write(String.format("<th colspan=\"%d\">", columns));
if (value == null) {
out.write("&nbsp;");
} else {
value = value.replace("&", "&amp;").replace("<", "&lt;").replace(">", "&gt;");
out.write(value);
}
out.write(CommonUtils.escapeHtml(value));
out.write("</th>");
}
private void writeTextCell(String value, boolean header) {
PrintWriter out = getWriter();
out.write(header ? "<th>" : "<td>");
if (value == null) {
out.write("&nbsp;");
} else {
value = value.replace("&", "&amp;").replace("<", "&lt;").replace(">", "&gt;");
out.write(value);
}
out.write(CommonUtils.escapeHtml(value));
out.write(header ? "</th>" : "</td>");
}
......@@ -228,33 +215,16 @@ public class DataExporterHTML extends StreamExporterAbstract {
}
private void writeCellValue(Reader reader) throws IOException {
try {
try (BufferedReader bufferedReader = new BufferedReader(reader)) {
PrintWriter out = getWriter();
// Copy reader
char[] buffer = new char[2000];
for (; ; ) {
int count = reader.read(buffer);
if (count <= 0) {
break;
}
for (int i = 0; i < count; i++) {
if (buffer[i] == '<') {
out.write("&lt;");
} else if (buffer[i] == '>') {
out.write("&gt;");
}
if (buffer[i] == '&') {
out.write("&amp;");
}
out.write(buffer[i]);
String line = bufferedReader.readLine();
while (line != null) {
out.write(CommonUtils.escapeHtml(line));
line = bufferedReader.readLine();
if (line != null) {
out.write("<br>");
}
}
} finally {
ContentUtils.close(reader);
}
}
public boolean saveBinariesAsImages() {
return true;
}
}
......@@ -1084,11 +1084,11 @@ public class OracleSchema extends OracleGlobalObject implements DBSSchema, DBPRe
"i.OWNER,i.INDEX_NAME,i.INDEX_TYPE,i.TABLE_OWNER,i.TABLE_NAME,i.UNIQUENESS,i.TABLESPACE_NAME,i.STATUS,i.NUM_ROWS,i.SAMPLE_SIZE,\n" +
"ic.COLUMN_NAME,ic.COLUMN_POSITION,ic.COLUMN_LENGTH,ic.DESCEND,iex.COLUMN_EXPRESSION\n" +
"FROM " + OracleUtils.getAdminAllViewPrefix(session.getProgressMonitor(), getDataSource(), "INDEXES") + " i\n" +
", " + OracleUtils.getAdminAllViewPrefix(session.getProgressMonitor(), getDataSource(), "IND_COLUMNS") + " ic, " +
OracleUtils.getAdminAllViewPrefix(session.getProgressMonitor(), getDataSource(), "IND_EXPRESSIONS") + " iex " +
"WHERE ic.INDEX_OWNER=i.OWNER AND ic.INDEX_NAME=i.INDEX_NAME \n" +
"AND iex.INDEX_OWNER(+)=i.OWNER AND iex.INDEX_NAME(+)=i.INDEX_NAME AND iex.COLUMN_POSITION(+)=ic.COLUMN_POSITION\n" +
"AND ");
"JOIN " + OracleUtils.getAdminAllViewPrefix(session.getProgressMonitor(), getDataSource(), "IND_COLUMNS") + " ic " +
"ON i.owner = ic.index_owner AND i.index_name = ic.index_name\n" +
"LEFT JOIN " + OracleUtils.getAdminAllViewPrefix(session.getProgressMonitor(), getDataSource(), "IND_EXPRESSIONS") + " iex " +
"ON iex.index_owner = i.owner AND iex.INDEX_NAME = i.INDEX_NAME AND iex.COLUMN_POSITION = ic.COLUMN_POSITION\n" +
"WHERE ");
if (forTable == null) {
sql.append("i.OWNER=?");
} else {
......
......@@ -157,9 +157,9 @@ public class OracleStructureAssistant implements DBSStructureAssistant<OracleExe
try (JDBCPreparedStatement dbStat = session.prepareStatement(
"SELECT " + OracleUtils.getSysCatalogHint((OracleDataSource) session.getDataSource()) + " OWNER, TABLE_NAME, CONSTRAINT_NAME, CONSTRAINT_TYPE\n" +
"FROM " + OracleUtils.getAdminAllViewPrefix(monitor, (OracleDataSource) session.getDataSource(), "CONSTRAINTS") + "\n" +
"WHERE CONSTRAINT_NAME like ?" + (!hasFK ? " AND CONSTRAINT_TYPE<>'R'" : "") +
(schema != null ? " AND OWNER=?" : ""))) {
dbStat.setString(1, params.getMask().toUpperCase());
"WHERE" + (params.isCaseSensitive() ? " CONSTRAINT_NAME " : " UPPER(CONSTRAINT_NAME) ") +
"LIKE ?" + (!hasFK ? " AND CONSTRAINT_TYPE<>'R'" : "") + (schema != null ? " AND OWNER=?" : ""))) {
dbStat.setString(1, params.isCaseSensitive() ? params.getMask() : params.getMask().toUpperCase());
if (schema != null) {
dbStat.setString(2, schema.getName());
}
......@@ -250,13 +250,25 @@ public class OracleStructureAssistant implements DBSStructureAssistant<OracleExe
if (searchViewsByDefinition) {
query.append(" UNION ALL SELECT OWNER, VIEW_NAME, 'VIEW' AS OBJECT_TYPE FROM ");
query.append(OracleUtils.getAdminAllViewPrefix(session.getProgressMonitor(), dataSource, "VIEWS"));
query.append(" v WHERE v.\"TEXT_VC\" LIKE ?");
query.append(" v WHERE ");
if (params.isCaseSensitive()) {
query.append("v.\"TEXT_VC\"");
} else {
query.append("UPPER(v.\"TEXT_VC\")");
}
query.append(" LIKE ?");
query.append(ownerClause);
}
if (params.isSearchInDefinitions()) {
query.append(" UNION ALL SELECT DISTINCT owner, name, type FROM ");
query.append(OracleUtils.getAdminAllViewPrefix(session.getProgressMonitor(), dataSource, "SOURCE"));
query.append(" WHERE text LIKE ?");
query.append(" WHERE ");
if (params.isCaseSensitive()) {
query.append("text ");
} else {
query.append("UPPER(text) ");
}
query.append("LIKE ?");
query.append(ownerClause);
}
query.append(")\nORDER BY OBJECT_NAME");
......
......@@ -176,7 +176,7 @@ public final class SQLUtils {
else if (c == '\\') {
if (i < like.length() - 1) {
char nc = like.charAt(i + 1);
if (nc == '_' || nc == '*' || nc == '?' || nc == '.') {
if (nc == '_' || nc == '*' || nc == '?' || nc == '.' || nc == '%') {
result.append("\\").append(nc);
i++;
} else {
......
......@@ -421,7 +421,7 @@ public class SQLFormatterTokenizedTest {
"\t1 = 1;"; //$NON-NLS-1$
assertEquals("SQLFormatterTokenized does not properly format query with a comment between FROM and WHERE", expected, format(sql));
sql = SQLConstants.KEYWORD_SELECT + lineBreak + "\t--cmnt" + lineBreak + "a, b FROM a ;";
sql = SQLConstants.KEYWORD_SELECT + lineBreak + "\t--comment" + lineBreak + "a, b FROM a ;";
expected = SQLConstants.KEYWORD_SELECT + lineBreak +
"\t--comment" + lineBreak +
"\ta," + lineBreak +
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册