SQLite3 :: Database和SQLite3 :: Statement的初始化方法在哪里?

时间:2012-03-30 06:14:35

标签: ruby sqlite rubygems sqlite3-ruby

我是一位经验丰富的程序员,学习Ruby(并且喜欢它)。 我正在使用SQLite3设置数据库。 为了更好地学习Ruby,我正在追踪SQLite3。 我不明白的是,数据库和语句类的#new代码在哪里。 实际上,我期望不是#new方法,而是#initialize方法。

SQLite3::Database.new(file, options = {})
SQLite3::Statement.new(db, sql)

以上两个陈述来自文件。 但是在我的代码中,当我尝试追踪到这个

$db = SQLite3::Database.new"MyDBfile"

它刚刚结束。

然后我尝试追溯到

#$db.execute 

我确实进入了Database.rb文件中的#execute方法,但是它调用了#prepare方法,我尝试进入

stmt = SQLite3::Statement.new( self, sql )

但又没有运气。它只是跨过它。

我已经搜索过源代码,完成了搜索等工作,但我找不到正在调用的初始化方法。他们在哪儿?

感谢您考虑这个问题。

1 个答案:

答案 0 :(得分:2)

initialize method for SQLite3::Database在C:

中实现
/* call-seq: SQLite3::Database.new(file, options = {})
 *
 * Create a new Database object that opens the given file. If utf16
 * is +true+, the filename is interpreted as a UTF-16 encoded string.
 *
 * By default, the new database will return result rows as arrays
 * (#results_as_hash) and has type translation disabled (#type_translation=).
 */
static VALUE initialize(int argc, VALUE *argv, VALUE self)

同样适用于SQLite3::Statement

/* call-seq: SQLite3::Statement.new(db, sql)
 *
 * Create a new statement attached to the given Database instance, and which
 * encapsulates the given SQL text. If the text contains more than one
 * statement (i.e., separated by semicolons), then the #remainder property
 * will be set to the trailing text.
 */
static VALUE initialize(VALUE self, VALUE db, VALUE sql)

Ruby调试器不知道如何进入C函数(假设SQLite3扩展甚至已经编译了调试支持),所以它会跳过它们。