app.pl 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  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. query( $db // 'mongo', 1 );
  38. };
  39. get '/queries/?db' => sub {
  40. my ( $self, $db ) = @_;
  41. query( $db // 'mongo', $self->param('queries') );
  42. };
  43. get '/fortunes/?db' => sub {
  44. my ( $self, $db ) = @_;
  45. $db //= 'mongo';
  46. my @objects;
  47. if ( $db eq 'mongo' ) {
  48. my $cursor = $fortune->query( {} );
  49. @objects = $cursor->all;
  50. }
  51. else {
  52. $sth[1]->execute();
  53. @objects = @{ $sth[1]->fetchall_arrayref( {} ) };
  54. }
  55. push @objects, { id => 0, message => "Additional fortune added at request time." };
  56. fortunes( \@objects );
  57. };
  58. get '/update/?db' => sub {
  59. my ( $self, $db ) = @_;
  60. $db //= 'mongo';
  61. my $arr = query( $db, $self->param('queries') );
  62. $arr = [$arr] unless ref($arr) eq 'ARRAY';
  63. for my $row (@$arr) {
  64. $row->{randomNumber} = int( rand(10_000) ) + 1;
  65. if ( $db eq 'mongo' ) {
  66. $world->update( { _id => $row->{id} },
  67. { randomNumber => $row->{randomNumber} } );
  68. }
  69. else {
  70. $row->{randomNumber} = int( rand(10_000) ) + 1;
  71. $sth[2]->execute( $row->{randomNumber}, $row->{id} );
  72. }
  73. }
  74. return $arr;
  75. };
  76. get '/plaintext' => sub {
  77. shift->res->text->render('Hello, World!');
  78. };
  79. run;
  80. sub query {
  81. my ( $db, $count ) = @_;
  82. $count //= 1;
  83. $count = 1 if ( $count !~ /^\d+$/ || $count < 1 );
  84. $count = 500 if $count > 500;
  85. my @response;
  86. for ( 1 .. $count ) {
  87. my $id = int rand 10000 + 1;
  88. my $row;
  89. if ( $db eq 'mongo' ) {
  90. $row = $world->find_one( { _id => $id } );
  91. }
  92. else {
  93. $sth[0]->execute($id);
  94. $row = $sth[0]->fetchrow_hashref;
  95. }
  96. if ($row) {
  97. if ( $count == 1 ) {
  98. return { id => $id, randomNumber => $row->{randomNumber} };
  99. }
  100. else {
  101. push @response,
  102. { id => $id, randomNumber => $row->{randomNumber} };
  103. }
  104. }
  105. }
  106. return \@response;
  107. }
  108. sub fortunes {
  109. my ($objects) = @_;
  110. my $res = q[<!DOCTYPE html><html><head><title>Fortunes</title></head>];
  111. $res .= q[<body><table><tr><th>id</th><th>message</th></tr>];
  112. for my $item ( sort { $a->{message} cmp $b->{message} } @$objects ) {
  113. my $id = $item->{id};
  114. my $message = escape_html( $item->{message} );
  115. # HTML::Escape encodes apostrophe as &#39; because IE8 does not
  116. # support &apos;. We forse an &apos; here in order to pass the
  117. # test
  118. $message =~ s/&#39/&apos/g;
  119. $res .= "<tr><td>$id</td><td>$message</td></tr>";
  120. }
  121. $res .= q[</table></body></html>];
  122. return $res;
  123. }