app.pl 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. use Mojolicious::Lite;
  2. use Mojo::Pg;
  3. use JSON::XS 'encode_json';
  4. use Scalar::Util 'looks_like_number';
  5. # configuration
  6. plugin Config => {
  7. file => 'app.conf',
  8. default => {
  9. database_host => 'localhost',
  10. hypnotoad => {
  11. graceful_timeout => 1,
  12. workers => 8,
  13. },
  14. hypnotoad_merge => {},
  15. },
  16. };
  17. {
  18. my $merge = app->config->{hypnotoad_merge};
  19. @{app->config->{hypnotoad}}{keys %$merge} = values %$merge;
  20. }
  21. helper pg => sub { state $pg = Mojo::Pg->new('postgresql://benchmarkdbuser:benchmarkdbpass@' . shift->config->{database_host} . '/hello_world') };
  22. helper render_json => sub { shift->render( data => encode_json(shift), format => 'json' ) };
  23. # Routes
  24. get '/json' => sub { shift->helpers->render_json({message => 'Hello, World!'}) };
  25. get '/db' => sub { shift->helpers->render_query(1, {single => 1}) };
  26. get '/queries' => sub {
  27. my $c = shift;
  28. $c->helpers->render_query(scalar $c->param('queries'));
  29. };
  30. get '/fortunes' => sub {
  31. my $c = shift;
  32. my $docs = $c->helpers->pg->db->query('SELECT id, message FROM Fortune')->arrays;
  33. push @$docs, [0, 'Additional fortune added at request time.'];
  34. $c->render( fortunes => docs => $docs->sort(sub{ $a->[1] cmp $b->[1] }) );
  35. };
  36. get '/updates' => sub {
  37. my $c = shift;
  38. $c->helpers->render_query(scalar $c->param('queries'), {update => 1});
  39. };
  40. get '/plaintext' => sub { shift->render( text => 'Hello, World!' ) };
  41. # Additional helpers (shared code)
  42. helper 'render_query' => sub {
  43. my ($self, $q, $args) = @_;
  44. $args ||= {};
  45. my $update = $args->{update};
  46. $q = 1 unless looks_like_number($q);
  47. $q = 1 if $q < 1;
  48. $q = 500 if $q > 500;
  49. my $r = [];
  50. my $tx = $self->tx;
  51. my $db = $self->helpers->pg->db;
  52. foreach (1 .. $q) {
  53. my $id = int rand 10_000;
  54. my $randomNumber = $db->query('SELECT randomnumber FROM World WHERE id=?', $id)->array->[0];
  55. $db->query('UPDATE World SET randomnumber=? WHERE id=?', ($randomNumber = 1 + int rand 10_000), $id) if $update;
  56. push @$r, { id => $id, randomNumber => $randomNumber };
  57. }
  58. $r = $r->[0] if $args->{single};
  59. $self->helpers->render_json($r);
  60. };
  61. app->start;
  62. __DATA__
  63. @@ fortunes.html.ep
  64. <!DOCTYPE html>
  65. <html>
  66. <head><title>Fortunes</title></head>
  67. <body>
  68. <table>
  69. <tr><th>id</th><th>message</th></tr>
  70. % foreach my $doc (@$docs) {
  71. <tr>
  72. <td><%= $doc->[0] %></td>
  73. <td><%= $doc->[1] %></td>
  74. </tr>
  75. % }
  76. </table>
  77. </body>
  78. </html>