Browse Source

bottle: updates, plaintext

INADA Naoki 12 years ago
parent
commit
596a04ece7
2 changed files with 94 additions and 33 deletions
  1. 91 33
      bottle/app.py
  2. 3 0
      bottle/benchmark_config

+ 91 - 33
bottle/app.py

@@ -1,8 +1,9 @@
-from bottle import Bottle, route, request, run, template
+from bottle import Bottle, route, request, run, template, response
 from bottle.ext import sqlalchemy 
 from bottle.ext import sqlalchemy 
 from sqlalchemy import create_engine, Column, Integer, Unicode
 from sqlalchemy import create_engine, Column, Integer, Unicode
 from sqlalchemy.ext.declarative import declarative_base
 from sqlalchemy.ext.declarative import declarative_base
 from random import randint
 from random import randint
+import sys
 import ujson
 import ujson
 from operator import attrgetter, itemgetter
 from operator import attrgetter, itemgetter
 from functools import partial
 from functools import partial
@@ -14,6 +15,9 @@ db_engine = create_engine(app.config['SQLALCHEMY_DATABASE_URI'])
 plugin = sqlalchemy.Plugin(db_engine, keyword='db', )
 plugin = sqlalchemy.Plugin(db_engine, keyword='db', )
 app.install(plugin)
 app.install(plugin)
 
 
+if sys.version_info[0] == 3:
+    xrange = range
+
 
 
 class World(Base):
 class World(Base):
   __tablename__ = "World"
   __tablename__ = "World"
@@ -34,46 +38,52 @@ class Fortune(Base):
   id = Column(Integer, primary_key=True)
   id = Column(Integer, primary_key=True)
   message = Column(Unicode)
   message = Column(Unicode)
 
 
+
 @app.route("/json")
 @app.route("/json")
 def hello():
 def hello():
-  resp = {"message": "Hello, World!"}
-  return ujson.dumps(resp)
+    response.content_type = 'application/json'
+    resp = {"message": "Hello, World!"}
+    return ujson.dumps(resp)
 
 
 @app.route("/db")
 @app.route("/db")
 def get_random_world(db):
 def get_random_world(db):
-  num_queries = request.query.queries or '1'
-  worlds = []
-  rp = partial(randint, 1, 10000)
-  for i in xrange(int(num_queries)):
-    worlds.append(db.query(World).get(rp()).serialize)
-  return ujson.dumps(worlds)
+    num_queries = request.query.get('queries', 1, type=int)
+    worlds = []
+    rp = partial(randint, 1, 10000)
+    for i in xrange(num_queries):
+        worlds.append(db.query(World).get(rp()).serialize)
+    response.content_type = 'application/json'
+    return ujson.dumps(worlds)
 
 
 @app.route("/dbs")
 @app.route("/dbs")
 def get_random_world_single(db):
 def get_random_world_single(db):
-  wid = randint(1, 10000)
-  worlds = [db.query(World).get(wid).serialize]
-  return ujson.dumps(worlds)
+    wid = randint(1, 10000)
+    worlds = [db.query(World).get(wid).serialize]
+    response.content_type = 'application/json'
+    return ujson.dumps(worlds)
   
   
 @app.route("/dbraw")
 @app.route("/dbraw")
 def get_random_world_raw():
 def get_random_world_raw():
-  connection = db_engine.connect()
-  num_queries = request.query.queries or '1'
-  worlds = []
-  rp = partial(randint, 1, 10000)
-  for i in range(int(num_queries)):
-    result = connection.execute("SELECT * FROM world WHERE id = " + str(rp())).fetchone()
-    worlds.append({'id': result[0], 'randomNumber': result[1]})
-  connection.close()
-  return ujson.dumps(worlds)
+    connection = db_engine.connect()
+    num_queries = request.query.get('queries', 1, type=int)
+    worlds = []
+    rp = partial(randint, 1, 10000)
+    for i in xrange(int(num_queries)):
+        result = connection.execute("SELECT * FROM world WHERE id = " + str(rp())).fetchone()
+        worlds.append({'id': result[0], 'randomNumber': result[1]})
+    connection.close()
+    response.content_type = 'application/json'
+    return ujson.dumps(worlds)
 
 
 @app.route("/dbsraw")
 @app.route("/dbsraw")
 def get_random_world_single_raw():
 def get_random_world_single_raw():
-  connection = db_engine.connect()
-  wid = randint(1, 10000)
-  result = connection.execute("SELECT * FROM world WHERE id = " + str(wid)).fetchone()
-  worlds = [{'id': result[0], 'randomNumber': result[1]}]
-  connection.close()
-  return ujson.dumps(worlds)
+    connection = db_engine.connect()
+    wid = randint(1, 10000)
+    result = connection.execute("SELECT * FROM world WHERE id = " + str(wid)).fetchone()
+    worlds = [{'id': result[0], 'randomNumber': result[1]}]
+    connection.close()
+    response.content_type = 'application/json'
+    return ujson.dumps(worlds)
 
 
 @app.route("/fortune")
 @app.route("/fortune")
 def fortune_orm(db):
 def fortune_orm(db):
@@ -84,12 +94,60 @@ def fortune_orm(db):
 
 
 @app.route("/fortuneraw")
 @app.route("/fortuneraw")
 def fortune_raw():
 def fortune_raw():
-  connection = db_engine.connect()
-  fortunes=[(f.id, f.message) for f in connection.execute("SELECT * FROM Fortune")]
-  fortunes.append((0, u'Additional fortune added at request time.'))
-  fortunes=sorted(fortunes, key=itemgetter(1))
-  connection.close()
-  return template('fortune', fortunes=fortunes)
+    connection = db_engine.connect()
+    fortunes=[(f.id, f.message) for f in connection.execute("SELECT * FROM Fortune")]
+    fortunes.append((0, u'Additional fortune added at request time.'))
+    fortunes=sorted(fortunes, key=itemgetter(1))
+    connection.close()
+    return template('fortune', fortunes=fortunes)
+
+
[email protected]("/updates")
+def updates(db):
+    """Test 5: Database Updates"""
+    num_queries = request.query.get('queries', 1, type=int)
+    if num_queries > 500:
+        num_queries = 500
+
+    worlds = []
+    rp = partial(randint, 1, 10000)
+    for i in xrange(num_queries):
+        world = db.query(World).get(rp())
+        world.randomNumber = rp()
+        worlds.append(world.serialize)
+
+    response.content_type = 'application/json'
+    return ujson.dumps(worlds)
+
+
[email protected]("/raw-updates")
+def raw_updates():
+    """Test 5: Database Updates"""
+    num_queries = request.query.get('queries', 1, type=int)
+    if num_queries > 500:
+        num_queries = 500
+
+    conn = db_engine.connect()
+
+    worlds = []
+    rp = partial(randint, 1, 10000)
+    for i in xrange(num_queries):
+        world = conn.execute("SELECT * FROM World WHERE id=%s", (rp(),)).fetchone()
+        randomNumber = rp()
+        worlds.append({'id': world['id'], 'randomNumber': randomNumber})
+        conn.execute("UPDATE World SET randomNumber=%s WHERE id=%s",
+                     (randomNumber, world['id']))
+    conn.close()
+    response.content_type = 'application/json'
+    return ujson.dumps(worlds)
+
+
[email protected]('/plaintext')
+def plaintext():
+    """Test 6: Plaintext"""
+    response.content_type = 'text/plain'
+    return b'Hello, World!'
+
 
 
 if __name__ == "__main__":
 if __name__ == "__main__":
     app.run(host='0.0.0.0', debug=False)
     app.run(host='0.0.0.0', debug=False)

+ 3 - 0
bottle/benchmark_config

@@ -7,6 +7,8 @@
       "db_url": "/dbs",
       "db_url": "/dbs",
       "query_url": "/db?queries=",
       "query_url": "/db?queries=",
       "fortune_url": "/fortune",
       "fortune_url": "/fortune",
+      "update_url": "/updates?queries=",
+      "plaintext_url": "/plaintext",
       "port": 8080,
       "port": 8080,
       "sort": 88
       "sort": 88
     },
     },
@@ -15,6 +17,7 @@
       "db_url": "/dbsraw",
       "db_url": "/dbsraw",
       "query_url": "/dbraw?queries=",
       "query_url": "/dbraw?queries=",
       "fortune_url": "/fortuneraw",
       "fortune_url": "/fortuneraw",
+      "update_url": "/raw-updates?queries=",
       "port": 8080,
       "port": 8080,
       "sort": 89
       "sort": 89
     }
     }