swarmlib/db/schema.py
author Sam Hart <criswellious@gmail.com>
Sun Apr 06 14:09:14 2008 -0400 (4 years ago)
changeset 265 30be108fda3a
parent 2497bff1bb19cf7
permissions -rw-r--r--
short_hash_id to issue_id
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)