<?php
/**
 * TrackBack データ変換スクリプト
 *
 * @copyright   Copyright &copy; 2005, Katsumi Saito <katsumi@jo1upk.ymt.prug.or.jp>
 * @version     $Id: conv_ts.php,v 0.5 2005/06/07 21:51:00 upk Exp $
 *
 *
 * THIS SCRIPT IS USED TO CORRESPOND TO
 * BugTrack/38(PukiWiki Plus!) AND BugTrack2/76(Pukiwiki.dev).
 *
 * このスクリプトは、
 * PukiWiki Plus! - BugTrack/38
 * Pukiwiki.dev   - BugTrack2/76
 * の対処するためのものです。
 *
 */

ini_set("max_execution_time", "360");	// デフォルトは、30秒。とりあえず 6分に設定。
ini_set("memory_limit", "32M");		// デフォルトは、8M。

if (extension_loaded('zlib')) {
	define('BACKUP_EXT', '.gz');
} else {
	define('BACKUP_EXT', '.txt');
}

$do_true   = 1; // 変換処理実行
$do_false  = 0; // 変換処理迂回

// pukiwiki.ini.php と同じ設定でＯＫです。
$do_backup = 1; // バックアップを実施している場合は 1 です。
$trackback = 1; // TrackBack で蓄積したファイルを変換するなら1 です。
$referer   = 1;

define('PKWK_SPLITTER', '>>>>>>>>>>');
/* **************************************************************************
 * *               稼動条件の定義(各自必ず変更して利用下さい)               *
 * ************************************************************************** */
define('DATA_HOME', '');
define('TRACKBACK_DIR', DATA_HOME . 'trackback/'); // TrackBack logs
define('BACKUP_DIR',    DATA_HOME . 'backup/'   ); // Backups
define('LOG_DIR',       DATA_HOME . 'log/');

$config_dir = array(
	array('tb',		$trackback,	TRACKBACK_DIR,		'.txt',		'TrackBack Data'),
	array('referer',	$referer,	TRACKBACK_DIR,		'.ref',		'Referer Data'),
	array('backup',		$do_backup,	BACKUP_DIR,		BACKUP_EXT,	'Backup Data'),
	array('log.view',	$do_false,	LOG_DIR.'browse/',	'.txt',		'Log Data(View)'),
	array('log.update',	$do_false,	LOG_DIR.'update/',	'.txt',		'Log Data(Update)'),
	array('log.down',	$do_false,	LOG_DIR.'download/',	'.txt',		'Log Data(Download)'),
);

/* **************************************************************************
 * *                           実行の本体                                   *
 * ************************************************************************** */
define('LOCALZONE', date('Z'));

echo "<pre>\n";
foreach($config_dir as $func) {
	if (!$func[1]) continue;
	convert_data($func[0],$func[2],$func[3],$func[4]);
}
echo "</pre>\n";

/* **************************************************************************
 * *                           処理関数の定義                               *
 * ************************************************************************** */
function convert_data($kind,$path,$ext,$title)
{
	global $ctr_all, $ctr_ok, $ctr_err;
	$ctr_all = $ctr_ok = $ctr_err = 0;

	if (!($dir = @opendir($path))) return '';
	echo '== '.$title." ==\n";

	while($file = readdir($dir))
	{
		if($file == '..' || $file == '.') continue;
		if (strstr($file,$ext) != TRUE) continue;
		$ctr_all++;
		data_update($kind,$path,$file);
	}
	closedir($dir);

	echo "$ctr_all files, $ctr_ok changed[O], $ctr_err errores[E].\n";
	if ($ctr_err == 0) {
		echo "== ALL PROCESSING WAS COMPLETED. ==\n";
	}
	return '';
}

function data_update($kind,$path,$file)
{
	global $ctr_all, $ctr_ok, $ctr_err;
	cp($path.$file);

	@list($file1, $ext)  = explode('.', $file);

	$mtime = filemtime($path.$file);

	if ($kind == 'backup' && $ext == 'gz') {
		$sw_gz   = 1;
		$fopen		 = 'gzopen';
		$fgets		 = 'gzgets';
		$fwrite		 = 'gzwrite';
		$fclose		 = 'gzclose';
	} else {
		$sw_gz   = 0;
		$fopen		 = 'fopen';
		$fgets		 = 'fgets';
		$fwrite		 = 'fwrite';
		$fclose		 = 'fclose';
	}

	if (!($fw = $fopen($path.$file,'w'))) {
		$ctr_err++;
		echo "[E]$file\n";
		return '';
	}

	$fr = @$fopen($path.$file.'.bak', 'r');
	while ($data = @$fgets($fr, 8192)) {
		switch ($kind) {
		case 'tb':
			$body = conv_trackback($data);
			continue;
		case 'referer':
			$body = conv_referer($data);
			continue;
		case 'backup':
			$body = conv_backup($data);
			continue;
		default:
			$body = conv_log($data);
			continue;
		}
		$fwrite($fw, $body);
	}
	$fclose ($fr);
        $fclose($fw);
        touch($path.$file, $mtime);

	rm($path.$file);
	// echo "[O]$file\n";
	$ctr_ok++;
	return '';
}

function conv_trackback($data)
{
	$ts  = substr($data,0,10);
	$ts += LOCALZONE;
	return $ts.substr($data,10);
}

function conv_referer($data)
{
	$ts1  = substr($data, 0,10);
	$ts1 += LOCALZONE;
	$ts2  = substr($data,11,10);
	$ts2 += LOCALZONE;
	return $ts1.','.$ts2.substr($data,21);
}

function conv_log($data)
{
	$ts  = substr($data,1,10);
	$ts += LOCALZONE;
	return '|'.$ts.substr($data,11);
}

function conv_backup($data)
{
	$regex_splitter = '/^' . preg_quote(PKWK_SPLITTER) . '\s(\d+)$/';
	$regex_splitter_new = '/^' . preg_quote(PKWK_SPLITTER) . '\s(\d+)\s(\d+)$/';

	if (preg_match($regex_splitter, $data, $match) ||
	    preg_match($regex_splitter_new, $data, $match)) {
		$time = $match[1];
		$real = (isset($match[2])) ? $match[2] : $match[1];
		$time += LOCALZONE;
		$real += LOCALZONE;
		return PKWK_SPLITTER . ' ' . $time . ' ' . $real . "\n";
	}
	return $data;
}

function cp($file)
{
	if (!copy($file, $file.'.bak')) {
		return FALSE;
	}
	return TRUE;
}

function rm($file)
{
	@unlink($file.'.bak');
}

?>
