Completed
Push — develop-3.2.x ( dcd8c5...afa453 )
by Matt
04:15 queued 02:03
created

similar_topics::forum_available()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 4
rs 10
c 0
b 0
f 0
cc 1
eloc 2
nc 1
nop 1
1
<?php
2
/**
3
 *
4
 * Precise Similar Topics
5
 *
6
 * @copyright (c) 2013 Matt Friedman
7
 * @license GNU General Public License, version 2 (GPL-2.0)
8
 *
9
 */
10
11
namespace vse\similartopics\core;
12
13
class similar_topics
14
{
15
	/** @var \phpbb\auth\auth */
16
	protected $auth;
17
18
	/** @var \phpbb\cache\service */
19
	protected $cache;
20
21
	/** @var \phpbb\config\config */
22
	protected $config;
23
24
	/** @var \phpbb\db\driver\driver_interface */
25
	protected $db;
26
27
	/** @var \phpbb\event\dispatcher_interface */
28
	protected $dispatcher;
29
30
	/** @var \phpbb\language\language */
31
	protected $langauge;
32
33
	/** @var \phpbb\pagination */
34
	protected $pagination;
35
36
	/** @var \phpbb\request\request */
37
	protected $request;
38
39
	/** @var \phpbb\template\template */
40
	protected $template;
41
42
	/** @var \phpbb\user */
43
	protected $user;
44
45
	/** @var \phpbb\content_visibility */
46
	protected $content_visibility;
47
48
	/** @var string phpBB root path  */
49
	protected $root_path;
50
51
	/** @var string PHP file extension */
52
	protected $php_ext;
53
54
	/**
55
	 * Constructor
56
	 *
57
	 * @access public
58
	 * @param \phpbb\auth\auth                  $auth
59
	 * @param \phpbb\cache\service              $cache
60
	 * @param \phpbb\config\config              $config
61
	 * @param \phpbb\db\driver\driver_interface $db
62
	 * @param \phpbb\event\dispatcher_interface $dispatcher
63
	 * @param \phpbb\language\language          $language
64
	 * @param \phpbb\pagination                 $pagination
65
	 * @param \phpbb\request\request            $request
66
	 * @param \phpbb\template\template          $template
67
	 * @param \phpbb\user                       $user
68
	 * @param \phpbb\content_visibility         $content_visibility
69
	 * @param string                            $root_path
70
	 * @param string                            $php_ext
71
	 */
72
	public function __construct(\phpbb\auth\auth $auth, \phpbb\cache\service $cache, \phpbb\config\config $config, \phpbb\db\driver\driver_interface $db, \phpbb\event\dispatcher_interface $dispatcher, \phpbb\language\language $language, \phpbb\pagination $pagination, \phpbb\request\request $request, \phpbb\template\template $template, \phpbb\user $user, \phpbb\content_visibility $content_visibility, $root_path, $php_ext)
73
	{
74
		$this->auth = $auth;
75
		$this->cache = $cache;
76
		$this->config = $config;
77
		$this->db = $db;
78
		$this->dispatcher = $dispatcher;
79
		$this->language = $language;
0 ignored issues
show
Bug introduced by
The property language does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
80
		$this->pagination = $pagination;
81
		$this->request = $request;
82
		$this->template = $template;
83
		$this->user = $user;
84
		$this->content_visibility = $content_visibility;
85
		$this->root_path = $root_path;
86
		$this->php_ext = $php_ext;
87
	}
88
89
	/**
90
	 * Is similar topics available?
91
	 *
92
	 * @access public
93
	 * @return bool True if available, false otherwise
94
	 */
95
	public function is_available()
96
	{
97
		return $this->is_enabled() && $this->is_viewable() && $this->is_mysql();
98
	}
99
100
	/**
101
	 * Is similar topics configured?
102
	 *
103
	 * @access public
104
	 * @return bool True if configured, false otherwise
105
	 */
106
	public function is_enabled()
107
	{
108
		return !empty($this->config['similar_topics']) && !empty($this->config['similar_topics_limit']);
109
	}
110
111
	/**
112
	 * Is similar topics viewable bu the user?
113
	 *
114
	 * @access public
115
	 * @return bool True if viewable, false otherwise
116
	 */
117
	public function is_viewable()
118
	{
119
		return !empty($this->user->data['user_similar_topics']) && $this->auth->acl_get('u_similar_topics');
120
	}
121
122
	/**
123
	 * Get similar topics by matching topic titles
124
	 *
125
	 * NOTE: Currently requires MySQL due to the use of FULLTEXT indexes
126
	 * and MATCH and AGAINST and UNIX_TIMESTAMP. MySQL FULLTEXT has built-in
127
	 * English ignore words. We use phpBB's ignore words for non-English
128
	 * languages. We also remove any admin-defined special ignore words.
129
	 *
130
	 * @access public
131
	 * @param array $topic_data Array with topic data
132
	 */
133
	public function display_similar_topics($topic_data)
134
	{
135
		// If the forum should not display similar topics, no need to continue
136
		if ($topic_data['similar_topics_hide'])
137
		{
138
			return;
139
		}
140
141
		$topic_title = $this->clean_topic_title($topic_data['topic_title']);
142
143
		// If the cleaned up topic_title is empty, no need to continue
144
		if (empty($topic_title))
145
		{
146
			return;
147
		}
148
149
		// Similar Topics query
150
		$sql_array = array(
151
			'SELECT'	=> "f.forum_id, f.forum_name, t.*,
152
				MATCH (t.topic_title) AGAINST ('" . $this->db->sql_escape($topic_title) . "') AS score",
153
154
			'FROM'		=> array(
155
				TOPICS_TABLE	=> 't',
156
			),
157
			'LEFT_JOIN'	=> array(
158
				array(
159
					'FROM'	=>	array(FORUMS_TABLE	=> 'f'),
160
					'ON'	=> 'f.forum_id = t.forum_id',
161
				),
162
			),
163
			'WHERE'		=> "MATCH (t.topic_title) AGAINST ('" . $this->db->sql_escape($topic_title) . "') >= 0.5
164
				AND t.topic_status <> " . ITEM_MOVED . '
165
				AND t.topic_visibility = ' . ITEM_APPROVED . '
166
				AND t.topic_time > (UNIX_TIMESTAMP() - ' . $this->config['similar_topics_time'] . ')
167
				AND t.topic_id <> ' . (int) $topic_data['topic_id'],
168
			//'GROUP_BY'	=> 't.topic_id',
0 ignored issues
show
Unused Code Comprehensibility introduced by
67% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
169
			//'ORDER_BY'	=> 'score DESC', // this is done automatically by MySQL when not using IN BOOLEAN MODE
0 ignored issues
show
Unused Code Comprehensibility introduced by
58% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
170
		);
171
172
		// Add topic tracking data to the query (only if query caching is off)
173
		if ($this->user->data['is_registered'] && $this->config['load_db_lastread'] && !$this->config['similar_topics_cache'])
174
		{
175
			$sql_array['LEFT_JOIN'][] = array('FROM' => array(TOPICS_TRACK_TABLE => 'tt'), 'ON' => 'tt.topic_id = t.topic_id AND tt.user_id = ' . $this->user->data['user_id']);
176
			$sql_array['LEFT_JOIN'][] = array('FROM' => array(FORUMS_TRACK_TABLE => 'ft'), 'ON' => 'ft.forum_id = f.forum_id AND ft.user_id = ' . $this->user->data['user_id']);
177
			$sql_array['SELECT'] .= ', tt.mark_time, ft.mark_time as f_mark_time';
178
		}
179
		else if ($this->config['load_anon_lastread'] || $this->user->data['is_registered'])
180
		{
181
			// Cookie based tracking copied from search.php
182
			$tracking_topics = $this->request->variable($this->config['cookie_name'] . '_track', '', true, \phpbb\request\request_interface::COOKIE);
183
			$tracking_topics = $tracking_topics ? tracking_unserialize($tracking_topics) : array();
184
		}
185
186
		// We need to exclude passworded forums so we do not leak the topic title
187
		$passworded_forums = $this->user->get_passworded_forums();
188
189
		// See if the admin set this forum to only search a specific group of other forums, and include them
190
		if (!empty($topic_data['similar_topic_forums']))
191
		{
192
			// Remove any passworded forums from this group of forums we will be searching
193
			$included_forums = array_diff(json_decode($topic_data['similar_topic_forums'], true), $passworded_forums);
194
			// if there's nothing left to display (user has no access to the forums we want to search)
195
			if (empty($included_forums))
196
			{
197
				return;
198
			}
199
200
			$sql_array['WHERE'] .= ' AND ' . $this->db->sql_in_set('f.forum_id', $included_forums);
201
		}
202
		// Otherwise exclude any ignored forums
203
		else
204
		{
205
			// Remove any passworded forums
206
			if (sizeof($passworded_forums))
207
			{
208
				$sql_array['WHERE'] .= ' AND ' . $this->db->sql_in_set('f.forum_id', $passworded_forums, true);
209
			}
210
211
			$sql_array['WHERE'] .= ' AND f.similar_topics_ignore = 0';
212
		}
213
214
		/**
215
		 * Event to modify the sql_array for similar topics
216
		 *
217
		 * @event vse.similartopics.get_topic_data
218
		 * @var array sql_array SQL array to get similar topics data
219
		 * @since 1.3.0
220
		 */
221
		$vars = array('sql_array');
222
		extract($this->dispatcher->trigger_event('vse.similartopics.get_topic_data', compact($vars)));
0 ignored issues
show
Bug introduced by
$this->dispatcher->trigg..._data', compact($vars)) cannot be passed to extract() as the parameter $var_array expects a reference.
Loading history...
223
224
		$sql = $this->db->sql_build_query('SELECT', $sql_array);
225
		$result = $this->db->sql_query_limit($sql, $this->config['similar_topics_limit'], 0, $this->config['similar_topics_cache']);
226
227
		// Grab icons
228
		$icons = $this->cache->obtain_icons();
229
230
		$rowset = array();
231
232
		while ($row = $this->db->sql_fetchrow($result))
233
		{
234
			$similar_forum_id = (int) $row['forum_id'];
235
			$similar_topic_id = (int) $row['topic_id'];
236
			$rowset[$similar_topic_id] = $row;
237
238
			if ($this->auth->acl_get('f_read', $similar_forum_id))
239
			{
240
				// Get topic tracking info
241
				if ($this->user->data['is_registered'] && $this->config['load_db_lastread'] && !$this->config['similar_topics_cache'])
242
				{
243
					$topic_tracking_info = get_topic_tracking($similar_forum_id, $similar_topic_id, $rowset, array($similar_forum_id => $row['f_mark_time']));
244
				}
245
				else if ($this->config['load_anon_lastread'] || $this->user->data['is_registered'])
246
				{
247
					$topic_tracking_info = get_complete_topic_tracking($similar_forum_id, $similar_topic_id);
248
249
					if (!$this->user->data['is_registered'])
250
					{
251
						$this->user->data['user_lastmark'] = isset($tracking_topics['l']) ? ((int) base_convert($tracking_topics['l'], 36, 10) + (int) $this->config['board_startdate']) : 0;
252
					}
253
				}
254
255
				// Replies
256
				$replies = $this->content_visibility->get_count('topic_posts', $row, $similar_forum_id) - 1;
257
258
				// Get folder img, topic status/type related information
259
				$folder_img = $folder_alt = $topic_type = '';
260
				$unread_topic = isset($topic_tracking_info[$similar_topic_id]) && $row['topic_last_post_time'] > $topic_tracking_info[$similar_topic_id];
261
				topic_status($row, $replies, $unread_topic, $folder_img, $folder_alt, $topic_type);
262
263
				$topic_unapproved = $row['topic_visibility'] == ITEM_UNAPPROVED && $this->auth->acl_get('m_approve', $similar_forum_id);
264
				$posts_unapproved = $row['topic_visibility'] == ITEM_APPROVED && $row['topic_posts_unapproved'] && $this->auth->acl_get('m_approve', $similar_forum_id);
265
				//$topic_deleted = $row['topic_visibility'] == ITEM_DELETED;
0 ignored issues
show
Unused Code Comprehensibility introduced by
47% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
266
				$u_mcp_queue = ($topic_unapproved || $posts_unapproved) ? append_sid("{$this->root_path}mcp.{$this->php_ext}", 'i=queue&amp;mode=' . ($topic_unapproved ? 'approve_details' : 'unapproved_posts') . "&amp;t=$similar_topic_id", true, $this->user->session_id) : '';
267
				//$u_mcp_queue = (!$u_mcp_queue && $topic_deleted) ? append_sid("{$this->root_path}mcp.{$this->php_ext}", "i=queue&amp;mode=deleted_topics&amp;t=$similar_topic_id", true, $this->user->session_id) : $u_mcp_queue;
0 ignored issues
show
Unused Code Comprehensibility introduced by
60% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
268
269
				$base_url = append_sid("{$this->root_path}viewtopic.{$this->php_ext}", 'f=' . $similar_forum_id . '&amp;t=' . $similar_topic_id);
270
271
				$topic_row = array(
272
					'TOPIC_AUTHOR_FULL'		=> get_username_string('full', $row['topic_poster'], $row['topic_first_poster_name'], $row['topic_first_poster_colour']),
273
					'FIRST_POST_TIME'		=> $this->user->format_date($row['topic_time']),
274
					'LAST_POST_TIME'		=> $this->user->format_date($row['topic_last_post_time']),
275
					'LAST_POST_AUTHOR_FULL'	=> get_username_string('full', $row['topic_last_poster_id'], $row['topic_last_poster_name'], $row['topic_last_poster_colour']),
276
277
					'TOPIC_REPLIES'			=> $replies,
278
					'TOPIC_VIEWS'			=> $row['topic_views'],
279
					'TOPIC_TITLE'			=> censor_text($row['topic_title']),
280
					'FORUM_TITLE'			=> $row['forum_name'],
281
282
					'TOPIC_IMG_STYLE'		=> $folder_img,
283
					'TOPIC_FOLDER_IMG'		=> $this->user->img($folder_img, $folder_alt),
284
					'TOPIC_FOLDER_IMG_ALT'	=> $this->language->lang($folder_alt),
285
286
					'TOPIC_ICON_IMG'		=> (!empty($icons[$row['icon_id']])) ? $icons[$row['icon_id']]['img'] : '',
287
					'TOPIC_ICON_IMG_WIDTH'	=> (!empty($icons[$row['icon_id']])) ? $icons[$row['icon_id']]['width'] : '',
288
					'TOPIC_ICON_IMG_HEIGHT'	=> (!empty($icons[$row['icon_id']])) ? $icons[$row['icon_id']]['height'] : '',
289
					'ATTACH_ICON_IMG'		=> ($this->auth->acl_get('u_download') && $this->auth->acl_get('f_download', $similar_forum_id) && $row['topic_attachment']) ? $this->user->img('icon_topic_attach', $this->language->lang('TOTAL_ATTACHMENTS')) : '',
290
					'UNAPPROVED_IMG'		=> ($topic_unapproved || $posts_unapproved) ? $this->user->img('icon_topic_unapproved', $topic_unapproved ? 'TOPIC_UNAPPROVED' : 'POSTS_UNAPPROVED') : '',
291
292
					'S_UNREAD_TOPIC'		=> $unread_topic,
293
					'S_TOPIC_REPORTED'		=> !empty($row['topic_reported']) && $this->auth->acl_get('m_report', $similar_forum_id),
294
					'S_TOPIC_UNAPPROVED'	=> $topic_unapproved,
295
					'S_POSTS_UNAPPROVED'	=> $posts_unapproved,
296
					//'S_TOPIC_DELETED'		=> $topic_deleted,
0 ignored issues
show
Unused Code Comprehensibility introduced by
67% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
297
					'S_HAS_POLL'			=> (bool) $row['poll_start'],
298
299
					'U_NEWEST_POST'			=> append_sid("{$this->root_path}viewtopic.{$this->php_ext}", 'f=' . $similar_forum_id . '&amp;t=' . $similar_topic_id . '&amp;view=unread') . '#unread',
300
					'U_LAST_POST'			=> append_sid("{$this->root_path}viewtopic.{$this->php_ext}", 'f=' . $similar_forum_id . '&amp;t=' . $similar_topic_id . '&amp;p=' . $row['topic_last_post_id']) . '#p' . $row['topic_last_post_id'],
301
					'U_VIEW_TOPIC'			=> append_sid("{$this->root_path}viewtopic.{$this->php_ext}", 'f=' . $similar_forum_id . '&amp;t=' . $similar_topic_id),
302
					'U_VIEW_FORUM'			=> append_sid("{$this->root_path}viewforum.{$this->php_ext}", 'f=' . $similar_forum_id),
303
					'U_MCP_REPORT'			=> append_sid("{$this->root_path}mcp.{$this->php_ext}", 'i=reports&amp;mode=reports&amp;f=' . $similar_forum_id . '&amp;t=' . $similar_topic_id, true, $this->user->session_id),
304
					'U_MCP_QUEUE'			=> $u_mcp_queue,
305
				);
306
307
				/**
308
				 * Event to modify the similar topics template block
309
				 *
310
				 * @event vse.similartopics.modify_topicrow
311
				 * @var array row       Array with similar topic data
312
				 * @var array topic_row Template block array
313
				 * @since 1.3.0
314
				 */
315
				$vars = array('row', 'topic_row');
316
				extract($this->dispatcher->trigger_event('vse.similartopics.modify_topicrow', compact($vars)));
0 ignored issues
show
Bug introduced by
$this->dispatcher->trigg...icrow', compact($vars)) cannot be passed to extract() as the parameter $var_array expects a reference.
Loading history...
317
318
				$this->template->assign_block_vars('similar', $topic_row);
319
320
				$this->pagination->generate_template_pagination($base_url, 'similar.pagination', 'start', $replies + 1, $this->config['posts_per_page'], 1, true, true);
321
			}
322
		}
323
324
		$this->db->sql_freeresult($result);
325
326
		$this->language->add_lang('similar_topics', 'vse/similartopics');
327
328
		$this->template->assign_vars(array(
329
			'L_SIMILAR_TOPICS'	=> $this->language->lang('SIMILAR_TOPICS'),
330
			'NEWEST_POST_IMG'	=> $this->user->img('icon_topic_newest', 'VIEW_NEWEST_POST'),
331
			'LAST_POST_IMG'		=> $this->user->img('icon_topic_latest', 'VIEW_LATEST_POST'),
332
			'REPORTED_IMG'		=> $this->user->img('icon_topic_reported', 'TOPIC_REPORTED'),
333
			//'DELETED_IMG'		=> $this->user->img('icon_topic_deleted', 'TOPIC_DELETED'),
0 ignored issues
show
Unused Code Comprehensibility introduced by
69% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
334
			'POLL_IMG'			=> $this->user->img('icon_topic_poll', 'TOPIC_POLL'),
335
			'S_PST_BRANCH'		=> phpbb_version_compare(max($this->config['phpbb_version'], PHPBB_VERSION), '3.2.0-dev', '<') ? '31x' : '32x',
336
		));
337
	}
338
339
	/**
340
	 * Clean topic title (and if needed, ignore-words)
341
	 *
342
	 * @access public
343
	 * @param string $text The topic title
344
	 * @return string The topic title
345
	 */
346
	public function clean_topic_title($text)
347
	{
348
		// Strip quotes, ampersands
349
		$text = str_replace(array('&quot;', '&amp;'), '', $text);
350
351
		if (!$this->english_lang() || $this->has_ignore_words())
352
		{
353
			$text = $this->strip_stop_words($text);
354
		}
355
356
		return $text;
357
	}
358
359
	/**
360
	 * Remove any non-english and/or custom defined ignore-words
361
	 *
362
	 * @access protected
363
	 * @param string $text The topic title
364
	 * @return string The topic title
365
	 */
366
	protected function strip_stop_words($text)
367
	{
368
		$words = array();
369
370
		// Retrieve a language dependent list of words to be ignored (method copied from search.php)
371
		$search_ignore_words = "{$this->user->lang_path}{$this->user->lang_name}/search_ignore_words.{$this->php_ext}";
372
		if (!$this->english_lang() && file_exists($search_ignore_words))
373
		{
374
			include($search_ignore_words);
375
		}
376
377
		if ($this->has_ignore_words())
378
		{
379
			// Merge any custom defined ignore words from the ACP to the stop-words array
380
			$words = array_merge($this->make_word_array($this->config['similar_topics_words']), $words);
381
		}
382
383
		// Remove stop-words from the topic title text
384
		$words = array_diff($this->make_word_array($text), $words);
385
386
		// Convert our words array back to a string
387
		return implode(' ', $words);
388
	}
389
390
	/**
391
	 * Helper function to split string into an array of words
392
	 *
393
	 * @access protected
394
	 * @param string $text String of plain text words
395
	 * @return array Array of plaintext words
396
	 */
397
	protected function make_word_array($text)
398
	{
399
		// Strip out any non-alpha-numeric characters using PCRE regex syntax
400
		$text = trim(preg_replace('#[^\p{L}\p{N}]+#u', ' ', $text));
401
402
		$words = explode(' ', utf8_strtolower($text));
403
		foreach ($words as $key => $word)
404
		{
405
			// Strip words of 2 characters or less
406
			if (utf8_strlen(trim($word)) < 3)
407
			{
408
				unset($words[$key]);
409
			}
410
		}
411
412
		return $words;
413
	}
414
415
	/**
416
	 * Check if English is the current user's language
417
	 *
418
	 * @access protected
419
	 * @return bool True if lang is 'en' or 'en_us', false otherwise
420
	 */
421
	protected function english_lang()
422
	{
423
		return ($this->user->lang_name === 'en' || $this->user->lang_name === 'en_us');
424
	}
425
426
	/**
427
	 * Check if custom ignore words have been defined for similar topics
428
	 *
429
	 * @access protected
430
	 * @return bool True or false
431
	 */
432
	protected function has_ignore_words()
433
	{
434
		return !empty($this->config['similar_topics_words']);
435
	}
436
437
	/**
438
	 * Check if the database layer is MySQL4 or later
439
	 *
440
	 * @access protected
441
	 * @return bool True is MySQL4 or later, false otherwise
442
	 */
443
	protected function is_mysql()
444
	{
445
		return ($this->db->get_sql_layer() === 'mysql4' || $this->db->get_sql_layer() === 'mysqli');
446
	}
447
}
448