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