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

#3298 Edit joined tables

上级 c1d543f4
......@@ -663,9 +663,9 @@ public class ResultSetModel {
}
public boolean isAttributeReadOnly(@NotNull DBDAttributeBinding attribute) {
if (!isSingleSource()) {
return true;
}
// if (!isSingleSource()) {
// return true;
// }
if (attribute.getMetaAttribute().isReadOnly()) {
return true;
}
......
......@@ -109,8 +109,29 @@ class ResultSetPersister {
this.viewer = viewer;
this.model = viewer.getModel();
this.columns = model.getAttributes();
collectChanges();
}
public boolean hasInserts() {
return !addedRows.isEmpty();
}
public boolean hasDeletes() {
return !deletedRows.isEmpty();
}
public boolean hasUpdates() {
return !changedRows.isEmpty();
}
public List<DBDAttributeBinding> getUpdatedAttributes() {
Set<DBDAttributeBinding> attrs = new LinkedHashSet<>();
for (ResultSetRow row : changedRows) {
attrs.addAll(row.changes.keySet());
}
return new ArrayList<>(attrs);
}
/**
* Applies changes.
* @throws org.jkiss.dbeaver.DBException
......@@ -120,10 +141,12 @@ class ResultSetPersister {
boolean applyChanges(@Nullable DBRProgressMonitor monitor, boolean generateScript, @Nullable DataUpdateListener listener)
throws DBException
{
collectChanges();
prepareDeleteStatements();
prepareInsertStatements();
if (hasDeletes()) {
prepareDeleteStatements();
}
if (hasInserts()) {
prepareInsertStatements();
}
prepareUpdateStatements();
return execute(monitor, generateScript, listener);
}
......
......@@ -2822,9 +2822,9 @@ public class ResultSetViewer extends Viewer
private ResultSetPersister createDataPersister(boolean skipKeySearch)
throws DBException
{
if (!skipKeySearch && !model.isSingleSource()) {
throw new DBException("Can't save data for result set from multiple sources");
}
// if (!skipKeySearch && !model.isSingleSource()) {
// throw new DBException("Can't save data for result set from multiple sources");
// }
boolean needPK = false;
if (!skipKeySearch) {
for (ResultSetRow row : model.getAllRows()) {
......@@ -2834,13 +2834,12 @@ public class ResultSetViewer extends Viewer
}
}
}
ResultSetPersister persister = new ResultSetPersister(this);
if (needPK) {
// If we have deleted or updated rows then check for unique identifier
if (!checkEntityIdentifier()) {
throw new DBException("No unique identifier defined");
}
checkEntityIdentifiers(persister);
}
return new ResultSetPersister(this);
return persister;
}
@NotNull
......@@ -3006,51 +3005,57 @@ public class ResultSetViewer extends Viewer
}
}
private boolean checkEntityIdentifier() throws DBException
private void checkEntityIdentifiers(ResultSetPersister persister) throws DBException
{
DBSEntity entity = model.getSingleSource();
if (entity == null) {
DBUserInterface.getInstance().showError(
"Unrecognized entity",
"Can't detect source entity");
return false;
}
final DBCExecutionContext executionContext = getExecutionContext();
if (executionContext == null) {
return false;
throw new DBCException("Can't persist data - not connected to database");
}
// Check for value locators
// Probably we have only virtual one with empty attribute set
final DBDRowIdentifier identifier = getVirtualEntityIdentifier();
if (identifier != null) {
if (CommonUtils.isEmpty(identifier.getAttributes())) {
// Empty identifier. We have to define it
return new UIConfirmation() {
@Override
public Boolean runTask() {
return ValidateUniqueKeyUsageDialog.validateUniqueKey(ResultSetViewer.this, executionContext);
boolean needsSingleEntity = persister.hasInserts() || persister.hasDeletes();
DBSEntity entity = model.getSingleSource();
if (needsSingleEntity) {
if (entity == null) {
throw new DBCException("Can't detect source entity");
}
}
if (entity != null) {
// Check for value locators
// Probably we have only virtual one with empty attribute set
final DBDRowIdentifier identifier = getVirtualEntityIdentifier();
if (identifier != null) {
if (CommonUtils.isEmpty(identifier.getAttributes())) {
// Empty identifier. We have to define it
if (!new UIConfirmation() {
@Override
public Boolean runTask() {
return ValidateUniqueKeyUsageDialog.validateUniqueKey(ResultSetViewer.this, executionContext);
}
}.confirm())
{
throw new DBCException("No unique key defined");
}
}.confirm();
}
}
}
{
List<DBDAttributeBinding> updatedAttributes = persister.getUpdatedAttributes();
for (DBDAttributeBinding attr : updatedAttributes) {
// Check attributes of non-virtual identifier
DBDRowIdentifier rowIdentifier = model.getVisibleAttribute(0).getRowIdentifier();
DBDRowIdentifier rowIdentifier = attr.getRowIdentifier();
if (rowIdentifier == null) {
// We shouldn't be here ever!
// Virtual id should be created if we missing natural one
DBUserInterface.getInstance().showError(
"No entity identifier",
"Entity " + entity.getName() + " has no unique key");
return false;
throw new DBCException("Attribute " + attr.getName() + " was changed but it hasn't associated unique key");
} else if (CommonUtils.isEmpty(rowIdentifier.getAttributes())) {
DBUserInterface.getInstance().showError(
"No entity identifier",
"Attributes of '" + DBUtils.getObjectFullName(rowIdentifier.getUniqueKey(), DBPEvaluationContext.UI) + "' are missing in result set");
return false;
throw new DBCException(
"Can't change attribute '" + attr.getName() +
"' - attributes of key '" + DBUtils.getObjectFullName(rowIdentifier.getUniqueKey(), DBPEvaluationContext.UI) + "' are missing in result set");
}
}
return true;
}
boolean editEntityIdentifier(DBRProgressMonitor monitor) throws DBException
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册