グレート!

久々にグレートなコードを見た。

PHP + MySQLの環境でのバッチ処理

大概のRDBMSにはバルクインサートって機能があって

例えば


insert into t1 (peky,c1,c2,c3) values (1,'aho','hoge','hage');
insert into t1 (peky,c1,c2,c3) values (2,'aho','hoge','hage');
insert into t1 (peky,c1,c2,c3) values (3,'aho','hoge','hage');

ってのを


insert into t1 (peky,c1,c2,c3)
values (1,'aho','hoge','hage'),(2,'aho','hoge','hage'),(3,'aho','hoge','hage');
って書けるんです。


で、何に感動したかと言うと

MySQLの設定値の中に【max_allowed_packet】って値があるんですが

PHPからこの値を読み出して

インサート文を構築してたんですよ!

具体的には下記のコード。


$aRow = $oMainDbh->queryRow("SHOW VARIABLES LIKE 'max_allowed_packet'");
$packetSize = !empty($aRow['value']) ? $aRow['value'] : 0;
$i = 0;
while ($rsData->fetch()) {
$aRow = $rsData->toArray();
if (!$query) {
$query = $sInsert.$sRow;
} elseif (strlen($query) + strlen($sRow) + 4 < $packetSize) {
$query .= ','.$sRow;
} else {
$aExecQueries[] = $query;
$query = $sInsert.$sRow;
}
if (++$i >= $count || strlen($query) >= $packetSize) {
$aExecQueries[] = $query;
$query = '';
}
if (count($aExecQueries)) {
foreach ($aExecQueries as $execQuery) {
$result = $oMainDbh->exec($execQuery);
}
$aExecQueries = array();
}
}

何を言っているのか解らねーかもしれないけど俺は感動したんだ!