Revision: 3631
Author: [email protected]
Date: Sun Jun 20 10:57:59 2010
Log: Add a new Liquibase option to control the usage of addPrimaryKey (to
workaround problems with MySQL)
http://code.google.com/p/power-architect/source/detail?r=3631
Modified:
/trunk/src/main/java/ca/sqlpower/architect/ddl/LiquibaseDDLGenerator.java
/trunk/src/main/java/ca/sqlpower/architect/swingui/LiquibaseOptionsPanel.java
/trunk/src/main/java/ca/sqlpower/architect/swingui/LiquibaseSettings.java
/trunk/src/main/resources/ca/sqlpower/architect/swingui/messages.properties
/trunk/src/main/resources/ca/sqlpower/architect/swingui/messages_de.properties
=======================================
---
/trunk/src/main/java/ca/sqlpower/architect/ddl/LiquibaseDDLGenerator.java
Sat May 22 08:44:54 2010
+++
/trunk/src/main/java/ca/sqlpower/architect/ddl/LiquibaseDDLGenerator.java
Sun Jun 20 10:57:59 2010
@@ -54,6 +54,7 @@
private String author;
private boolean generateId;
private int currentId = 1;
+ private boolean useAddPKSingleColumn = false;
public LiquibaseDDLGenerator() throws SQLException {
super(false);
@@ -79,7 +80,24 @@
setAuthor(options.getAuthor());
setGenerateId(options.getGenerateId());
setIdStart(options.getIdStart());
- }
+
setUseAddPKTagForSingleColumns(options.getUseAddPKTagForSingleColumns());
+ }
+
+ /**
+ * Controls usage of the the <addPrimaryKey> tag for single column
primary keys.
+ * <br/>
+ * If set to false, it will only be used for multi-column primary keys.
For single column primary keys
+ * a nested <constraint> tag with a "primaryKey" attribute will be
used instead.
+ * <br/>
+ * <addPrimaryKey> does not work when used with MySQL and
autoincrement columns, so this feature
+ * is essentially a workaround for a MySQL defiency
+ *
+ * @param flag if false, addPrimaryKey will only be used for multi-column
primary keys
+ */
+ public void setUseAddPKTagForSingleColumns(boolean flag) {
+ useAddPKSingleColumn = flag;
+ }
+
/**
* Control the usage of changeSets in the generated output.
* <br/>
@@ -455,7 +473,7 @@
print("<addColumn ");
print(getTableQualifier(c.getParent()));
println(">");
- println(columnDefinition(" ", c));
+ println(columnDefinition(" ", c, false));
println("</addColumn>");
if (c.isAutoIncrementSequenceNameSet() && c.isAutoIncrement()) {
print("<createSequence sequenceName=\"");
@@ -509,7 +527,7 @@
print("<modifyColumn ");
print(getTableQualifier(t));
println(">");
- println(columnDefinition(" ", c));
+ println(columnDefinition(" ", c, false));
println("</modifyColumn>");
endOfStatement();
endStatement(DDLStatement.StatementType.XMLTAG, c);
@@ -544,7 +562,7 @@
/**
* Creates a <column> definition tag
*/
- protected String columnDefinition(String indent, SQLColumn c) {
+ protected String columnDefinition(String indent, SQLColumn c, boolean
tableHasSingleColumnPK) {
StringBuilder def = new StringBuilder(50);
def.append(indent);
@@ -587,12 +605,30 @@
def.append(" autoIncrement=\"true\"");
}
- if (!c.isDefinitelyNullable()) {
+ boolean needsConstraint = !c.isDefinitelyNullable() ||
tableHasSingleColumnPK && c.isPrimaryKey() && !useAddPKSingleColumn;
+
+ if (needsConstraint) {
def.append(">");
def.append(EOL);
def.append(indent);
def.append(indent);
- def.append("<constraints nullable=\"false\"/>");
+ def.append("<constraints");
+ if (tableHasSingleColumnPK && c.isPrimaryKey()
&& !useAddPKSingleColumn) {
+ def.append(" primaryKey=\"true\"");
+ SQLTable tbl = c.getParent();
+ try {
+ SQLIndex pk = tbl.getPrimaryKeyIndex();
+ def.append(" constraintName=\"");
+ def.append(getName(pk));
+ def.append("\"");
+ } catch (Exception e) {
+ logger.error("Could not obtain PK
index", e);
+ }
+ }
+ if (!c.isDefinitelyNullable()) {
+ def.append(" nullable=\"false\"");
+ }
+ def.append("/>");
def.append(EOL);
def.append(indent);
def.append("</column>");
@@ -671,6 +707,10 @@
public void addTable(SQLTable t) throws SQLException,
SQLObjectException {
Set<SQLColumn> sequenceColumns = new
HashSet<SQLColumn>(t.getChildCount());
startOfStatement();
+ SQLIndex pk = t.getPrimaryKeyIndex();
+
+ boolean singleColumnPK = pk.getChildren(SQLIndex.Column.class).size() ==
1;
+
print("<createTable ");
print( getTableQualifier(t) );
if (StringUtils.isNotBlank(t.getRemarks())) {
@@ -681,7 +721,7 @@
Iterator<SQLColumn> it = t.getColumns().iterator();
while (it.hasNext()) {
SQLColumn c = (SQLColumn) it.next();
- println(columnDefinition(" ", c));
+ println(columnDefinition(" ", c, singleColumnPK));
if (c.isAutoIncrementSequenceNameSet() &&
c.isAutoIncrement()) {
sequenceColumns.add(c);
}
@@ -689,8 +729,7 @@
println("</createTable>");
endOfStatement();
- SQLIndex pk = t.getPrimaryKeyIndex();
- if (pk.getChildCount() > 0) {
+ if (pk.getChildCount() > 0 && singleColumnPK &&
useAddPKSingleColumn) {
writePKConstraintClause(pk);
}
=======================================
---
/trunk/src/main/java/ca/sqlpower/architect/swingui/LiquibaseOptionsPanel.java
Tue May 25 09:44:45 2010
+++
/trunk/src/main/java/ca/sqlpower/architect/swingui/LiquibaseOptionsPanel.java
Sun Jun 20 10:57:59 2010
@@ -44,6 +44,7 @@
private JTextField authorField;
private JLabel authorLabel;
private JCheckBox generateId;
+ private JCheckBox useAddPKTagForSingleColumns;
private JSpinner startId;
private JLabel startValueLabel;
@@ -75,18 +76,21 @@
private void setup() {
panel = new JPanel(new MigLayout());
useChangeSets = new
JCheckBox(Messages.getString("LiquibaseOptionsPanel.useChangeSet"));
//$NON-NLS-1$
+ useAddPKTagForSingleColumns = new
JCheckBox(Messages.getString("LiquibaseOptionsPanel.alwaysUseAddPK"));
//$NON-NLS-1$
generateId = new
JCheckBox(Messages.getString("LiquibaseOptionsPanel.generateID"));
//$NON-NLS-1$
authorLabel = new
JLabel(Messages.getString("LiquibaseOptionsPanel.authorName"));
//$NON-NLS-1$
authorField = new JTextField(20);
startValueLabel = new
JLabel(Messages.getString("LiquibaseOptionsPanel.idStart")); //$NON-NLS-1$
SpinnerNumberModel model = new SpinnerNumberModel(1,1,9999,1);
startId = new JSpinner(model);
+ panel.add(useAddPKTagForSingleColumns, "wrap");
panel.add(useChangeSets);
panel.add(authorLabel);
panel.add(authorField, "wrap");
panel.add(generateId);
panel.add(startValueLabel);
panel.add(startId);
+
}
public void restoreSettings(LiquibaseSettings settings) {
@@ -99,6 +103,7 @@
if (start > 0) {
startId.setValue(Integer.valueOf(start));
}
+
useAddPKTagForSingleColumns.setSelected(settings.getUseAddPKTagForSingleColumns());
}
public LiquibaseSettings getLiquibaseSettings() {
@@ -107,6 +112,7 @@
settings.setGenerateId(getGenerateId());
settings.setUseSeparateChangeSets(getUseChangeSets());
settings.setIdStart(getIdStart());
+
settings.setUseAddPKTagForSingleColumns(useAddPKTagForSingleColumns.isSelected());
return settings;
}
@@ -115,6 +121,7 @@
ddlGenerator.setAuthor(getAuthor());
ddlGenerator.setGenerateId(getGenerateId());
ddlGenerator.setIdStart(getIdStart());
+
ddlGenerator.setUseAddPKTagForSingleColumns(useAddPKTagForSingleColumns.isSelected());
return true;
}
=======================================
---
/trunk/src/main/java/ca/sqlpower/architect/swingui/LiquibaseSettings.java
Sat May 22 08:44:54 2010
+++
/trunk/src/main/java/ca/sqlpower/architect/swingui/LiquibaseSettings.java
Sun Jun 20 10:57:59 2010
@@ -29,6 +29,7 @@
private boolean generateID;
private String author;
private int idStart = 1;
+ private boolean useAddPKTagForSingleColumns = true;
public LiquibaseSettings() {
}
@@ -65,4 +66,14 @@
this.separateChangesets = separateChangesets;
}
-}
+ public boolean getUseAddPKTagForSingleColumns() {
+ return useAddPKTagForSingleColumns;
+ }
+
+ public void setUseAddPKTagForSingleColumns(boolean flag) {
+ useAddPKTagForSingleColumns = flag;
+ }
+
+
+
+}
=======================================
---
/trunk/src/main/resources/ca/sqlpower/architect/swingui/messages.properties
Mon Jun 14 15:22:17 2010
+++
/trunk/src/main/resources/ca/sqlpower/architect/swingui/messages.properties
Sun Jun 20 10:57:59 2010
@@ -422,3 +422,4 @@
LiquibaseOptionsPanel.generateID=Generate ID attribute
LiquibaseOptionsPanel.authorName=Author
LiquibaseOptionsPanel.idStart=Start at
+LiquibaseOptionsPanel.alwaysUseAddPK=Always use <addPrimaryKey>
=======================================
---
/trunk/src/main/resources/ca/sqlpower/architect/swingui/messages_de.properties
Sat May 22 08:44:54 2010
+++
/trunk/src/main/resources/ca/sqlpower/architect/swingui/messages_de.properties
Sun Jun 20 10:57:59 2010
@@ -413,3 +413,4 @@
LiquibaseOptionsPanel.generateID=Erzeuge ID Attribut
LiquibaseOptionsPanel.authorName=Author
LiquibaseOptionsPanel.idStart=Anfangswert
+LiquibaseOptionsPanel.alwaysUseAddPK=<addPrimaryKey> immer verwenden