Class: DBI::DBD::SQLite::Statement
- Inherits:
-
BaseStatement
- Object
- BaseStatement
- DBI::DBD::SQLite::Statement
- Defined in:
- lib/dbd/sqlite/statement.rb
Overview
See DBI::BaseStatement.
Constant Summary collapse
- DBI_TYPE_MAP =
[ [ /^INT(EGER)?$/i, DBI::SQL_INTEGER ], [ /^(OID|ROWID|_ROWID_)$/i, DBI::SQL_OTHER ], [ /^FLOAT$/i, DBI::SQL_FLOAT ], [ /^REAL$/i, DBI::SQL_REAL ], [ /^DOUBLE$/i, DBI::SQL_DOUBLE ], [ /^DECIMAL/i, DBI::SQL_DECIMAL ], [ /^(BOOL|BOOLEAN)$/i, DBI::SQL_BOOLEAN ], [ /^TIME$/i, DBI::SQL_TIME ], [ /^DATE$/i, DBI::SQL_DATE ], [ /^TIMESTAMP$/i, DBI::SQL_TIMESTAMP ], [ /^(VARCHAR|TEXT)/i, DBI::SQL_VARCHAR ], [ /^CHAR$/i, DBI::SQL_CHAR ], ]
Instance Method Summary collapse
-
#bind_param(param, value, attributes = nil) ⇒ Object
See DBI::BaseStatement#bind_param.
- #column_info ⇒ Object
-
#execute ⇒ Object
See DBI::BaseStatement#execute.
- #fetch ⇒ Object
-
#initialize(stmt, dbh) ⇒ Statement
constructor
A new instance of Statement.
- #rows ⇒ Object
Constructor Details
#initialize(stmt, dbh) ⇒ Statement
Returns a new instance of Statement.
20 21 22 23 24 25 26 27 28 |
# File 'lib/dbd/sqlite/statement.rb', line 20 def initialize(stmt, dbh) @dbh = dbh @statement = DBI::SQL::PreparedStatement.new(@dbh, stmt) @attr = { } @params = [ ] @rows = [ ] @result_set = nil @dbh.open_handles += 1 end |
Instance Method Details
#bind_param(param, value, attributes = nil) ⇒ Object
See DBI::BaseStatement#bind_param. This method will also raise DBI::InterfaceError if param
is not a Fixnum, to prevent incorrect binding.
35 36 37 38 39 40 41 42 43 |
# File 'lib/dbd/sqlite/statement.rb', line 35 def bind_param(param, value, attributes=nil) unless param.kind_of? Fixnum raise DBI::InterfaceError, "Only numeric parameters are supported" end @params[param-1] = value # FIXME what to do with attributes? are they important in SQLite? end |
#column_info ⇒ Object
89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 |
# File 'lib/dbd/sqlite/statement.rb', line 89 def column_info columns = [ ] # FIXME this shit should *really* be abstracted into DBI # FIXME this still doesn't handle nullable/unique/default stuff. @result_set.columns.each_with_index do |name, i| columns[i] = { } unless columns[i] columns[i]["name"] = name type_name = @result_set.types[i] if type_name m = DBI::DBD::SQLite.parse_type(type_name) columns[i]["type_name"] = m[1] columns[i]["precision"] = m[3].to_i if m[3] columns[i]["scale"] = m[5].to_i if m[5] DBI_TYPE_MAP.each do |map| if columns[i]["type_name"] =~ map[0] columns[i]["sql_type"] = map[1] break end end case columns[i]["type_name"] when 'double' columns[i]["dbi_type"] = DBI::Type::Float end end end return columns end |
#execute ⇒ Object
See DBI::BaseStatement#execute.
In the event AutoCommit is off and no transaction is currently executing, one will be opened at this point. It is your responsibility to #finish, #cancel, #rollback, or #commit.
52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
# File 'lib/dbd/sqlite/statement.rb', line 52 def execute sql = @statement.bind(@params) # XXX sqlite re-escapes this for us automatically, it's causing trouble with everything else. # this will probably break in a horrible manner and I will be forced to "fix" it again. sql.gsub!(/\\\\/) { '\\' } DBI::DBD::SQLite.check_sql(sql) begin unless @dbh.db.transaction_active? @dbh.db.transaction end @result_set = @dbh.db.query(sql) @dbh.commit if @dbh["AutoCommit"] rescue Exception => e raise DBI::DatabaseError, e. end end |
#fetch ⇒ Object
80 81 82 83 84 85 86 87 |
# File 'lib/dbd/sqlite/statement.rb', line 80 def fetch return nil if @result_set.eof? row = @result_set.next return nil unless row return row end |
#rows ⇒ Object
122 123 124 |
# File 'lib/dbd/sqlite/statement.rb', line 122 def rows return @dbh.db.changes end |