Class: Knj::Db::Query_buffer
Overview
This class buffers a lot of queries and flushes them out via transactions.
Instance Method Summary collapse
-
#delete(table, where) ⇒ Object
Delete as on a normal Knj::Db.
-
#flush ⇒ Object
Flushes all queries out in a transaction.
-
#initialize(args) ⇒ Query_buffer
constructor
Constructor.
-
#insert(table, data) ⇒ Object
Plans to inset a hash into a table.
-
#query(str) ⇒ Object
Adds a query to the buffer.
Constructor Details
#initialize(args) ⇒ Query_buffer
Constructor. Takes arguments to be used and a block.
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# File 'lib/knj/knjdb/query_buffer.rb', line 4 def initialize(args) @args = args @queries = [] @inserts = {} @queries_count = 0 @debug = @args[:debug] @lock = Mutex.new STDOUT.puts "Query buffer started." if @debug if block_given? begin yield(self) ensure self.flush end end end |
Instance Method Details
#delete(table, where) ⇒ Object
Delete as on a normal Knj::Db.
Examples
db.q_buffer do |buffer|
buffer.delete(:users, {:id => 5})
end
40 41 42 43 44 |
# File 'lib/knj/knjdb/query_buffer.rb', line 40 def delete(table, where) STDOUT.puts "Delete called on table #{table} with arguments: '#{where}'." if @debug self.query(@args[:db].delete(table, where, :return_sql => true)) return nil end |
#flush ⇒ Object
Flushes all queries out in a transaction. This will automatically be called for every 1000 queries.
63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
# File 'lib/knj/knjdb/query_buffer.rb', line 63 def flush return nil if @queries_count <= 0 @lock.synchronize do @args[:db].transaction do @queries.shift(1000).each do |str| STDOUT.print "Executing via buffer: #{str}\n" if @debug @args[:db].q(str) end @inserts.each do |table, datas_arr| while !datas_arr.empty? datas_chunk_arr = datas_arr.shift(1000) @args[:db].insert_multi(table, datas_chunk_arr) end end end @inserts.clear @queries_count = 0 end return nil end |
#insert(table, data) ⇒ Object
Plans to inset a hash into a table. It will only be inserted when flush is called.
Examples
db.q_buffer do |buffer|
buffer.insert(:users, {:name => "John Doe"})
end
51 52 53 54 55 56 57 58 59 60 |
# File 'lib/knj/knjdb/query_buffer.rb', line 51 def insert(table, data) @lock.synchronize do @inserts[table] = [] if !@inserts.key?(table) @inserts[table] << data @queries_count += 1 end self.flush if @queries_count >= 1000 return nil end |
#query(str) ⇒ Object
Adds a query to the buffer.
24 25 26 27 28 29 30 31 32 33 |
# File 'lib/knj/knjdb/query_buffer.rb', line 24 def query(str) @lock.synchronize do STDOUT.print "Adding to buffer: #{str}\n" if @debug @queries << str @queries_count += 1 end self.flush if @queries_count >= 1000 return nil end |