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
1112if RUBY_PLATFORM == 'java'
1415 DEFAULT_DATABASE_URL = 'postgresql://tfb-database/hello_world?user=benchmarkdbuser&password=benchmarkdbpass'
1516end
1617
18+ $db = connect ( DEFAULT_DATABASE_URL )
19+
1720class HelloWorld
1821 QUERY_RANGE = ( 1 ..10_000 ) . freeze # range of IDs in the Fortune DB
1922 ALL_IDS = QUERY_RANGE . to_a # enumeration of all the IDs in fortune DB
@@ -42,30 +45,6 @@ class HelloWorld
4245 </body>
4346 </html>'
4447
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-
6948 def call ( env )
7049 case env [ 'PATH_INFO' ]
7150 when '/json'
@@ -74,20 +53,19 @@ def call(env)
7453 { message : 'Hello, World!' } . to_json
7554 when '/db'
7655 # Test type 2: Single database query
77- respond JSON_TYPE , @db . select_random_world . to_json
56+ id = random_id
57+ respond JSON_TYPE , $db. with { _1 . select_world ( id ) } . to_json
7858 when '/queries'
7959 # 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
60+ queries = bounded_queries ( env )
61+ respond JSON_TYPE , select_worlds ( queries ) . to_json
8362 when '/fortunes'
8463 # Test type 4: Fortunes
8564 respond HTML_TYPE , fortunes
8665 when '/updates'
8766 # 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
67+ queries = bounded_queries ( env )
68+ respond JSON_TYPE , update_worlds ( queries ) . to_json
9169 when '/plaintext'
9270 # Test type 6: Plaintext
9371 respond PLAINTEXT_TYPE , 'Hello, World!'
@@ -120,4 +98,51 @@ def headers(content_type)
12098 }
12199 end
122100 end
101+
102+ def fortunes
103+ fortunes = $db. with ( &:select_fortunes ) . map ( &:to_h )
104+ fortunes << { 'id' => 0 , 'message' => 'Additional fortune added at request time.' }
105+ fortunes . sort_by! { |item | item [ 'message' ] }
106+ buffer = String . new
107+ buffer << TEMPLATE_PREFIX
108+
109+ fortunes . each do |item |
110+ buffer << "<tr><td>#{ item [ 'id' ] } </td><td>#{ ERB ::Escape . html_escape ( item [ 'message' ] ) } </td></tr>"
111+ end
112+ buffer << TEMPLATE_POSTFIX
113+ end
114+
115+ def update_worlds ( count )
116+ results = select_worlds ( count )
117+ ids = [ ]
118+ sql = String . new ( "UPDATE world SET randomnumber = CASE id " )
119+ results . each do |r |
120+ r [ 'randomnumber' ] = random_id
121+ ids << r [ 'id' ]
122+ sql << "when #{ r [ 'id' ] } then #{ r [ 'randomnumber' ] } "
123+ end
124+ sql << "ELSE randomnumber END WHERE id IN ( #{ ids . join ( ',' ) } )"
125+ $db. with { _1 . exec ( sql ) }
126+ results
127+ end
128+
129+ def select_worlds ( count )
130+ ids = ALL_IDS . sample ( count )
131+ $db. with do |conn |
132+ ids . map do |id |
133+ conn . select_world ( id )
134+ end
135+ end
136+ end
137+
138+ def random_id
139+ Random . rand ( QUERY_RANGE )
140+ end
141+
142+ def bounded_queries ( env )
143+ params = Rack ::Utils . parse_query ( env [ 'QUERY_STRING' ] )
144+
145+ queries = params [ 'queries' ] . to_i
146+ queries . clamp ( MIN_QUERIES , MAX_QUERIES )
147+ end
123148end
0 commit comments