protected static function generateSetupSql(HermitProcedureInfo $info)
 {
     $begin = false;
     $parameterNames = $info->getParamNames();
     $setupSql = 'SET';
     $setupSql .= ' ';
     foreach ($parameterNames as $parameterName) {
         if ($info->typeofIn($parameterName)) {
             continue;
         }
         $begin = true;
         $setupSql .= '@' . $parameterName;
         $setupSql .= ' = ';
         $setupSql .= '/*' . $parameterName . '*/';
         $setupSql .= '"' . $parameterName . '"';
         $setupSql .= ',';
     }
     if (!$begin) {
         return null;
     }
     return substr($setupSql, 0, -1);
 }
 public function getProcedureInfo($procedure)
 {
     if (isset($this->procedures[$procedure])) {
         return $this->procedures[$procedure];
     }
     $stmt = $this->pdo->prepare(self::PROCEDIRE_INFO_SQL);
     $stmt->execute(array(':db' => $this->databaseName, ':name' => $procedure));
     $paramList = $stmt->fetchColumn(0);
     if (false === $paramList) {
         throw new InvalidArgumentException('not found procedure name: ' . $procedure . ' in db: ' . $this->databaseName);
     }
     // replace (...) labels
     // e.g. IN _hoge DECIMAL(10, 5), OUT _foo VARCHAR(20)
     $paramList = preg_replace('/(\\(([^\\)]+)\\))/', '', $paramList);
     $info = new HermitProcedureInfo();
     $info->setName($procedure);
     $chunk = array_map('trim', explode(',', $paramList));
     foreach ($chunk as $field) {
         if (empty($field)) {
             continue;
         }
         $sp = preg_split('/\\s+/', $field);
         $inoutType = null;
         $paramName = null;
         $paramType = null;
         $upper = strtoupper($sp[0]);
         if (in_array($upper, array('IN', 'OUT', 'INOUT'), true)) {
             $inoutType = $upper;
             $paramName = $sp[1];
             $paramType = $sp[2];
         } else {
             // default IN: http://dev.mysql.com/doc/refman/5.1/ja/create-procedure.html
             $inoutType = 'IN';
             $paramName = $sp[0];
             $paramType = $sp[1];
         }
         $info->addParamName($paramName);
         $info->putParamType($paramName, $paramType);
         if (strcmp('IN', $inoutType) === 0) {
             $info->putInType($paramName);
         } else {
             if (strcmp('OUT', $inoutType) === 0) {
                 $info->putOutType($paramName);
             } else {
                 $info->putInOutType($paramName);
             }
         }
     }
     $stmt->closeCursor();
     unset($stmt);
     return $this->procedures[$procedure] = $info;
 }