mysql的gem包年久失修,项目的作者明确表示不再维护该包的代码,等待接盘侠。然而习惯了使用ruby的dbi数据库操作,dbi的mysql驱动dbd-mysql依赖于mysql的gem包,因此还是绕不过去,只有硬着头皮把它改了。
错误的表现:
在安装dbd-mysql的gem包时,去解决依赖安装mysql的gem包,结果native代码编译报错,提示rb_cFixnum变量没有定义。
错误的原因:
在新版的ruby实现中,已经将几类整形数值合并了,原来的数值型Fixnum和Bignum合并到Integer中去了,不再区分对待,而有年份的gem原生代码并不知情,引用到了这些类型的原生定义。
解决的方法:
存在三种方法处理这一问题,第一种方法为将ruby回退到支持mysql的gem包的版本;第二种方法为下载mysql的gem包的源代码(托管在github,可以去搜),然后修改原生代码,去除对不存在类型的判断和访问,之后重新打包并本地安装;第三种方法为在安装mysql的gem包时,临时调整ruby.h的定义,将rb_cFixnum类型typedef为rb_cInteger(其实rb_cBignum也有同样的问题,只不过在原生代码中并没有对其进行引用),之后安装gem包编译mysql原生代码,安装成功后将ruby.h文件还原,在逻辑上保持正确。
通过以上的分析,就工作量而言,第三种是最简便的方法,测试后运行正确。