app_sync_raw.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. #!/usr/bin/env python
  2. from datetime import datetime
  3. from functools import lru_cache
  4. import os
  5. from random import randint, sample
  6. from microdot_wsgi import Microdot
  7. from microdot_jinja import render_template
  8. import psycopg2
  9. from psycopg2.extras import execute_batch
  10. from cachetools import cached
  11. from cachetools.keys import hashkey
  12. app = Microdot()
  13. db = psycopg2.connect(os.environ['DATABASE_URL'])
  14. get_world_sql = 'SELECT id, randomnumber FROM world WHERE id = $1'
  15. update_world_sql = 'UPDATE world SET randomnumber = $1 WHERE id = $2'
  16. fortune_sql = 'SELECT * FROM fortune'
  17. with db.cursor() as cur:
  18. cur.execute('PREPARE get_world AS ' + get_world_sql)
  19. cur.execute('PREPARE update_world AS ' + update_world_sql)
  20. cur.execute('PREPARE fortune AS ' + fortune_sql)
  21. def get_num_queries(request, name="queries"):
  22. try:
  23. num_queries = request.args.get(name, 1, type=int)
  24. except ValueError:
  25. num_queries = 1
  26. if num_queries < 1:
  27. return 1
  28. if num_queries > 500:
  29. return 500
  30. return num_queries
  31. def generate_ids(num_queries):
  32. return sample(range(1, 10001), num_queries)
  33. @app.route("/json")
  34. def test_json(request):
  35. return {"message": "Hello, World!"}
  36. @app.route("/db")
  37. def test_db(request):
  38. id = randint(1, 10000)
  39. with db.cursor() as cur:
  40. cur.execute('EXECUTE get_world (%s)', (id,))
  41. result = cur.fetchone()
  42. world = {'id': result[0], 'randomNumber': result[1]}
  43. return world
  44. def get_world(cur, id):
  45. cur.execute('EXECUTE get_world (%s)', (id,))
  46. result = cur.fetchone()
  47. return {'id': result[0], 'randomNumber': result[1]}
  48. @app.route("/queries")
  49. def test_queries(request):
  50. with db.cursor() as cur:
  51. worlds = [get_world(cur, id) for id in generate_ids(get_num_queries(request))]
  52. return worlds
  53. @app.route("/fortunes")
  54. def test_fortunes(request):
  55. with db.cursor() as cur:
  56. cur.execute('EXECUTE fortune')
  57. fortunes = list(cur.fetchall())
  58. fortunes.append((0, 'Additional fortune added at request time.'))
  59. fortunes.sort(key=lambda f: f[1])
  60. return render_template("fortunes_raw.html", fortunes=fortunes), {'Content-Type': 'text/html; charset=utf-8'}
  61. @app.route("/updates")
  62. def test_updates(request):
  63. worlds = []
  64. updated_worlds = []
  65. with db.cursor() as cur:
  66. for id in generate_ids(get_num_queries(request)):
  67. cur.execute('EXECUTE get_world (%s)', (id,))
  68. result = cur.fetchone()
  69. new_value = randint(1, 10000)
  70. updated_worlds.append((new_value, result[0]))
  71. worlds.append({'id': result[0], 'randomNumber': new_value})
  72. execute_batch(cur, 'EXECUTE update_world (%s, %s)', updated_worlds)
  73. db.commit()
  74. return worlds
  75. @app.route("/plaintext")
  76. def test_plaintext(request):
  77. return b"Hello, World!"
  78. @cached(cache={}, key=lambda cur, id: hashkey(id))
  79. def get_cached_world(cur, id):
  80. cur.execute('EXECUTE get_world (%s)', (id,))
  81. result = cur.fetchone()
  82. return {'id': result[0], 'randomNumber': result[1]}
  83. @app.route("/cached-queries")
  84. def test_cached_queries(request):
  85. with db.cursor() as cur:
  86. worlds = [get_cached_world(cur, id) for id in generate_ids(get_num_queries(request, 'count'))]
  87. return worlds