Skip to content
This repository was archived by the owner on Mar 24, 2026. It is now read-only.

Commit 9d49dcb

Browse files
committed
[ruby/rack] Don't use Sequel ORM
Just use the raw `pg` adapter.
1 parent 924410e commit 9d49dcb

5 files changed

Lines changed: 101 additions & 128 deletions

File tree

frameworks/Ruby/rack/Gemfile

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,6 @@ gem 'connection_pool'
1010
gem 'jdbc-postgres', '~> 42.2', platforms: :jruby, require: 'jdbc/postgres'
1111
gem 'json', '~> 2.10'
1212
gem 'pg', '~> 1.5', platforms: %i[ruby windows]
13-
gem 'sequel'
14-
gem 'sequel_pg', platforms: %i[ruby windows], require: 'sequel'
1513
gem 'tzinfo-data', '1.2023.3'
1614

1715
group :falcon, optional: true do

frameworks/Ruby/rack/config/puma.rb

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,4 @@
11
if ENV.fetch('WEB_CONCURRENCY').to_i > 1
2-
before_fork do
3-
Sequel::DATABASES.each(&:disconnect)
4-
end
52
else
63
workers ENV.fetch('WEB_CONCURRENCY')
74
require 'concurrent/utility/processor_counter'

frameworks/Ruby/rack/db.rb

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
# frozen_string_literal: true
2+
3+
require 'connection_pool'
4+
require 'pg'
5+
6+
if RUBY_PLATFORM == 'java'
7+
require 'jdbc/postgres'
8+
Jdbc::Postgres.load_driver
9+
end
10+
11+
def connect(connection_string)
12+
if defined?(Puma) || defined?(Itsi)
13+
max_connections = ENV.fetch('MAX_THREADS')
14+
elsif defined?(Iodine)
15+
max_connections = ENV.fetch('THREADS')
16+
else
17+
max_connections = 512
18+
end
19+
ConnectionPool.new(size: max_connections, timeout: 5) do
20+
Database.new(connection_string)
21+
end
22+
end
23+
24+
class Database
25+
attr_reader :connection
26+
27+
def initialize(connection_string = nil)
28+
@connection = PG::Connection.new(connection_string)
29+
@connection.set_error_verbosity(PG::PQERRORS_VERBOSE)
30+
@connection.prepare('select_world', 'SELECT id, randomNumber FROM world WHERE id = $1')
31+
end
32+
33+
def select_world(id)
34+
@connection.exec_prepared('select_world', [id]).first
35+
end
36+
37+
def select_fortunes
38+
@connection.exec('SELECT id, message FROM fortune')
39+
end
40+
41+
def exec(query)
42+
@connection.exec(query)
43+
end
44+
end

frameworks/Ruby/rack/hello_world.rb

Lines changed: 57 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@
22

33
# Our Rack application to be executed by rackup
44

5-
require_relative 'pg_db'
5+
require_relative 'db'
66
require_relative 'config/auto_tune'
77
require 'rack'
88
require 'json'
9+
require 'time'
910
require 'erb'
1011

1112
if RUBY_PLATFORM == 'java'
@@ -14,6 +15,8 @@
1415
DEFAULT_DATABASE_URL = 'postgresql://tfb-database/hello_world?user=benchmarkdbuser&password=benchmarkdbpass'
1516
end
1617

18+
$db = connect(DEFAULT_DATABASE_URL)
19+
1720
class 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
123148
end

frameworks/Ruby/rack/pg_db.rb

Lines changed: 0 additions & 91 deletions
This file was deleted.

0 commit comments

Comments
 (0)