/**
  * 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();
 }
 public static function splitParams($args)
 {
     Charcoal_ParamTrait::validateString(1, $args);
     $args = us($args);
     $pos = 0;
     $dq = FALSE;
     $sq = FALSE;
     $max_pos = strlen($args);
     $args_array = array();
     $arg_tmp = '';
     $escape = FALSE;
     while ($pos < $max_pos) {
         $ch = substr($args, $pos, 1);
         $escape_now = FALSE;
         if ($escape) {
             $arg_tmp .= $ch;
         } elseif ($dq) {
             if ($ch == '\\') {
                 $escape = TRUE;
                 $escape_now = TRUE;
             } elseif ($ch == '"') {
                 $dq = FALSE;
             } else {
                 $arg_tmp .= $ch;
             }
         } elseif ($sq) {
             if ($ch == '\\') {
                 $escape = TRUE;
                 $escape_now = TRUE;
             } elseif ($ch == "'") {
                 $sq = FALSE;
             } else {
                 $arg_tmp .= $ch;
             }
         } else {
             if ($ch == ' ') {
                 $args_array[] = $arg_tmp;
                 $arg_tmp = '';
             } elseif ($ch == '\\') {
                 $escape = TRUE;
                 $escape_now = TRUE;
             } elseif ($ch == '"') {
                 $dq = TRUE;
             } elseif ($ch == "'") {
                 $sq = TRUE;
             } else {
                 $arg_tmp .= $ch;
             }
         }
         if (!$escape_now && $escape) {
             $escape = FALSE;
         }
         $pos++;
     }
     if (strlen($arg_tmp) > 0) {
         $args_array[] = $arg_tmp;
     }
     return $args_array;
 }
 /**
  *    render buffer
  *
  * @param Charcoal_String|string $buffer    rendering data
  */
 public function render($buffer)
 {
     Charcoal_ParamTrait::validateString(1, $buffer);
     $buffer = us($buffer);
     if (is_string($buffer)) {
         echo $buffer;
     }
 }
 public function __construct($component_name, $entry, $message = NULL, $prev = NULL)
 {
     Charcoal_ParamTrait::validateString(1, $component_name);
     Charcoal_ParamTrait::validateString(2, $entry);
     Charcoal_ParamTrait::validateString(3, $message);
     Charcoal_ParamTrait::validateException(4, $prev, TRUE);
     parent::__construct("component({$component_name}) config maybe wrong: [entry]{$entry} [message]{$message}", $prev);
 }
 /**
  *    Construct
  */
 public function __construct($message, $prev = NULL)
 {
     Charcoal_ParamTrait::validateString(1, $message);
     Charcoal_ParamTrait::validateException(2, $prev, TRUE);
     parent::__construct(us($message), 0, $prev);
     $this->backtrace = debug_backtrace();
     $this->previous = $prev;
 }
 public function __construct($name, $value, $params)
 {
     Charcoal_ParamTrait::validateString(1, $name);
     Charcoal_ParamTrait::validateString(2, $value);
     Charcoal_ParamTrait::validateVector(3, $params);
     $this->name = us($name);
     $this->value = us($value);
     $this->params = uv($params);
 }
 public function __construct($argument, $option_name, $prev = NULL)
 {
     Charcoal_ParamTrait::validateString(1, $argument);
     Charcoal_ParamTrait::validateString(2, $option_name);
     Charcoal_ParamTrait::validateException(3, $prev, TRUE);
     $this->argument = $argument;
     $this->option_name = $option_name;
     parent::__construct("Invalid argument for -{$option_name}: {$argument}", $prev);
 }
 /**
  *  indicates FROM clause and switches to from context
  *
  * @param Charcoal_String $model_name    model name for table
  * @param Charcoal_String $alias         alias name for table
  *
  * @return Charcoal_FromContext    from context
  */
 public function from($model_name, $alias = NULL)
 {
     Charcoal_ParamTrait::validateString(1, $model_name);
     Charcoal_ParamTrait::validateString(2, $alias, TRUE);
     $query_target = new Charcoal_QueryTarget($model_name);
     if ($alias) {
         $query_target->setAlias($alias);
     }
     $this->getContext()->setQueryTarget($query_target);
     return new Charcoal_FromContext($this->getContext());
 }
 public function __construct($path, $parent = NULL)
 {
     Charcoal_ParamTrait::validateString(1, $path);
     Charcoal_ParamTrait::validateIsA(2, 'Charcoal_File', $parent, TRUE);
     parent::__construct($path, $parent);
     if (!is_readable(parent::getPath())) {
         _throw(new Charcoal_FileNotFoundException($this));
     }
     $this->_data = getimagesize(parent::getPath());
     if ($this->_data === FALSE) {
         _throw(new Charcoal_ImageGetSizeException($this));
     }
 }
 /**
  * Constructor
  */
 public function __construct($page_info, $where = NULL, $params = NULL, $order_by = NULL, $group_by = NULL)
 {
     Charcoal_ParamTrait::validateIsA(1, 'Charcoal_DBPageInfo', $page_info);
     Charcoal_ParamTrait::validateString(2, $where, TRUE);
     Charcoal_ParamTrait::validateVector(2, $params, TRUE);
     Charcoal_ParamTrait::validateString(3, $order_by, TRUE);
     Charcoal_ParamTrait::validateString(4, $group_by, TRUE);
     $this->page_info = $page_info;
     $page = $page_info->getPage();
     $page_size = $page_info->getPageSize();
     $page = ui($page);
     $page_size = ui($page_size);
     $limit = $page_size;
     $offset = ($page - 1) * $page_size;
     parent::__construct($where, $params, $order_by, $limit, $offset, $group_by);
 }
 /**
  * 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();
 }
 /**
  *    render buffer
  *
  * @param Charcoal_String|string $buffer    rendering data
  */
 public function render($buffer)
 {
     Charcoal_ParamTrait::validateString(1, $buffer);
     $buffer = us($buffer);
     if (is_string($buffer)) {
         $dir = new Charcoal_File(dirname($this->file_path));
         if (!$dir->exists()) {
             $dir->makeDirectory($this->dir_mode);
         }
         if (!$dir->isWriteable()) {
             _throw(new Charcoal_RenderTargetException("directory not writable: {$dir}"));
         }
         $result = @file_put_contents($this->file_path, $buffer, LOCK_EX);
         if ($result === FALSE) {
             $last_error = print_r(error_get_last(), true);
             _throw(new Charcoal_RenderTargetException("file_put_contents failed: {$this->file_path} last error: {$last_error}"));
         }
     }
 }
 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));
     }
 }
 /**
  * generate feed and output to the buffer
  *
  * @param Charcoal_String|string $format         format name of the feed
  */
 public function outputFeed($format = self::DEFAULT_FORMAT)
 {
     Charcoal_ParamTrait::validateString(1, $format);
     echo 'outputFeed' . PHP_EOL;
     $this->creator->outputFeed(us($format));
 }
 /**
  *    Prepare for statement and execute query
  *
  * @param string|Charcoal_String $sql              SQL statement(placeholders can be included)
  * @param array|Charcoal_HashMap $params           Parameter values for prepared statement
  * @param array|Charcoal_HashMap $driver_options   Driver options
  *
  * @return PDOStatement
  */
 private function _prepareExecute($sql, $params, $driver_options)
 {
     Charcoal_ParamTrait::validateString(1, $sql);
     Charcoal_ParamTrait::validateHashMap(2, $params, TRUE);
     Charcoal_ParamTrait::validateHashMap(3, $driver_options, TRUE);
     $params = um($params);
     $driver_options = um($driver_options);
     $params = $params ? $params : array();
     $driver_options = $driver_options ? $driver_options : array();
     $timer_handle = Charcoal_Benchmark::start();
     $command_id = $this->command_id++;
     $params_disp = $params ? implode(',', $params) : '';
     log_debug('data_source,sql,debug', "[ID]{$command_id} [SQL]{$sql}", self::TAG);
     log_debug('data_source,sql,debug', "[ID]{$command_id} [params]{$params_disp}", self::TAG);
     /** @var PDOStatement $stmt */
     $stmt = $this->getConnection()->prepare($sql, $driver_options);
     $this->sql_histories->push(new Charcoal_SQLHistory($sql, $params));
     $success = $stmt->execute($params);
     if (!$success) {
         list($sqlstate, $err_code, $err_msg) = $stmt->errorInfo();
         $msg = "PDO#execute failed. [ID]{$command_id} [SQL]{$sql} [params]{$params_disp} [SQLSTATE]{$sqlstate} [ERR_CODE]{$err_code} [ERR_MSG]{$err_msg}";
         log_error('data_source,sql,debug', "...FAILED: {$msg}", self::TAG);
         _throw(new Charcoal_DBDataSourceException($msg));
     }
     $this->num_rows = $rows = $stmt->rowCount();
     log_info('data_source,sql,debug', "[ID]{$command_id} ...success(numRows={$rows})", self::TAG);
     // ログ
     $elapse = Charcoal_Benchmark::stop($timer_handle);
     log_debug('data_source,sql,debug', "[ID]{$command_id} _prepareExecute() end. time=[{$elapse}]msec.", self::TAG);
     // SQL benchmark
     ini_set('serialize_precision', 16);
     log_debug('sql_bench', var_export(array($sql, $rows, $elapse), true), self::TAG);
     return $stmt;
 }
 public function __construct($url)
 {
     Charcoal_ParamTrait::validateString(1, $url);
     parent::__construct(p(array()));
     $this->url = $url;
 }
 public function getDefaultValue($field)
 {
     Charcoal_ParamTrait::validateString(1, $field);
     $field = s($field);
     $annot = $this->getAnnotationValue($field, s('default'));
     if (!$annot) {
         return NULL;
     }
     $value = $annot->getValue();
     if (!$value) {
         return NULL;
     }
     $value = us($value);
     return $value == 'NULL' ? NULL : $value;
 }
 /**
  *    [Fluent Interface] create fluent interface
  *
  * @param string $fields    field list(comma separated string) for SELECT clause
  *
  * @return Charcoal_SelectContext    select context
  */
 public function select($fields)
 {
     Charcoal_ParamTrait::validateString(1, $fields);
     $context = new Charcoal_QueryContext($this);
     if (!empty($fields)) {
         $context->setFields($fields);
     }
     return new Charcoal_SelectContext($context);
 }
 /**
  * parse XML
  *
  * @param Charcoal_String|string $data         Chunk of data to parse
  * @param Charcoal_Boolean|bool $is_final      If set and TRUE, data is the last piece of data sent in this parse.
  *
  * @return bool                  Returns 1 on success or 0 on failure.
  */
 public function parse($data, $is_final = false)
 {
     Charcoal_ParamTrait::validateString(1, $data);
     Charcoal_ParamTrait::validateBoolean(2, $is_final);
     if (!$this->parser) {
         _throw(new PhpXmlParserComponentException('parser object is not created'));
     }
     return xml_parse($this->parser, us($data), ub($is_final));
 }
 /**
  * Set temporary file mode
  *
  * @param string|Charcoal_String $mode file mode
  */
 public function setMode($mode)
 {
     Charcoal_ParamTrait::validateString(1, $mode);
     $this->mode = us($mode);
 }
 /**
  *    real implementation of Charcoal_SmartGateway::updateAll()
  *
  * @param Charcoal_QueryTarget $query_target    description about target model, alias, or joins
  * @param Charcoal_SQLCriteria $criteria        criteria object
  * @param Charcoal_HashMap|array $data      associative array or HashMap object to update
  * @param Charcoal_String|string $comment                comment text
  *
  * @return integer count of affected rows
  */
 public function updateAll($comment, $query_target, $criteria, $data)
 {
     Charcoal_ParamTrait::validateString(1, $comment, TRUE);
     Charcoal_ParamTrait::validateIsA(2, 'Charcoal_QueryTarget', $query_target);
     Charcoal_ParamTrait::validateIsA(3, 'Charcoal_SQLCriteria', $criteria);
     Charcoal_ParamTrait::validateHashMap(4, $data);
     $model = $this->getModel($query_target->getModelName());
     $alias = $query_target->getAlias();
     $dto = $model->createDTO(um($data));
     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 );
     // SQL実行
     $this->data_source->prepareExecute($sql, $params);
     return $this->data_source->numRows();
 }
 /**
  *    Generate RDBMS-specific SQL for TABLE EXISTS
  *
  *    @param string $database                   table schema
  *    @param Charcoal_ITableModel $model        table model object related with th query
  *
  *    @return string                            SQL
  */
 public function buildExistsTableSQL($database, $model)
 {
     Charcoal_ParamTrait::validateString(1, $database);
     Charcoal_ParamTrait::validateIsA(2, 'Charcoal_ITableModel', $model);
     try {
         $table_name = $model->getTableName();
         $sql = "SELECT count(*) FROM information_schema.columns WHERE TABLE_NAME = '{$table_name}'";
         $sql .= " AND TABLE_SCHEMA = '{$database}'";
         log_debug("debug,sql,smart_gateway", "buildExistsTableSQL result: {$sql}", self::TAG);
         return $sql;
     } catch (Exception $e) {
         _throw(new Charcoal_SQLBuilderException("MySQL_SQLBuilder#buildCreateTableSQL failed"));
     }
     return '';
 }
 public function validate($sequence, $form_token, $throws = TRUE)
 {
     Charcoal_ParamTrait::validateIsA(1, 'Charcoal_ISequence', $sequence);
     Charcoal_ParamTrait::validateString(2, $form_token);
     Charcoal_ParamTrait::validateBoolean(3, $throws);
     $throws = ub($throws);
     log_debug("debug", "sequence: " . print_r($sequence, true));
     log_debug("debug", "form_token: " . print_r($form_token, true));
     if ($this->getSandbox()->isDebug() && $this->debug_mode) {
         ad($sequence, array('title' => "sequence"));
     }
     $token_key = $this->token_key;
     log_debug("debug", "token_key: " . print_r($token_key, true));
     if ($this->getSandbox()->isDebug() && $this->debug_mode) {
         ad($token_key, array('title' => "token_key", "type" => "div"));
     }
     // get token container from session.
     $token_list = $sequence->get(s($token_key));
     if ($this->getSandbox()->isDebug() && $this->debug_mode) {
         ad($token_list, array('title' => "token list"));
     }
     log_debug("debug", "token_list: " . print_r($token_list, true));
     if ($token_list === NULL || !is_array($token_list)) {
         $token_list = array();
     }
     // find token from token list.
     $token_index = NULL;
     foreach ($token_list as $idx => $token) {
         log_info("debug", "token: {$token}");
         if ($this->getSandbox()->isDebug() && $this->debug_mode) {
             ad($token, array('title' => "token", "type" => "div"));
         }
         if ($token == $form_token) {
             $token_index = $idx;
             break;
         }
     }
     if ($token_index === NULL) {
         // illegal access
         log_warning("system, debug", "token not found: {$form_token}");
         if ($this->getSandbox()->isDebug() && $this->debug_mode) {
             ad($form_token, array('title' => "token not found", "type" => "div"));
         }
         if ($throws) {
             _throw(new Charcoal_FormTokenValidationException('token not found in sequence:' . $form_token), FALSE);
         }
         return FALSE;
     } else {
         // authorized access
         log_debug("debug", "token accepted: {$form_token}");
         if ($this->getSandbox()->isDebug() && $this->debug_mode) {
             ad($form_token, array('title' => "token accepted", "type" => "div"));
         }
         // erase token from token list to prevent duplicate form submission.
         unset($token_list[$token_index]);
     }
     // update token list in sequence.
     $sequence->set($token_key, $token_list);
     // the event was successfully processed.
     return TRUE;
 }
 public function execute($sql)
 {
     Charcoal_ParamTrait::validateString(1, $sql);
     // 接続処理
     $this->connect();
     // SQLを実行
     $sqliteerror = '';
     $result = $this->sqlite_exec($sql, SQLITE_BOTH, $sqliteerror);
     if ($result === FALSE) {
         _throw(new Charcoal_DBDataSourceException(__METHOD__ . " Failed. SQLite error: {$sqliteerror}"));
     }
 }
 /**
  *  Set fields
  */
 public function setFields($fields)
 {
     Charcoal_ParamTrait::validateString(1, $fields);
     $this->_fields = $fields;
 }
 /**
  * repair HTML from file
  *
  * @param Charcoal_String|string $input       HTML text to parse
  *
  * @return string       Returns the repaired string.
  */
 public function repairFile($file, $use_include_path = FALSE)
 {
     Charcoal_ParamTrait::validateString(1, $file);
     return $this->tidy->repairFile(us($file), $this->config, $this->encoding, $use_include_path);
 }
 public function __construct($expression)
 {
     Charcoal_ParamTrait::validateString(1, $expression);
     $expression = us($expression);
     parent::__construct();
     $tokens = $this->tokenize($expression);
     if (count($tokens) < 1) {
         _throw(new Charcoal_QueryTargetException("no query target element is not specified."));
     }
     $state = NULL;
     $element_list = NULL;
     foreach ($tokens as $token) {
         if (strlen($token) === 0) {
             continue;
         }
         if ($state === NULL) {
             $element_list[] = new Charcoal_QueryTargetElement(i(Charcoal_EnumQueryTargetType::TARGET_MODEL), s($token));
             $state = "model set";
         } elseif (in_array($state, array("model set", "join set")) && $token == 'as') {
             $state = "as";
         } elseif ($state == "as") {
             $element_list[] = new Charcoal_QueryTargetElement(i(Charcoal_EnumQueryTargetType::TARGET_AS_NAME), s($token));
             $state = "as set";
         } elseif ($state == "model set" || $state == "as set" || $state == "join set" || $state == "on set") {
             if ($token == 'on') {
                 $state = "on";
             } elseif ($token == '+') {
                 $element_list[] = new Charcoal_QueryTargetElement(i(Charcoal_EnumQueryTargetType::TARGET_INNER_JOIN));
                 $state = "join";
             } elseif ($token == '(+') {
                 $element_list[] = new Charcoal_QueryTargetElement(i(Charcoal_EnumQueryTargetType::TARGET_LEFT_JOIN));
                 $state = "join";
             } elseif ($token == '+)') {
                 $element_list[] = new Charcoal_QueryTargetElement(i(Charcoal_EnumQueryTargetType::TARGET_RIGHT_JOIN));
                 $state = "join";
             } elseif ($state == "on set") {
                 $element_list[] = new Charcoal_QueryTargetElement(i(Charcoal_EnumQueryTargetType::TARGET_ON_CONDITION), s($token));
             }
         } elseif ($state == "join") {
             $element_list[] = new Charcoal_QueryTargetElement(i(Charcoal_EnumQueryTargetType::TARGET_MODEL), s($token));
             $state = "join set";
         } elseif ($state == "on") {
             $element_list[] = new Charcoal_QueryTargetElement(i(Charcoal_EnumQueryTargetType::TARGET_ON_CONDITION), s($token));
             $state = "on set";
         }
     }
     //        log_debug( "debug, smart_gateway", "element_list: " . print_r($element_list,true) );
     $main_model = NULL;
     $alias = NULL;
     $state = "main model";
     $join_stack = new Charcoal_Stack();
     foreach ($element_list as $element) {
         if ($state === "main model") {
             switch ($element->getType()) {
                 case Charcoal_EnumQueryTargetType::TARGET_MODEL:
                     $main_model = $element->getString();
                     break;
                 case Charcoal_EnumQueryTargetType::TARGET_AS_NAME:
                     $alias = $element->getString();
                     break;
                 case Charcoal_EnumQueryTargetType::TARGET_INNER_JOIN:
                     $join_stack->push(new Charcoal_QueryJoin(i(Charcoal_EnumSQLJoinType::INNER_JOIN)));
                     $state = "joins";
                     break;
                 case Charcoal_EnumQueryTargetType::TARGET_LEFT_JOIN:
                     $join_stack->push(new Charcoal_QueryJoin(i(Charcoal_EnumSQLJoinType::LEFT_JOIN)));
                     $state = "joins";
                     break;
                 case Charcoal_EnumQueryTargetType::TARGET_RIGHT_JOIN:
                     $join_stack->push(new Charcoal_QueryJoin(i(Charcoal_EnumSQLJoinType::RIGHT_JOIN)));
                     $state = "joins";
                     break;
             }
         } elseif ($state === "joins") {
             $join = $join_stack->pop();
             switch ($element->getType()) {
                 case Charcoal_EnumQueryTargetType::TARGET_MODEL:
                     $join->setModelName(s($element->getString()));
                     break;
                 case Charcoal_EnumQueryTargetType::TARGET_AS_NAME:
                     $join->setAlias(s($element->getString()));
                     break;
                 case Charcoal_EnumQueryTargetType::TARGET_ON_CONDITION:
                     $join_cond = $join->getCondition();
                     $join->setCondition(s($join_cond . $element->getString()));
                     break;
                 case Charcoal_EnumQueryTargetType::TARGET_INNER_JOIN:
                     $join_stack->push($join);
                     $join = new Charcoal_QueryJoin(i(Charcoal_EnumSQLJoinType::INNER_JOIN));
                     break;
                 case Charcoal_EnumQueryTargetType::TARGET_LEFT_JOIN:
                     $join_stack->push($join);
                     $join = new Charcoal_QueryJoin(i(Charcoal_EnumSQLJoinType::LEFT_JOIN));
                     break;
                 case Charcoal_EnumQueryTargetType::TARGET_RIGHT_JOIN:
                     $join_stack->push($join);
                     $join = new Charcoal_QueryJoin(i(Charcoal_EnumSQLJoinType::RIGHT_JOIN));
                     break;
             }
             $join_stack->push($join);
         }
     }
     $joins = $join_stack->toArray();
     //        log_debug( "debug, smart_gateway", "joins: " . print_r($joins,true) );
     $this->model_name = $main_model;
     $this->alias = $alias;
     $this->joins = $joins;
     //        log_debug( "debug, smart_gateway", "query_target_list: " . print_r($this,true) );
 }
 /**
  *    Generate RDBMS-specific SQL for DELETE
  *
  *    @param Charcoal_ITableModel $model        table model object related with th query
  *    @param string $alias                      table model alias which is specified by $model
  *    @param Charcoal_SQLCriteria $criteria     criteria which should be used in WHERE clause
  *
  *    @return string                            SQL
  */
 public function buildDeleteSQL($model, $alias, $criteria)
 {
     Charcoal_ParamTrait::validateIsA(1, 'Charcoal_ITableModel', $model);
     Charcoal_ParamTrait::validateString(2, $alias, TRUE);
     Charcoal_ParamTrait::validateIsA(3, 'Charcoal_SQLCriteria', $criteria);
     $table_name = $model->getTableName();
     $sql = "DELETE FROM " . us($table_name);
     if (!$criteria) {
         return $sql;
     }
     $where_clause = $criteria->getWhere();
     $order_by = $criteria->getOrderBy();
     $limit = $criteria->getLimit();
     $group_by = $criteria->getGroupBy();
     if (!empty($where_clause)) {
         $sql .= ' WHERE ' . $where_clause;
     }
     if (!empty($group_by)) {
         $sql .= ' GROUP BY ' . $group_by;
     }
     if (!empty($order_by)) {
         $sql .= ' ORDER BY ' . $order_by;
     }
     if (!empty($limit)) {
         $sql .= ' LIMIT ' . $limit;
     }
     return $sql;
 }
 /**
  * set author
  *
  * @param Charcoal_String|string $author
  */
 public function setAuthor($author)
 {
     Charcoal_ParamTrait::validateString(1, $author, TRUE);
     $this->item->author = us($author);
     return $this;
 }
 /**
  * Get framework/project/application file
  *
  * @param Charcoal_IEnvironment $env    framework's environment variables
  * @param string $virtual_path          virtual path to retrieve, including macro key like '%BASE_DIR%', '%WEBAPP_DIR%', etc.
  * @param string $filename              file name
  *
  * @return Charcoal_File        file object
  */
 public static function getFile($env, $virtual_path, $filename = NULL)
 {
     Charcoal_ParamTrait::validateIsA(1, 'Charcoal_IEnvironment', $env);
     Charcoal_ParamTrait::validateString(2, $virtual_path);
     Charcoal_ParamTrait::validateString(3, $filename, TRUE);
     return new Charcoal_File(self::getPath($env, $virtual_path, $filename));
 }