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 &lt;constraint&gt; tag with a "primaryKey" attribute will be used instead.
+        * <br/>
+ * &lt;addPrimaryKey&gt; 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

Reply via email to