Bugzilla之类继承体系结构及其扩展应用(二)

来源:互联网 发布:php location 编辑:程序博客网 时间:2024/05/22 01:33

  (一)中介绍了如何为Bugzilla的新增数据库表写一个类似于API的交互类。如果我们想Bugzilla安装时也创建好新增的表rc,表格式同文(一)中,如下:

Field NameTypeRemarksrc_idmediumint自增,表的主键。bug_idmediumint所属bug对象的id。contentmediumtext内容。statusvarchar(64)状态。

 

  Bugzilla同样给我们提供了良好的扩展机制。我们可以通过修改Bugzilla的ABSTRACT_SCHEMA(位于bugzilla/Bugzilla/DB/Schema.pm文件中)达到这个目的。

 

  查看Bugzilla的ABSTRACT_SCHEMA,我们可以发现,这里通过Hash表列举了所需要定义的表的结构和字段类型以及其它的一些重要信息。如bugs表使用下面的Hash结构表示:

 

  从上面的代码中可以看到,数据库表名称、表字段的名称和类型、表的索引等。

 

  现在我们之需要将新增的rc表的格式添加到ABSTRACT_SCHEMA中,就可以在安装时自动创建这个rc表了,如下:

 

  很简单吧,^-^!

 

  也许有人说,如果我不这样做,而是直接在数据库中直接增加一张rc表不也可以吗?是的,可以。但是我至少有这么几点理由认为你应该这样做:

 

  1.Bugzilla既然提供了如此方便的方法来新增一张数据表,没有理由不follow它。

  2.更重要的,如果不使用上面的方法来新增一张数据表,那我们将不可能简单的如文(一)中所述的那样从Object类轻松的继承出一个子类来操作这张新增的数据表。

 

  问题就出在Object类中的_check_field函数身上,我们看一下定义:

  从注释中我们就可以看出点猫腻了,原来Bugzilla会检查你所操作的字段是不是属于某一特定表的,通过之后才允许做真正的数据库操作,也就是上面的Bugzilla->dbh->bz_column_info($class->DB_TABLE, $field)语句。

 

  那Bugzilla是如何知道某一字段是不是属于某一张数据表的呢?答案很简单,Bugzilla将这些信息存储了下来,在需要的时候再去检索,这也就是bz_column_info函数做的事情了。那Bugzilla是什么时候将信息存储下来的呢?又是以什么形式存储在哪里的呢?

  答案是Bugzilla在安装过程中会创建数据库及各个表,信息就是那时候存储下来的,而存储的地方当然就在创建的数据库中的某一张表中。还是回到ABSTRACT_SCHEMA中,最后一张表就是存储这些信息的地方:

相应的bz_column_info函数就是在这个地方进行检索了。

 

  因此,如果你的表不是来自ABSTRACT_SCHEMA,那自然bz_column_info函数就会失败,_check_field函数就会抛出相应的异常。解决方法之一就是在自己的继承类中覆盖_check_field函数,当然你也完全可以自己重新造轮子,不从Object类继承。

 

  差不多了,就写到这里。

 

  大家春节快乐!

 

 

原创粉丝点击