Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4261826
  • 博文数量: 601
  • 博客积分: 15410
  • 博客等级: 上将
  • 技术积分: 6884
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-16 08:11
个人简介

独学而无友,则孤陋而寡闻!

文章分类

全部博文(601)

文章存档

2020年(1)

2018年(4)

2017年(7)

2016年(42)

2015年(25)

2014年(15)

2013年(36)

2012年(46)

2011年(117)

2010年(148)

2009年(82)

2008年(37)

2007年(41)

分类:

2010-04-11 19:52:27

  序:上一段时间帮人分析过moodle架构,梳理堆砌了一些文字资料,这里放上来,供大家参考。如有错误或遗漏的地方,请各位指正。

    

    1、数据连接抽象类ADOConnection

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

//抽象数据库连接类ADOConnection

class ADOConnection {}

ADOConnection定义了连接、断开连接(Close)、 事务处理(BeginTransCommitTransRollbackTrans等)、 错误异常处理、CURDGetOneSelectLimitAutoExecute等)、 缓存机制(CacheFlushCacheSelectLimitCacheExecute)、 锁机制等。更加详细实现见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数据库连接对象的实例化

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

l 数据连接对象创建的管理

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

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

为此,Moodleconfig.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的 实现

Moodlelib/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() .'

'.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;

    }

   

    //省去其他部分

}
阅读(2224) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~