#!/usr/bin/python
# -*- coding:utf-8 -*-

__doc__ = """
DevCamp2006s 「Twisted + SQLAlchemy」プレゼン用スクリプト
わかりやすいと思い、モジュールは必要になった時点でimportしてます。
気に入らなかったらごめんなさい。

最下段にプレゼンで使用したコマンドを記載しています。
参考になれば幸いです。

感想、苦情、質問などはこちらまで。
村岡友介 yusuke.muraoka[at]gmail.com
"""

import sqlalchemy as sa
from sasync.database import AccessBroker, transact

class LogAB(AccessBroker):
    def startup(self):
        # This method can also be 'userStartup' instead of 'startup', due to
        # backwards compatibility.
        return self.table('accesslog',
            sa.Column('regist_datetime', sa.DateTime, primary_key=True),
            sa.Column('request', sa.String(1024))
        )
    @transact
    def insertLog(self, regist_dt, request):
        return self.accesslog.insert().execute(regist_datetime = regist_dt, request = request)
    @transact
    def getLogs(self):
        return self.accesslog.select().execute().fetchall()

from twisted.protocols import basic
from twisted.internet import protocol, reactor
from datetime import datetime

class HTTPProtocol(basic.LineReceiver):
    def __init__(self):
        self.lines = []
        self.gotRequest = False
    def lineReceived(self, line):
        self.lines.append(line)
        if not line and not self.gotRequest:
            #ヘッダ部だけ読む(ヘッダとボディの間に改行だけの行があるのでそこで読み込みを終了する HTTPの仕様)
            regist_dt, log = self.sendResponse()
            self.gotRequest = True
            self.factory.ab.insertLog(regist_dt, log)
    def sendResponse(self):
        n   = datetime.now()
        log = '\r\n'.join(self.lines)
        responseBody = 'logging\r\n%(line)s\r\ntimestamp:%(now)s\r\n%(line)s\r\nlog:%(log)s' % {'line':'-' * 30, 'now': n, 'log': log}
        #HTTP/1.1でリクエストが投げられても返すのはHTTP/1.0
        self.sendLine('HTTP/1.0 200 OK')
        self.sendLine('Content-Type: text/plain')
        self.sendLine('Content-Length: %i' % len(responseBody))
        self.sendLine('')
        self.transport.write(responseBody)
        self.transport.loseConnection()
        return (n, log)

class HTTPLoggingFactory(protocol.ServerFactory):
    protocol = HTTPProtocol
    def startFactory(self):
        self.ab = LogAB('sqlite:///twisted_http_demo.db')

if __name__ == '__main__':
    from twisted.internet import reactor
    reactor.listenTCP(8080, HTTPLoggingFactory())
    reactor.run()

"""
from sqlalchemy import *
from sqlalchemy.ext.sessioncontext import SessionContext
from sqlalchemy.ext.assignmapper import assign_mapper

db = create_engine('sqlite:///twisted_http_demo.db')
ctx = SessionContext(create_session)
metadata = BoundMetaData(db)

logs = Table('accesslog', metadata, autoload=True)

class MapperClass(object): pass

assign_mapper(ctx, MapperClass, logs)

dir(MapperClass)

def select_all():
    for obj in MapperClass.select():
        print  obj.regist_datetime, obj.request[:30].replace('\r', '\\r').replace('\n', '\\n')

select_all()    

i = logs.insert()

from datetime import datetime

i.execute(regist_datetime = datetime.now(), request = 'foo')

select_all()

"""

