2017年09月 / 08月≪ 123456789101112131415161718192021222324252627282930≫10月

インフォメーション

FC2ブログで画像等を一括アップロードするソフトを地味に配布してます。
FC2ブログ用ファイルアップロードの最新版はこちら
(ベクター)FC2ブログ用ファイルアップロード

--.--.-- (--)

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


 |  --:--  |  スポンサー広告  |  Top↑

2011.01.27 (Thu)

CakePHPのShellでsql_dumpが見たい

CakePHPのレイアウトに入ってる
$this->element('sql_dump');
これが非常に便利。
画面が表示されるまでに実際に発行されたSQLをすべて確認できる。

これが便利すぎるのでShellでも使いたいなあと思ったので
cake/libs/view/elements/sql_dump.ctp
を参考にshell用を作った。
  /**
* クエリ表示
*/
function sql_dump()
{
if (!class_exists('ConnectionManager') || Configure::read('debug') < 2) {
return false;
}
$noLogs = !isset($logs);
if ($noLogs):
$sources = ConnectionManager::sourceList();

$logs = array();
foreach ($sources as $source):
$db =& ConnectionManager::getDataSource($source);
if (!$db->isInterfaceSupported('getLog')):
continue;
endif;
$logs[$source] = $db->getLog();
endforeach;
endif;

$tmp = '';
if ($noLogs || isset($_forced_from_dbo_)){
foreach ($logs as $source => $logInfo){
$text = $logInfo['count'] > 1 ? 'queries' : 'query';
$tmp .= sprintf("cakeSqlLog_%s ",preg_replace('/[^A-Za-z0-9_]/', '_', uniqid(time(), true)));
$tmp .= sprintf("(%s) %s %s took %s ms\n", $source, $logInfo['count'], $text, $logInfo['time']);
$tmp .= "Nr\tQuery\tError\tAffected\tNum. rows\tTook (ms)\n";
foreach ($logInfo['log'] as $k => $i){
$tmp .= sprintf("%s\t%s\t%s\t%s\t%s\t%s\t\n",($k + 1), $i['query'],$i['error'],$i['affected'],$i['numRows'],$i['took']);
}
}
}else{
$tmp .= '

Encountered unexpected $logs cannot generate SQL log

';
}
return $tmp;
}

タブで区切ったりしてるけどその辺は好みで。

【More・・・】

実際の使用例
class MyclassShell extends Shell {

/**
* 初期化
* @see cake/console/libs/Shell::startup()
*/
function startup(){
$this->User = ClassRegistry::init('User');
}

/**
* メイン処理
*/
function main(){
$data = $this->User->find('first',array('conditions'=>array('User.age >='=>20)));
echo $this->sql_dump();
}

/**
* クエリ表示
*/
function sql_dump()
{
if (!class_exists('ConnectionManager') || Configure::read('debug') < 2) {
return false;
}
$noLogs = !isset($logs);
if ($noLogs):
$sources = ConnectionManager::sourceList();

$logs = array();
foreach ($sources as $source):
$db =& ConnectionManager::getDataSource($source);
if (!$db->isInterfaceSupported('getLog')):
continue;
endif;
$logs[$source] = $db->getLog();
endforeach;
endif;

$tmp = '';
if ($noLogs || isset($_forced_from_dbo_)){
foreach ($logs as $source => $logInfo){
$text = $logInfo['count'] > 1 ? 'queries' : 'query';
$tmp .= sprintf("cakeSqlLog_%s ",preg_replace('/[^A-Za-z0-9_]/', '_', uniqid(time(), true)));
$tmp .= sprintf("(%s) %s %s took %s ms\n", $source, $logInfo['count'], $text, $logInfo['time']);
$tmp .= "Nr\tQuery\tError\tAffected\tNum. rows\tTook (ms)\n";
foreach ($logInfo['log'] as $k => $i){
$tmp .= sprintf("%s\t%s\t%s\t%s\t%s\t%s\t\n",($k + 1), $i['query'],$i['error'],$i['affected'],$i['numRows'],$i['took']);
}
}
}else{
$tmp .= '

Encountered unexpected $logs cannot generate SQL log

';
}
return $tmp;
}
}


 |  14:49  |  PHP  |  トラックバック(0)  |  コメント(0)  |  Top↑

Comment

コメントを投稿する

URL
コメント
パス  編集・削除するのに必要
非公開  管理者だけにコメントを表示
 

Trackback

この記事のトラックバックURL

この記事へのトラックバック

 | BLOGTOP | 
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。