"""
    MoinMoin - Parser for MySQL data
    
    Take care that a MySQL based database for source is assumed.
    For additional information performing these parser without any data given. 

    @copyright: 2004,2005 by Alexander Fischer <mail@fischer-alexander.net>
    @copyright: 2006 by Gouichi Iisaka <iisaka51 at hotmail dot com>
        Add error handling for procedure.
        Add HEADATTR, EVENATTR, ODDATTR.
            Attributes is depend on wiki engine.
            Currently follows attributes have been checked.
                bgcolor, align, valign
    @license: GNU GPL, see http://www.gnu.org/licenses/gpl for details

"""

import sys
from MoinMoin import wikiutil, config
import MySQLdb
import re

_re_dbh=re.compile("DBDATA (?P<DBDATA>.*)")
_re_query=re.compile("QUERY (?P<QUERY>.*)")
_re_headline=re.compile("HEADLINE (?P<HEADLINE>.*)")
_re_headattr=re.compile("HEADATTR (?P<HEADATTR>.*)")
_re_evenattr=re.compile("EVENATTR (?P<EVENATTR>.*)")
_re_oddattr=re.compile("ODDATTR (?P<ODDATTR>.*)")
_re_wikicol=re.compile("WIKICOLUMN (?P<WIKICOLUMN>.*)")
_re_htmlcol=re.compile("HTMLCOLUMN (?P<HTMLCOLUMN>.*)")
_re_mailcol=re.compile("MAILCOLUMN (?P<MAILCOLUMN>.*)")
_re_hidden=re.compile("HIDDENCOLUMN (?P<HIDDENCOLUMN>.*)")

_format_href='''
<a class="external" href="%s">
<img src="/wiki/rightsidebar/img/moin-www.png"
alt="[www]" width="11" height="11">%s</a>'''
_format_wikiref=' <a href="%s">%s</a>'
_format_mailto='<a href="mailto:%s">%s</a>'

Dependencies = ["Time"] # no cahce

class Preference:
    def __init__(self):
        self.linebreak = ''
        self.headattrs={}
        self.evenattrs={}
        self.oddattrs={}
        self.dbh=''
        self.query=''
        self.header=''
        self.html=''
        self.wiki=''
        self.mail=''
        self.hidden=''

class Parser:
    def __init__(self, raw, request, **kw):
        self.raw = raw
        self.request = request

    def format(self, formatter):
        self.request.write(process(self.request, formatter, self.raw.split('\n')))

def process(request, formatter, lines):
    params = Preference()
    params.linebreak = request.formatter.linebreak(0) 
    outbuffer=[request.formatter.paragraph(0)]                                                   
    output=[]

    # parameter lines are not exist ----------------
    if not lines[1:]:
	output.append(params.linebreak)
        output.append('Transfer connectiondata and query for correct output!')
	output.append(params.linebreak)
        output.append('{{{#!MySQL')
	output.append(params.linebreak)
        output.append('DBDATA host,database,[user],[password]')
	output.append(params.linebreak)
        output.append('QUERY dbquery')
	output.append(params.linebreak)
        output.append('[HEADLINE columnname1,columnname2,...,...]')
	output.append(params.linebreak)
        output.append('[HEADATTR attr1=val[,attr2=val,...]')
	output.append(params.linebreak)
        output.append('[EVENATTR attr1=val[,attr2=val,...]')
	output.append(params.linebreak)
        output.append('[ODDATTR attr1=val[,attr2=val,...]')
	output.append(params.linebreak)
        output.append('[HTMLCOLUMN columnnumber1,columnnumber2,...,...]')
	output.append(params.linebreak)
        output.append('[WIKICOLUMN columnnumber1,columnnumber2,...,...]')
	output.append(params.linebreak)
        output.append('[MAILCOLUMN columnnumber1,columnnumber2,...,...]')
	output.append(params.linebreak)
        output.append('[HIDDENCOLUMN columnnumber1,columnnumber2,...,...]')
	output.append(params.linebreak)
        output.append('}}}')
	output.append(params.linebreak)
	output.append(params.linebreak)
        output.append('Replace host, database, user, password, dbquery, columname, columnnumber with practical data!')
        output.append('<b>Take care for lower and upper case. Squared bracket = Optional data, Large letters = Syntax</b>')
  
    # section1 : parse parameter lines ----------------
    parameterlist=[] 
    for index in range(len(lines)):
        parameterlist.append(lines[index])

    for parameterstring in parameterlist : 
        match=_re_dbh.search(parameterstring)
        if match and match.groupdict().has_key('DBDATA'):
            params.dbh=match.group('DBDATA').split(',')
  
        match=_re_query.search(parameterstring)
        if match and match.groupdict().has_key('QUERY'):
            params.query=match.group('QUERY')
        
        match=_re_headattr.search(parameterstring)
        if match and match.groupdict().has_key('HEADATTR'):
            for attr in match.group('HEADATTR').split(','):
                attrName, attrVal = attr.split('=')
                try:
                    params.headattrs[attrName]=attrVal
                except:
                    pass
        match=_re_evenattr.search(parameterstring)
        if match and match.groupdict().has_key('EVENATTR'):
            for attr in match.group('EVENATTR').split(','):
                attrName, attrVal = attr.split('=')
                try:
                    params.evenattrs[attrName]=attrVal
                except:
                    pass
        match=_re_oddattr.search(parameterstring)
        if match and match.groupdict().has_key('ODDATTR'):
            for attr in match.group('ODDATTR').split(','):
                attrName, attrVal = attr.split('=')
                try:
                    params.oddattrs[attrName]=attrVal
                except:
                    pass

        match=_re_headline.search(parameterstring)
        if match and match.groupdict().has_key('HEADLINE'):
            params.header=match.group('HEADLINE').split(',')
        
        match=_re_wikicol.search(parameterstring)
        if match and match.groupdict().has_key('WIKICOLUMN'):
            params.wiki=match.group('WIKICOLUMN').split(',')
        
        match=_re_htmlcol.search(parameterstring)
        if match and match.groupdict().has_key('HTMLCOLUMN'):
            params.html=match.group('HTMLCOLUMN').split(',')
       
        match=_re_mailcol.search(parameterstring)
        if match and match.groupdict().has_key('MAILCOLUMN'):
            params.mail=match.group('MAILCOLUMN').split(',')

        match=_re_hidden.search(parameterstring)
        if match and match.groupdict().has_key('HIDDENCOLUMN'):
            params.hidden=match.group('HIDDENCOLUMN').split(',')
  
    # section1 : execute query and fetch all lines ----------------
    output.append(formatter.table(1)) 
      
    if params.header!='':
        output.append(formatter.table_row(1)) 
        for element in params.header:
               output.append(formatter.table_cell(1,params.headattrs))
               output.append(formatter.strong(1))
               output.append(formatter.text(element))
               output.append(formatter.strong(0)) 
               output.append(formatter.table_cell(0)) 
        output.append(formatter.table_row(0)) 

    dboutputs=''
    try:
        dbh=MySQLdb.connect(host=params.dbh[0], db=params.dbh[1],
			user=params.dbh[2], passwd=params.dbh[3]) 
        c=dbh.cursor() 
        c.execute(params.query) 
        dboutputs=c.fetchall() 
        dbh.close() 
    except MySQLdb.OperationalError, msg:
        output.append(msg[1])
    except MySQLdb.InterfaceError, msg:
        output.append(msg[1])
    except MySQLdb.DatabaseError, msg:
        output.append(msg[1])
    except MySQLdb.DataError, msg:
        output.append(msg[1])
    except MySQLdb.InternalError, msg:
        output.append(msg[1])
    except MySQLdb.ProgrammingError, msg:
        output.append(msg[1])
    except MySQLdb.NotSupportedError, msg:
        output.append(msg[1])
    except:
         output.append("Unknown Error while accessing database")
         output.append(params.linebreak)


    aRowNumber = 0
    aRowAttrs=[ params.evenattrs, params.oddattrs ]
    for aRow in dboutputs: 
        output.append(formatter.table_row(1)) 
        aColumnNumber=0 
        isHTML=0 
        for aCell in aRow: 
            aColumnNumber=aColumnNumber+1 
            element=unicode(str(aCell) , config.charset)
            if str(aColumnNumber) in params.hidden: 
                    conitnue
            if str(aColumnNumber) in params.html: 
                    isHTML=1 
                    element=_format_href % (str(aCell), str(aCell) )
            if str(aColumnNumber) in params.wiki: 
                    isHTML=1
                    element=_format_wikiref % (str(aCell), str(aCell) )
            if str(aColumnNumber) in params.mail: 
                    isHTML=1
                    element=_format_mailto % (str(aCell),str(aCell))
  
            if isHTML==1:  
                output.append(formatter.table_cell(1,aRowAttrs[aRowNumber%2]))  
                output.append(formatter.rawHTML(element))
                output.append(formatter.table_cell(0))
                isHTML=0
            else:
                output.append(formatter.table_cell(1,aRowAttrs[aRowNumber%2]))
                output.append(formatter.text(element))
                output.append(formatter.table_cell(0))
        output.append(formatter.table_row(0)) 
        aRowNumber += 1
    output.append(formatter.table(0))
  
    outbuffer.extend(output)  
    return (''.join(outbuffer))
