| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 | import osimport sysfrom functools import partialfrom operator import attrgetterfrom random import randintimport jsonimport cherrypyfrom sqlalchemy.ext.declarative import declarative_basefrom sqlalchemy import Columnfrom sqlalchemy.types import String, Integertry:    from cgi import escape as html_escapeexcept:    from html import escape as html_escapeBase = declarative_base()if sys.version_info[0] == 3:    xrange = rangedef getQueryNum(queryString):    try:        int(queryString)        return int(queryString)    except ValueError:        return 1class Fortune(Base):    __tablename__ = "fortune"    id = Column(Integer, primary_key=True)    message = Column(String)    def serialize(self):        return {'id': self.id, 'message': self.message}class World(Base):    __tablename__ = "world"    id = Column(Integer, primary_key=True)    randomNumber = Column(Integer)    def serialize(self):        return {'id': self.id, 'randomNumber': self.randomNumber}class CherryPyBenchmark(object):    @cherrypy.expose    @cherrypy.tools.json_out()    def json(self):        cherrypy.response.headers["Content-Type"] = "application/json"        json_message = {"message": "Hello, world!"}        return json_message    @cherrypy.expose    def plaintext(self):        cherrypy.response.headers["Content-Type"] = "text/plain"        return "Hello, world!"    @cherrypy.expose    @cherrypy.tools.json_out()    def db(self):        cherrypy.response.headers["Content-Type"] = "application/json"        wid = randint(1, 10000)        world = cherrypy.request.db.query(World).get(wid).serialize()        return world    @cherrypy.expose    @cherrypy.tools.json_out()    def queries(self, queries=1):        num_queries = getQueryNum(queries)        if num_queries < 1:            num_queries = 1        if num_queries > 500:            num_queries = 500        rp = partial(randint, 1, 10000)        get = cherrypy.request.db.query(World).get        worlds = [get(rp()).serialize() for _ in xrange(num_queries)]        return worlds    @cherrypy.expose    @cherrypy.tools.json_out()    def updates(self, queries=1):        cherrypy.response.headers["Content-Type"] = "application/json"        num_queries = getQueryNum(queries)        if num_queries < 1:            num_queries = 1        if num_queries > 500:            num_queries = 500        worlds = []        rp = partial(randint, 1, 10000)        ids = [rp() for _ in xrange(num_queries)]        ids.sort()  # To avoid deadlock        for id in ids:            world = cherrypy.request.db.query(World).get(id)            world.randomNumber = rp()            worlds.append(world.serialize())        cherrypy.request.db.commit()        return worlds    @cherrypy.expose    def fortunes(self):        _fortunes = cherrypy.request.db.query(Fortune).all()        _fortunes.append( Fortune(id=0, message="Additional fortune added at request time.") )        _fortunes.sort(key=attrgetter("message"))        html = "<!DOCTYPE html><html><head><title>Fortunes</title></head><body><table><tr><th>id</th><th>message</th></tr>"        for f in _fortunes:            html += "<tr><td>" + str(f.id) + "</td><td>" + html_escape(f.message) + "</td></tr>"        html += "</table></body></html>"        return htmlif __name__ == "__main__":    import logging    import multiprocessing    # Register the SQLAlchemy plugin    from saplugin import SAEnginePlugin    DBDRIVER = 'mysql'    DBUSER = 'benchmarkdbuser'    DBPSWD = 'benchmarkdbpass'    DATABASE_URI = '%s://%s:%s@tfb-database:3306/hello_world?charset=utf8' % (        DBDRIVER, DBUSER, DBPSWD)    SAEnginePlugin(cherrypy.engine, DATABASE_URI).subscribe()    _is_travis = os.environ.get('TRAVIS') == 'true'    workers = int(multiprocessing.cpu_count())    if _is_travis:        workers = 3    cherrypy._cpconfig.environments['staging']['log.screen'] = False    logging.getLogger("cherrypy").propagate = False    log_fmt = "%(asctime)s.%(msecs)03d [%(levelname)s] (%(name)s) %(message)s"    logging.basicConfig(level=logging.CRITICAL, format=log_fmt, datefmt="%Y-%m-%d %H:%M:%S")    cherrypy.config.update({            'tools.db.on': True,            'environment': 'production',            'log.screen': False,            'log.access_file': '',            'log.error_file': ''    })        # Register the SQLAlchemy tool    from satool import SATool    cherrypy.tools.db = SATool()    cherrypy.server.socket_host = '0.0.0.0'    cherrypy.server.socket_port = 8080    cherrypy.server.thread_pool = workers    cherrypy.server.socket_queue_size = 25    cherrypy.quickstart(CherryPyBenchmark(), '', {        '/': {            'tools.db.on': True,            'log.screen': False,            'log.access_file': '',            'log.error_file': ''        }    })
 |