22
33# Our Rack application to be executed by rackup
44
5- require_relative 'pg_db '
5+ require_relative 'db '
66require_relative 'config/auto_tune'
77require 'rack'
88require 'json'
9+ require 'time'
910require 'erb'
1011
11- if RUBY_PLATFORM == 'java'
12- DEFAULT_DATABASE_URL = 'jdbc:postgresql://tfb-database/hello_world?user=benchmarkdbuser&password=benchmarkdbpass'
13- else
14- DEFAULT_DATABASE_URL = 'postgresql://tfb-database/hello_world?user=benchmarkdbuser&password=benchmarkdbpass'
15- end
12+ $db = connect
1613
1714class HelloWorld
1815 QUERY_RANGE = ( 1 ..10_000 ) . freeze # range of IDs in the Fortune DB
@@ -42,30 +39,6 @@ class HelloWorld
4239 </body>
4340 </html>'
4441
45- def initialize
46- if defined? ( Puma ) || defined? ( Itsi )
47- max_connections = ENV . fetch ( 'MAX_THREADS' )
48- elsif defined? ( Iodine )
49- max_connections = ENV . fetch ( 'THREADS' )
50- else
51- max_connections = 512
52- end
53- @db = PgDb . new ( DEFAULT_DATABASE_URL , max_connections )
54- end
55-
56- def fortunes
57- fortunes = @db . select_fortunes
58- fortunes << { id : 0 , message : 'Additional fortune added at request time.' }
59- fortunes . sort_by! { |item | item [ :message ] }
60- buffer = String . new
61- buffer << TEMPLATE_PREFIX
62-
63- fortunes . each do |item |
64- buffer << "<tr><td>#{ item [ :id ] } </td><td>#{ ERB ::Escape . html_escape ( item [ :message ] ) } </td></tr>"
65- end
66- buffer << TEMPLATE_POSTFIX
67- end
68-
6942 def call ( env )
7043 case env [ 'PATH_INFO' ]
7144 when '/json'
@@ -74,20 +47,19 @@ def call(env)
7447 { message : 'Hello, World!' } . to_json
7548 when '/db'
7649 # Test type 2: Single database query
77- respond JSON_TYPE , @db . select_random_world . to_json
50+ id = random_id
51+ respond JSON_TYPE , $db. with { _1 . select_world ( id ) } . to_json
7852 when '/queries'
7953 # Test type 3: Multiple database queries
80- params = Rack ::Utils . parse_query ( env [ 'QUERY_STRING' ] )
81- queries = params [ 'queries' ]
82- respond JSON_TYPE , @db . select_worlds ( queries ) . to_json
54+ queries = bounded_queries ( env )
55+ respond JSON_TYPE , select_worlds ( queries ) . to_json
8356 when '/fortunes'
8457 # Test type 4: Fortunes
8558 respond HTML_TYPE , fortunes
8659 when '/updates'
8760 # Test type 5: Database updates
88- params = Rack ::Utils . parse_query ( env [ 'QUERY_STRING' ] )
89- queries = params [ 'queries' ]
90- respond JSON_TYPE , @db . update_worlds ( queries ) . to_json
61+ queries = bounded_queries ( env )
62+ respond JSON_TYPE , update_worlds ( queries ) . to_json
9163 when '/plaintext'
9264 # Test type 6: Plaintext
9365 respond PLAINTEXT_TYPE , 'Hello, World!'
@@ -120,4 +92,51 @@ def headers(content_type)
12092 }
12193 end
12294 end
95+
96+ def fortunes
97+ fortunes = $db. with ( &:select_fortunes ) . map ( &:to_h )
98+ fortunes << { 'id' => 0 , 'message' => 'Additional fortune added at request time.' }
99+ fortunes . sort_by! { |item | item [ 'message' ] }
100+ buffer = String . new
101+ buffer << TEMPLATE_PREFIX
102+
103+ fortunes . each do |item |
104+ buffer << "<tr><td>#{ item [ 'id' ] } </td><td>#{ ERB ::Escape . html_escape ( item [ 'message' ] ) } </td></tr>"
105+ end
106+ buffer << TEMPLATE_POSTFIX
107+ end
108+
109+ def update_worlds ( count )
110+ results = select_worlds ( count )
111+ ids = [ ]
112+ sql = String . new ( "UPDATE world SET randomnumber = CASE id " )
113+ results . each do |r |
114+ r [ 'randomnumber' ] = random_id
115+ ids << r [ 'id' ]
116+ sql << "when #{ r [ 'id' ] } then #{ r [ 'randomnumber' ] } "
117+ end
118+ sql << "ELSE randomnumber END WHERE id IN ( #{ ids . join ( ',' ) } )"
119+ $db. with { _1 . exec ( sql ) }
120+ results
121+ end
122+
123+ def select_worlds ( count )
124+ ids = ALL_IDS . sample ( count )
125+ $db. with do |conn |
126+ ids . map do |id |
127+ conn . select_world ( id )
128+ end
129+ end
130+ end
131+
132+ def random_id
133+ Random . rand ( QUERY_RANGE )
134+ end
135+
136+ def bounded_queries ( env )
137+ params = Rack ::Utils . parse_query ( env [ 'QUERY_STRING' ] )
138+
139+ queries = params [ 'queries' ] . to_i
140+ queries . clamp ( MIN_QUERIES , MAX_QUERIES )
141+ end
123142end
0 commit comments