|
<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2010 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: luofei614 <www.3g4k.com>
// +----------------------------------------------------------------------
// $Id: SaeRank.class.php 2766 2012-02-20 15:58:21Z luofei614@gmail.com $
class SaeRank extends SaeObject{
public function __construct(){
parent::__construct();
}
public function clear($namespace){
if($this->emptyName($namespace)) return false;
self::$db->runSql("delete from sae_rank where namespace='$namespace'");
self::$db->runSql("delete from sae_rank_list where namespace='$namespace'");
return true;
}
//创建
//expire过期时间的单位为分钟
public function create($namespace,$number,$expire=0){
//判断是否存在
if(!$this->emptyName($namespace)){
$this->errno=-10;
$this->errmsg=Imit_L("_SAE_THE_RANK_IS_EXISTED_");
return false;
}
$ret=self::$db->runSql("insert into sae_rank(namespace,num,expire,createtime) values('$namespace','$number','$expire','".time()."')");
if($ret===false){
$this->errno=-6;
$this->errmsg=Imit_L("_SAE_ERR_");
return false;
}else{
return true;
}
}
//减去
public function decrease($namespace,$key,$value,$renkReurn=false){
if($this->emptyName($namespace)) return false;
$this->check($namespace);
if(self::$db->getVar("select count(*) from sae_rank_list where namespace='$namespace' and k='$key'")==0){
//如果不存在
$this->errno=-3;
$this->errmsg=Imit_L("_SAE_NOT_IN_BILLBOARD_");
return false;
}else{
$ret=self::$db->runSql("update sae_rank_list set v=v-$value where namespace='$namespace' and k='$key'");
if($ret===false) return false;
if(rankReturn){
return $this->getRank($namespace,$key);
}
return true;
}
}
//删除键
public function delete($namespace,$key,$rankReturn=false){
if($this->emptyName($namespace)) return false;
if($rankReturn) $r=$this->getRank($namespace,$key);
$ret=self::$db->runSql("delete from sae_rank_list where namespace='$namespace' and k='$key'");
if($ret===false){
$this->errno=-6;
$this->errmsg=Imit_L("_SAE_ERR_");
return false;
}else{
if($rankReturn) return $r;
return true;
}
}
//获得排行榜
public function getList($namespace,$order=false,$offsetFrom=0,$offsetTo=PHP_INT_MAX){
//判断是否存在
if($this->emptyName($namespace)) return false;
$ord="v asc";
//获得列表
if($order) $ord="v desc";
//判断是否有长度限制
$num=self::$db->getVar("select num from sae_rank where namespace='$namespace'");
if($num!=0){
$ord="v desc";//todu,完善和sae数据一致。
if($offsetTo>$num) $offsetTo=$num;
}
$data=self::$db->getData("select * from sae_rank_list where namespace='$namespace' order by $ord limit $offsetFrom,$offsetTo");
$ret=array();
foreach($data as $r){
$ret[$r['k']]=$r['v'];
}
$this->check($namespace);//检查过期
if($data===false){
$this->errno=-6;
$this->errmsg=Imit_L("_SAE_ERR_");
return false;
}else{
return $ret;
}
}
//获得某个键的排名
//注意排名是从0开始的
public function getRank($namespace,$key){
if($this->emptyName($namespace)) return false;
$v=self::$db->getVar("select v from sae_rank_list where namespace='$namespace' and k='$key'");
$ret=self::$db->getVar("select count(*) from sae_rank_list where namespace='$namespace' and v>=$v");
if(!$ret){
$this->errno=-3;
$this->errmsg=Imit_L("_SAE_NOT_IN_BILLBOARD_");
return false;
}
return $ret-1;
}
//增加值
public function increase($namespace,$key,$value,$rankReturn=false){
if($this->emptyName($namespace)) return false;
$this->check($namespace);
if(self::$db->getVar("select count(*) from sae_rank_list where namespace='$namespace' and k='$key'")==0){
//如果不存在
$this->errno=-3;
$this->errmsg=Imit_L("_SAE_NOT_IN_BILLBOARD_");
return false;
}else{
$ret=self::$db->runSql("update sae_rank_list set v=v+$value where namespace='$namespace' and k='$key'");
if($ret===false) return false;
if(rankReturn){
return $this->getRank($namespace,$key);
}
return true;
}
}
//设置值
public function set($namespace,$key,$value,$rankReturn=false){
//判断是否存在
if($this->emptyName($namespace)) return false;
//检查是否过期
$this->check($namespace);
//设置值
//判断是否有此key
if(self::$db->getVar("select count(*) from sae_rank_list where namespace='$namespace' and k='$key'")==0){
$setarr=array(
'namespace'=>$namespace,
'k'=>$key,
'v'=>$value
);
$ret=self::$db->runSql("insert into sae_rank_list(namespace,k,v) values('$namespace','$key','$value')");
}else{
$ret=self::$db->runSql("update sae_rank_list set v='$value' where namespace='$namespace' and k='$key'");
}
if($ret===false) return false;
if($rankReturn){
//返回排名
return $this->getRank($namespace,$key);
}
return true;
}
//判断是否为空
private function emptyName($name){
$num=self::$db->getVar("select count(*) from sae_rank where namespace='$name'");
if($num==0){
return true;
}else{
$this->errno=-4;
$this->errmsg=Imit_L("_SAE_BILLBOARD_NOT_EXISTS_");
return false;
}
}
//检查是否过期
private function check($name){
$data=self::$db->getLine("select * from sae_rank where namespace='$name'");
if($data['expire'] && $data['createtime']+$data['expire']*60<=time()){
self::$db->runSql("delete from sae_rank_list where namespace='$name'");
//重新设置创建时间
self::$db->runSql("update sae_rank set createtime='".time()."' where namespace='$name'");
}
}
}
?>
|