app.pl 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. #!/usr/bin/env perl
  2. use Kelp::Less;
  3. use HTML::Escape 'escape_html';
  4. use MongoDB;
  5. use DBI;
  6. use utf8;
  7. module 'JSON::XS';
  8. my $mongo;
  9. my $mdb;
  10. my $world;
  11. my $fortune;
  12. my @sth;
  13. my $dbh;
  14. if ($ENV{MONGO}) {
  15. $mongo = MongoDB::MongoClient->new( host => 'tfb-database', port => 27017 );
  16. $mdb = $mongo->get_database('hello_world');
  17. $world = $mdb->get_collection('world');
  18. $fortune = $mdb->get_collection('fortune');
  19. } else {
  20. $dbh = DBI->connect(
  21. "dbi:mysql:database=hello_world;host=tfb-database;port=3306",
  22. 'benchmarkdbuser',
  23. 'benchmarkdbpass',
  24. { RaiseError => 0, PrintError => 0, mysql_enable_utf8 => 1 }
  25. );
  26. @sth = map { $dbh->prepare($_) } (
  27. "SELECT * FROM World WHERE id = ?",
  28. "SELECT * FROM Fortune",
  29. "UPDATE World SET randomNumber = ? WHERE id = ?",
  30. );
  31. }
  32. get '/json' => sub {
  33. { message => 'Hello, World!' };
  34. };
  35. get '/db/?db' => sub {
  36. my ( $self, $db ) = @_;
  37. my $id = int rand 10000 + 1;
  38. my $row;
  39. if ( $db eq 'mongo' ) {
  40. $row = $world->find_one( { _id => $id } );
  41. }
  42. else {
  43. $sth[0]->execute($id);
  44. $row = $sth[0]->fetchrow_hashref;
  45. }
  46. return { id => $id, randomNumber => $row->{randomNumber} };
  47. };
  48. get '/queries/?db' => sub {
  49. my ( $self, $db ) = @_;
  50. query( $db // 'mongo', $self->param('queries') );
  51. };
  52. get '/fortunes/?db' => sub {
  53. my ( $self, $db ) = @_;
  54. $db //= 'mongo';
  55. my @objects;
  56. if ( $db eq 'mongo' ) {
  57. my $cursor = $fortune->query( {} );
  58. @objects = $cursor->all;
  59. }
  60. else {
  61. $sth[1]->execute();
  62. @objects = @{ $sth[1]->fetchall_arrayref( {} ) };
  63. }
  64. push @objects, { id => 0, message => "Additional fortune added at request time." };
  65. fortunes( \@objects );
  66. };
  67. get '/update/?db' => sub {
  68. my ( $self, $db ) = @_;
  69. $db //= 'mongo';
  70. my $arr = query( $db, $self->param('queries') );
  71. $arr = [$arr] unless ref($arr) eq 'ARRAY';
  72. for my $row (@$arr) {
  73. $row->{randomNumber} = int( rand(10_000) ) + 1;
  74. if ( $db eq 'mongo' ) {
  75. $world->update( { _id => $row->{id} },
  76. { randomNumber => $row->{randomNumber} } );
  77. }
  78. else {
  79. $row->{randomNumber} = int( rand(10_000) ) + 1;
  80. $sth[2]->execute( $row->{randomNumber}, $row->{id} );
  81. }
  82. }
  83. return $arr;
  84. };
  85. get '/plaintext' => sub {
  86. shift->res->text->render('Hello, World!');
  87. };
  88. run;
  89. sub query {
  90. my ( $db, $count ) = @_;
  91. $count //= 1;
  92. $count = 1 if ( $count !~ /^\d+$/ || $count < 1 );
  93. $count = 500 if $count > 500;
  94. my @response;
  95. for ( 1 .. $count ) {
  96. my $id = int rand 10000 + 1;
  97. my $row;
  98. if ( $db eq 'mongo' ) {
  99. $row = $world->find_one( { _id => $id } );
  100. }
  101. else {
  102. $sth[0]->execute($id);
  103. $row = $sth[0]->fetchrow_hashref;
  104. }
  105. if ($row) {
  106. push @response,
  107. { id => $id, randomNumber => $row->{randomNumber} };
  108. }
  109. }
  110. return \@response;
  111. }
  112. sub fortunes {
  113. my ($objects) = @_;
  114. my $res = q[<!DOCTYPE html><html><head><title>Fortunes</title></head>];
  115. $res .= q[<body><table><tr><th>id</th><th>message</th></tr>];
  116. for my $item ( sort { $a->{message} cmp $b->{message} } @$objects ) {
  117. my $id = $item->{id};
  118. my $message = escape_html( $item->{message} );
  119. # HTML::Escape encodes apostrophe as &#39; because IE8 does not
  120. # support &apos;. We forse an &apos; here in order to pass the
  121. # test
  122. $message =~ s/&#39/&apos/g;
  123. $res .= "<tr><td>$id</td><td>$message</td></tr>";
  124. }
  125. $res .= q[</table></body></html>];
  126. return $res;
  127. }