我试图在服务器/客户端模式下使用KirbyBase (在Ruby中),并且有一些问题.下面是设置(我正在使用一个特定的嵌入式linux系统(在文章底部解释),但是,为了参数起见,我将调用那些PC )。
以下是服务器代码:
# Multi-user server script for KirbyBase.
require 'DatabaseObjects.rb'
include DatabaseObjects
require 'kirbybase'
require 'drb'
puts 'Initializing database server and indexes...'
# Create an instance of the database.
db = KirbyBase.new(:server,nil,nil,'/mnt/sharedSpace/data/')
DRb.start_service('druby://:44444', db)
puts 'Server ready to receive connections...'
DRb.thread.join下面是客户端代码:
#draft.rb
require 'kirbybase'
require 'DatabaseObjects.rb'
require 'drb'
include DatabaseObjects
begin
db = KirbyBase.new(:client, '192.168.1.11', 44444)
if db.table_exists?(:registeredTags)
puts "found table"
registeredTagsTable = db.get_table(:registeredTags)
puts "got table"
puts registeredTagsTable.select().to_report
else
puts "couldnt found table"
end
rescue Exception => sp
puts sp.message
puts sp.backtrace.inspect
end我启动服务器,它打印“服务器就绪.”然后在另一台机器上启动客户端代码,下面是我得到的信息:
undefined method `close' for nil:NilClass
["(druby://192.168.1.11:44444) /usr/lib/ruby/1.8/kirbybase.rb:1765:in `with_table'", "(druby://192.168.1.11:44444) /usr/lib/ruby/1.8/kirbybase.rb:992:in `get_header_vars'", "/usr/lib/ruby/1.8/kirbybase.rb:3112:in `update_header_vars'", "/usr/lib/ruby/1.8/kirbybase.rb:2026:in `initialize'", "/usr/lib/ruby/1.8/kirbybase.rb:2002:in `new'", "/usr/lib/ruby/1.8/kirbybase.rb:2002:in `create_called_from_database_instance'", "/usr/lib/ruby/1.8/kirbybase.rb:463:in `initialize'", "/usr/lib/ruby/1.8/kirbybase.rb:461:in `each'", "/usr/lib/ruby/1.8/kirbybase.rb:461:in `initialize'", "draft.rb:6:in `new'", "draft.rb:6"]但是,如果在服务器代码运行的同一台机器上启动相同的客户端代码,一切都会顺利进行,并打印表内容。有什么主意.?
一些人要求的系统解释:我正在使用的设备是一台智能RFID阅读器,带有一台基于嵌入式linux arm的机上计算机。唯一的api/语言制造商允许并提供(w/o脱离许可条款)是ruby,他们不支持安装额外的东西,他们已经在设备中定制内核,使安装/编译尽可能困难。如果它们只是.rb库文件,我可以使用额外的红宝石文件--也就是说,我可以轻松地将它们包含在代码中,但是任何需要编译的内容都是不需要编译的。而且,这个系统没有创业板。
Edit2:响应第一个答案,我已经更改了上述功能如下:
def with_table(table, access='r')
begin
yield fptr = open(table.filename, access)
ensure
if !fptr.nil? then
fptr.close
end
end
end现在我发现了一个错误:
druby://localhost.localdomain:1027 - #<Errno::ECONNREFUSED: Connection refused - connect(2)>
["(druby://192.168.1.22:44444) /usr/lib/ruby/1.8/drb/drb.rb:736:in `open'", "(druby://192.168.1.22:44444) /usr/lib/ruby/1.8/drb/drb.rb:729:in `each'", "(druby://192.168.1.22:44444) /usr/lib/ruby/1.8/drb/drb.rb:729:in `open'", "(druby://192.168.1.22:44444) /usr/lib/ruby/1.8/drb/drb.rb:1196:in `initialize'", "(druby://192.168.1.22:44444) /usr/lib/ruby/1.8/drb/drb.rb:1176:in `new'", "(druby://192.168.1.22:44444) /usr/lib/ruby/1.8/drb/drb.rb:1176:in `open'", "(druby://192.168.1.22:44444) /usr/lib/ruby/1.8/drb/drb.rb:1092:in `method_missing'", "(druby://192.168.1.22:44444) /usr/lib/ruby/1.8/drb/drb.rb:1110:in `with_friend'", "(druby://192.168.1.22:44444) /usr/lib/ruby/1.8/drb/drb.rb:1091:in `method_missing'", "(druby://192.168.1.22:44444) /usr/lib/ruby/1.8/kirbybase.rb:1763:in `with_table'", "(druby://192.168.1.22:44444) /usr/lib/ruby/1.8/kirbybase.rb:992:in `get_header_vars'", "/usr/lib/ruby/1.8/kirbybase.rb:3114:in `update_header_vars'", "/usr/lib/ruby/1.8/kirbybase.rb:2028:in `initialize'", "/usr/lib/ruby/1.8/kirbybase.rb:2004:in `new'", "/usr/lib/ruby/1.8/kirbybase.rb:2004:in `create_called_from_database_instance'", "/usr/lib/ruby/1.8/kirbybase.rb:463:in `initialize'", "/usr/lib/ruby/1.8/kirbybase.rb:461:in `each'", "/usr/lib/ruby/1.8/kirbybase.rb:461:in `initialize'", "draft.rb:6:in `new'", "draft.rb:6"]发布于 2009-09-09 21:57:03
Inside KirbyBase.new()参见with_table
def with_table(table, access='r')
begin
yield fptr = open(table.filename, access)
ensure
fptr.close
end
end我认为,正在发生的事情是,open()正在返回nil,而with_table调用站点中的相关块正在获取nil fptr,并试图在get_header_vars中删除nil。然后,随后的异常回滚回with_table,然后再尝试删除fptr,调用close,生成一个未获救的最终异常。
现在,我说open()返回的是nil,而不是open()失败,因为(参见打开(内核))当path是管道时,子节点总是返回nil,而父函数应该忽略它。因此,接下来要做的事情是开始调试KirbyBase的内部,并找出它是您的问题还是KirbyBase问题。我希望我已经帮你启动了。
调试这一点的一种方法是通过对KirbyBase进行猴子切换。如果您希望读取您自己的源代码副本,请在有gem的开发主机上执行以下操作:
gem fetch KirbyBase
mkdir t
gem unpack --target=t/. KirbyBase*https://stackoverflow.com/questions/1399500
复制相似问题