<?php
class Pkg_Db_Actor {
/**
* 读 记录集
*/
const MODE_READ_GETALL = 0x1001;
/**
* 读 第一条记录
*/
const MODE_READ_GETROW = 0x1002;
/**
* 读 第一条记录的第一个字段
*/
const MODE_READ_GETONE = 0x1003;
/**
* 读 记录集的指定列
*/
const MODE_READ_GETCOL = 0x1004;
/**
* 写 (插入) 操作
*/
const MODE_WRITE_INSERT = 0x2001;
/**
* 写 (更新) 操作
*/
const MODE_WRITE_UPDATE = 0x2002;
/**
* 写 (删除) 操作
*/
const MODE_WRITE_DELETE = 0x2002;
/**
* 执行 读 操作
*
* @param string $mode 模式 [MODE_READ_GETALL,MODE_READ_GETROW,MODE_READ_GETONE,MODE_READ_GETCOL]
* @param mixed $arguments 参数[不同模式参数不同,缺省为sql字符串]
* @param string $callback 查询记录集的回调处理函数
* @param mixed $return 处理的结果
*
* @return void
*/
static function read($mode, $arguments, $callback, &$return = null){
$dbo = Core_App::$defaultDbExecutor->getReader();
$arguments = (array) $arguments;
$sql = array_shift($arguments);// 缺省第一个参数是sql字符串
switch ($mode){
case self::MODE_READ_GETALL: // 如果sql里面带了limit则不能使用counter
$limit = array_shift($arguments);
$counter = array_shift($arguments);
if ($counter){
$counter_sql = "SELECT COUNT(*) FROM ( $sql ) as _count_table";
}else {
$counter_sql = null;
}
if ($limit) $sql .= Core_DBSqlHelper::getLimitSql($limit);
$result = $dbo->getAll($sql);
if ($counter_sql){
$result = array(
'counter' => $dbo->getOne($counter_sql),
'rows' => $result,
);
}
break;
case self::MODE_READ_GETROW:
$result = $dbo->getRow($sql);
break;
case self::MODE_READ_GETONE:
$result = $dbo->getOne($sql);
break;
case self::MODE_READ_GETCOL:
$col = (int) array_shift($arguments);
$result = $dbo->getCol($sql,$col);
break;
default:
throw new Exception("未定义的 Pkg_Db_Actor READ 模式");
}
$callback = self::callbackWraper($callback);
$return = empty($callback) ? $result : call_user_func_array($callback,array($result));
}
/**
* 执行 更新/删除 操作
*
* @param string $mode 模式 [MODE_WRITE_UPDATE,MODE_WRITE_DELETE]
* @param mixed $arguments 参数[不同模式参数不同,缺省为sql字符串]
* @param string $callback 查询结果集的回调处理函数
* @param mixed $return 处理的结果
*
* @return void
*/
static function write($mode, $arguments, $callback, &$return = null){
$dbo = Core_App::$defaultDbExecutor->getWriter();
$arguments = (array) $arguments;
$sql = array_shift($arguments);// 缺省第一个参数是sql字符串
$result = $dbo->execute($sql);
switch ($mode){
case self::MODE_WRITE_INSERT: // 插入操作可选 得到主键标识
$id = array_shift($arguments);
$result = $id ? $dbo->lastInsertId() : $dbo->lastQueryAffectedRows();
break;
case self::MODE_WRITE_UPDATE:
case self::MODE_WRITE_DELETE:
$result = $dbo->lastQueryAffectedRows();
break;
default:
throw new Exception("未定义的 Pkg_Db_Actor WRITE 模式");
}
$callback = self::callbackWraper($callback);
$return = empty($callback) ? $result : call_user_func_array($callback,array($result));
}
/**
* 回调函数包装器
*
* 如果函数是可调用的,则返回 回调函数,否则返回NULL
*
* @param string $callback 回调函数
*
* @return callback
*/
static function callbackWraper($callback){
if (!empty($callback)){
if (is_callable($callback)) return $callback;// call_user_func_array($callback, $args);
$cbInst = Core_Helper_Callback::getInstance();
if ($cbInst->exists($callback)) return $cbInst->get($callback);
}
return null;
}
}
测试代码如下:
<?php
/**
*
* @author xuxh
*/
class App_Controller_Cui_Actor_Run extends Core_Mvc_Web_Controller
{
function II(array $rows){
return array(
'counter' => 3,
'rows' => $rows
);
}
function actionIndex(){
// $sql = "SELECT * FROM worksheet_order Limit 1";
// Pkg_Db_Actor::read(Pkg_Db_Actor::MODE_READ_GETALL ,$sql,array($this,'II'),$return);
// Core_AppUtils::dump($return,'Pkg_Db_Actor::MODE_READ_GETALL');
//
// Pkg_Db_Actor::read(Pkg_Db_Actor::MODE_READ_GETONE ,"SELECT count(*) FROM worksheet_order",NULL,$return);
// Core_AppUtils::dump($return,'Pkg_Db_Actor::MODE_READ_GETONE');
Pkg_Db_Actor::read(Pkg_Db_Actor::MODE_READ_GETALL ,array(
"SELECT id,sale_order_id FROM worksheet_order",array(1,3),true
),NULL,$return);
Core_AppUtils::dump($return,'Pkg_Db_Actor::MODE_READ_GETALL');
}
}
测试结果如下:
D:\AppServ\www\orderun\prototype\app>php rake.php q=cui.actor.run.index
Pkg_Db_Actor::MODE_READ_GETALL :
Array
(
[counter] => 2957
[rows] => Array
(
[0] => Array
(
[id] => 5
[sale_order_id] => 5
)
)
)
转载请注明原文地址: https://ju.6miu.com/read-1126008.html