<?php

/**
 *      [Discuz!] (C)2001-2099 Comsenz Inc.
 *      This is NOT a freeware, use is subject to license terms
 *
 *      $Id: table_forum_attachment.php 36278 2016-12-09 07:52:35Z nemohou $
 */

if(!defined('IN_DISCUZ')) {
	exit('Access Denied');
}

class table_forum_attachment extends discuz_table
{
	private $_tableids = array();

	public function __construct() {

		$this->_table = 'forum_attachment';
		$this->_pk    = 'aid';
		$this->_pre_cache_key = 'forum_attachment_';
		$this->_cache_ttl = 0;

		parent::__construct();
	}

	public function update_download($aid, $count = 1) {
		$this->clear_cache($aid);
		return DB::query("UPDATE %t SET downloads=downloads+%d WHERE aid IN (%n)", array($this->_table, $count, (array)$aid), false, true);
	}

	public function fetch_all_by_id($idtype, $ids, $orderby = '') {
		$attachments = array();
		if($orderby) {
			$orderby = 'ORDER BY '.DB::order($orderby, 'DESC');
		}
		if(in_array($idtype, array('aid', 'tid', 'pid', 'uid')) && $ids) {
			$query = DB::query("SELECT * FROM %t WHERE %i IN (%n) %i", array($this->_table, $idtype, (array)$ids, $orderby));
			while($value = DB::fetch($query)) {
				$attachments[$value['aid']] = $value;
				$this->_tableids[$value['tableid']][] = $value['aid'];
			}
		}
		return $attachments;
	}

	public function delete_by_id($idtype, $ids) {
		if(in_array($idtype, array('aid', 'tid', 'pid', 'uid')) && $ids) {
			DB::query('DELETE FROM %t WHERE %i IN (%n)', array($this->_table, $idtype, (array)$ids), false, true);
		}
	}

	public function update_by_id($idtype, $ids, $newtid) {
		if(in_array($idtype, array('tid', 'pid')) && $ids) {
			DB::query("UPDATE %t SET tid=%d,tableid=%d WHERE %i IN (%n)", array($this->_table, $newtid, getattachtableid($newtid), $idtype, (array)$ids), false, true);
		}
	}

	public function count_by_tid($tid) {
		return $tid ? DB::result_first("SELECT COUNT(*) FROM %t WHERE tid=%d", array($this->_table, $tid)) : 0;
	}

	public function fetch_by_aid_uid($aid, $uid) {
		$query = DB::query("SELECT * FROM %t WHERE aid=%d AND uid=%d", array($this->_table, $aid, $uid));
		return DB::fetch($query);
	}

	public function fetch_all_unused_attachment($uid, $aids = null, $posttime = null) {
		$parameter = array($this->_table);
		$wherearr = array();
		if($aids !== null) {
			$parameter[] = $aids;
			$wherearr[] = is_array($aids) ? 'a.aid IN(%n)' : 'a.aid=%d';
		}
		$parameter[] = $uid;
		$wherearr[] = 'af.uid=%d';
		$wherearr[] = 'a.tid=0';

		if($posttime !== null) {
			$parameter[] = $posttime;
			$wherearr[] = "af.dateline>%d";
		}
		$wheresql = !empty($wherearr) && is_array($wherearr) ? ' WHERE '.implode(' AND ', $wherearr) : '';
		return DB::fetch_all("SELECT a.*, af.* FROM %t a INNER JOIN ".DB::table('forum_attachment_unused')." af USING(aid) $wheresql ORDER BY a.aid DESC", $parameter);
	}

	public function get_tableids() {
		return $this->_tableids;
	}

	public function fetch_all_for_manage($tableid, $inforum = '', $authorid = 0, $filename = '', $keyword = '', $sizeless = 0, $sizemore = 0, $dlcountless = 0, $dlcountmore = 0, $daysold = 0, $count = 0, $start = 0, $limit = 0) {
		$sql = "1";
		if(!is_numeric($tableid) || $tableid < 0 || $tableid > 9) {
			return;
		}
		if($inforum) {
			$sql .= is_numeric($inforum) ? " AND t.fid=".DB::quote($inforum) : '';
			$sql .= $inforum == 'isgroup' ? ' AND t.isgroup=\'1\'' : ' AND t.isgroup=\'0\'';
		}
		if($authorid) {
			$sql .= " AND a.uid=".DB::quote($authorid);
		}
		if($filename) {
			$sql .= " AND a.filename LIKE ".DB::quote('%'.$filename.'%');
		}
		if($keyword) {
			$sqlkeywords = $or = '';
			foreach(explode(',', str_replace(' ', '', $keyword)) as $keyword) {
				$sqlkeywords .= " $or a.description LIKE ".DB::quote('%'.$keyword.'%');
				$or = 'OR';
			}
			$sql .= " AND ($sqlkeywords)";
		}
		$sql .= $sizeless ? " AND a.filesize>'$sizeless'" : '';
		$sql .= $sizemore ? " AND a.filesize<'$sizemore' " : '';
		$sql .= $dlcountless ? " AND ai.downloads<'$dlcountless'" : '';
		$sql .= $dlcountmore ? " AND ai.downloads>'$dlcountmore'" : '';
		$sql .= $daysold ? " AND a.dateline<'".(TIMESTAMP - intval($daysold) * 86400)."'" : '';
		if($count) {
			return DB::result_first("SELECT COUNT(*)
				FROM ". DB::table('forum_attachment_'.$tableid)." a
				INNER JOIN ".DB::table('forum_attachment')." ai USING(aid)
				INNER JOIN ".DB::table('forum_thread')." t
				INNER JOIN ".DB::table('forum_forum')." f
				WHERE t.tid=a.tid AND f.fid=t.fid AND t.displayorder>='0' AND $sql");
		}
		return DB::fetch_all("SELECT a.*, ai.downloads, t.fid, t.tid, t.subject, f.name AS fname
				FROM ". DB::table('forum_attachment_'.$tableid)." a
				INNER JOIN ".DB::table('forum_attachment')." ai USING(aid)
				INNER JOIN ".DB::table('forum_thread')." t
				INNER JOIN ".DB::table('forum_forum')." f
				WHERE t.tid=a.tid AND f.fid=t.fid AND t.displayorder>='0' AND $sql ORDER BY a.aid DESC ".DB::limit($start, $limit));
	}

}

?>