import Sybase
from albatross import SimpleSessionApp
from albatross.apacheapp import Request

def get_table_list(ctx):
    db = ctx.app.db
    db.execute('use %s' % ctx.locals.database)
    c = db.cursor()
    c.execute('select name from sysobjects'
              ' where type in ("U", "S")'
              ' order by name')
    tables = map(lambda r: r[0], c.fetchall())
    ctx.locals.tables = tables

def get_database_list(ctx):
    c = ctx.app.db.cursor()
    c.execute('select name from master..sysdatabases')
    databases = map(lambda r: r[0], c.fetchall())
    ctx.locals.databases = databases

def get_table_desc(ctx):
    db = ctx.app.db
    db.execute('use %s' % ctx.locals.database)
    c = db.cursor()
    c.execute('select id from sysobjects'
              ' where type in ("U", "S") and name = "%s"' % ctx.locals.table)
    table_id, = c.fetchone()
    c.execute('select c.name, t.name, c.length, c.status'
              ' from syscolumns c, systypes t'
              ' where c.id = %d and c.usertype = t.usertype'
              ' order by c.colid' % table_id)
    ctx.locals.columns = c.fetchall()

def get_table_view(ctx):
    db = ctx.app.db
    db.execute('use %s' % ctx.locals.database)
    c = db.cursor()
    c.execute('select u.name from sysusers u, sysobjects o'
              ' where o.type in ("U","S") and o.name = "%s"'
              ' and o.uid = u.uid' % ctx.locals.table)
    owner, = c.fetchone()
    table = '%s.%s' % (owner, ctx.locals.table)
    c = db.cursor()
    c.execute('select * from %s' % table)
    ctx.locals.desc = c.description
    ctx.locals.rows = c.fetchall()

def request_field(ctx, name):
    if ctx.request.has_field(name):
        return ctx.request.field_value(name)

class TableList:
    name = 'table_list'

    def page_display(self, ctx):
        if not hasattr(ctx.locals, 'database'):
            ctx.locals.database = 'master'
        get_database_list(ctx)
        get_table_list(ctx)
        ctx.run_template('table-list.html')

    def page_process(self, ctx):
        if ctx.req_equals('changedb'):
            ctx.locals.database = request_field(ctx, 'database')
        elif ctx.req_equals('desc'):
            ctx.locals.table = request_field(ctx, 'desc')
            ctx.set_page('table_desc')
        elif ctx.req_equals('view'):
            ctx.locals.table = request_field(ctx, 'view')
            ctx.set_page('table_view')

class TableDesc:
    name = 'table_desc'

    def page_display(self, ctx):
        get_table_desc(ctx)
        ctx.run_template('table-desc.html')

    def page_process(self, ctx):
        if ctx.req_equals('changetable'):
            ctx.locals.table = request_field(ctx, 'table')
        elif ctx.req_equals('back'):
            ctx.set_page('table_list')

class TableView:
    name = 'table_view'

    def page_display(self, ctx):
        get_table_view(ctx)
        ctx.run_template('table-view.html')

    def page_process(self, ctx):
        if ctx.req_equals('changetable'):
            try:
                del ctx.locals.r
            except AttributeError:
                pass
            ctx.locals.table = request_field(ctx, 'table')
        elif ctx.req_equals('back'):
            ctx.set_page('table_list')

class App(SimpleSessionApp):
    def __init__(self):
        SimpleSessionApp.__init__(self,
                                  base_url = 'sybase.py',
                                  template_path = '-=-install_dir-=-',
                                  start_page = 'table_list',
                                  secret = '-=-secret-=-',
                                  session_appid = 'sybase')
        for page_class in (TableList, TableDesc, TableView):
            self.register_page(page_class.name, page_class())
        self.db = Sybase.connect('SYBASE', 'sa', '')

    def create_context(self):
        ctx = SimpleSessionApp.create_context(self)
        ctx.run_template_once('macros.html')
        ctx.add_session_vars('database', 'tables', 'table')
        return ctx

app = App()

def handler(req):
    return app.run(Request(req))