<?xml version="1.0" encoding="utf-8" ?>
<package>
	<?component error="true" debug="true" ?>
	<scriptlet>
		<public>
			<property name="libName" dispid="0" />
			<method name="trace" />
			<method name="appendLog" />
			<method name="clear" />
			<method name="valueOf" />
			<method name="init" />
		</public>
		<implements type="ASP" />
		<script language="livescript">
		<![CDATA[
var ins, libName = "日志监控";

function init(dbfile, sys, fromjson, tojson) {
	ins = new Debugger(Server.MapPath(dbfile), sys, fromjson, tojson);
}

function trace() { return ins.trace.apply(ins, arguments); }

function appendLog() { return ins.appendLog(); }

function clear() { return ins.clear(); }

function valueOf() { return ins.valueOf(); }

function Debugger(dbfile, sys, tojson, fromjson) {
	// 调试信息
	var dbgs = new Array;
	this.trace = function() {
		if(!sys.debug) return;
		var arr = dbgs.slice.call(arguments, 0);
		arr.push(new Date - sys.sTime);
		dbgs.push(arr);
	};

	this.appendLog = function() {
		if(!sys.debug) return;
		var rs = getRs();
		// 更新点击数
		var date = sys.sTime.getDate();
		if(rs.fields("date").value != date) {
			rs.fields("last").value = rs.fields("hits").value || 0;
			rs.fields("hits").value = 0;
			rs.fields("date").value = date;
		}
		rs.fields("hits").value++;
		var row = [
			Request.ServerVariables("REQUEST_METHOD").Item,
			Request.ServerVariables("URL").Item,
			Request.QueryString("r").Item,
			Request.ServerVariables("REMOTE_ADDR").Item,
			sys.sTime.getVarDate(), new Date - sys.sTime
		];
		// 更新访问记录
		var logs = fromjson(rs.fields("logs").value || "[]");
		logs.unshift(row);
		if(logs.length > 100) logs.length = 100;
		rs.fields("logs").value = tojson(logs);
		// 更新慢日志
		if(row[5] > ~~rs.fields("over").value) {
			var slow = fromjson(rs.fields("slow").value || "[]");
			slow.unshift(row);
			slow.sort(function(a, b) { return b[5] - a[5]; });
			if(slow.length > 100) slow.length = 100;
			rs.fields("slow").value = tojson(slow);
			rs.fields("over").value = slow.pop()[5];
		}
		// 更新调试信息
		var test = fromjson(rs.fields("test").value || "[]");
		if(dbgs.length) {
			dbgs.unshift(row);
			test.unshift(dbgs);
			if(test.length > 100) test.length = 100;
			rs.fields("test").value = tojson(test);
		}
		rs.save(dbfile); rs.close();
	};

	this.clear = function() {
		var rs = getRs();
		rs.fields("test").value = "[]";
		rs.fields("slow").value = "[]";
		rs.fields("over").value = -1;
		rs.save(dbfile); rs.close();
	};

	this.valueOf = function() {
		var rs = getRs();
		var arr = rs.getRows().toArray();
		return rs.close(), arr;
	};

	this.toString = function() { return libName; };

	function getRs() {
		var rs = new ActiveXObject("AdoR.Recordset");
		try{ rs.open(dbfile); } catch(err) {
			rs.fields.append("logs", 203, -1);
			rs.fields.append("slow", 203, -1);
			rs.fields.append("test", 203, -1);
			rs.fields.append("hits", 3);
			rs.fields.append("last", 3);
			rs.fields.append("date", 3);
			rs.fields.append("over", 3);
			rs.open(); rs.addNew();
			rs.fields("hits").value = 0;
		}
		return rs;
	}
}
		]]>
		</script>
	</scriptlet>
</package>