moodle架构分析---数据连接层的设计
1、数据连接抽象类ADOConnection
Moodle支持Mysql、Oracle、Sql Server等多种数据库。由于不同的数据库操作有所不同,为支持多种数据库,Moodle定义了数据库连接抽象类ADOConnection。
//抽象数据库连接类ADOConnectionclass 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
moodle架构分析---数据连接层的设计相关推荐
- MMO网络游戏数据访问层的设计设想
对于大多数互联网应用,数据的存储和访问都是不可或缺的一环.从早前的文件存储,到目前广泛使用的数据库,再到曙光初现的NoSQL,归根结底都是提供了数据的存储和访问功能.但是,面对不同的应用,对于数据的安 ...
- 企业级应用架构(三)三层架构之数据访问层的改进以及测试DOM的发布
在上一篇我们在宏观概要上对DAL层进行了封装与抽象.我们的目的主要有两个:第一,解除BLL层对DAL层的依赖,这一点我们通过定义接口做到了:第二,使我们的DAL层能够支持一切数据访问技术,如Ado.n ...
- 企业级应用架构(二)三层架构之数据访问层的封装与抽象
在上一篇我们知道,要解除BLL对DAL的依赖,我们就必须抽象出DAL层的接口,同时基于DAL的数据访问技术很多,如EF,ADO.NET,LINQ TO SQL,因此,我们的数据访问层必须对这些技术提供 ...
- moodle架构分析---表现层的设计(一)
Moodle在表现层的实现有多种机制,分别针对页面.表单.导航条.页面头部.页面底部等. 1.针对页面的实现,直接编辑HTML页面,然后在业务逻辑处理完毕之后,include编辑好的html页面即可. ...
- moodle架构分析---表现层的设计(二)
3.针对导航条的实现,一般是直接调用build_navigation函数即可.使用方法可以看下面一个例子. $newaccount = get_string('newaccount');$login ...
- 三层架构之数据访问层(DAL)
一. DAL层 1..模板: windows->类库 2.引用: Model configuration 3. 原则:一个实体一个Service类; SqlHelper (配置文件:连接字符串 ...
- 系统架构之业务逻辑层
一.上章回顾 上章我们主要讲述了系统设计规范与原则中的具体原则与规范及如何实现满足规范的设计,我们也讲述了通过分离功能点的方式来实现,而在软件开发过程中的具 体实现方式简单的分为面向过程与面向对象的开 ...
- 网络骨架:Backbone(神经网络基本组成——BN层、全连接层)
BN层 为了追求更高的性能,卷积网络被设计得越来越深,然而网络却变得难以训练收敛与调参.原因在于,浅层参数的微弱变化经过多层线性变化与激活函数后会被放大,改变了每一层的输入分布,造成深层的网络需要不断 ...
- ClownFish:比手写代码还快的通用数据访问层
最近花了二个月的业余时间重写了我以前的通用数据访问层, 由于是重写,所以我给这个项目取了个新名字:ClownFish 如果需要了解ClownFish的使用方法,请点击ClownFish 使用说明 Cl ...
最新文章
- SDUT_1299 最长上升子序列
- 黎曼猜想的1/2和质子自旋的1/2会不会是一个数?
- 项目初步验收需要检查事项
- vb+socket 编写入侵监听程序
- python getopt argparse_python OptParse模块和argparse命令行解析的用法详解
- Application package 'AndroidManifest.xml' must have a minimum of 2 segments错误
- CodeForces - 343D Water Tree(树链剖分+线段树)
- 一个两年Java的面试总结
- 吴恩达深度学习4.2练习_Convolutional Neural Networks_Residual Networks
- C# WinForm关闭窗体确认
- 适合程序员演讲的定场诗
- Smart3D倾斜摄影建模教程
- 躺着赚钱|闲鱼自动发货脚本|自动化|Auto.js
- type-C 边充电边听歌(OTG) PD芯片方案,LDR6028 PD充电加OTG方案
- buff系统 游戏中_泛娱产业:ARPG游戏的技能系统和buff系统的一种实现
- DCT和IDCT原始公式计算
- 个人网站怎么申请支付接口?
- 电脑开热点手机搜不到连不上
- 藏书阁(非技术流书籍)
- 数据结构 - 环形队列
热门文章
- 登山(信息学奥赛一本通-T1283)
- 矩阵转置(信息学奥赛一本通-T1126)
- 小书童——密码(洛谷-P1914)
- android 内存分析 名词解释,Android内存分析和调优(下)
- python爬取网上文章_python 爬取微信文章
- flask manage port_后端Python3+Flask结合Socket.io配合前端Vue2.0实现简单全双工在线客服系统...
- 重庆市大学生程序设计比赛相关情况
- android程序设计activity,《Android编程权威指南》之第二个activity
- C/C++:各类型变量占用字节
- 【Matplotlib】详解图像各个部分