~launchpad-pqm/launchpad/devel

« back to all changes in this revision

Viewing changes to database/schema/hack.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2005-02-11 22:07:15 UTC
  • mfrom: (unknown (missing))
  • Revision ID: Arch-1:rocketfuel@canonical.com%launchpad--devel--0--patch-1308
Add generated database diagrams (initial cut)
Patches applied:

 * stuart.bishop@canonical.com/launchpad--dbdiagrams--0--base-0
   tag of stuart.bishop@canonical.com/launchpad--devel--1--patch-124

 * stuart.bishop@canonical.com/launchpad--dbdiagrams--0--patch-1
   Example to demonstrate postgresql_autodoc output

 * stuart.bishop@canonical.com/launchpad--dbdiagrams--0--patch-2
   Work in progress

 * stuart.bishop@canonical.com/launchpad--dbdiagrams--0--patch-3
   Work in progress

 * stuart.bishop@canonical.com/launchpad--dbdiagrams--0--patch-4
   Post-processing proof of concept working

 * stuart.bishop@canonical.com/launchpad--dbdiagrams--0--patch-5
   Work in progress

 * stuart.bishop@canonical.com/launchpad--dbdiagrams--0--patch-6
   Work in progress

 * stuart.bishop@canonical.com/launchpad--dbdiagrams--0--patch-7
   Work in progress

 * stuart.bishop@canonical.com/launchpad--dbdiagrams--0--patch-8
   tweaking

 * stuart.bishop@canonical.com/launchpad--dbdiagrams--0--patch-9
   tweaking

 * stuart.bishop@canonical.com/launchpad--dbdiagrams--0--patch-10
   Switch to postscript

 * stuart.bishop@canonical.com/launchpad--dbdiagrams--0--patch-11
   Merge from Rocketfuel

 * stuart.bishop@canonical.com/launchpad--dbdiagrams--0--patch-12
   Add generated database diagrams (initial cut)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
dot = '''
 
2
digraph g {
 
3
graph [
 
4
rankdir = "LR",
 
5
concentrate = true,
 
6
ratio = auto
 
7
];
 
8
node [
 
9
fontsize = "10",
 
10
shape = record
 
11
];
 
12
edge [
 
13
];
 
14
 
 
15
"emailaddress" [shape = record, label = "<col0> \N |  id:  serial\l email:  text\l person:  integer\l status:  integer\l" ];
 
16
 
 
17
"gpgkey" [shape = record, label = "<col0> \N |  id:  serial\l person:  integer\l keyid:  text\l fingerprint:  text\l pubkey:  text\l revoked:  boolean\l algorithm:  integer\l keysize:  integer\l" ];
 
18
 
 
19
"ircid" [shape = record, label = "<col0> \N |  id:  serial\l person:  integer\l network:  text\l nickname:  text\l" ];
 
20
 
 
21
"jabberid" [shape = record, label = "<col0> \N |  id:  serial\l person:  integer\l jabberid:  text\l" ];
 
22
 
 
23
"karma" [shape = record, label = "<col0> \N |  id:  serial\l karmafield:  integer\l datecreated:  timestamp without time zone\l person:  integer\l points:  integer\l" ];
 
24
 
 
25
"logintoken" [shape = record, label = "<col0> \N |  id:  serial\l requester:  integer\l requesteremail:  text\l email:  text\l created:  timestamp without time zone\l tokentype:  integer\l token:  text\l" ];
 
26
 
 
27
"person" [shape = record, label = "<col0> \N |  id:  serial\l displayname:  text\l givenname:  text\l familyname:  text\l password:  text\l teamowner:  integer\l teamdescription:  text\l karma:  integer\l karmatimestamp:  timestamp without time zone\l name:  text\l language:  integer\l fti:  tsvector\l" ];
 
28
 
 
29
"personlabel" [shape = record, label = "<col0> \N |  person:  integer\l label:  integer\l" ];
 
30
 
 
31
"personlanguage" [shape = record, label = "<col0> \N |  id:  serial\l person:  integer\l language:  integer\l" ];
 
32
 
 
33
"sshkey" [shape = record, label = "<col0> \N |  id:  serial\l person:  integer\l keytype:  integer\l keytext:  text\l comment:  text\l" ];
 
34
 
 
35
"teammembership" [shape = record, label = "<col0> \N |  id:  serial\l person:  integer\l team:  integer\l role:  integer\l status:  integer\l" ];
 
36
 
 
37
"teamparticipation" [shape = record, label = "<col0> \N |  id:  serial\l team:  integer\l person:  integer\l" ];
 
38
 
 
39
"wikiname" [shape = record, label = "<col0> \N |  id:  serial\l person:  integer\l wiki:  text\l wikiname:  text\l" ];
 
40
 
 
41
 
 
42
"emailaddress" -> "person" [label=""];
 
43
"gpgkey" -> "person" [label=""];
 
44
"ircid" -> "person" [label=""];
 
45
"jabberid" -> "person" [label=""];
 
46
"karma" -> "person" [label="karma_person_fk"];
 
47
"logintoken" -> "person" [label="logintoken_requester_fk"];
 
48
"person" -> "person" [label=""];
 
49
"personlabel" -> "person" [label=""];
 
50
"personlanguage" -> "person" [label="personlanguage_person_fk"];
 
51
"sshkey" -> "person" [label=""];
 
52
"teammembership" -> "person" [label=""];
 
53
"teammembership" -> "person" [label=""];
 
54
"teamparticipation" -> "person" [label=""];
 
55
"teamparticipation" -> "person" [label=""];
 
56
"wikiname" -> "person" [label=""];
 
57
}
 
58
'''
 
59
 
 
60
# Shorten timestamp declarations
 
61
import re
 
62
dot = re.subn('timestamp without time zone','timestamp', dot)[0]
 
63
 
 
64
lines = dot.split('\n')
 
65
for i in xrange(0, len(lines)):
 
66
    line = lines[i]
 
67
    if r'label = "<col0> \N' in line:
 
68
        m = re.search(r'''
 
69
                ^"(.*?)" .* 
 
70
                label \s = \s "<col0> \s \\N \s \| \s+ (.+?)" \s ];$
 
71
                ''', line, re.X)
 
72
        assert m is not None, 'Bad line %s' % repr(m)
 
73
        table = m.group(1)
 
74
        raw_cols = m.group(2)
 
75
        assert raw_cols.endswith(r'\l'), 'Bad column list'
 
76
        raw_cols = [
 
77
            r.strip() for r in raw_cols.split(r'\l') if r.strip()
 
78
            ]
 
79
        cols = [c.split(':') for c in raw_cols]
 
80
        cols = [(a.strip(), b.strip()) for a,b in cols]
 
81
 
 
82
        # This version looks nicer, but we have two cells for a table
 
83
        # column instead of one and we will have more difficulty using
 
84
        #label = r"{<col0>\N|{{"
 
85
        #for col, typ in cols:
 
86
        #    label += r"%s |" % col
 
87
        #label = label[:-1] + "}|{"
 
88
        #for col, typ in cols:
 
89
        #    label += r"%s |" % typ
 
90
        #label = label[:-1] + "}}}"
 
91
        #label = '"%s"' % label
 
92
        #shape = 'record'
 
93
 
 
94
        # This version is feature full, but looks crappy since we
 
95
        # can't control fonts or cell formatting
 
96
        #label = r"{<col0>\N | "
 
97
        #for col,typ in cols:
 
98
        #    label += r'<%s> %s: %s |' % (col, col, typ)
 
99
        #if label[-1] == '|':
 
100
        #    label = label[:-1]
 
101
        #label += "}"
 
102
        #label = '"%s"' % label
 
103
        #shape = 'record'
 
104
 
 
105
        # This version uses new HTML tables
 
106
        shape = 'plaintext'
 
107
        label = '''<
 
108
            <TABLE BGCOLOR="azure3" BORDER="1" ALIGN="LEFT" PORT="col1">
 
109
                <TR BORDER="1">
 
110
                    <TD BGCOLOR="white" COLSPAN="2" ALIGN="CENTER">\\N</TD>
 
111
                </TR>\n'''
 
112
        for col, typ in cols:
 
113
            label += '<TR BORDER="0" PORT="%s">\n' % col
 
114
            label += '<TD ALIGN="LEFT" BORDER="0">%s</TD>\n' % col
 
115
            label += '<TD ALIGN="LEFT" BORDER="0">%s</TD>\n' % typ
 
116
            label += '</TR>\n'
 
117
        label += '</TABLE>\n>'
 
118
 
 
119
        lines[i] = '"%s" [shape = %s, label = %s ];' % (table, shape, label)
 
120
    print lines[i]
 
121