Class: Pgtk::Pool
- Inherits:
-
Object
- Object
- Pgtk::Pool
- Defined in:
- lib/pgtk/pool.rb
Overview
Pool.
- Author
-
Yegor Bugayenko ([email protected])
- Copyright
-
Copyright © 2019 Yegor Bugayenko
- License
-
MIT
Defined Under Namespace
Classes: Txn
Instance Method Summary collapse
-
#exec(query, args = [], result = 0) ⇒ Object
Make a query and return the result as an array of hashes.
-
#initialize(host: 'localhost', port:, dbname:, user:, password:) ⇒ Pool
constructor
Constructor.
-
#start(max = 8) ⇒ Object
Start it with a fixed number of connections.
-
#transaction ⇒ Object
Run a transaction.
Constructor Details
#initialize(host: 'localhost', port:, dbname:, user:, password:) ⇒ Pool
Constructor.
32 33 34 35 36 37 38 39 |
# File 'lib/pgtk/pool.rb', line 32 def initialize(host: 'localhost', port:, dbname:, user:, password:) @host = host @port = port @dbname = dbname @user = user @password = password @pool = Queue.new end |
Instance Method Details
#exec(query, args = [], result = 0) ⇒ Object
Make a query and return the result as an array of hashes. For example, in order to fetch the list of all books belonging to the user:
books = pool.exec('SELECT * FROM book WHERE owner = $1', ['yegor256'])
books.each do |row|
puts 'ID: ' + row['id'].to_i
puts 'Created: ' + Time.parse(row['created'])
puts 'Title: ' + row['title']
end
All values in the retrieved hash are strings. No matter what types of of data you have in the database, you get strings here. It’s your job to convert them to the type you need.
In order to insert a new row (pay attention to the RETURNING
clause at the end of the SQL query):
id = pool.exec(
'INSERT INTO book (owner, title) VALUES ($1, $2) RETURNING id',
['yegor256', 'Elegant Objects']
)[0]['id'].to_i
You can also pass a block to this method, if you want to get an instance of PG::Result
instead of an array of hashes:
pool.exec('SELECT * FROM book WHERE owner = $1', ['yegor256']) do |res|
res.each do |row|
puts 'ID: ' + row['id'].to_i
puts 'Title: ' + row['title']
end
end
More details about exec_params
, which is called here, you can find here: www.rubydoc.info/gems/pg/0.17.1/PG%2FConnection:exec_params
91 92 93 94 95 96 97 98 99 100 101 102 |
# File 'lib/pgtk/pool.rb', line 91 def exec(query, args = [], result = 0) connect do |c| t = Txn.new(c) if block_given? t.exec(query, args, result) do |res| yield res end else t.exec(query, args, result) end end end |
#start(max = 8) ⇒ Object
Start it with a fixed number of connections. The amount of connections is specified in max
argument and should be big enough to handle the amount of parallel connections you may have to the database. However, keep in mind that not all servers will allow you to have many connections open at the same time. For example, Heroku free PostgreSQL database allows only one connection open.
47 48 49 50 51 52 53 54 55 |
# File 'lib/pgtk/pool.rb', line 47 def start(max = 8) max.times do @pool << PG.connect( dbname: @dbname, host: @host, port: @port, user: @user, password: @password ) end self end |
#transaction ⇒ Object
Run a transaction. The block has to be provided. It will receive a temporary object, which implements method exec
, which works exactly like the method exec
of class Pool
, for example:
pgsql.transaction do |t|
t.exec('DELETE FROM user WHERE id = $1', [id])
t.exec('INSERT INTO user (name) VALUES ($1)', [name])
end
112 113 114 115 116 117 |
# File 'lib/pgtk/pool.rb', line 112 def transaction connect do |c| t = Txn.new(c) yield t end end |