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; }