Class: DBI::BaseStatement

Inherits:
Base
  • Object
show all
Defined in:
lib/dbi/base_classes/statement.rb

Overview

StatementHandles are used to encapsulate the process of managing a statement (DDL or DML) and its parameters, sending it to the database, and gathering any results from the execution of that statement.

As with the other Base classes, the terms “DBD Required” and “DBD Optional” are defined in DBI::BaseDatabase.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(attr = nil) ⇒ BaseStatement

Returns a new instance of BaseStatement.



14
15
16
# File 'lib/dbi/base_classes/statement.rb', line 14

def initialize(attr=nil)
    @attr = attr || {}
end

Instance Attribute Details

#raise_errorObject

Returns the value of attribute raise_error.



12
13
14
# File 'lib/dbi/base_classes/statement.rb', line 12

def raise_error
  @raise_error
end

Instance Method Details

#[](attr) ⇒ Object

Get statement attributes.



159
160
161
162
# File 'lib/dbi/base_classes/statement.rb', line 159

def [](attr)
    @attr ||= { }
    @attr[attr]
end

#[]=(attr, value) ⇒ Object

Set statement attributes. DBD Optional.

Raises:



167
168
169
# File 'lib/dbi/base_classes/statement.rb', line 167

def []=(attr, value)
    raise NotSupportedError
end

#bind_param(param, value, attribs) ⇒ Object

Bind a parameter to the statement. DBD Required.

The parameter number is numeric and indexes starting at 1. This corresponds to the question marks (?) in the statement from the left-most part of the statement moving forward.

The value may be any ruby type. How these are handled is DBD-dependent, but the vast majority of DBDs will convert these to string inside the query.



29
30
31
# File 'lib/dbi/base_classes/statement.rb', line 29

def bind_param(param, value, attribs)
    raise NotImplementedError
end

#bind_params(*bindvars) ⇒ Object

Take a list of bind variables and bind them successively using bind_param.



74
75
76
77
# File 'lib/dbi/base_classes/statement.rb', line 74

def bind_params(*bindvars)
    bindvars.each_with_index {|val,i| bind_param(i+1, val, nil) }
    self
end

#cancelObject

Cancel any result cursors. DBD Optional, but intentionally does not raise any exception as it’s used internally to maintain consistency.



83
84
# File 'lib/dbi/base_classes/statement.rb', line 83

def cancel
end

#column_infoObject

returns result-set column information as array of hashs, where each hash represents one column. See BaseDatabase#columns. DBD Required.



63
64
65
# File 'lib/dbi/base_classes/statement.rb', line 63

def column_info
    raise NotImplementedError
end

#executeObject

Execute the statement with the known binds. DBD Required.



36
37
38
# File 'lib/dbi/base_classes/statement.rb', line 36

def execute
    raise NotImplementedError
end

#fetchObject

Fetch the next row in the result set. DBD Required.

DBI::Row is responsible for formatting the data the DBD provides it.



54
55
56
# File 'lib/dbi/base_classes/statement.rb', line 54

def fetch
    raise NotImplementedError
end

#fetch_allObject

Fetch all available rows. Result is Array of DBI::Row.



141
142
143
144
145
146
147
148
149
150
151
152
153
154
# File 'lib/dbi/base_classes/statement.rb', line 141

def fetch_all
    rows = []
    loop do
        row = fetch
        break if row.nil?
        rows << row.dup
    end

    if rows.empty?
        nil
    else
        rows
    end
end

#fetch_many(cnt) ⇒ Object

fetch x rows. The result is Array of DBI::Row.



123
124
125
126
127
128
129
130
131
132
133
134
135
136
# File 'lib/dbi/base_classes/statement.rb', line 123

def fetch_many(cnt)
    rows = []
    cnt.times do
        row = fetch
        break if row.nil?
        rows << row.dup
    end

    if rows.empty?
        nil
    else
        rows
    end
end

#fetch_scroll(direction, offset) ⇒ Object

fetch_scroll is provided with a direction and offset and works similar to how seek() is used on files.

The constants available for direction are as follows:

  • SQL_FETCH_NEXT: fetch the next result.

  • SQL_FETCH_LAST: fetch the last result, period.

  • SQL_FETCH_RELATIVE: fetch the result at the offset.

Other constants can be used, but if this method is not supplied by the driver, they will result in a raise of DBI::NotSupportedError.



100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
# File 'lib/dbi/base_classes/statement.rb', line 100

def fetch_scroll(direction, offset)
    case direction
    when SQL_FETCH_NEXT
        return fetch
    when SQL_FETCH_LAST
        last_row = nil
        while (row=fetch) != nil
            last_row = row
        end
        return last_row
    when SQL_FETCH_RELATIVE
        raise NotSupportedError if offset <= 0
        row = nil
        offset.times { row = fetch; break if row.nil? }
        return row
    else
        raise NotSupportedError
    end
end

#finishObject

Close the statement and any result cursors. DBD Required.

Note

Most implementations will fail miserably if you forget to finish your statement handles.



45
46
47
# File 'lib/dbi/base_classes/statement.rb', line 45

def finish
    raise NotImplementedError
end