mirror of
https://gitea.invidious.io/iv-org/shard-crystal-db.git
synced 2024-08-15 00:53:32 +00:00
Fix mt issues (#178)
This commit is contained in:
parent
87dc8aafaf
commit
da7494b5ba
3 changed files with 42 additions and 20 deletions
|
@ -216,8 +216,10 @@ module DB
|
|||
|
||||
private def build_resource : T
|
||||
resource = @factory.call
|
||||
sync do
|
||||
@total << resource
|
||||
@idle << resource
|
||||
end
|
||||
resource
|
||||
end
|
||||
|
||||
|
|
|
@ -7,6 +7,7 @@ module DB
|
|||
class PoolPreparedStatement < PoolStatement
|
||||
# connections where the statement was prepared
|
||||
@connections = Set(WeakRef(Connection)).new
|
||||
@mutex = Mutex.new
|
||||
|
||||
def initialize(db : Database, query : String)
|
||||
super
|
||||
|
@ -20,6 +21,7 @@ module DB
|
|||
end
|
||||
|
||||
protected def do_close
|
||||
@mutex.synchronize do
|
||||
# TODO close all statements on all connections.
|
||||
# currently statements are closed when the connection is closed.
|
||||
|
||||
|
@ -27,23 +29,33 @@ module DB
|
|||
# deallocate itself when the connection is free.
|
||||
@connections.clear
|
||||
end
|
||||
end
|
||||
|
||||
# builds a statement over a real connection
|
||||
# the connection is registered in `@connections`
|
||||
private def build_statement : Statement
|
||||
clean_connections
|
||||
conn, existing = @db.checkout_some(@connections)
|
||||
|
||||
conn, existing = @mutex.synchronize do
|
||||
@db.checkout_some(@connections)
|
||||
end
|
||||
|
||||
begin
|
||||
stmt = conn.prepared.build(@query)
|
||||
rescue ex
|
||||
conn.release
|
||||
raise ex
|
||||
end
|
||||
@connections << WeakRef.new(conn) unless existing
|
||||
unless existing
|
||||
@mutex.synchronize do
|
||||
@connections << WeakRef.new(conn)
|
||||
end
|
||||
end
|
||||
stmt
|
||||
end
|
||||
|
||||
private def clean_connections
|
||||
@mutex.synchronize do
|
||||
# remove disposed or closed connections
|
||||
@connections.each do |ref|
|
||||
conn = ref.value
|
||||
|
@ -54,3 +66,4 @@ module DB
|
|||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,21 +1,28 @@
|
|||
module DB
|
||||
class StringKeyCache(T)
|
||||
@cache = {} of String => T
|
||||
@mutex = Mutex.new
|
||||
|
||||
def fetch(key : String) : T
|
||||
@mutex.synchronize do
|
||||
value = @cache.fetch(key, nil)
|
||||
value = @cache[key] = yield unless value
|
||||
value
|
||||
end
|
||||
end
|
||||
|
||||
def each_value
|
||||
@mutex.synchronize do
|
||||
@cache.each do |_, value|
|
||||
yield value
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def clear
|
||||
@mutex.synchronize do
|
||||
@cache.clear
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue