I've written the following dumb perl script to generate a dia file
from my database table layout (pretending that each table is a UML object
with just attributes). So, I run this, and try to read the resulting
file. I get "Error loading diagram: /tmp/dbinfo Unknown file
type". What am I doing wrong?

I suspect that the problem has to do with not knowing up-front what
the width/heights should be for everything. How do I calculate those,
if I don't know the font, etc?

#!/usr/bin/perl

while(<>) {
  if (/^CREATE\s+TABLE\s+(\w+)\s*\(/) {
    $table = $1;
  } elsif (/^\s*--/) {
    next;
  } elsif (/^\s*(\w+)\s+(.*),\s*$/) {
    push @{$data{$table}}, [$1,$2];
  } elsif (/^\s*(\w+)\s+(.*\S)\s*$/) {
    push @{$data{$table}}, [$1,$2];
  } else {
  }
}

print q{<?xml version="1.0"?>
<dia:diagram xmlns:dia="http://www.lysator.liu.se/~alla/dia/">
  <dia:diagramdata>
    <dia:attribute name="background">
      <dia:color val="#ffffff"/>
    </dia:attribute>
  </dia:diagramdata>
  <dia:layer name="Background" visible="true">
};

$i=1;
foreach $table (sort keys %data) {
  last if $i > 10;
  $x = $y = $i/5+2;
  print qq{    <dia:object type="UML - Class" version="0" id="O},$i-1,qq{">
      <dia attribute name="obj_pos">
        <dia:point val="$x,$y"/>
      </dia:attribute>
};
#  print qq{      <dia:attribute name="obj_bb">
#        <dia:rectangle val="$x,$y;25.666,12.65"/>
#      </dia:attribute>
#      <dia:attribute name="elem_corner">
#        <dia:point val="$x,$y"/>
#      </dia:attribute>
#      <dia:attribute name="elem_width">
#        <dia:real val="22.616"/>
#      </dia:attribute>
#      <dia:attribute name="elem_height">
#        <dia:real val="10.4"/>
#      </dia:attribute>
#};
  print qq{      <dia:attribute name="name">\n
        <dia:string>\#$table\#</dia:string>
      </dia:attribute>
      <dia:attribute name="stereotype">
        <dia:string/>
      </dia:attribute>
      <dia:attribute name="abstract">
        <dia:boolean val="false"/>
      </dia:attribute>
      <dia:attribute name="suppress_attributes">
        <dia:boolean val="false"/>
      </dia:attribute>
      <dia:attribute name="suppress_operations">
        <dia:boolean val="false"/>
      </dia:attribute>
      <dia:attribute name="visible_attributes">
        <dia:boolean val="true"/>
      </dia:attribute>
      <dia:attribute name="visible_operations">
        <dia:boolean val="false"/>
      </dia:attribute>
      <dia:attribute name="attributes">
};
  foreach $attr (@{$data{$table}}) {
    ($name,$type) = @$attr;
    print qq{        <dia:composite type="umlattribute">
          <dia:attribute name="name">
            <dia:string>\#$name\#</dia:string>
          </dia:attribute>
          <dia:attribute name="type">
            <dia:string>\#$type\#</dia:string>
          </dia:attribute>
          <dia:attribute name="value">
            <dia:string/>
          </dia:attribute>
          <dia:attribute name="visibility">
            <dia:enum val="0"/>
          </dia:attribute>
          <dia:attribute name="abstract">
            <dia:boolean val="false"/>
          </dia:attribute>
          <dia:attribute name="class_scope">
            <dia:boolean val="false"/>
          </dia:attribute>
        </dia:composite>
};
  }
  print q{      </dia:attribute>
      <dia:attribute name="operations"/>
      <dia:attribute name="template">
        <dia:boolean val="false"/>
      </dia:attribute>
      <dia:attribute name="templates"/>
    </dia:object>
};
  $i++;
}

print q{  </dia:layer>
</dia:diagram>
};

Reply via email to