<?xml version="1.0" encoding="utf-8" ?>
<package>
	<scriptlet>
		<public>
			<property name="libName" dispid="0" />
			<method name="init">
				<parameter name="dbfile" />
				<parameter name="sys" />
				<parameter name="tojson" />
				<parameter name="fromjson" />
			</method>
			<method name="get">
				<parameter name="key" />
			</method>
			<method name="set">
				<parameter name="key" />
				<parameter name="val" />
				<parameter name="exp" />
			</method>
			<method name="getJson">
				<parameter name="key" />
			</method>
			<method name="setJson">
				<parameter name="key" />
				<parameter name="val" />
				<parameter name="exp" />
			</method>
			<method name="del">
				<parameter name="key" />
			</method>
			<method name="expr" />
		</public>
		<implements type="ASP" />
		<script language="javascript">
		<![CDATA[
var ins, libName = "模拟 Redis";

function init(dbfile, sys, tojson, fromjson) {
	ins = new Redis(Server.MapPath(dbfile), sys, tojson, fromjson);
}

function get(key) { return ins.get(key); }
function set(key, val, exp) { return ins.set(key, val, exp); }
function getJson(key) { return ins.getJson(key); }
function setJson(key, val, exp) { return ins.setJson(key, val, exp); }
function del(key) { return ins.del(key); }
function expr() { return ins.expr(); }

function Redis(dbfile, sys, tojson, fromjson) {
	this.get = function(key) {
		var rs = getRs();
		rs.filter = "key='" + key + "'";
		if(rs.EOF) return rs.close();
		if(rs.fields("exp") - sys.sTime < 0) {
			rs.Delete(); rs.filter = "";
			return rs.save(dbfile, 1), rs.close();
		}
		return [ rs.fields("val").value, rs.close() ][0];
	};

	this.set = function(key, val, exp) {
		var rs = getRs();
		rs.filter = "key='" + key + "'";
		if(rs.EOF) {
			rs.addNew();
			rs.fields("key").value = key;
		}
		if(!exp) exp = 3e9;
		var time = new Date;
		time.setSeconds(time.getSeconds() + exp);
		rs.fields("val").value = val;
		rs.fields("exp").value = time.getVarDate();
		rs.filter = ""; rs.save(dbfile, 1); rs.close();
	}

	this.getJson = function(key) {
		var val = this.get(key);
		return val ? fromjson(val) : val;
	};

	this.setJson = function(key, val, exp) {
		this.set(key, tojson(val), exp);
	};

	this.del = function(key) {
		var rs = getRs();
		rs.filter = "key='" + key + "'";
		if(rs.EOF) return rs.close();
		rs.Delete(); rs.filter = "";
		rs.save(dbfile, 1); rs.close();
	}

	this.expr = function() {
		var rs = getRs(); rs.sort = "exp";
		var arr = new Array;
		while(!rs.EOF) {
			if(rs.fields("exp") - sys.sTime > 0) break;
			arr.push(rs.fields("key").value);
			rs.Delete(); rs.moveNext();
		}
		rs.save(dbfile, 1); rs.close();
		return arr;
	};

	this.toString = function() { return libName; };

	function getRs() {
		var rs = new ActiveXObject("AdoR.Recordset");
		try{ rs.open(dbfile); } catch(err) {
			rs.fields.append("key", 201, 255);
			rs.fields.append("val", 203, -1);
			rs.fields.append("exp", 135);
			rs.open();
		}
		return rs;
	}
}
		]]>
		</script>
	</scriptlet>
</package>