/**
  * find elements
  *
  * @param Charcoal_String|string $selector
  * @param Charcoal_Integer|integer $index
  */
 public function find($selector, $index = NULL)
 {
     Charcoal_ParamTrait::validateString(1, $selector);
     Charcoal_ParamTrait::validateInteger(2, $index, TRUE);
     if (!$this->simple_html_dom) {
         _throw(new SimpleHtmlDomComponentException("SimpleHtmlDom object is not created"));
     }
     $selector = us($selector);
     log_debug("debug", "index:{$index}");
     if ($index !== NULL) {
         // returns single element
         $index = ui($index);
         log_debug("debug", "returns single element");
         $result = $this->simple_html_dom->find($selector, $index);
         log_debug("debug", "result: " . print_r($result, true));
         return $result ? new Charcoal_SimpleHtmlDomElement($result) : NULL;
     }
     // returns all elements
     log_debug("debug", "selector:" . print_r($selector, true));
     $result = $this->simple_html_dom->find($selector);
     log_debug("debug", "result: " . print_r($result, true));
     $elements = array();
     foreach ($result as $e) {
         $elements[] = new Charcoal_SimpleHtmlDomElement($e);
     }
     return $result ? $elements : array();
 }
 /**
  * find elements
  *
  * @param Charcoal_String|string $selector
  * @param Charcoal_Integer|integer $index
  */
 public function find($selector, $index = NULL)
 {
     Charcoal_ParamTrait::validateString(1, $selector);
     Charcoal_ParamTrait::validateInteger(2, $index, TRUE);
     $selector = us($selector);
     if ($index !== NULL) {
         // returns single element
         $index = ui($index);
         $result = $this->element->find($selector, $index);
         return $result ? new Charcoal_SimpleHtmlDomElement($result) : NULL;
     }
     // returns all elements
     $result = $this->element->find($selector);
     $elements = array();
     foreach ($result as $e) {
         $elements[] = new Charcoal_SimpleHtmlDomElement($e);
     }
     return $result ? $elements : array();
 }
 public function createFile($file_path, $contents, $overwrite = TRUE, $mode = 0777)
 {
     Charcoal_ParamTrait::validateString(1, $file_path);
     Charcoal_ParamTrait::validateString(2, $contents);
     Charcoal_ParamTrait::validateBoolean(3, $overwrite);
     Charcoal_ParamTrait::validateInteger(4, $mode);
     $obj = new Charcoal_File($file_path, $this->_base_dir_obj);
     if ($overwrite) {
         if ($obj->exists() && !$obj->canWrite()) {
             _throw(new Charcoal_FileSystemComponentException('specified file is not writeable.'));
         }
     } elseif ($obj->exists()) {
         _throw(new Charcoal_FileSystemComponentException('specified file is already exists.'));
     }
     try {
         // create file with parent directory
         $obj->makeFile($mode, $contents, TRUE);
         return $obj;
     } catch (Exception $e) {
         _catch($e);
         _throw(new Charcoal_FileSystemComponentException(s('creating file failed.'), $e));
     }
 }
 /**
  * set option
  *
  * @param Charcoal_Integer|integer $option    XML_OPTION_CASE_FOLDING or XML_OPTION_TARGET_ENCODING
  * @param mixed $value                        XML_OPTION_CASE_FOLDING or XML_OPTION_TARGET_ENCODING
  */
 public function setRawOption($option, $value)
 {
     Charcoal_ParamTrait::validateInteger(1, $option);
     if (!$this->parser) {
         _throw(new PhpXmlParserComponentException('parser object is not created'));
     }
     return xml_parser_set_option($this->parser, ui($option), $value);
 }
 /**
  *    real implementation of Charcoal_SmartGateway::updateField()
  *
  * @param Charcoal_String|string $comment                comment text
  * @param Charcoal_QueryTarget $query_target    description about target model, alias, or joins
  * @param Charcoal_Integer|int $data_id         identify database entity
  * @param Charcoal_String|string $field         field name to update
  * @param Charcoal_Scalar $value                scalar primitive data to update
  */
 public function updateField($comment, $query_target, $data_id, $field, $value)
 {
     Charcoal_ParamTrait::validateString(1, $comment, TRUE);
     Charcoal_ParamTrait::validateIsA(2, 'Charcoal_QueryTarget', $query_target);
     Charcoal_ParamTrait::validateInteger(3, $data_id);
     Charcoal_ParamTrait::validateString(4, $field);
     Charcoal_ParamTrait::validateScalar(5, $value);
     $model = $this->getModel($query_target->getModelName());
     $alias = $query_target->getAlias();
     $dto = $model->createDTO();
     $dto->{$field} = $value instanceof Charcoal_Scalar ? $value->unbox() : $value;
     //        log_debug( "debug,smart_gateway,sql", "dto:" . print_r($dto,true) );
     //        log_debug( "debug,smart_gateway,sql", "sql:$sql", self::TAG );
     //        log_debug( "debug,smart_gateway,sql", "params:" . print_r($params,true), self::TAG );
     $pk = $model->getPrimaryKey();
     $where = "{$pk} = ?";
     $params = array(ui($data_id));
     $criteria = new Charcoal_SQLCriteria($where, $params);
     list($sql, $params) = $this->sql_builder->buildUpdateSQL($model, $alias, $dto, $criteria);
     $sql = !empty($comment) ? $this->sql_builder->prependComment($sql, $comment) : $sql;
     //        log_debug( "debug,smart_gateway,sql", "sql:$sql", self::TAG );
     //        log_debug( "debug,smart_gateway,sql", "params:" . print_r($params,true), self::TAG );
     $this->data_source->prepareExecute($sql, $params);
 }
 /**
  *    Generate RDBMS-specific SQL for MIN/MAX/SUM/COUNT/AVG
  *
  *    @param Charcoal_ITableModel $model        table model object related with th query
  *    @param string $alias                      table model alias which is specified by $model
  *    @param int $aggregate_func                specify aggregate function which is defined in Charcoal_EnumSQLAggregateFunc
  *    @param Charcoal_SQLCriteria $criteria     criteria which should be used in WHERE clause
  *    @param array $joins                       list of join(list of Charcoal_QueryJoin object)
  *    @param array $fields                      list of fields which will be returned in query result
  *
  *    @return string                            SQL
  */
 public function buildAggregateSQL($model, $alias, $aggregate_func, $criteria, $joins, $fields = NULL)
 {
     Charcoal_ParamTrait::validateIsA(1, 'Charcoal_ITableModel', $model);
     Charcoal_ParamTrait::validateString(2, $alias, TRUE);
     Charcoal_ParamTrait::validateInteger(3, $aggregate_func);
     Charcoal_ParamTrait::validateIsA(4, 'Charcoal_SQLCriteria', $criteria);
     Charcoal_ParamTrait::validateVector(5, $joins);
     Charcoal_ParamTrait::validateVector(6, $fields, TRUE);
     $table_name = $model->getTableName();
     /** @var int $aggregate_func */
     $aggregate_func = ui($aggregate_func);
     $aggregate_func_map = array(Charcoal_EnumSQLAggregateFunc::FUNC_MIN => 'MIN', Charcoal_EnumSQLAggregateFunc::FUNC_MAX => 'MAX', Charcoal_EnumSQLAggregateFunc::FUNC_SUM => 'SUM', Charcoal_EnumSQLAggregateFunc::FUNC_COUNT => 'COUNT', Charcoal_EnumSQLAggregateFunc::FUNC_AVG => 'AVG');
     $func = $aggregate_func_map[$aggregate_func];
     $fields = v($fields)->join(",");
     $sql = "SELECT {$func}({$fields}) FROM " . us($table_name);
     if ($alias && !empty($alias)) {
         $sql .= ' AS ' . $alias;
     }
     foreach ($joins as $join) {
         /** @var Charcoal_QueryJoin $join */
         $join_type = $join->getJoinType();
         $join_model_name = $join->getModelName();
         $join_alias = $join->getAlias();
         $join_cond = $join->getCondition();
         $join_model = $this->getSandbox()->createObject($join_model_name, 'table_model');
         /** @var Charcoal_ITableModel $join_model */
         /** @var Charcoal_String $join_alias */
         /** @var Charcoal_String $join_cond */
         switch ($join_type) {
             case Charcoal_EnumSQLJoinType::INNER_JOIN:
                 $sql .= ' INNER JOIN ' . $join_model->getTableName();
                 break;
             case Charcoal_EnumSQLJoinType::LEFT_JOIN:
                 $sql .= ' LEFT JOIN ' . $join_model->getTableName();
                 break;
             case Charcoal_EnumSQLJoinType::RIGHT_JOIN:
                 $sql .= ' RIGHT JOIN ' . $join_model->getTableName();
                 break;
         }
         if ($join_alias && !$join_alias->isEmpty()) {
             $sql .= ' AS ' . $join_alias;
         }
         if ($join_cond && !$join_cond->isEmpty()) {
             $sql .= ' ON ' . $join_cond;
         }
     }
     $where_clause = $criteria->getWhere();
     $limit = $criteria->getLimit();
     $offset = $criteria->getOffset();
     $group_by = $criteria->getGroupBy();
     if (!empty($where_clause)) {
         $sql .= ' WHERE ' . $where_clause;
     }
     if (!empty($limit)) {
         $sql .= ' LIMIT ' . $limit;
     }
     if (!empty($offset)) {
         $sql .= ' OFFSET ' . $offset;
     }
     if (!empty($group_by)) {
         $sql .= ' GROUP BY ' . $group_by;
     }
     return $sql;
 }
 /**
  *    Load bitmap
  */
 public function create($src_file, $dest_file, $thumb_max_width, $thumb_max_height, $image_format = IMG_JPG)
 {
     Charcoal_ParamTrait::validateString(1, $src_file);
     Charcoal_ParamTrait::validateString(2, $dest_file);
     Charcoal_ParamTrait::validateInteger(3, $thumb_max_width);
     Charcoal_ParamTrait::validateInteger(4, $thumb_max_height);
     Charcoal_ParamTrait::validateInteger(5, $image_format);
     $src_file = us($src_file);
     $dest_file = us($dest_file);
     $thumb_max_width = ui($thumb_max_width);
     $thumb_max_height = ui($thumb_max_height);
     $info = @getimagesize($src_file);
     if ($info === false) {
         _throw(new ThumbnailComponentException(s("failed to get image info:[{$src_file}]")));
     }
     // MimeTypeを調べる
     $mime = $info['mime'];
     switch ($mime) {
         case 'image/gif':
             $mime = $ext = 'gif';
             break;
         case 'image/png':
             $mime = $ext = 'png';
             break;
         case 'image/jpeg':
             $mime = 'jpeg';
             $ext = 'jpg';
             break;
         default:
             _throw(new ThumbnailComponentException(s("invalid image type:[{$mime}]")));
     }
     // 元の画像の幅と高さ
     $width = $info[0];
     $height = $info[1];
     // 元の画像のアスペクト比
     $aspect = $width / $height;
     // 幅・高さに0が指定された場合は元画像のサイズを使用
     if ($thumb_max_width == 0) {
         $thumb_max_width = $width;
     }
     if ($thumb_max_height == 0) {
         $thumb_max_height = $height;
     }
     // 変換先サイズのアスペクト比
     $max_aspect = $thumb_max_width / $thumb_max_height;
     // 画像リソースを生成
     $img = @call_user_func("imagecreatefrom{$mime}", $src_file);
     if ($img === FALSE || !is_resource($img)) {
         _throw(new ThumbnailComponentException(s("failed to imagecreate{$mime}({$src_file})")));
     }
     // 最大幅・高さを超過していないかチェック・縦横比を維持して新しいサイズを定義
     if ($aspect > $max_aspect) {
         $thumb_width = $thumb_max_width;
         $thumb_height = intval($thumb_width / $aspect);
     } else {
         $thumb_height = $thumb_max_height;
         $thumb_width = intval($thumb_height * $aspect);
     }
     // サムネイルを作成
     $thumb = imagecreatetruecolor($thumb_width, $thumb_height);
     imagecopyresampled($thumb, $img, 0, 0, 0, 0, $thumb_width, $thumb_height, $width, $height);
     switch ($image_format) {
         case IMG_GIF:
             $res = imagegif($thumb, $dest_file);
             break;
         case IMG_PNG:
             $res = imagepng($thumb, $dest_file);
             break;
         case IMG_JPG:
             $res = imagejpeg($thumb, $dest_file);
             break;
         default:
             _throw(new ThumbnailComponentException("invalid image image format:[{$image_format}]"));
     }
     return array($thumb_width, $thumb_height);
 }
 /**
  *  Set OFFSET clause
  *
  *  @param int $offset        OFFSET clause
  */
 public function setOffset($offset)
 {
     Charcoal_ParamTrait::validateInteger(1, $offset);
     $this->offset = ui($offset);
 }
 /**
  * Touch internal
  *
  */
 public function _touch($filter, $duration)
 {
     Charcoal_ParamTrait::validateImplements(1, 'Charcoal_IFileFilter', $filter);
     Charcoal_ParamTrait::validateInteger(2, $duration, TRUE);
     $expire_date = date('Y-m-d H:i:s', strtotime("+{$duration} seconds"));
     // meta suffix
     $suffix = '.' . CACHE_FILE_EXT_META;
     // select files and delete them all
     $files = $this->_cache_root_dir->listFiles($meta_filter);
     if ($files && is_array($files)) {
         foreach ($files as $file) {
             $key = basename($file, $suffix);
             // read cache meta file
             $meta = $this->_readMeta($meta_file);
             if ($meta === FALSE) {
                 $meta = $this->_buildMeta($key);
                 if ($meta === FALSE) {
                     continue;
                 }
             }
             // save meta file
             $meta['expire_date'] = $expire_date;
             $this->_writeMeta($meta_file, p($meta));
         }
     }
 }