Completed
Push — master ( a0ceb6...422577 )
by Daniel
08:41
created

base_mapper::load()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 13
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 8
CRAP Score 2

Importance

Changes 4
Bugs 1 Features 1
Metric Value
c 4
b 1
f 1
dl 0
loc 13
ccs 8
cts 8
cp 1
rs 9.4285
cc 2
eloc 8
nc 2
nop 1
crap 2
1
<?php
2
/**
3
 *
4
 * @package sitemaker
5
 * @copyright (c) 2015 Daniel A. (blitze)
6
 * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
7
 *
8
 */
9
10
namespace blitze\sitemaker\model;
11
12
abstract class base_mapper implements mapper_interface
13
{
14
	/** @var \phpbb\db\driver\driver_interface */
15
	protected $db;
16
17
	/** @var \blitze\sitemaker\model\base_collection */
18
	protected $collection;
19
20
	/** @var \blitze\sitemaker\model\mapper_factory */
21
	protected $mapper_factory;
22
23
	/** @var string */
24
	protected $entity_table;
25
26
	/** @var string */
27
	protected $entity_class;
28
29
	/** @var string */
30
	protected $entity_pkey;
31
32
	/**
33
	 * Constructor
34
	 *
35
	 * @param \phpbb\db\driver\driver_interface				$db					Database object
36
	 * @param \blitze\sitemaker\model\base_collection		$collection			Entity collection
37
	 * @param \blitze\sitemaker\model\mapper_factory		$mapper_factory		Mapper factory object
38
	 * @param string										$entity_table
39
	 */
40 117
	public function  __construct(\phpbb\db\driver\driver_interface $db, \blitze\sitemaker\model\base_collection $collection, \blitze\sitemaker\model\mapper_factory $mapper_factory, $entity_table)
41
	{
42 117
		$this->db = $db;
43 117
		$this->collection = $collection;
44 117
		$this->mapper_factory = $mapper_factory;
45 117
		$this->entity_table = $entity_table;
46 117
	}
47
48
	/**
49
	 * Get the collection
50
	 */
51
	public function get_collection()
52
	{
53
		return $this->collection;
54
	}
55
56
	/**
57
	* {@inheritdoc}
58
	*/
59 55
	public function load(array $condition = array())
60
	{
61 55
		$sql_where = $this->get_condition($condition);
62 55
		$results = $this->db->sql_query($this->find_sql($sql_where));
63 55
		$row = $this->db->sql_fetchrow($results);
64 55
		$this->db->sql_freeresult($results);
65
66
		if ($row)
67 55
		{
68 44
			return $this->create_entity($row);
69
		}
70 19
		return null;
71
	}
72
73
	/**
74
	* {@inheritdoc}
75
	*/
76 42
	public function find(array $condition = array())
77
	{
78 42
		$sql_where = $this->get_condition($condition);
79 42
		$results = $this->db->sql_query($this->find_sql($sql_where));
80 42
		$this->collection->clear();
81
82 42
		while ($row = $this->db->sql_fetchrow($results))
83
		{
84 39
			$this->collection[$row[$this->entity_pkey]] = $this->create_entity($row);
85 39
		}
86 42
		$this->db->sql_freeresult($results);
87
88 42
		return $this->collection;
89
	}
90
91
	/**
92
	* {@inheritdoc}
93
	*/
94 26
	public function save(\blitze\sitemaker\model\entity_interface $entity)
95
	{
96 26
		$accessor = 'get_' . $this->entity_pkey;
97 26
		if (is_null($entity->$accessor()))
98 26
		{
99 11
			$entity = $this->insert($entity);
100 11
		}
101
		else
102
		{
103 16
			$this->update($entity);
104
		}
105
106 25
		return $entity;
107
	}
108
109
	/**
110
	* {@inheritdoc}
111
	*/
112 15
	public function delete($condition)
113
	{
114 15
		if ($condition instanceof $this->entity_class)
115 15
		{
116 10
			$accessor = 'get_' . $this->entity_pkey;
117 10
			$condition = array($this->entity_pkey, '=', $condition->$accessor());
118 10
		}
119
120 15
		$sql_where = $this->get_condition($condition);
0 ignored issues
show
Bug introduced by
It seems like $condition defined by parameter $condition on line 112 can also be of type object<blitze\sitemaker\model\entity_interface>; however, blitze\sitemaker\model\b...mapper::get_condition() does only seem to accept array, maybe add an additional type check?

This check looks at variables that have been passed in as parameters and are passed out again to other methods.

If the outgoing method call has stricter type requirements than the method itself, an issue is raised.

An additional type check may prevent trouble.

Loading history...
121 15
		$this->db->sql_query('DELETE FROM ' . $this->entity_table . (sizeof($sql_where) ? ' WHERE ' . join(' AND ', $sql_where) : ''));
122 15
	}
123
124
	/**
125
	 * {@inheritdoc}
126
	 */
127 71
	public function create_entity(array $row)
128
	{
129 71
		return new $this->entity_class($row);
130
	}
131
132
	/**
133
	 * Insert a new row in the table corresponding to the specified entity
134
	 * @param \blitze\sitemaker\model\entity_interface $entity
135
	 * @return \blitze\sitemaker\model\entity_interface
136
	 * @throws \blitze\sitemaker\exception\unexpected_value
137
	 */
138 11
	protected function insert(\blitze\sitemaker\model\entity_interface $entity)
139
	{
140 11
		if ($entity instanceof $this->entity_class)
141 11
		{
142 11
			$this->db->sql_query('INSERT INTO ' . $this->entity_table . ' ' . $this->db->sql_build_array('INSERT', $entity->to_db()));
143
144 11
			$mutator = 'set_' . $this->entity_pkey;
145 11
			$entity->$mutator((int) $this->db->sql_nextid());
146
147 11
			return $entity;
148
		}
149
150
		throw new \blitze\sitemaker\exception\unexpected_value('INVALID_ENTITY');
151
	}
152
153
	/**
154
	 * Update the row in the table corresponding to the specified entity
155
	 * @param \blitze\sitemaker\model\entity_interface $entity
156
	 * @return mixed
157
	 * @throws \blitze\sitemaker\exception\unexpected_value
158
	 */
159 16
	protected function update(\blitze\sitemaker\model\entity_interface $entity)
160
	{
161 16
		if ($entity instanceof $this->entity_class)
162 16
		{
163 16
			$accessor = 'get_' . $this->entity_pkey;
164
165 16
			return $this->db->sql_query('UPDATE ' . $this->entity_table . '
166 16
				SET ' . $this->db->sql_build_array('UPDATE', $entity->to_db()) . '
167 15
				WHERE ' . $this->entity_pkey . ' = ' . (int) $entity->$accessor());
168
		}
169
170
		throw new \blitze\sitemaker\exception\unexpected_value('INVALID_ENTITY');
171
	}
172
173
	/**
174
	 * @param array $sql_where
175
	 * @return string
176
	 */
177 28
	protected function find_sql(array $sql_where)
178
	{
179 28
		return 'SELECT * FROM ' . $this->entity_table .
180 28
			(sizeof($sql_where) ? ' WHERE ' . join(' AND ', $sql_where) : '');
181
	}
182
183
	/**
184
	 * @param array $condition
185
	 * @return array
186
	 */
187 107
	protected function get_condition(array $condition)
188
	{
189 107
		$sql_where = array();
190 107
		$condition = $this->ensure_multi_array($condition);
191
192 107
		foreach ($condition as $info)
193
		{
194 78
			list($field, $operator, $value) = $info;
195
196 78
			switch (gettype($value))
197
			{
198 78
				case 'array':
199 9
					$sql_where[] = $this->db->sql_in_set($field, $value, ($operator == '=') ? false : true);
200 9
				break;
201 78
				case 'string':
202 23
					$sql_where[] = $field . " $operator '" . $this->db->sql_escape($value) . "'";
203 23
				break;
204 77
				case 'boolean':
205 77
				case 'integer':
206 77
					$sql_where[] = $field . " $operator " . (int) $value;
207 77
				break;
208 78
			}
209 107
		}
210
211 107
		return $sql_where;
212
	}
213
214
	/**
215
	 * @param array $condition
216
	 * @return mixed
217
	 */
218 107
	protected function ensure_multi_array(array $condition)
219
	{
220 107
		return array_filter((is_array(current($condition))) ? $condition : array($condition));
221
	}
222
}
223