<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE bugzilla SYSTEM "https://bugs.kde.org/page.cgi?id=bugzilla.dtd">

<bugzilla version="5.0.6"
          urlbase="https://bugs.kde.org/"
          
          maintainer="sysadmin@kde.org"
>

    <bug>
          <bug_id>77377</bug_id>
          
          <creation_ts>2004-03-12 13:04:23 +0000</creation_ts>
          <short_desc>SQL code generator generates &quot;circular reference&quot; foreign keys</short_desc>
          <delta_ts>2006-11-20 22:36:56 +0000</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>2</classification_id>
          <classification>Applications</classification>
          <product>umbrello</product>
          <component>general</component>
          <version>1.2</version>
          <rep_platform>unspecified</rep_platform>
          <op_sys>Linux</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>NOR</priority>
          <bug_severity>normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>0</everconfirmed>
          <reporter name="Maciej J . Woloszyk">matofesi</reporter>
          <assigned_to name="Umbrello Development Group">umbrello-devel</assigned_to>
          <cc>holster</cc>
          
          <cf_commitlink></cf_commitlink>
          <cf_versionfixedin></cf_versionfixedin>
          <cf_sentryurl></cf_sentryurl>
          <votes>0</votes>

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>214635</commentid>
    <comment_count>0</comment_count>
    <who name="Maciej J . Woloszyk">matofesi</who>
    <bug_when>2004-03-12 13:04:24 +0000</bug_when>
    <thetext>Version:           1.2 (using KDE 3.2.0, Gentoo)
Compiler:          gcc version 3.3.2 20031218 (Gentoo Linux 3.3.2-r5, propolice-3.3-7)
OS:          Linux (i686) release 2.4.22-gentoo-r7

When you use Umbrello to design SQL scheme using agregations to simulate foreign keys constraints the code generators creates foreign key constarint in both tables instead of the &quot;source&quot; (role B - as I assume looking at the arrowhead of the aggregation connection - which is a bit misleading) table. Below is the simple patch - it makes code generator to check the objects of the aggregations and only create constraint in one table. In the other table generator also places the constraint, but only as an SQL comment. I&apos;m not sure how well will it work, but at least it works for me.

M.

----------------- umbrello-sqlwriter.patch ---------------------------
--- kdesdk-3.2.0-orig/umbrello/umbrello/codegenerators/sqlwriter.cpp    2003-09-21 10:41:52.000000000 +0200
+++ kdesdk-3.2.0/umbrello/umbrello/codegenerators/sqlwriter.cpp 2004-03-12 12:15:23.000000000 +0100
@@ -89,8 +89,14 @@
        UMLAssociationList aggregations = c-&gt;getAggregations();
        if( forceSections() || !aggregations.isEmpty() ) {
                for(UMLAssociation* a = aggregations.first(); a; a = aggregations.next()) {
-                       sql &lt;&lt; &quot;,\n\tCONSTRAINT &quot; &lt;&lt; a-&gt;getName() &lt;&lt; &quot; FOREIGN KEY (&quot; &lt;&lt; a-&gt;getMultiB() &lt;&lt;
-                              &quot;) REFERENCES &quot; &lt;&lt;   a-&gt;getObjectA()-&gt;getName() &lt;&lt; &quot;(&quot; &lt;&lt; a-&gt;getMultiA() &lt;&lt; &quot;)&quot;;
+                       if( a-&gt;getObjectA()-&gt;getID()==c-&gt;getID() ) {
+                               sql &lt;&lt; &quot;\n-- CONSTRAINT &quot; &lt;&lt; a-&gt;getName() &lt;&lt; &quot; FOREIGN KEY (&quot; &lt;&lt; a-&gt;getMultiB() &lt;&lt;
+                                       &quot;) REFERENCES &quot; &lt;&lt;   a-&gt;getObjectA()-&gt;getName() &lt;&lt; &quot;(&quot; &lt;&lt; a-&gt;getMultiA() &lt;&lt; &quot;)&quot;;
+                       } else {
+                               sql &lt;&lt; &quot;,\n\tCONSTRAINT &quot; &lt;&lt; a-&gt;getName() &lt;&lt; &quot; FOREIGN KEY (&quot; &lt;&lt; a-&gt;getMultiB() &lt;&lt;
+                                       &quot;) REFERENCES &quot; &lt;&lt;   a-&gt;getObjectA()-&gt;getName() &lt;&lt; &quot;(&quot; &lt;&lt; a-&gt;getMultiA() &lt;&lt; &quot;)&quot;;
+
+                       }
                }
        }</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>215927</commentid>
    <comment_count>1</comment_count>
    <who name="Jonathan Riddell">jr</who>
    <bug_when>2004-03-15 23:31:39 +0000</bug_when>
    <thetext>I&apos;ve applied the patch, thanks for your contribution.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>215929</commentid>
    <comment_count>2</comment_count>
    <who name="Jonathan Riddell">jr</who>
    <bug_when>2004-03-15 23:32:50 +0000</bug_when>
    <thetext>*** Bug 76877 has been marked as a duplicate of this bug. ***</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>254189</commentid>
    <comment_count>3</comment_count>
    <who name="Sebastian Stein">seb.kde</who>
    <bug_when>2004-07-29 17:47:02 +0000</bug_when>
    <thetext>- foreign key constraint fixed
- comma adding fixed for different scopes</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>254192</commentid>
    <comment_count>4</comment_count>
    <who name="Sebastian Stein">seb.kde</who>
    <bug_when>2004-07-29 17:50:08 +0000</bug_when>
    <thetext>Ah, I added the wrong comment a minute ago. This bug was already mostly fixed. I just removed the commented foreign key constraint, because it is nonsense and makes the code easier to read.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>488185</commentid>
    <comment_count>5</comment_count>
      <attachid>18621</attachid>
    <who name="Alexey Parshin">alexeyp</who>
    <bug_when>2006-11-20 08:29:16 +0000</bug_when>
    <thetext>Created attachment 18621
Patch to allow tables to have self-references

Sometimes, you need something like this:
create table t1 (
  id int primary key,
  parent int references t1(id)
);
The proposed patch allows it.
Also, Umbrello sometimes tries to create (in the export file) the empty foreign
keys with no table name and fields. These declarations come as a result of
deleting associations and not accessible through the Umbrello interface.
However, they are presented in the XMI file. This patch offers a primitive
workaround for this problem, too, by ignoring such associations during export.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>488187</commentid>
    <comment_count>6</comment_count>
    <who name="Alexey Parshin">alexeyp</who>
    <bug_when>2006-11-20 08:30:36 +0000</bug_when>
    <thetext>Forgot to tell: Umbrello version I&apos;m reporting about is a part of KDE 3.5.5.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>488353</commentid>
    <comment_count>7</comment_count>
    <who name="Oliver Kellogg">okellogg</who>
    <bug_when>2006-11-20 20:29:26 +0000</bug_when>
    <thetext>In attachment id=18621, Alexey Parshin wrote:
+ if ( a-&gt;getRoleName(Uml::B) != &quot;&quot; &amp;&amp; a-&gt;getRoleName(Uml::B) != &quot;&quot;) {

Hmm, twice the same expression? Please check.
</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>488423</commentid>
    <comment_count>8</comment_count>
    <who name="Oliver Kellogg">okellogg</who>
    <bug_when>2006-11-20 22:36:55 +0000</bug_when>
    <thetext>SVN commit 606555 by okellogg:

Apply attachment 18621 by Alexey Parshin with slight modification.
Thanks Alexey for contributing.
CCBUG:77377


 M  +12 -8     sqlwriter.cpp  


--- branches/KDE/3.5/kdesdk/umbrello/umbrello/codegenerators/sqlwriter.cpp #606554:606555
@@ -86,14 +86,18 @@
     UMLAssociationList aggregations = c-&gt;getAggregations();
     if( forceSections() || !aggregations.isEmpty() ) {
         for(UMLAssociation* a = aggregations.first(); a; a = aggregations.next()) {
-            if( a-&gt;getObject(Uml::A)-&gt;getID() != c-&gt;getID() ) {
-
-                sql &lt;&lt; m_indentation &lt;&lt; &quot;,&quot; &lt;&lt; m_endl &lt;&lt; m_indentation
-                &lt;&lt; &quot;CONSTRAINT &quot; &lt;&lt; a-&gt;getName() &lt;&lt; &quot; FOREIGN KEY (&quot;
-                &lt;&lt; a-&gt;getRoleName(Uml::B) &lt;&lt; &quot;) REFERENCES &quot;
-                &lt;&lt; a-&gt;getObject(Uml::A)-&gt;getName()
-                &lt;&lt; &quot; (&quot; &lt;&lt; a-&gt;getRoleName(Uml::A) &lt;&lt; &quot;)&quot;;
-            }
+            UMLObject *objA = a-&gt;getObject(Uml::A);
+            UMLObject *objB = a-&gt;getObject(Uml::B);
+            if (objA-&gt;getID() == c-&gt;getID() &amp;&amp; objB-&gt;getID() != c-&gt;getID())
+                continue;
+            QString roleNameA = a-&gt;getRoleName(Uml::A);
+            QString roleNameB = a-&gt;getRoleName(Uml::B);
+            if (roleNameA.isEmpty() || roleNameB.isEmpty())
+                continue;
+            sql &lt;&lt; m_indentation &lt;&lt; &quot;,&quot; &lt;&lt; m_endl;
+            sql &lt;&lt; m_indentation &lt;&lt; &quot;CONSTRAINT &quot; &lt;&lt; a-&gt;getName()
+                &lt;&lt; &quot; FOREIGN KEY (&quot; &lt;&lt; roleNameB &lt;&lt; &quot;) REFERENCES &quot;
+                &lt;&lt; objA-&gt;getName() &lt;&lt; &quot; (&quot; &lt;&lt; roleNameA &lt;&lt; &quot;)&quot;;
         }
     }
 
</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>18621</attachid>
            <date>2006-11-20 08:29:16 +0000</date>
            <delta_ts>2006-11-20 08:29:16 +0000</delta_ts>
            <desc>Patch to allow tables to have self-references</desc>
            <filename>3.5.5-sql-export.patch</filename>
            <type>text/plain</type>
            <size>1505</size>
            <attacher name="Alexey Parshin">alexeyp</attacher>
            
              <data encoding="base64">ZGlmZiAtdU5yIGtkZXNkay0zLjUuNS5vcmlnL3VtYnJlbGxvL3VtYnJlbGxvL2NvZGVnZW5lcmF0
b3JzL3NxbHdyaXRlci5jcHAga2Rlc2RrLTMuNS41L3VtYnJlbGxvL3VtYnJlbGxvL2NvZGVnZW5l
cmF0b3JzL3NxbHdyaXRlci5jcHAKLS0tIGtkZXNkay0zLjUuNS5vcmlnL3VtYnJlbGxvL3VtYnJl
bGxvL2NvZGVnZW5lcmF0b3JzL3NxbHdyaXRlci5jcHAJMjAwNi0wNy0yMiAxODoxMTo1Ny4wMDAw
MDAwMDAgKzEwMDAKKysrIGtkZXNkay0zLjUuNS91bWJyZWxsby91bWJyZWxsby9jb2RlZ2VuZXJh
dG9ycy9zcWx3cml0ZXIuY3BwCTIwMDYtMTEtMjAgMTY6NDI6MzUuMDAwMDAwMDAwICsxMTAwCkBA
IC04NiwxNCArODYsMTUgQEAKICAgICBVTUxBc3NvY2lhdGlvbkxpc3QgYWdncmVnYXRpb25zID0g
Yy0+Z2V0QWdncmVnYXRpb25zKCk7CiAgICAgaWYoIGZvcmNlU2VjdGlvbnMoKSB8fCAhYWdncmVn
YXRpb25zLmlzRW1wdHkoKSApIHsKICAgICAgICAgZm9yKFVNTEFzc29jaWF0aW9uKiBhID0gYWdn
cmVnYXRpb25zLmZpcnN0KCk7IGE7IGEgPSBhZ2dyZWdhdGlvbnMubmV4dCgpKSB7Ci0gICAgICAg
ICAgICBpZiggYS0+Z2V0T2JqZWN0KFVtbDo6QSktPmdldElEKCkgIT0gYy0+Z2V0SUQoKSApIHsK
LQotICAgICAgICAgICAgICAgIHNxbCA8PCBtX2luZGVudGF0aW9uIDw8ICIsIiA8PCBtX2VuZGwg
PDwgbV9pbmRlbnRhdGlvbgotICAgICAgICAgICAgICAgIDw8ICJDT05TVFJBSU5UICIgPDwgYS0+
Z2V0TmFtZSgpIDw8ICIgRk9SRUlHTiBLRVkgKCIKLSAgICAgICAgICAgICAgICA8PCBhLT5nZXRS
b2xlTmFtZShVbWw6OkIpIDw8ICIpIFJFRkVSRU5DRVMgIgotICAgICAgICAgICAgICAgIDw8IGEt
PmdldE9iamVjdChVbWw6OkEpLT5nZXROYW1lKCkKLSAgICAgICAgICAgICAgICA8PCAiICgiIDw8
IGEtPmdldFJvbGVOYW1lKFVtbDo6QSkgPDwgIikiOwotICAgICAgICAgICAgfQorICAgICAgICAg
ICAgaWYoIGEtPmdldE9iamVjdChVbWw6OkEpLT5nZXRJRCgpID09IGMtPmdldElEKCkgJiYgYS0+
Z2V0T2JqZWN0KFVtbDo6QiktPmdldElEKCkgIT0gYy0+Z2V0SUQoKSApCisJCWNvbnRpbnVlOwor
CSAgICBpZiAoIGEtPmdldFJvbGVOYW1lKFVtbDo6QikgIT0gIiIgJiYgYS0+Z2V0Um9sZU5hbWUo
VW1sOjpCKSAhPSAiIikgeworICAgICAgICAgICAgCSAgICBzcWwgPDwgbV9pbmRlbnRhdGlvbiA8
PCAiLCIgPDwgbV9lbmRsIDw8IG1faW5kZW50YXRpb24KKyAgICAgICAgICAgIAkgICAgPDwgIkNP
TlNUUkFJTlQgIiA8PCBhLT5nZXROYW1lKCkgPDwgIiBGT1JFSUdOIEtFWSAoIgorICAgICAgICAg
ICAgCSAgICA8PCBhLT5nZXRSb2xlTmFtZShVbWw6OkIpIDw8ICIpIFJFRkVSRU5DRVMgIgorICAg
ICAgICAgICAgCSAgICA8PCBhLT5nZXRPYmplY3QoVW1sOjpBKS0+Z2V0TmFtZSgpCisgICAgICAg
ICAgICAJICAgIDw8ICIgKCIgPDwgYS0+Z2V0Um9sZU5hbWUoVW1sOjpBKSA8PCAiKSI7CisJICAg
IH0KICAgICAgICAgfQogICAgIH0KIAo=
</data>

          </attachment>
      

    </bug>

</bugzilla>