123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- require 'sqlite3/errors'
- require 'sqlite3/resultset'
- class String
- def to_blob
- SQLite3::Blob.new( self )
- end
- end
- module SQLite3
- # A statement represents a prepared-but-unexecuted SQL query. It will rarely
- # (if ever) be instantiated directly by a client, and is most often obtained
- # via the Database#prepare method.
- class Statement
- include Enumerable
- # This is any text that followed the first valid SQL statement in the text
- # with which the statement was initialized. If there was no trailing text,
- # this will be the empty string.
- attr_reader :remainder
- # Binds the given variables to the corresponding placeholders in the SQL
- # text.
- #
- # See Database#execute for a description of the valid placeholder
- # syntaxes.
- #
- # Example:
- #
- # stmt = db.prepare( "select * from table where a=? and b=?" )
- # stmt.bind_params( 15, "hello" )
- #
- # See also #execute, #bind_param, Statement#bind_param, and
- # Statement#bind_params.
- def bind_params( *bind_vars )
- index = 1
- bind_vars.flatten.each do |var|
- if Hash === var
- var.each { |key, val| bind_param key, val }
- else
- bind_param index, var
- index += 1
- end
- end
- end
- # Execute the statement. This creates a new ResultSet object for the
- # statement's virtual machine. If a block was given, the new ResultSet will
- # be yielded to it; otherwise, the ResultSet will be returned.
- #
- # Any parameters will be bound to the statement using #bind_params.
- #
- # Example:
- #
- # stmt = db.prepare( "select * from table" )
- # stmt.execute do |result|
- # ...
- # end
- #
- # See also #bind_params, #execute!.
- def execute( *bind_vars )
- reset! if active? || done?
- bind_params(*bind_vars) unless bind_vars.empty?
- @results = ResultSet.new(@connection, self)
- step if 0 == column_count
- yield @results if block_given?
- @results
- end
- # Execute the statement. If no block was given, this returns an array of
- # rows returned by executing the statement. Otherwise, each row will be
- # yielded to the block.
- #
- # Any parameters will be bound to the statement using #bind_params.
- #
- # Example:
- #
- # stmt = db.prepare( "select * from table" )
- # stmt.execute! do |row|
- # ...
- # end
- #
- # See also #bind_params, #execute.
- def execute!( *bind_vars, &block )
- execute(*bind_vars)
- block_given? ? each(&block) : to_a
- end
- # Returns true if the statement is currently active, meaning it has an
- # open result set.
- def active?
- !done?
- end
- # Return an array of the column names for this statement. Note that this
- # may execute the statement in order to obtain the metadata; this makes it
- # a (potentially) expensive operation.
- def columns
- get_metadata unless @columns
- return @columns
- end
- def each
- loop do
- val = step
- break self if done?
- yield val
- end
- end
- # Return an array of the data types for each column in this statement. Note
- # that this may execute the statement in order to obtain the metadata; this
- # makes it a (potentially) expensive operation.
- def types
- must_be_open!
- get_metadata unless @types
- @types
- end
- # Performs a sanity check to ensure that the statement is not
- # closed. If it is, an exception is raised.
- def must_be_open! # :nodoc:
- if closed?
- raise SQLite3::Exception, "cannot use a closed statement"
- end
- end
- private
- # A convenience method for obtaining the metadata about the query. Note
- # that this will actually execute the SQL, which means it can be a
- # (potentially) expensive operation.
- def get_metadata
- @columns = Array.new(column_count) do |column|
- column_name column
- end
- @types = Array.new(column_count) do |column|
- column_decltype column
- end
- end
- end
- end
|