1: <?php
2: /**
3: * Implementation of the Quota API for servers keeping quota information in a
4: * custom SQL database.
5: *
6: * Copyright 2006-2007 Tomas Simonaitis <haden@homelan.lt>
7: * Copyright 2006-2012 Horde LLC (http://www.horde.org/)
8: *
9: * See the enclosed file COPYING for license information (GPL). If you
10: * did not receive this file, see http://www.horde.org/licenses/gpl.
11: *
12: * @author Tomas Simonaitis <haden@homelan.lt>
13: * @author Jan Schneider <jan@horde.org>
14: * @category Horde
15: * @license http://www.horde.org/licenses/gpl GPL
16: * @package IMP
17: */
18: class IMP_Quota_Sql extends IMP_Quota_Base
19: {
20: /**
21: * DB object.
22: *
23: * @var Horde_Db_Adapter
24: */
25: protected $_db;
26:
27: /**
28: * Constructor.
29: *
30: * @param array $params Parameters:
31: * <pre>
32: * 'db' - (Horde_Db_Adapter) [REQUIRED] The DB instance.
33: * 'query_quota' - (string) SQL query which returns single row/column with
34: * user quota (in bytes). %u is replaced with current user
35: * name, %U with the user name without the domain part, %d
36: * with the domain.
37: * 'query_used' - (string) SQL query which returns single row/column with
38: * user used space (in bytes). Placeholders are the same
39: * as in 'query_quota'.
40: * </pre>
41: *
42: * @throws InvalidArgumentException
43: */
44: public function __construct(array $params = array())
45: {
46: if (!isset($params['db'])) {
47: throw new IMP_Exception('Missing db parameter.');
48: }
49: $this->_db = $params['db'];
50: unset($params['db']);
51:
52: $params = array_merge(array(
53: 'query_quota' => null,
54: 'query_used' => null
55: ), $params);
56:
57: parent::__construct($params);
58: }
59:
60: /**
61: * Returns quota information.
62: *
63: * @return array An array with the following keys:
64: * <pre>
65: * 'limit' - Maximum quota allowed
66: * 'usage' - Currently used portion of quota (in bytes)
67: * </pre>
68: * @throws IMP_Exception
69: */
70: public function getQuota()
71: {
72: $quota = array(
73: 'limit' => 0,
74: 'usage' => 0
75: );
76:
77: if (empty($this->_params['query_quota'])) {
78: Horde::logMessage(__CLASS__ . ': query_quota SQL query not set.', 'ERR');
79: } else {
80: @list($bare_user, $domain) = explode('@', $this->_params['username'], 2);
81: $query = str_replace(array('?', '%u', '%U', '%d'),
82: array($this->_db->quote($this->_params['username']),
83: $this->_db->quote($this->_params['username']),
84: $this->_db->quote($bare_user),
85: $this->_db->quote($domain)),
86: $this->_params['query_quota']);
87: try {
88: $result = $this->_db->selectOne($query);
89: } catch (Horde_Db_Exception $e) {
90: throw new IMP_Exception($e);
91: }
92:
93: $quota['limit'] = $result;
94: }
95:
96: if (empty($this->_params['query_used'])) {
97: Horde::logMessage(__CLASS__ . ': query_used SQL query not set.', 'ERR');
98: } else {
99: @list($bare_user, $domain) = explode('@', $this->_params['username'], 2);
100: $query = str_replace(array('?', '%u', '%U', '%d'),
101: array($this->_db->quote($this->_params['username']),
102: $this->_db->quote($this->_params['username']),
103: $this->_db->quote($bare_user),
104: $this->_db->quote($domain)),
105: $this->_params['query_used']);
106: try {
107: $result = $this->_db->selectOne($query);
108: } catch (Horde_Db_Exception $e) {
109: throw new IMP_Exception($e);
110: }
111:
112: $quota['usage'] = $result;
113: }
114:
115: return $quota;
116: }
117:
118: }
119: