DiscuzX/upload/source/class/discuz/discuz_table.php

247 lines
6.9 KiB
PHP

<?php
/**
* [Discuz!] (C)2001-2099 Comsenz Inc.
* This is NOT a freeware, use is subject to license terms
*
* $Id: discuz_table.php 30321 2012-05-22 09:09:35Z zhangguosheng $
*/
if(!defined('IN_DISCUZ')) {
exit('Access Denied');
}
class discuz_table extends discuz_base
{
public $data = array();
public $methods = array();
protected $_table;
protected $_pk;
protected $_pre_cache_key;
protected $_cache_ttl;
protected $_allowmem;
public function __construct($para = array()) {
if(!empty($para)) {
$this->_table = $para['table'];
$this->_pk = $para['pk'];
}
if(isset($this->_pre_cache_key) && (($ttl = getglobal('setting/memory/'.$this->_table)) !== null || ($ttl = $this->_cache_ttl) !== null) && memory('check')) {
$this->_cache_ttl = $ttl;
$this->_allowmem = true;
}
$this->_init_extend();
parent::__construct();
}
public function getTable() {
return $this->_table;
}
public function setTable($name) {
return $this->_table = $name;
}
public function count() {
$count = (int) DB::result_first("SELECT count(*) FROM ".DB::table($this->_table));
return $count;
}
public function update($val, $data, $unbuffered = false, $low_priority = false) {
if(isset($val) && !empty($data) && is_array($data)) {
$this->checkpk();
$ret = DB::update($this->_table, $data, DB::field($this->_pk, $val), $unbuffered, $low_priority);
foreach((array)$val as $id) {
$this->update_cache($id, $data);
}
return $ret;
}
return !$unbuffered ? 0 : false;
}
public function delete($val, $unbuffered = false) {
$ret = false;
if(isset($val)) {
$this->checkpk();
$ret = DB::delete($this->_table, DB::field($this->_pk, $val), null, $unbuffered);
$this->clear_cache($val);
}
return $ret;
}
public function truncate() {
DB::query("TRUNCATE ".DB::table($this->_table));
}
public function insert($data, $return_insert_id = false, $replace = false, $silent = false) {
return DB::insert($this->_table, $data, $return_insert_id, $replace, $silent);
}
public function checkpk() {
if(!$this->_pk) {
throw new DbException('Table '.$this->_table.' has not PRIMARY KEY defined');
}
}
public function fetch($id, $force_from_db = false){
$data = array();
if(!empty($id)) {
if($force_from_db || ($data = $this->fetch_cache($id)) === false) {
$data = DB::fetch_first('SELECT * FROM '.DB::table($this->_table).' WHERE '.DB::field($this->_pk, $id));
if(!empty($data)) $this->store_cache($id, $data);
}
}
return $data;
}
public function fetch_all($ids, $force_from_db = false) {
$data = array();
if(!empty($ids)) {
if($force_from_db || ($data = $this->fetch_cache($ids)) === false || count($ids) != count($data)) {
if(is_array($data) && !empty($data)) {
$ids = array_diff($ids, array_keys($data));
}
if($data === false) $data =array();
if(!empty($ids)) {
$query = DB::query('SELECT * FROM '.DB::table($this->_table).' WHERE '.DB::field($this->_pk, $ids));
while($value = DB::fetch($query)) {
$data[$value[$this->_pk]] = $value;
$this->store_cache($value[$this->_pk], $value);
}
}
}
}
return $data;
}
public function fetch_all_field(){
$data = false;
$query = DB::query('SHOW FIELDS FROM '.DB::table($this->_table), '', 'SILENT');
if($query) {
$data = array();
while($value = DB::fetch($query)) {
$data[$value['Field']] = $value;
}
}
return $data;
}
public function range($start = 0, $limit = 0, $sort = '') {
if($sort) {
$this->checkpk();
}
return DB::fetch_all('SELECT * FROM '.DB::table($this->_table).($sort ? ' ORDER BY '.DB::order($this->_pk, $sort) : '').DB::limit($start, $limit), null, $this->_pk ? $this->_pk : '');
}
public function optimize() {
DB::query('OPTIMIZE TABLE '.DB::table($this->_table), 'SILENT');
}
public function fetch_cache($ids, $pre_cache_key = null) {
$data = false;
if($this->_allowmem) {
if($pre_cache_key === null) $pre_cache_key = $this->_pre_cache_key;
$data = memory('get', $ids, $pre_cache_key);
}
return $data;
}
public function store_cache($id, $data, $cache_ttl = null, $pre_cache_key = null) {
$ret = false;
if($this->_allowmem) {
if($pre_cache_key === null) $pre_cache_key = $this->_pre_cache_key;
if($cache_ttl === null) $cache_ttl = $this->_cache_ttl;
$ret = memory('set', $id, $data, $cache_ttl, $pre_cache_key);
}
return $ret;
}
public function clear_cache($ids, $pre_cache_key = null) {
$ret = false;
if($this->_allowmem) {
if($pre_cache_key === null) $pre_cache_key = $this->_pre_cache_key;
$ret = memory('rm', $ids, $pre_cache_key);
}
return $ret;
}
public function update_cache($id, $data, $cache_ttl = null, $pre_cache_key = null) {
$ret = false;
if($this->_allowmem) {
if($pre_cache_key === null) $pre_cache_key = $this->_pre_cache_key;
if($cache_ttl === null) $cache_ttl = $this->_cache_ttl;
if(($_data = memory('get', $id, $pre_cache_key)) !== false) {
$ret = $this->store_cache($id, array_merge($_data, $data), $cache_ttl, $pre_cache_key);
}
}
return $ret;
}
public function update_batch_cache($ids, $data, $cache_ttl = null, $pre_cache_key = null) {
$ret = false;
if($this->_allowmem) {
if($pre_cache_key === null) $pre_cache_key = $this->_pre_cache_key;
if($cache_ttl === null) $cache_ttl = $this->_cache_ttl;
if(($_data = memory('get', $ids, $pre_cache_key)) !== false) {
foreach($_data as $id => $value) {
$ret = $this->store_cache($id, array_merge($value, $data), $cache_ttl, $pre_cache_key);
}
}
}
return $ret;
}
public function reset_cache($ids, $pre_cache_key = null) {
$ret = false;
if($this->_allowmem) {
$keys = array();
if(($cache_data = $this->fetch_cache($ids, $pre_cache_key)) !== false) {
$keys = array_intersect(array_keys($cache_data), $ids);
unset($cache_data);
}
if(!empty($keys)) {
$this->fetch_all($keys, true);
$ret = true;
}
}
return $ret;
}
public function increase_cache($ids, $data, $cache_ttl = null, $pre_cache_key = null) {
if($this->_allowmem) {
if(($cache_data = $this->fetch_cache($ids, $pre_cache_key)) !== false) {
foreach($cache_data as $id => $one) {
foreach($data as $key => $value) {
if(is_array($value)) {
$one[$key] = $value[0];
} else {
$one[$key] = $one[$key] + ($value);
}
}
$this->store_cache($id, $one, $cache_ttl, $pre_cache_key);
}
}
}
}
public function __toString() {
return $this->_table;
}
protected function _init_extend() {
}
public function attach_before_method($name, $fn) {
$this->methods[$name][0][] = $fn;
}
public function attach_after_method($name, $fn) {
$this->methods[$name][1][] = $fn;
}
}
?>