diff options
author | Joas Schilling <nickvergessen@gmx.de> | 2013-04-16 23:09:21 +0200 |
---|---|---|
committer | Joas Schilling <nickvergessen@gmx.de> | 2013-04-16 23:09:21 +0200 |
commit | 57a05e7cf509f56309591aaf9344226a8f1a9a8e (patch) | |
tree | 5cb1698cd3a4263f3c815db82536ae55da7a7b36 /phpBB/includes/nestedset/forum.php | |
parent | 0d5efcc1d569b3907eebfacef84ac0be3fd11143 (diff) | |
download | forums-57a05e7cf509f56309591aaf9344226a8f1a9a8e.tar forums-57a05e7cf509f56309591aaf9344226a8f1a9a8e.tar.gz forums-57a05e7cf509f56309591aaf9344226a8f1a9a8e.tar.bz2 forums-57a05e7cf509f56309591aaf9344226a8f1a9a8e.tar.xz forums-57a05e7cf509f56309591aaf9344226a8f1a9a8e.zip |
[ticket/11495] Add forum implementation of nestedset
PHPBB3-11495
Diffstat (limited to 'phpBB/includes/nestedset/forum.php')
-rw-r--r-- | phpBB/includes/nestedset/forum.php | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/phpBB/includes/nestedset/forum.php b/phpBB/includes/nestedset/forum.php new file mode 100644 index 0000000000..7ad4d2c85e --- /dev/null +++ b/phpBB/includes/nestedset/forum.php @@ -0,0 +1,121 @@ +<?php +/** +* +* @package Nested Set +* @copyright (c) 2013 phpBB Group +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 +* +*/ + +/** +* @ignore +*/ +if (!defined('IN_PHPBB')) +{ + exit; +} + +class phpbb_nestedset_forum extends phpbb_nestedset_base +{ + /** @var phpbb_db_driver */ + protected $db; + + /** @var phpbb_lock_db */ + protected $lock; + + /** @var String */ + protected $table_name; + + /** @var String */ + protected $item_class = 'phpbb_nestedset_item_forum'; + + /** + * Column names in the table + * @var array + */ + protected $table_columns = array( + 'item_id' => 'forum_id', + 'left_id' => 'left_id', + 'right_id' => 'right_id', + 'parent_id' => 'parent_id', + 'item_parents' => 'forum_parents', + ); + + /** + * Additional SQL restrictions + * Allows to have multiple nestedsets in one table + * Columns must be prefixed with %1$s + * @var String + */ + protected $sql_where = ''; + + /** + * List of item properties to be cached in $item_parents + * @var array + */ + protected $item_basic_data = array('forum_id', 'forum_name', 'forum_type'); + + /** + * Construct + * + * @param phpbb_db_driver $db Database connection + * @param phpbb_lock_db $lock Lock class used to lock the table when moving forums around + * @param string $table_name Table name + */ + public function __construct(phpbb_db_driver $db, phpbb_lock_db $lock, $table_name) + { + $this->db = $db; + $this->lock = $lock; + $this->table_name = $table_name; + } + + /** + * @inheritdoc + */ + public function move_children(phpbb_nestedset_item_interface $current_parent, phpbb_nestedset_item_interface $new_parent) + { + while (!$this->lock->acquire()) + { + // Retry after 0.2 seconds + usleep(200 * 1000); + } + + try + { + $return = parent::move_children($current_parent, $new_parent); + } + catch (phpbb_nestedset_exception $e) + { + $this->lock->release(); + throw new phpbb_nestedset_exception('FORUM_NESTEDSET_' . $e->getMessage()); + } + $this->lock->release(); + + return $return; + } + + /** + * @inheritdoc + */ + public function set_parent(phpbb_nestedset_item_interface $item, phpbb_nestedset_item_interface $new_parent) + { + while (!$this->lock->acquire()) + { + // Retry after 0.2 seconds + usleep(200 * 1000); + } + + try + { + $return = parent::set_parent($item, $new_parent); + } + catch (phpbb_nestedset_exception $e) + { + $this->lock->release(); + throw new phpbb_nestedset_exception('FORUM_NESTEDSET_' . $e->getMessage()); + } + $this->lock->release(); + + return $return; + } +} |