class Janko::Merge
Public Instance Methods
alter(*list, &block)
click to toggle source
# File lib/janko/merge.rb, line 67 def alter(*list, &block) preserve_state_if_started columns.alter(*list, &block) self end
columns()
click to toggle source
# File lib/janko/merge.rb, line 94 def columns @state[:columns] ||= begin raise("Connect before setting merge parameters.") \ unless connected? default_column_list end end
connect(connection)
click to toggle source
# File lib/janko/merge.rb, line 26 def connect(connection) @state[:connection] = Connection.build(connection) self end
default_state()
click to toggle source
# File lib/janko/merge.rb, line 22 def default_state { strategy: Janko::BulkMerge, connection: Connection.default } end
insert(*list)
click to toggle source
# File lib/janko/merge.rb, line 55 def insert(*list) preserve_state_if_started columns.tag("insert", *list) self end
key(*list)
click to toggle source
# File lib/janko/merge.rb, line 43 def key(*list) preserve_state_if_started columns.tag("key", *list) self end
push(*args)
click to toggle source
# File lib/janko/merge.rb, line 81 def push(*args) raise("Call #start before #push") unless @state[:started] rollback_on_error { delegate.push(*args) } self end
returning(returning)
click to toggle source
# File lib/janko/merge.rb, line 36 def returning(returning) returning = returning.to_s raise("Merge can return inserted, updated, all, or none.") \ unless %w(inserted updated all none).include?(returning) chain(returning: returning) end
select(*list)
click to toggle source
# File lib/janko/merge.rb, line 61 def select(*list) preserve_state_if_started columns.tag("select", *list) self end
start()
click to toggle source
# File lib/janko/merge.rb, line 73 def start @state[:started] = true reset_delegate begin_transaction and lock_table rollback_on_error { delegate.start } self end
stop()
click to toggle source
# File lib/janko/merge.rb, line 87 def stop raise("Call #start before #stop") unless @state[:started] rollback_on_error { delegate.stop } @state[:started] = false self end
update(*list)
click to toggle source
# File lib/janko/merge.rb, line 49 def update(*list) preserve_state_if_started columns.tag("update", *list) self end
use(strategy)
click to toggle source
# File lib/janko/merge.rb, line 31 def use(strategy) @state[:strategy] = strategy self end
Private Instance Methods
begin_transaction()
click to toggle source
# File lib/janko/merge.rb, line 126 def begin_transaction return(self) if connection.in_transaction? return(self) if (@state[:transaction] == false) @state[:our_transaction] == true exec("BEGIN") self end
commit_or_rollback_transaction()
click to toggle source
# File lib/janko/merge.rb, line 134 def commit_or_rollback_transaction return(self) unless connection.in_transaction? return(self) unless @state.delete(:our_transaction) exec(connection.failed? ? "ROLLBACK" : "COMMIT") self end
connected?()
click to toggle source
# File lib/janko/merge.rb, line 104 def connected? @state.has_key?(:connection) end
default_column_list()
click to toggle source
# File lib/janko/merge.rb, line 108 def default_column_list ColumnList.new(parent: self) .tag(:key, :id) .tag(:select, Janko::ALL) .tag(:insert, Janko::ALL).untag(:insert, :id) .tag(:update, Janko::ALL).untag(:update, :id) end
delegate()
click to toggle source
# File lib/janko/merge.rb, line 153 def delegate @delegate ||= begin strategy_class = @state[:strategy] strategy_class || raise("Set strategy before merging.") strategy_class.new(@state.slice(:connection, :table, :returning, :collector).merge(columns: columns)) end end
lock_table()
click to toggle source
# File lib/janko/merge.rb, line 141 def lock_table return(self) unless connection.in_transaction? return(self) if (@state[:locking] == false) exec("LOCK TABLE #{table} IN SHARE ROW EXCLUSIVE MODE;") self end
preserve_state_if_started()
click to toggle source
# File lib/janko/merge.rb, line 148 def preserve_state_if_started return(self) unless @state[:started] raise("Call #stop before changing import options.") end
reset_delegate()
click to toggle source
# File lib/janko/merge.rb, line 162 def reset_delegate @delegate = nil self end
rollback_on_error() { || ... }
click to toggle source
# File lib/janko/merge.rb, line 116 def rollback_on_error begin yield rescue raise ensure commit_or_rollback_transaction end end