|
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); |
|
|
|
|
|
|
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
|
|
|
|
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.