/**
  *    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 query(Charcoal_String $sql)
 {
     $flag = new Charcoal_ErrorReportingSwitcher(0, E_DEPRECATED);
     // 接続処理
     $this->connect();
     $timer_handle = Charcoal_Benchmark::start();
     // SQLを実行して結果セットを得る
     $resultset = $this->_query($sql);
     // ログ
     $elapse = Charcoal_Benchmark::stop($timer_handle);
     log_debug('sql', "query() end. time=[{$elapse}]sec.");
     // 結果セットを返却
     return $resultset;
 }
 public function execute($request, $response, $session = NULL)
 {
     $timer_handle = Charcoal_Benchmark::start();
     //        Charcoal_ParamTrait::validateImplements( 1, 'Charcoal_IRequest', $request );
     //        Charcoal_ParamTrait::validateImplements( 2, 'Charcoal_IResponse', $response );
     //        Charcoal_ParamTrait::validateIsA( 3, 'Charcoal_Session', $session, TRUE );
     $proc_path = $this->getObjectPath();
     $proc_name = $proc_path->toString();
     //        log_info( "system", "procedure",  "プロシージャ[$proc_name]を実行します。" );
     //=======================================
     // タスクマネージャの作成
     //
     // タスクマネージャを作成
     $task_manager_name = $this->task_manager;
     $task_manager = $this->getSandbox()->createObject($task_manager_name, 'task_manager');
     //        log_info( "system", "procedure", "タスクマネージャ[$task_manager_name]を作成しました。" );
     //=======================================
     // modules以下にクラスファイルがあればロードする
     //
     //        log_info( "system", "procedure", 'loading module at procedure path:' . $proc_path );
     Charcoal_ModuleLoader::loadModule($this->getSandbox(), $proc_path, $task_manager);
     //        log_info( "system", "procedure", 'loaded module at procedure path:' . $proc_path );
     //=======================================
     // 追加モジュールのロード
     //
     if ($this->modules) {
         //            log_info( "system", "procedure", 'loading additional modules: ' . $this->modules . " of procedure: " . $proc_path );
         foreach ($this->modules as $module_name) {
             if (strlen($module_name) === 0) {
                 continue;
             }
             // load module
             Charcoal_ModuleLoader::loadModule($this->getSandbox(), $module_name, $task_manager);
         }
         //            log_info( "system", "procedure", 'loaded additional modules.' );
     }
     //=======================================
     // ステートフルタスクの復帰
     //
     $use_session = b($this->getSandbox()->getProfile()->getBoolean('USE_SESSION'));
     if ($use_session->isTrue()) {
         //            log_info( "system", "procedure", 'ステートフルタスクの復元を開始します。' );
         $task_manager->restoreStatefulTasks($session);
         //            log_info( "system", "procedure", 'ステートフルタスクを復元しました。' );
     }
     //=======================================
     // シーケンスの復帰
     //
     $sequence = NULL;
     $globalsequence = NULL;
     $localsequence = NULL;
     if ($use_session->isTrue()) {
         $seq_name = us($this->sequence);
         $seq_name = strlen($seq_name) > 0 ? $seq_name : 'local';
         // restore global sequence
         //            log_info( "system,sequence", "sequence", "starting restoring global sequence." );
         $data_id = 'sequence://global';
         $global_seq = NULL;
         if (isset($_SESSION[$data_id])) {
             $data = $_SESSION[$data_id];
             $data = unserialize($data);
             if ($data instanceof Charcoal_Sequence) {
                 $global_seq = $data;
                 //                    log_info( "debug,sequence", "sequence", "restored global sequence:" . print_r($globalsequence,true) );
             }
         }
         // restore local sequence
         //            log_info( "system,sequence", "sequence", "starting restoring local sequence." );
         // 復元
         $data_id = 'sequence://' . $seq_name;
         $local_seq = NULL;
         if (isset($_SESSION[$data_id])) {
             $data = $_SESSION[$data_id];
             $data = unserialize($data);
             if ($data instanceof Charcoal_Sequence) {
                 $local_seq = $data;
                 //                    log_info( "debug,sequence",  "restored local sequence:" . print_r($localsequence,true) );
             }
         }
         // merge global and local sequence
         $global_seq = $global_seq ? $global_seq : new Charcoal_Sequence();
         $local_seq = $local_seq ? $local_seq : new Charcoal_Sequence();
         $sequence = new Charcoal_SequenceHolder($global_seq, $local_seq);
     }
     //=======================================
     // create system event(request event)
     //
     //        log_info( "system,debug,event", 'creating reqyest event.', 'event' );
     // create request event
     $event = $this->getSandbox()->createEvent('request', array($request));
     $task_manager->pushEvent($event);
     //        log_info( "system,debug,event", 'pushed reqyest event to the event queue.', 'event' );
     //=======================================
     // ユーザイベントの作成
     //
     //        log_info( "system", "procedure", 'ユーザイベントの作成処理を開始します。' );
     $event_list = array();
     if ($this->events) {
         foreach ($this->events as $event_name) {
             if (strlen($event_name) === 0) {
                 continue;
             }
             $event = $this->getSandbox()->createEvent($event_name);
             $task_manager->pushEvent($event);
         }
     }
     //=======================================
     // イベント処理
     //
     //        log_info( "system", "procedure", "タスクマネージャによるイベント処理を開始します。" );
     $context = new Charcoal_EventContext($this->getSandbox());
     $context->setProcedure($this);
     $context->setRequest($request);
     $context->setSequence($sequence);
     $context->setResponse($response);
     $context->setTaskManager($task_manager);
     $exit_code = $task_manager->processEvents($context);
     if (!is_int($exit_code) && !$exit_code instanceof Charcoal_Integer) {
         //            log_info( "system", "procedure", "異常な終了コードを検知しました。(" . gettype($exit_code) . ")。タスクマネージャは終了コードとして整数値のみ返却することができます。" );
         _throw(new Charcoal_BadExitCodeException($exit_code));
     }
     //        log_info( "system", "procedure", "タスクマネージャによるイベント処理が完了しました。終了コード($exit_code)" );
     //=======================================
     // 終了処理
     //
     if ($use_session->isTrue()) {
         $seq_name = us($this->sequence);
         $seq_name = strlen($seq_name) > 0 ? $seq_name : 'local';
         // globalシーケンスの保存
         $data_id = 'sequence://global';
         $session->set(s($data_id), $global_seq);
         //            log_info( "debug,sequence",  "globalsequence:" . print_r($globalsequence,true) );
         //            log_info( "system,sequence", "globalシーケンスを保存しました。" );
         // localシーケンスの保存
         $data_id = 'sequence://' . $seq_name;
         $session->set(s($data_id), $local_seq);
         //            log_info( "debug,sequence",  "localsequence:" . print_r($localsequence,true) );
         //            log_info( "system,sequence", "localシーケンス[$seq_name]を保存しました。" );
     }
     // セッション情報の保存
     if ($use_session->isTrue()) {
         // ステートフルタスクの保存
         $task_manager->saveStatefulTasks($session);
     }
     $score = Charcoal_Benchmark::stop($timer_handle);
     log_debug('system, debug', "procedure execute method end: [{$score}] msec");
     //        log_info( "system", "procedure", "プロシージャ[$proc_name]を実行しました。" );
 }
 /**
  *   process events
  *
  * @param Charcoal_IEventContext $context
  *
  * @return int
  *
  * @throws Charcoal_BusinessException|Charcoal_RuntimeException
  */
 public function processEvents($context)
 {
     $debug = $this->getSandbox()->isDebug() || $context->getProcedure()->isDebugMode();
     if ($debug) {
         log_debug('system,event', "processEvents start.");
     }
     //        $procedure = $context->getProcedure();
     //        $request   = $context->getRequest();
     //        $sequence  = $context->getSequence();
     //        $response  = $context->getResponse();
     $max_event_loop = $this->max_event_loop;
     $exit_code = 0;
     try {
         $queue = $this->queue;
         $timer_all = Charcoal_Benchmark::start();
         $loop_id = 0;
         while (!$queue->isEmpty()) {
             if ($debug) {
                 log_debug('system,event', "event queue(" . count($queue) . "): {$queue}");
             }
             // increment loop counter
             $loop_id++;
             // イベント一覧を優先度でソートする
             $queue->sortByPriority();
             /** @var Charcoal_IEvent $event */
             $event = $queue->dequeue();
             /** @var string $event_name */
             $event_name = $event->getObjectName();
             /** @var Charcoal_ObjectPath $event_id */
             $event_id = $event->getObjectPath();
             $delete_event = FALSE;
             $context->setEvent($event);
             // if this event loop exceeds [max_event_loop], thro exception
             if ($loop_id > $max_event_loop) {
                 log_warning("system,event", "[loop:{$loop_id}/{$event_name}] aborting by overflow maximum loop count[{$max_event_loop}].", "task_manager");
                 log_warning("system,event", "[loop:{$loop_id}/{$event_name}] event queue=[{$queue}].", "task_manager");
                 _throw(new Charcoal_EventLoopCounterOverflowException($max_event_loop));
             }
             if ($debug) {
                 log_debug('system,event', "[loop:{$loop_id}/{$event_name}] event loop start.");
             }
             // タスク一覧を優先度でソートする
             $key_priority = array();
             foreach ($this->tasks as $key => $task) {
                 $key_priority[$key] = ui($task->getPriority());
             }
             $a_task_list = uv($this->tasks);
             array_multisort($key_priority, SORT_DESC, $a_task_list);
             $this->tasks = v($a_task_list);
             // task list to remove on end of this loop
             $remove_tasks = NULL;
             // すべてのタスクにイベントをディスパッチする
             if ($debug) {
                 log_debug('system,event', "[loop:{$loop_id}/{$event_name}] task list: [{$this->tasks}]");
             }
             foreach ($this->tasks as $task) {
                 $task_name = $task->getObjectName();
                 $task_id = $task->getObjectPath();
                 if ($debug) {
                     log_debug('system,event', "[loop:{$loop_id}/{$event_name}/{$task_name}] event[{$event_name}] is dispatching to task[{$task_name}].");
                 }
                 // イベントフィルタ
                 $process = FALSE;
                 $event_filters = $task->getEventFilters();
                 if ($debug) {
                     log_debug('system,event', "[loop:{$loop_id}/{$event_name}/{$task_name}] task event filter: " . $event_filters);
                 }
                 foreach ($event_filters as $filter) {
                     if ($event_id->getObjectPathString() == us($filter)) {
                         $process = TRUE;
                         break;
                     }
                 }
                 if (!$process) {
                     if ($debug) {
                         log_debug('system,event', "[loop:{$loop_id}/{$event_name}/{$task_name}] event[{$event_name}] is NOT found in task's event filters: [{$event_filters}]. Passing this task.");
                     }
                     continue;
                 }
                 if ($debug) {
                     log_debug('system,event', "[loop:{$loop_id}/{$event_name}/{$task_name}] event[{$event_name}] is found in task's event filters: [{$event_filters}].");
                 }
                 // task timer start
                 $timer_task = Charcoal_Benchmark::start();
                 $result = NULL;
                 try {
                     $result = $task->processEvent($context);
                     if ($debug) {
                         log_debug('system,event', "[loop:{$loop_id}/{$event_name}/{$task_name}] returned from processEvent with result:" . print_r($result, true));
                     }
                 } catch (Charcoal_BusinessException $e) {
                     // just handle the exception
                     $exception_handled = $task->handleException($e, $context);
                     if (b($exception_handled)->isFalse()) {
                         // just re-throw the exception, if the exception was not handled by the task
                         throw $e;
                     }
                 } catch (Charcoal_RuntimeException $e) {
                     // write log and handle the exception
                     _catch($e);
                     $exception_handled = $task->handleException($e, $context);
                     if (b($exception_handled)->isFalse()) {
                         // write log and re-throw the exception, if the exception was not handled by the task
                         _throw($e);
                     }
                 }
                 // result value handling
                 $result_str = NULL;
                 if ($result === NULL) {
                     $result_str = 'NULL';
                 } elseif ($result === FALSE || $result instanceof Charcoal_Boolean && $result->isFalse()) {
                     $result_str = 'FALSE';
                     $result = FALSE;
                 } elseif ($result === TRUE || $result instanceof Charcoal_Boolean && $result->isTrue()) {
                     $result_str = 'TRUE';
                     $result = TRUE;
                 } else {
                     $msg = "processEvent() must return a [boolean] value. but returned:" . print_r($result, true);
                     log_error('system,event,error', $msg, self::TAG);
                     _throw(new Charcoal_ProcessEventAtTaskException($event, $task, $result, $msg));
                 }
                 // task timer stop
                 $elapse = Charcoal_Benchmark::stop($timer_task);
                 log_debug('system,event', "[loop:{$loop_id}/{$event_name}/{$task_name}] event was processed by task. result=[{$result_str}] time=[{$elapse}]msec.");
                 // ポストアクション
                 $post_actions = $task->getPostActions();
                 if ($debug) {
                     log_debug('system,event', "[loop:{$loop_id}/{$event_name}/{$task_name}] task post actions: {$post_actions}");
                 }
                 if ($result && $post_actions) {
                     foreach ($post_actions as $key => $action) {
                         $target = NULL;
                         $action = us($action);
                         if (strpos(":", $action) !== FALSE) {
                             list($action, $target) = explode(":", trim($action));
                             if ($debug) {
                                 log_debug('system,event', "[loop:{$loop_id}/{$event_name}/{$task_name}] post action[{$action}] with target[{$target}].");
                             }
                         } else {
                             $action = trim($action);
                             if ($debug) {
                                 log_debug('system,event', "[loop:{$loop_id}/{$event_name}/{$task_name}] post action[{$action}].");
                             }
                         }
                         switch ($action) {
                             case "remove_task":
                                 // タスク実行リストからタスクを削除
                                 if (!$target) {
                                     $target = $task_id;
                                 }
                                 if ($target == $task_id) {
                                     if ($debug) {
                                         log_debug('system,event', "[loop:{$loop_id}/{$event_name}/{$task_name}] task[{$target}] is marked to remove.");
                                     }
                                     $remove_tasks[] = $task_id;
                                 }
                                 break;
                             case "remove_event":
                                 // イベントを削除
                                 if (!$target) {
                                     $target = $event_id;
                                 }
                                 if ($target == $event_id) {
                                     if ($debug) {
                                         log_debug('system,event', "[loop:{$loop_id}/{$event_name}/{$task_name}] event[{$target}] is marked to remove.");
                                     }
                                     $delete_event |= TRUE;
                                 }
                                 break;
                             case "continue_event":
                                 // イベントをキューに再投入
                                 break;
                         }
                     }
                 } else {
                     if ($debug) {
                         log_debug('system,event', "[loop:{$loop_id}/{$event_name}/{$task_name}] no post action is  defined for event.");
                     }
                 }
                 if ($debug) {
                     log_debug('system,event', "[loop:{$loop_id}/{$event_name}] task loop end.");
                 }
             }
             // task loop end
             // remove tasks
             if ($remove_tasks) {
                 foreach ($remove_tasks as $task_id) {
                     unset($this->tasks["{$task_id}"]);
                     if ($debug) {
                         log_debug('system,event', "[loop:{$loop_id}/{$event_name}] removed task: {$task_id}");
                     }
                 }
                 if ($debug) {
                     log_debug('system,event', "[loop:{$loop_id}/{$event_name}] next task list: [{$this->tasks}]");
                 }
             }
             if (!$delete_event) {
                 // push back the event into our event queue
                 $this->pushEvent($event);
             } else {
                 if ($debug) {
                     log_debug('system,event', "[loop:{$loop_id}/{$event_name}] event[{$event}] is removed.");
                 }
             }
             if ($debug) {
                 log_debug('system,event', "[loop:{$loop_id}/{$event_name}] event loop end.");
             }
         }
         // event loop end
         if ($queue->isEmpty()) {
             if ($debug) {
                 log_debug('system,event', "event queue is empty.");
             }
             $exit_code = Charcoal_Event::EXIT_CODE_OK;
         }
         // ログ
         $elapse = Charcoal_Benchmark::stop($timer_all);
         if ($debug) {
             log_debug('system,event', "event loop end. time=[{$elapse}]msec.");
         }
     } catch (Charcoal_RuntimeException $e) {
         _catch($e, true);
         if ($debug) {
             log_debug('system,event,debug', "an exception occured while processing event.");
         }
         _throw(new Charcoal_ProcessEventAtTaskManagerException($e));
     }
     if ($debug) {
         log_debug('system,event', "processEvents end: exit_code=" . print_r($exit_code, true));
     }
     return $exit_code;
 }
 /**
  * Process core hook message
  */
 public function processMessage($stage, $data)
 {
     $stage_name = parent::getCoreHookStageName($stage);
     switch ($stage) {
         case Charcoal_EnumCoreHookStage::START_OF_BOOTSTRAP:
             // starting message
             echo "[core stage:{$stage_name}] Starting framework bootstrap process." . eol();
             echo "[core stage:{$stage_name}] ===============================================" . eol();
             $ver = Charcoal_Framework::getVersion();
             echo "[core stage:{$stage_name}] CharcoalPHP Framwrork version: {$ver}" . eol();
             echo "[core stage:{$stage_name}] PHP version: " . PHP_VERSION . eol();
             echo "[core stage:{$stage_name}] default_timezone: " . date_default_timezone_get() . eol();
             echo "[core stage:{$stage_name}] ===============================================" . eol();
             echo "[core stage:{$stage_name}] profile=[" . CHARCOAL_PROFILE . "]" . eol();
             break;
         case Charcoal_EnumCoreHookStage::BEFORE_INIT_FRAMEWORK:
             echo "[core stage:{$stage_name}] Starting framework initialization process." . eol();
             break;
         case Charcoal_EnumCoreHookStage::AFTER_INIT_FRAMEWORK:
             echo "[core stage:{$stage_name}] Finished framework initialization process." . eol();
             break;
         case Charcoal_EnumCoreHookStage::BEFORE_REG_CLASS_LOADERS:
             echo "[core stage:{$stage_name}] Starting registering class loaders." . eol();
             break;
         case Charcoal_EnumCoreHookStage::CREATE_FRAMEWORK_CLASS_LOADER:
             echo "[core stage:{$stage_name}] Created framework class loader." . eol();
             break;
         case Charcoal_EnumCoreHookStage::REG_FRAMEWORK_CLASS_LOADER:
             echo "[core stage:{$stage_name}] Registered framework class loader." . eol();
             break;
         case Charcoal_EnumCoreHookStage::CREATE_CLASS_LOADER:
             echo "[core stage:{$stage_name}] Created class loader: [{$data}]" . eol();
             break;
         case Charcoal_EnumCoreHookStage::REG_CLASS_LOADER:
             echo "[core stage:{$stage_name}] Registered class loader: [{$data}]" . eol();
             break;
         case Charcoal_EnumCoreHookStage::AFTER_REG_CLASS_LOADERS:
             echo "[core stage:{$stage_name}] Finished registering class loaders." . eol();
             break;
             /*
                     case Charcoal_EnumCoreHookStage::BEFORE_REG_EXCEPTION_HANDLERS:
                         echo "[core stage:$stage_name] Starting registering exception handlers.". eol();
                         break;
                     case Charcoal_EnumCoreHookStage::CREATE_EXCEPTION_HANDLER:
                         echo "[core stage:$stage_name] Registered exception handler: [$data]". eol();
                         break;
                     case Charcoal_EnumCoreHookStage::AFTER_REG_EXCEPTION_HANDLERS:
                         echo "[core stage:$stage_name] Finished registering exception handlers.". eol();
                         break;
                     case Charcoal_EnumCoreHookStage::BEFORE_REG_USER_LOGGERS:
                         echo "[core stage:$stage_name] Starting registering loggers.". eol();
                         break;
                     case Charcoal_EnumCoreHookStage::CREATE_USER_LOGGER:
                         echo "[core stage:$stage_name] Registered logger: [" . $data . "]");
                         break;
                     case Charcoal_EnumCoreHookStage::AFTER_REG_USER_LOGGERS:
                         echo "[core stage:$stage_name] Finished registering loggers.". eol();
                         break;
             */
         /*
                 case Charcoal_EnumCoreHookStage::BEFORE_REG_EXCEPTION_HANDLERS:
                     echo "[core stage:$stage_name] Starting registering exception handlers.". eol();
                     break;
                 case Charcoal_EnumCoreHookStage::CREATE_EXCEPTION_HANDLER:
                     echo "[core stage:$stage_name] Registered exception handler: [$data]". eol();
                     break;
                 case Charcoal_EnumCoreHookStage::AFTER_REG_EXCEPTION_HANDLERS:
                     echo "[core stage:$stage_name] Finished registering exception handlers.". eol();
                     break;
                 case Charcoal_EnumCoreHookStage::BEFORE_REG_USER_LOGGERS:
                     echo "[core stage:$stage_name] Starting registering loggers.". eol();
                     break;
                 case Charcoal_EnumCoreHookStage::CREATE_USER_LOGGER:
                     echo "[core stage:$stage_name] Registered logger: [" . $data . "]");
                     break;
                 case Charcoal_EnumCoreHookStage::AFTER_REG_USER_LOGGERS:
                     echo "[core stage:$stage_name] Finished registering loggers.". eol();
                     break;
         */
         case Charcoal_EnumCoreHookStage::BEFORE_REG_EXTLIB_DIR:
             echo "[core stage:{$stage_name}] Starting registering external library paths." . eol();
             break;
         case Charcoal_EnumCoreHookStage::ADD_EXTLIB_DIR:
             echo "[core stage:{$stage_name}] Registered external library path: [{$data}]" . eol();
             break;
         case Charcoal_EnumCoreHookStage::AFTER_REG_EXTLIB_DIR:
             echo "[core stage:{$stage_name}] Finished registering external library paths." . eol();
             break;
         case Charcoal_EnumCoreHookStage::BEFORE_SET_SESSION_HANDLER:
             echo "[core stage:{$stage_name}] Starting registering session handlers." . eol();
             break;
         case Charcoal_EnumCoreHookStage::AFTER_SET_SESSION_HANDLER:
             echo "[core stage:{$stage_name}] Finished registering session handlers." . eol();
             break;
         case Charcoal_EnumCoreHookStage::BEFORE_START_SESSION:
             echo "[core stage:{$stage_name}] Starting session." . eol();
             break;
         case Charcoal_EnumCoreHookStage::AFTER_START_SESSION:
             echo "[core stage:{$stage_name}] Session started." . eol();
             break;
         case Charcoal_EnumCoreHookStage::BEFORE_ROUTING_RULE:
             echo "[core stage:{$stage_name}] Starting creating routing rules." . eol();
             break;
         case Charcoal_EnumCoreHookStage::AFTER_ROUTING_RULE:
             echo "[core stage:{$stage_name}] Finished creating routing rules." . eol();
             break;
         case Charcoal_EnumCoreHookStage::BEFORE_ROUTER:
             echo "[core stage:{$stage_name}] Starting routing." . eol();
             break;
         case Charcoal_EnumCoreHookStage::AFTER_ROUTER:
             echo "[core stage:{$stage_name}] Finished routing." . eol();
             break;
         case Charcoal_EnumCoreHookStage::BEFORE_CREATE_PROCEDURE:
             echo "[core stage:{$stage_name}] Creating procedure: [{$data}]" . eol();
             break;
         case Charcoal_EnumCoreHookStage::AFTER_CREATE_PROCEDURE:
             echo "[core stage:{$stage_name}] Created procedure: [{$data}]" . eol();
             break;
         case Charcoal_EnumCoreHookStage::BEFORE_PROCEDURE_FORWARD:
             echo "[core stage:{$stage_name}] Starting procedure forwarding process." . eol();
             break;
         case Charcoal_EnumCoreHookStage::PRE_PROCEDURE_FORWARD:
             echo "[core stage:{$stage_name}] Executing procedure forwarding." . eol();
             break;
         case Charcoal_EnumCoreHookStage::POST_PROCEDURE_FORWARD:
             echo "[core stage:{$stage_name}] Executed procedure forwarding." . eol();
             break;
         case Charcoal_EnumCoreHookStage::AFTER_PROCEDURE_FORWARD:
             echo "[core stage:{$stage_name}] Finished procedure forwarding process." . eol();
             break;
         case Charcoal_EnumCoreHookStage::END_OF_BOOTSTRAP:
             $elapse = Charcoal_Benchmark::score();
             echo "[core stage:{$stage_name}] Finished framework bootstrap process." . eol();
             echo "[core stage:{$stage_name}] bootstrap processing time: [{$elapse}] msec" . eol();
             break;
         case Charcoal_EnumCoreHookStage::PRE_EXECUTE_PROCEDURE:
             $proc_stack = Charcoal_Framework::getProcedureStack();
             echo "[core stage:{$stage_name}] Executing procedure: [{$data}]" . eol();
             echo "[core stage:{$stage_name}] procedure stack: [ " . Charcoal_System::implodeArray(",", $proc_stack) . " ]" . eol();
             break;
         case Charcoal_EnumCoreHookStage::POST_EXECUTE_PROCEDURE:
             echo "[core stage:{$stage_name}] Executed procedure: [{$data}]" . eol();
             break;
         case Charcoal_EnumCoreHookStage::AFTER_EXECUTE_PROCEDURES:
             echo "[core stage:{$stage_name}] Finished procedure executing process." . eol();
             break;
         case Charcoal_EnumCoreHookStage::START_OF_SHUTDOWN:
             echo "[core stage:{$stage_name}] Started framework shutdown process." . eol();
             break;
         case Charcoal_EnumCoreHookStage::BEFORE_SAVE_SESSION:
             echo "[core stage:{$stage_name}] Starting saving session data." . eol();
             break;
         case Charcoal_EnumCoreHookStage::AFTER_SAVE_SESSION:
             echo "[core stage:{$stage_name}] Finished saving session data." . eol();
             break;
         case Charcoal_EnumCoreHookStage::BEFORE_DESTROY_CONTAINER:
             echo "[core stage:{$stage_name}] Starting destroying container." . eol();
             break;
         case Charcoal_EnumCoreHookStage::AFTER_DESTROY_CONTAINER:
             echo "[core stage:{$stage_name}] Finished destroying container." . eol();
             break;
             /*
                     case Charcoal_EnumCoreHookStage::BEFORE_TERMINATE_LOGGERS:
                         echo "[core stage:$stage_name] Starting terminating loggers.");
                         break;
                     case Charcoal_EnumCoreHookStage::AFTER_TERMINATE_LOGGERS:
                         echo "[core stage:$stage_name] Finished terminating loggers.");
                         break;
             */
         /*
                 case Charcoal_EnumCoreHookStage::BEFORE_TERMINATE_LOGGERS:
                     echo "[core stage:$stage_name] Starting terminating loggers.");
                     break;
                 case Charcoal_EnumCoreHookStage::AFTER_TERMINATE_LOGGERS:
                     echo "[core stage:$stage_name] Finished terminating loggers.");
                     break;
         */
         case Charcoal_EnumCoreHookStage::END_OF_SHUTDOWN:
             echo "[core stage:{$stage_name}] Finished framework shutdown process." . eol();
             if ($this->getSandbox()->isDebug()) {
                 $peak_usage = memory_get_peak_usage(FALSE);
                 $real_usage = memory_get_peak_usage(TRUE);
                 $unit_peak = Charcoal_System::formatByteSize($peak_usage, 5);
                 $unit_real = Charcoal_System::formatByteSize($real_usage, 5);
                 echo "[core stage:{$stage_name}] memory peak usage: [{$unit_peak}] bytes" . eol();
                 echo "[core stage:{$stage_name}] memory real usage: [{$unit_real}] bytes" . eol();
             }
             break;
     }
 }
Example #6
0
 /**
  *    execute framework main code
  *
  * @param boolean $debug
  * @param Charcoal_Sandbox $sandbox
  */
 public static function run($debug = NULL, $sandbox = NULL)
 {
     $th_run = Charcoal_Benchmark::start();
     $mh_run = Charcoal_MemoryBenchmark::start();
     //        Charcoal_ParamTrait::validateBoolean( 1, $debug, TRUE );
     //        Charcoal_ParamTrait::validateSandbox( 2, $sandbox, TRUE );
     if ($sandbox === NULL) {
         $sandbox = new Charcoal_Sandbox(CHARCOAL_PROFILE, $debug);
     }
     try {
         try {
             //ob_start();
             self::_run($sandbox);
             //ob_end_flush();
         } catch (Charcoal_ProcedureNotFoundException $ex) {
             _catch($ex);
             switch (CHARCOAL_RUNMODE) {
                 // ランモードがhttpの時は404エラー
                 case 'http':
                     throw new Charcoal_HttpStatusException(404, $ex);
                     break;
                     // それ以外の場合はリスロー
                 // それ以外の場合はリスロー
                 default:
                     _throw($ex);
                     break;
             }
         } catch (Exception $ex) {
             _catch($ex);
             switch (CHARCOAL_RUNMODE) {
                 // ランモードがhttpの時は500エラー
                 case 'http':
                     throw new Charcoal_HttpStatusException(500, $ex);
                     break;
                     // それ以外の場合はリスロー
                 // それ以外の場合はリスロー
                 default:
                     _throw($ex);
                     break;
             }
         }
     } catch (Charcoal_ProfileLoadingException $e) {
         echo 'profile loading failed:' . $e->getMessage();
         exit;
     } catch (Exception $e) {
         _catch($e);
         // restore error handlers for avoiding infinite loop
         restore_error_handler();
         restore_exception_handler();
         self::handleException($e);
         // display debugtrace
         if ($debug || $sandbox->isDebug()) {
             self::$debugtrace_renderers->render($e);
         }
         self::$loggers->flush();
     } catch (Throwable $e) {
         _catch($e);
         // restore error handlers for avoiding infinite loop
         restore_error_handler();
         restore_exception_handler();
         self::handleException($e);
         // display debugtrace
         if ($debug || $sandbox->isDebug()) {
             self::$debugtrace_renderers->render($e);
         }
         self::$loggers->flush();
     }
     // finally process
     $timer_score = Charcoal_Benchmark::stop($th_run);
     log_debug('system, debug', sprintf("total framework process time: [%0.4f] msec", $timer_score));
     // memory usage
     list($usage_1, $usage_2) = Charcoal_MemoryBenchmark::stop($mh_run);
     log_debug('system, debug', sprintf("used memory: [%d] bytes / [%d] bytes", $usage_1, $usage_2));
     // memory peak usage
     $peak_usage_1 = Charcoal_MemoryUtil::convertSize(memory_get_peak_usage(true), Charcoal_EnumMemoryUnit::UNIT_B);
     $peak_usage_2 = Charcoal_MemoryUtil::convertSize(memory_get_peak_usage(false), Charcoal_EnumMemoryUnit::UNIT_B);
     log_debug('system, debug', sprintf("peak memory: [%d] bytes / [%d] bytes", $peak_usage_1, $peak_usage_2));
     //Charcoal_Object::dump();
     self::terminate();
 }