/**
  * This is based on CActiveRecord::query().
  * @param CActiveRecord $model
  * @param CDbCriteria $criteria
  * @return array containing CDbDataReader and CActiveFinder objects
  */
 private function createDataReader($model, $criteria)
 {
     $model->beforeFindInternal();
     $model->applyScopes($criteria);
     if (empty($criteria->with)) {
         $finder = null;
         $command = $model->getCommandBuilder()->createFindCommand($model->tableSchema, $criteria, $model->getTableAlias());
     } else {
         $finder = new EActiveFinder($model, $criteria->with);
         $command = $finder->createCommand($criteria);
     }
     $command->prepare();
     $command->execute($command->params);
     return array(new CDbDataReader($command), $finder);
 }
 /**
  * Function returns CActiveRecord model.
  * If param $id is not passed than return new model.
  * If model not found by id then send response with 404 error code and terminate app if $this->sendToEndUser is true.
  * 
  * @param CActiveRecord $model Model class instance
  * @param int $id id attribute for which you want to find a record.
  * @param boolean $newIfNull create new model in $id is null.
  * If $id is not set then return empty model
  * @return CActiveRecord model
  */
 public function getModel(CActiveRecord $model, $id = null, $newIfNull = true)
 {
     if (is_null($id) && $newIfNull) {
         return new $model();
     }
     $this->criteria = new CDbCriteria();
     $this->criteria->addCondition($model->getTableAlias($this->tableAliasQuotes) . "." . $this->idParamName . "=:id");
     $this->criteria->params[':id'] = $id;
     $this->criteria->mergeWith($this->baseCriteria);
     $model = $model->find($this->criteria);
     if (is_null($model)) {
         $this->statusCode = 404;
         if ($this->sendToEndUser) {
             $this->sendData($this->notFoundErrorResponse, 404);
         }
     }
     return $model;
 }