| sam@234 | 1 | # Copyright 2007 Sam Hart
|
| sam@234 | 2 | #
|
| sam@234 | 3 | # This program is free software; you can redistribute it and/or modify
|
| sam@234 | 4 | # it under the terms of the GNU General Public License as published by
|
| sam@234 | 5 | # the Free Software Foundation; either version 2 of the License, or
|
| sam@234 | 6 | # (at your option) any later version.
|
| sam@234 | 7 | #
|
| sam@234 | 8 | # This program is distributed in the hope that it will be useful,
|
| sam@234 | 9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
|
| sam@234 | 10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
| sam@234 | 11 | # GNU General Public License for more details.
|
| sam@234 | 12 | #
|
| sam@234 | 13 | # You should have received a copy of the GNU General Public License
|
| sam@234 | 14 | # along with this program; if not, write to the Free Software
|
| sam@234 | 15 | # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
| sam@234 | 16 | #
|
| sam@234 | 17 | # Author: Sam Hart
|
| sam@234 | 18 |
|
| sam@234 | 19 | """
|
| sam@234 | 20 | Swarm DB Schema Package
|
| sam@234 | 21 |
|
| sam@234 | 22 | This package defines the database schema used in a Swarm Hive.
|
| sam@234 | 23 | """
|
| sam@234 | 24 |
|
| sam@234 | 25 | from sqlalchemy import Table, Column, Integer, String, MetaData, ForeignKey, \
|
| criswellious@245 | 26 | Float, PickleType, Text, Binary, Boolean
|
| criswellious@235 | 27 |
|
| criswellious@246 | 28 | #from sqlalchemy.orm import mapper, relation, backref
|
| criswellious@246 | 29 | #import sqlalchemy.types as types
|
| sam@234 | 30 |
|
| criswellious@242 | 31 | from swarmlib.db.db_bits import metadata
|
| criswellious@246 | 32 | import swarmlib.db.data_objects as dobj
|
| criswellious@244 | 33 |
|
| criswellious@244 | 34 | ###################################
|
| criswellious@244 | 35 | # Define the issue and node tables
|
| criswellious@244 | 36 | ###################################
|
| sam@234 | 37 |
|
| sam@234 | 38 | __HASH_ID_LENGTH__ = 40
|
| sam@234 | 39 | __USER_ID_LENGTH__ = 60
|
| criswellious@237 | 40 | __SUMMARY_LENGTH__ = 255
|
| sam@234 | 41 |
|
| criswellious@237 | 42 | issues_table = Table('issues', metadata,
|
| criswellious@241 | 43 | Column('hash_id', String(__HASH_ID_LENGTH__),
|
| criswellious@241 | 44 | primary_key=True, unique=True, nullable=False),
|
| criswellious@265 | 45 | Column('issue_id', String(__HASH_ID_LENGTH__),
|
| criswellious@241 | 46 | unique=True, nullable=False),
|
| sam@234 | 47 |
|
| criswellious@244 | 48 | Column('block_id', String(__HASH_ID_LENGTH__),
|
| criswellious@244 | 49 | ForeignKey('issues.hash_id')),
|
| criswellious@244 | 50 |
|
| criswellious@244 | 51 | # Status will no longer be a user definable list
|
| criswellious@244 | 52 | # This is to better refine searches.
|
| criswellious@244 | 53 | Column('status', Integer, nullable=False),
|
| criswellious@244 | 54 |
|
| sam@234 | 55 | # XXX: The following all need to have default values. The best way
|
| sam@234 | 56 | # will probably be to set up a mapping in sqlalchemy orm, but I don't
|
| sam@234 | 57 | # yet know how best to do this, so I'm marking it as a FIXME
|
| criswellious@240 | 58 | Column('component', Integer, nullable=False),
|
| criswellious@240 | 59 | Column('version', Integer, nullable=False),
|
| criswellious@240 | 60 | Column('milestone', Integer, nullable=False),
|
| criswellious@240 | 61 | Column('severity', Integer, nullable=False),
|
| criswellious@240 | 62 | Column('priority', Integer, nullable=False),
|
| criswellious@240 | 63 | Column('resolution', Integer, nullable=False),
|
| sam@234 | 64 |
|
| criswellious@240 | 65 | Column('owner', String(__USER_ID_LENGTH__)),
|
| criswellious@240 | 66 | Column('reporter', String(__USER_ID_LENGTH__), nullable=False),
|
| sam@234 | 67 |
|
| sam@234 | 68 | # FIXME XXX: More mappings will be needed here
|
| criswellious@240 | 69 | Column('cc_id', Integer),
|
| criswellious@240 | 70 | Column('subscribers_id', Integer),
|
| sam@234 | 71 |
|
| criswellious@240 | 72 | Column('time', Float),
|
| criswellious@237 | 73 | )
|
| criswellious@237 | 74 |
|
| criswellious@243 | 75 | nodes_table = Table('nodes', metadata,
|
| criswellious@241 | 76 | Column('hash_id', String(__HASH_ID_LENGTH__),
|
| criswellious@241 | 77 | primary_key=True, unique=True, nullable=False),
|
| criswellious@241 | 78 | Column('issue_id', String(__HASH_ID_LENGTH__),
|
| criswellious@241 | 79 | ForeignKey('issues.hash_id')),
|
| criswellious@241 | 80 | Column('parent_node_id', String(__HASH_ID_LENGTH__),
|
| criswellious@241 | 81 | ForeignKey('nodes.hash_id')),
|
| criswellious@237 | 82 |
|
| criswellious@240 | 83 | Column('time', Float),
|
| criswellious@237 | 84 |
|
| criswellious@240 | 85 | Column('poster', String(__USER_ID_LENGTH__)),
|
| criswellious@237 | 86 |
|
| criswellious@240 | 87 | Column('summary', String(__SUMMARY_LENGTH__)),
|
| criswellious@240 | 88 | Column('details', Text),
|
| criswellious@237 | 89 |
|
| criswellious@244 | 90 | Column('attachment', Binary),
|
| criswellious@235 | 91 | )
|
| sam@234 | 92 |
|
| criswellious@246 | 93 | mapper(dobj.Issue, issues_table, properties={
|
| criswellious@244 | 94 | 'root_nodes':relation(Node), #, backref='issue')
|
| criswellious@244 | 95 | 'depends':relation(Issue, backref=backref('blocks',
|
| criswellious@244 | 96 | remote_side=[issues_table.c.hash_id])),
|
| criswellious@237 | 97 | })
|
| criswellious@246 | 98 | mapper(dobj.Node, nodes_table, properties={
|
| criswellious@241 | 99 | 'children':relation(Node, backref=backref('parent',
|
| criswellious@241 | 100 | remote_side=[nodes_table.c.hash_id])),
|
| criswellious@237 | 101 | })
|
| criswellious@237 | 102 |
|
| criswellious@244 | 103 | ###################################
|
| criswellious@244 | 104 | # Define the Transaction log table
|
| criswellious@244 | 105 | ###################################
|
| criswellious@244 | 106 |
|
| criswellious@244 | 107 | transaction_log_table = Table('transaction_log', metadata,
|
| criswellious@244 | 108 | Column('id', Integer, primary_key=True, auto_increment=True),
|
| criswellious@244 | 109 | Column('root', String(__HASH_ID_LENGTH__)),
|
| criswellious@244 | 110 | Column('time', Float),
|
| criswellious@244 | 111 | Column('transaction', Integer),
|
| criswellious@244 | 112 | Column('transaction_data', PickleType),
|
| criswellious@244 | 113 | )
|
| criswellious@244 | 114 |
|
| criswellious@246 | 115 | mapper(dobj.TransactionEntry, transaction_log_table)
|
| criswellious@245 | 116 |
|
| criswellious@245 | 117 | ############################################
|
| criswellious@245 | 118 | # Define the user-definable Taxonomy tables
|
| criswellious@245 | 119 | ############################################
|
| criswellious@245 | 120 | __TAX_NAME_LENGTH__ = 25
|
| criswellious@245 | 121 | ##################
|
| criswellious@245 | 122 | component_table = Table('components', metadata
|
| criswellious@245 | 123 | Column('id', Integer, primary_key=True, unique=True, auto_increment=True),
|
| criswellious@245 | 124 | Column('name', String(__TAX_NAME_LENGTH__)),
|
| criswellious@245 | 125 | Column('isdefault', Boolean),
|
| criswellious@245 | 126 | )
|
| criswellious@245 | 127 |
|
| criswellious@246 | 128 | mapper(dobj.ComponentEntry, component_table)
|
| criswellious@245 | 129 |
|
| criswellious@245 | 130 | version_table = Table('versions', metadata
|
| criswellious@245 | 131 | column('id',Integer, primary_key=True, unique=True,
|
| criswellious@245 | 132 | auto_increment=True),
|
| criswellious@245 | 133 | column('name', String(__TAX_NAME_LENGTH__)),
|
| criswellious@245 | 134 | column('isdefault', Boolean),
|
| criswellious@245 | 135 | )
|
| criswellious@245 | 136 |
|
| criswellious@246 | 137 | mapper(dobj.VersionEntry, version_table)
|
| criswellious@245 | 138 |
|
| criswellious@245 | 139 | milestone_table = Table('milestones', metadata
|
| criswellious@245 | 140 | column('id',Integer, primary_key=True, unique=True,
|
| criswellious@245 | 141 | auto_increment=True),
|
| criswellious@245 | 142 | column('name', String(__TAX_NAME_LENGTH__)),
|
| criswellious@245 | 143 | column('isdefault', Boolean),
|
| criswellious@245 | 144 | )
|
| criswellious@245 | 145 |
|
| criswellious@246 | 146 | mapper(dobj.MilestoneEntry, milestone_table)
|
| criswellious@245 | 147 |
|
| criswellious@245 | 148 | severity_table = Table('severities', metadata
|
| criswellious@245 | 149 | column('id',Integer, primary_key=True, unique=True,
|
| criswellious@245 | 150 | auto_increment=True),
|
| criswellious@245 | 151 | column('name', String(__TAX_NAME_LENGTH__)),
|
| criswellious@245 | 152 | column('isdefault', Boolean),
|
| criswellious@245 | 153 | )
|
| criswellious@245 | 154 |
|
| criswellious@246 | 155 | mapper(dobj.SeverityEntry, severity_table)
|
| criswellious@245 | 156 |
|
| criswellious@245 | 157 | priority_table = Table('priorities', metadata
|
| criswellious@245 | 158 | column('id',Integer, primary_key=True, unique=True,
|
| criswellious@245 | 159 | auto_increment=True),
|
| criswellious@245 | 160 | column('name', String(__TAX_NAME_LENGTH__)),
|
| criswellious@245 | 161 | column('isdefault', Boolean),
|
| criswellious@245 | 162 | )
|
| criswellious@245 | 163 |
|
| criswellious@246 | 164 | mapper(dobj.PriorityEntry, priority_table)
|
| criswellious@245 | 165 |
|
| criswellious@245 | 166 | status_table = Table('status', metadata
|
| criswellious@245 | 167 | column('id',Integer, primary_key=True, unique=True,
|
| criswellious@245 | 168 | auto_increment=True),
|
| criswellious@245 | 169 | column('name', String(__TAX_NAME_LENGTH__)),
|
| criswellious@245 | 170 | column('isdefault', Boolean),
|
| criswellious@245 | 171 | )
|
| criswellious@245 | 172 |
|
| criswellious@246 | 173 | mapper(dobj.StatusEntry, status_table)
|
| criswellious@245 | 174 |
|
| criswellious@245 | 175 | resolution_table = Table('resolutions', metadata
|
| criswellious@245 | 176 | column('id',Integer, primary_key=True, unique=True,
|
| criswellious@245 | 177 | auto_increment=True),
|
| criswellious@245 | 178 | column('name', String(__TAX_NAME_LENGTH__)),
|
| criswellious@245 | 179 | column('isdefault', Boolean),
|
| criswellious@245 | 180 | )
|
| criswellious@245 | 181 |
|
| criswellious@246 | 182 | mapper(dobj.ResolutionEntry, resolution_table)
|
| criswellious@245 | 183 |
|
| criswellious@246 | 184 | ##############################
|
| criswellious@246 | 185 | # Upstream tracker definition
|
| criswellious@246 | 186 | ##############################
|
| criswellious@246 | 187 | __URI_LENGTH__ = 200
|
| criswellious@246 | 188 | upstream_table = Table('upstream', metadata
|
| criswellious@246 | 189 | column('id', Integer, primary_key=True, unique=True,
|
| criswellious@246 | 190 | auto_increment=True),
|
| criswellious@246 | 191 | column('uri', String(__URI_LENGTH__),
|
| criswellious@246 | 192 | column('type', Integer),
|
| criswellious@246 | 193 | column('authentication', PickleType), # blob containing auth info
|
| criswellious@246 | 194 | column('transport', PickleType), # blob containing transport info
|
| criswellious@246 | 195 | )
|
| criswellious@245 | 196 |
|
| criswellious@246 | 197 | mapper(dobj.Upstream, upstream_table)
|