moodle架构分析---数据连接层的设计

1、数据连接抽象类ADOConnection

 

  Moodle支持Mysql、Oracle、Sql Server等多种数据库。由于不同的数据库操作有所不同,为支持多种数据库,Moodle定义了数据库连接抽象类ADOConnection。

 

//抽象数据库连接类ADOConnection

  class ADOConnection {}
 

 

  ADOConnection定义了连接、断开连接(Close)、事务处理(BeginTrans、CommitTrans、 RollbackTrans等)、错误异常处理、CURD(GetOne、SelectLimit、AutoExecute等)、缓存机制 (CacheFlush、CacheSelectLimit、CacheExecute)、锁机制等。更加详细实现见lib/adodb /adodb.inc.php文件。

 

  2、数据库连接抽象类ADOConnection的具体实现

  Moodle针对各种具体的数据库定义了ADOConnection抽象类的实现,这些实现都放置在文件夹lib/adodb/drivers 下面。如Sql Server数据库的实现在lib/adodb/drivers/adodb-mssql.inc.php文件里面,Mysql数据库的实现在lib /adodb/drivers/adodb-mysql.inc.php等等。

  如:

 

class ADODB_mysql extends ADOConnection {}

class ADODB_mssql extends ADOConnection {}
 

 

  3、数据库连接对象的实例化

  现在,我们已经拥有了数据连接接口与实现,可以说,数据访问层的主体已经完成。留给我们的还有一下两个问题需要解决。

 

  数据连接对象创建的管理

 

  考虑利于数据库迁移的设计

  在前面的设计中,数据连接对象已经被抽象为对应的接口ADOConnection,它们的实现根据数据库的不同而有所区别,也就是说,创建的对象有多种类型,每种类型又有不同的实现,这是典型的抽象工厂模式的应用场景。这也是上述两个问题的解决之道。

 

  为此,Moodle在config.php中定义了数据库连接字符串来实现“依赖注入”。

  $CFG->dbtype    = 'mysql';

  $CFG->dbhost    = 'localhost';

  $CFG->dbname    = 'course_center';

  $CFG->dbuser    = 'root';

  $CFG->dbpass    = 'heshaoyue';

  $CFG->dbpersist = false;

  $CFG->prefix    = 'mdl_';
 

  接下来,在lib/setup.php中进行数据连接对象的实例化。即通过代码:

 

$db = &ADONewConnection($CFG->dbtype);
 

 

  实现了创建具体的数据库连接,ADONewConnection的部分实现如下。

  $cls = 'ADODB_'.$db;

  if (!class_exists($cls)) {

  adodb_backtrace();

  return $false;

  }

  $obj = new $cls();
 

  这样,数据库连接对象就创建好了。

 

ORM的实现

 

  Moodle在lib/dmllib.php中实现了ORM机制。常用的函数及用法如下:

  //查询$table中符合条件的记录是否存在

  function record_exists($table, $field1='', $value1='', $field2='', $value2='', $field3='', $value3='');

  //获取$table中符合条件的记录

  function get_record($table, $field1, $value1, $field2='', $value2='', $field3='', $value3='', $fields='*') ;

  //插入数据对象$dataobject到$table中

  function insert_record($table, $dataobject, $returnid=true, $primarykey='id') ;
 

  这些函数遍布moodle业务逻辑层的各个角落。由于数据库连接对象的存在,屏蔽了底层数据库之间的差异,使得这部分的实现就变得异常简单。在需要使用数据库连接对象之前,只首先引用lib/setup.php中创建的$db对象,

 

  global $db;
 

 

  即可调用底层数据库操作了。

  下面以insert_record来说明。

  function insert_record($table, $dataobject, $returnid=true, $primarykey='id') {

  //引用$db对象

  global $db, $CFG, $empty_rs_cache;

  //中间省去SQL语句生成的部分和缓存部分

  /// 执行插入操作

  if (!$rs = $db->Execute($insertSQL)) {

  debugging($db->ErrorMsg() .'<br /><br />'.s($insertSQL));

  if (!empty($CFG->dblogerror)) {

  $debug=array_shift(debug_backtrace());

  error_log("SQL ".$db->ErrorMsg()." in {$debug['file']} on line {$debug['line']}. STATEMENT: $insertSQL");

  }

  return false;

  }

  //省去其他部分

  }
 

 

来源:http://www.goodu.info/gc/node/352

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值