/**
  * add feed item
  *
  * @return Charcoal_FeedCreatorFeedItem       new feed item
  */
 public function addItem($data = array())
 {
     Charcoal_ParamTrait::validateHashMap(1, $data);
     $item = new Charcoal_FeedCreatorFeedItem($this, $data);
     $this->creator->addItem($item->getRawItem());
     return $item;
 }
 public function __construct($sandbox, $obj_path, $params = NULL)
 {
     Charcoal_ParamTrait::validateSandbox(1, $sandbox);
     Charcoal_ParamTrait::validateStringOrObjectPath(1, $obj_path);
     Charcoal_ParamTrait::validateHashMap(2, $params, TRUE);
     parent::__construct(p(array()));
     $this->_sandbox = $sandbox;
     $this->_obj_path = is_string(us($obj_path)) ? new Charcoal_ObjectPath($obj_path) : $obj_path;
     $this->_params = $params ? $params : m(array());
 }
Exemple #3
0
 public static function makeAbsoluteURL($sandbox, $obj_path, $params = NULL)
 {
     Charcoal_ParamTrait::validateSandbox(1, $sandbox);
     Charcoal_ParamTrait::validateStringOrObject(2, 'Charcoal_ObjectPath', $obj_path);
     Charcoal_ParamTrait::validateHashMap(3, $params, TRUE);
     // サーバ名
     $url = 'http://' . $_SERVER['SERVER_NAME'];
     // サーバのパス
     $url .= dirname($_SERVER['SCRIPT_NAME']);
     // 相対部分を追加
     $url .= self::makeRelativeURL($sandbox, $obj_path, $params);
     return $url;
 }
 /**
  * create
  *
  */
 public function create($params)
 {
     Charcoal_ParamTrait::validateHashMap(1, $params);
     $this->pager = @Pager::factory($params);
 }
 /**
  *    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;
 }
 /**
  *    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 bulk insert
  *
  *    @param Charcoal_ITableModel $model        table model object related with th query
  *    @param string $alias                      table model alias which is specified by $model
  *    @param array $data_set                    array of array or HashMap of objects
  *    @param array $override                    association field set which you want to override
  *
  *    @return array                             the first element means SQL, the second element means parameter values
  */
 public function buildBulkInsertSQL($model, $alias, $data_set, $override = NULL)
 {
     Charcoal_ParamTrait::validateIsA(1, 'Charcoal_ITableModel', $model);
     Charcoal_ParamTrait::validateString(2, $alias, TRUE);
     Charcoal_ParamTrait::validateVector(3, $data_set);
     Charcoal_ParamTrait::validateHashMap(4, $override, TRUE);
     try {
         $SQL_field_list = NULL;
         $SQL_value_list = NULL;
         $SQL_params = array();
         $override = up($override);
         $field_list = $model->getFieldList();
         // determin field list
         foreach ($field_list as $field) {
             $insert = $model->getAnnotationValue(s($field), s('insert'));
             if ($override && isset($override[$field])) {
                 $insert = isset($override[$field]['insert']) ? $override[$field]['insert'] : $insert;
             }
             if (!$insert) {
                 // 無指定の場合エラー
                 _throw(new Charcoal_TableModelFieldException($model, $field, '[@insert] annotation is required'));
             }
             // @insertアノテーションの値によって分岐
             $insert_anno = us($insert->getValue());
             switch ($insert_anno) {
                 case 'value':
                 case 'function':
                     $SQL_field_list[] = $field;
                     break;
                 case 'no':
                     break;
                 default:
                     _throw(new Charcoal_TableModelFieldException($model, $field, '[@insert] value is invalid'));
             }
         }
         // determin value list
         foreach ($data_set as $dto) {
             $SQL_value_list_line = array();
             foreach ($SQL_field_list as $field) {
                 $insert = $model->getAnnotationValue(s($field), s('insert'));
                 if ($override && isset($override[$field])) {
                     $insert = isset($override[$field]['insert']) ? $override[$field]['insert'] : $insert;
                 }
                 if (!$insert) {
                     // 無指定の場合エラー
                     _throw(new Charcoal_TableModelFieldException($model, $field, '[@insert] annotation is required'));
                 }
                 // @insertアノテーションの値によって分岐
                 $insert_anno = us($insert->getValue());
                 switch ($insert_anno) {
                     case 'value':
                         // 値で更新
                         $value = $dto->{$field};
                         if (is_array($value)) {
                             $type = isset($value[0]) ? $value[0] : NULL;
                             $arg = isset($value[1]) ? $value[1] : NULL;
                             $processed = false;
                             if (is_string($type) && is_string($arg)) {
                                 switch (strtolower($type)) {
                                     case 'value':
                                         if (strtolower($arg) == 'null') {
                                             $SQL_value_list_line[] = 'NULL';
                                             $processed = true;
                                         }
                                         break;
                                     case 'function':
                                         if (strtolower($arg) == 'now') {
                                             $SQL_value_list_line[] = 'NOW()';
                                             $processed = true;
                                         }
                                         break;
                                 }
                             }
                             // is not processed, save the array as a JSON string
                             if (!$processed) {
                                 $SQL_value_list_line[] = '?';
                                 $SQL_params[] = json_encode($value, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
                             }
                         } elseif ($value !== NULL) {
                             $SQL_value_list_line[] = '?';
                             $SQL_params[] = $value;
                         }
                         break;
                     case 'function':
                         // 関数を決定
                         $params = uv($insert->getParameters());
                         $function = 'NULL';
                         if (count($params) == 1) {
                             switch ($params[0]) {
                                 case 'now':
                                     $function = 'NOW()';
                                     break;
                                 default:
                                     break;
                             }
                         }
                         // 関数で更新
                         $SQL_value_list_line[] = $function;
                         break;
                     case 'no':
                         // 更新しない
                         break;
                     default:
                         _throw(new Charcoal_TableModelFieldException($model, $field, '[@insert] value is invalid'));
                 }
             }
             $SQL_value_list[] = $SQL_value_list_line;
         }
         $SQL_field_list = implode(',', $SQL_field_list);
         $table = $model->getTableName();
         $sql = "INSERT INTO " . us($table) . "(" . us($SQL_field_list) . ") VALUES";
         $values = array();
         foreach ($SQL_value_list as $line) {
             $SQL_value_list = implode(',', $line);
             $values[] = "(" . us($SQL_value_list) . ")";
         }
         $sql .= implode(',', $values);
         return array($sql, $SQL_params);
     } catch (Exception $e) {
         _throw(new Charcoal_SQLBuilderException("DefaultSQLBuilder#buildInsertSQL failed"));
     }
     return array();
 }
 /**
  * set layout values
  *
  * @param Charcoal_HashMap|array $values        array value which should be assigned to the template system
  */
 public function setValues($values)
 {
     Charcoal_ParamTrait::validateHashMap(1, $values);
     $this->values = um($values);
 }