예제 #1
0
 /**
  * 执行
  */
 public function execute()
 {
     //参数重载
     if (func_num_args() == 1) {
         return $this->_executeParam1(func_get_arg(0));
     }
     switch (trim($this->action)) {
         case 'SELECT':
             $databaseObject = CDatabase::getDatabase($this->configName, false);
             $sql = $this->_sql = $this->_createSelectSQL();
             $rsReult = array();
             $btime = $etime = 0;
             //检查缓存
             if (!empty($this->_cache)) {
                 //尝试直接从缓存获取
                 $cacheData = Cache::getInstance()->get($this->_cache);
                 if (null != $cacheData) {
                     //查询结果对象
                     $resultObject = new CResult();
                     $resultObject->setIsMaster(false);
                     $resultObject->setSql($sql);
                     $resultObject->setIsCache(true);
                     $resultObject->setValue($cacheData->asArray());
                     $resultObject->setCastTime($etime > $btime ? round($etime - $btime, 6) : 0);
                     //执行查询后钩子函数
                     CHooks::callHooks(HOOKS_EXECUTE_END, $resultObject);
                     $this->_clearSelf();
                     return $cacheData;
                 }
             }
             try {
                 //执行查询前钩子函数
                 CHooks::callHooks(HOOKS_EXECUTE_BEFORE, $this);
                 $btime = microtime(true);
                 $rs = $databaseObject->prepare($this->_sql);
                 if (!$rs) {
                     $errorData = $databaseObject->errorInfo();
                     //发生SQL错误时 触发钩子
                     $dbError = new CDBError();
                     $dbError->setSQLErrorCode($errorData[0]);
                     $dbError->setDriverErrorCode($errorData[1]);
                     $dbError->setErrorMessage($errorData[2]);
                     $dbError->setSql($this->_sql);
                     CHooks::callHooks(HOOKS_EXECUTE_ERROR, $dbError);
                     throw new PDOException('[' . $errorData[1] . '] ' . $errorData[2] . ' with SQL [' . $this->_sql . ']');
                 }
                 $rs->execute($this->whereValue);
                 $rs->setFetchMode(PDO::FETCH_OBJ);
                 $rsReult = $rs->fetchAll();
                 $etime = microtime(true);
             } catch (PDOException $pdoException) {
                 throw new CDbException($pdoException->getMessage());
             }
             //查询结果对象
             $resultObject = new CResult();
             $resultObject->setIsMaster(false);
             $resultObject->setSql($sql);
             $resultObject->setWhereValue($this->whereValue);
             $resultObject->setValue($rsReult);
             $resultObject->setCastTime($etime > $btime ? round($etime - $btime, 6) : 0);
             //执行查询后钩子函数
             CHooks::callHooks(HOOKS_EXECUTE_END, $resultObject);
             //缓存结果
             if (!empty($this->_cache)) {
                 $cacheData = Cache::getInstance()->set($this->_cache, $resultObject, $this->_cacheTime);
             }
             //清理
             $this->_clearSelf();
             return $resultObject;
             break;
         case 'INSERT INTO':
             // 强制主库操作新增
             $this->isMaster = true;
             $databaseObject = CDatabase::getDatabase($this->configName, $this->isMaster);
             $sql = $this->_sql = $this->_createInsertSQL();
             //执行查询前钩子函数
             CHooks::callHooks(HOOKS_EXECUTE_BEFORE, $this);
             $insertStatus = $databaseObject->exec($this->_sql);
             if ($insertStatus > 0) {
                 //执行操作
                 $execObject = new CExec();
                 $execObject->setSql($sql);
                 $execObject->setRow($insertStatus);
                 $execObject->setStatus(true);
                 $execObject->setLastInsertId($databaseObject->lastInsertId());
                 //执行查询后钩子函数
                 CHooks::callHooks(HOOKS_EXECUTE_END, $execObject);
                 //清理
                 $this->_clearSelf();
                 return $execObject;
             } else {
                 //发生错误
                 $errorData = $databaseObject->errorInfo();
                 //发生SQL错误时 触发钩子
                 $dbError = new CDBError();
                 $dbError->setSQLErrorCode($errorData[0]);
                 $dbError->setDriverErrorCode($errorData[1]);
                 $dbError->setErrorMessage($errorData[2]);
                 $dbError->setSql($this->_sql);
                 CHooks::callHooks(HOOKS_EXECUTE_ERROR, $dbError);
                 throw new CDbException('[' . $errorData[1] . '] ' . $errorData[2] . ' with SQL [' . $this->_sql . ']');
             }
             //清理
             $this->_clearSelf();
             break;
         case 'UPDATE':
             // 强制主库操作更新
             $this->isMaster = true;
             $databaseObject = CDatabase::getDatabase($this->configName, $this->isMaster);
             $sql = $this->_sql = $this->_createUpdateSQL();
             //执行查询前钩子函数
             CHooks::callHooks(HOOKS_EXECUTE_BEFORE, $this);
             $rs = $databaseObject->prepare($this->_sql);
             $updateStatus = $rs->execute($this->whereValue);
             if (false === $updateStatus) {
                 $errorData = $databaseObject->errorInfo();
                 //发生SQL错误时 触发钩子
                 $dbError = new CDBError();
                 $dbError->setSQLErrorCode($errorData[0]);
                 $dbError->setDriverErrorCode($errorData[1]);
                 $dbError->setErrorMessage($errorData[2]);
                 $dbError->setSql($this->_sql);
                 CHooks::callHooks(HOOKS_EXECUTE_ERROR, $dbError);
                 throw new CDbException('[' . $errorData[1] . '] ' . $errorData[2] . ' with SQL [' . $this->_sql . ']');
             } else {
                 $execObject = new CExec();
                 $execObject->setSql($sql);
                 $execObject->setRow($updateStatus);
                 $execObject->setWhereValue($this->whereValue);
                 $execObject->setStatus(true);
                 //执行查询后钩子函数
                 CHooks::callHooks(HOOKS_EXECUTE_END, $execObject);
                 $this->_clearSelf();
                 return $execObject;
             }
             $this->_clearSelf();
             break;
         case 'DELETE':
             // 强制主库操作删除
             $this->isMaster = true;
             $databaseObject = CDatabase::getDatabase($this->configName, $this->isMaster);
             $sql = $this->_sql = $this->_createDeleteSQL();
             //执行查询前钩子函数
             CHooks::callHooks(HOOKS_EXECUTE_BEFORE, $this);
             //echo '<pre>';print_r($this->whereValue);exit;
             $rs = $databaseObject->prepare($this->_sql);
             $deleteStatus = $rs->execute($this->whereValue);
             if (false === $deleteStatus) {
                 $errorData = $databaseObject->errorInfo();
                 //发生SQL错误时 触发钩子
                 $dbError = new CDBError();
                 $dbError->setSQLErrorCode($errorData[0]);
                 $dbError->setDriverErrorCode($errorData[1]);
                 $dbError->setErrorMessage($errorData[2]);
                 $dbError->setSql($this->_sql);
                 CHooks::callHooks(HOOKS_EXECUTE_ERROR, $dbError);
                 throw new CDbException('[' . $errorData[1] . '] ' . $errorData[2] . ' with SQL [' . $this->_sql . ']');
             } else {
                 $execObject = new CExec();
                 $execObject->setSql($sql);
                 $execObject->setWhereValue($this->whereValue);
                 $execObject->setRow($deleteStatus);
                 $execObject->setStatus(true);
                 //执行查询后钩子函数
                 CHooks::callHooks(HOOKS_EXECUTE_END, $execObject);
                 $this->_clearSelf();
                 return $execObject;
             }
             $this->_clearSelf();
             break;
         default:
             if (!empty($this->prepare)) {
             }
             throw new CDbException('[查询错误]未指定操作方法');
             break;
     }
     $this->_clearSelf();
 }