From 7159120b2509be8b3e3629c283425e307c720fb9 Mon Sep 17 00:00:00 2001 From: Meik Sievertsen Date: Wed, 14 Jun 2006 17:45:06 +0000 Subject: - store error result in dbal for later retrieving - use method for moving modules up/down (will be extended later to not only support an amount of 1) - utilize the module methods in installation git-svn-id: file:///svn/phpbb/trunk@6061 89ea8834-ac86-4346-8a33-228a782c2dd0 --- phpBB/includes/acp/acp_modules.php | 205 +++++++++++++++++++++---------------- phpBB/includes/db/dbal.php | 26 ++++- phpBB/install/install_install.php | 193 ++++++++++++++-------------------- 3 files changed, 213 insertions(+), 211 deletions(-) (limited to 'phpBB') diff --git a/phpBB/includes/acp/acp_modules.php b/phpBB/includes/acp/acp_modules.php index f5c7d5fd55..8f6f44f7f9 100644 --- a/phpBB/includes/acp/acp_modules.php +++ b/phpBB/includes/acp/acp_modules.php @@ -124,91 +124,13 @@ class acp_modules } $db->sql_freeresult($result); - $module_info = array($module_id => $row); + $move_module_name = $this->move_module_by($row, $action, 1); - // Get the adjacent forum - $sql = 'SELECT module_id, left_id, right_id, module_langname - FROM ' . MODULES_TABLE . " - WHERE module_class = '" . $db->sql_escape($this->module_class) . "' - AND parent_id = {$row['parent_id']} - AND " . (($action == 'move_up') ? "right_id < {$row['right_id']} ORDER BY right_id DESC" : "left_id > {$row['left_id']} ORDER BY left_id ASC"); - $result = $db->sql_query_limit($sql, 1); - - if (!($row = $db->sql_fetchrow($result))) + if ($move_module_name !== false) { - // already on top or at bottom - break; + add_log('admin', 'LOG_MODULE_' . strtoupper($action), $move_module_name); + $this->remove_cache_file(); } - $db->sql_freeresult($result); - - $module_info[$row['module_id']] = $row; - - if ($action == 'move_up') - { - $up_id = $module_id; - $down_id = $row['module_id']; - } - else - { - $up_id = $row['module_id']; - $down_id = $module_id; - } - - $move_module_name = $this->lang_name($row['module_langname']); - $diff_up = $module_info[$up_id]['right_id'] - $module_info[$up_id]['left_id']; - $diff_down = $module_info[$down_id]['right_id'] - $module_info[$down_id]['left_id']; - - $ids = array(); - - $sql = 'SELECT module_id - FROM ' . MODULES_TABLE . " - WHERE module_class = '" . $db->sql_escape($this->module_class) . "' - AND left_id > " . $module_info[$up_id]['left_id'] . ' - AND right_id < ' . $module_info[$up_id]['right_id']; - $result = $db->sql_query($sql); - - while ($row = $db->sql_fetchrow($result)) - { - $ids[] = $row['module_id']; - } - $db->sql_freeresult($result); - - // Start transaction - $db->sql_transaction('begin'); - - $sql = 'UPDATE ' . MODULES_TABLE . ' - SET left_id = left_id + ' . ($diff_up + 1) . ', right_id = right_id + ' . ($diff_up + 1) . " - WHERE module_class = '" . $db->sql_escape($this->module_class) . "' - AND left_id > " . $module_info[$down_id]['left_id'] . ' - AND right_id < ' . $module_info[$down_id]['right_id']; - $db->sql_query($sql); - - if (sizeof($ids)) - { - $sql = 'UPDATE ' . MODULES_TABLE . ' - SET left_id = left_id - ' . ($diff_down + 1) . ', right_id = right_id - ' . ($diff_down + 1) . " - WHERE module_class = '" . $db->sql_escape($this->module_class) . "' - AND module_id IN (" . implode(', ', $ids) . ')'; - $db->sql_query($sql); - } - - $sql = 'UPDATE ' . MODULES_TABLE . ' - SET left_id = ' . $module_info[$down_id]['left_id'] . ', right_id = ' . ($module_info[$down_id]['left_id'] + $diff_up) . " - WHERE module_class = '" . $db->sql_escape($this->module_class) . "' - AND module_id = $up_id"; - $db->sql_query($sql); - - $sql = 'UPDATE ' . MODULES_TABLE . ' - SET left_id = ' . ($module_info[$up_id]['right_id'] - $diff_down) . ', right_id = ' . $module_info[$up_id]['right_id'] . " - WHERE module_class = '" . $db->sql_escape($this->module_class) . "' - AND module_id = $down_id"; - $db->sql_query($sql); - - $db->sql_transaction('commit'); - - add_log('admin', 'LOG_MODULE_' . strtoupper($action), $move_module_name); - - $this->remove_cache_file(); break; @@ -781,8 +703,10 @@ class acp_modules /** * Update/Add module + * + * @param bool $run_inline if set to true errors will be returned and no logs being written */ - function update_module_data(&$module_data) + function update_module_data(&$module_data, $run_inline = false) { global $db, $user; @@ -790,8 +714,6 @@ class acp_modules { // no module_id means we're creating a new category/module - $db->sql_transaction('begin'); - if ($module_data['parent_id']) { $sql = 'SELECT left_id, right_id @@ -802,6 +724,11 @@ class acp_modules if (!$row = $db->sql_fetchrow($result)) { + if ($run_inline) + { + return 'PARENT_NO_EXIST'; + } + trigger_error($user->lang['PARENT_NO_EXIST']); } $db->sql_freeresult($result); @@ -836,11 +763,13 @@ class acp_modules $sql = 'INSERT INTO ' . MODULES_TABLE . ' ' . $db->sql_build_array('INSERT', $module_data); $db->sql_query($sql); - - $db->sql_transaction('commit'); $module_data['module_id'] = $db->sql_nextid(); - add_log('admin', 'LOG_MODULE_ADD', $this->lang_name($module_data['module_langname'])); + + if (!$run_inline) + { + add_log('admin', 'LOG_MODULE_ADD', $this->lang_name($module_data['module_langname'])); + } } else { @@ -868,7 +797,10 @@ class acp_modules AND module_id = {$module_data['module_id']}"; $db->sql_query($sql); - add_log('admin', 'LOG_MODULE_EDIT', $this->lang_name($module_data['module_langname'])); + if (!$run_inline) + { + add_log('admin', 'LOG_MODULE_EDIT', $this->lang_name($module_data['module_langname'])); + } } return array(); @@ -998,6 +930,101 @@ class acp_modules return array(); } + + /** + * Move module position by $amount up/down + * @todo support more than one step up/down (at the moment $amount needs to be 1)! + */ + function move_module_by($module_row, $action = 'move_up', $amount) + { + global $db; + + $module_id = $module_row['module_id']; + $module_info = array($module_row['module_id'] => $module_row); + + // Get the adjacent module + $sql = 'SELECT module_id, left_id, right_id, module_langname + FROM ' . MODULES_TABLE . " + WHERE module_class = '" . $db->sql_escape($this->module_class) . "' + AND parent_id = {$module_row['parent_id']} + AND " . (($action == 'move_up') ? "right_id < {$module_row['right_id']} ORDER BY right_id DESC" : "left_id > {$module_row['left_id']} ORDER BY left_id ASC"); + $result = $db->sql_query_limit($sql, 1, ($amount - 1)); + $row = $db->sql_fetchrow($result); + $db->sql_freeresult($result); + + if (!$row) + { + // already on top or at bottom + return false; + } + + $module_info[$row['module_id']] = $row; + + if ($action == 'move_up') + { + $up_id = $module_id; + $down_id = $row['module_id']; + } + else + { + $up_id = $row['module_id']; + $down_id = $module_id; + } + + $move_module_name = $this->lang_name($row['module_langname']); + $diff_up = $module_info[$up_id]['right_id'] - $module_info[$up_id]['left_id']; + $diff_down = $module_info[$down_id]['right_id'] - $module_info[$down_id]['left_id']; + + $ids = array(); + + $sql = 'SELECT module_id + FROM ' . MODULES_TABLE . " + WHERE module_class = '" . $db->sql_escape($this->module_class) . "' + AND left_id > " . $module_info[$up_id]['left_id'] . ' + AND right_id < ' . $module_info[$up_id]['right_id']; + $result = $db->sql_query($sql); + + while ($row = $db->sql_fetchrow($result)) + { + $ids[] = $row['module_id']; + } + $db->sql_freeresult($result); + + // Start transaction + $db->sql_transaction('begin'); + + $sql = 'UPDATE ' . MODULES_TABLE . ' + SET left_id = left_id + ' . ($diff_up + 1) . ', right_id = right_id + ' . ($diff_up + 1) . " + WHERE module_class = '" . $db->sql_escape($this->module_class) . "' + AND left_id > " . $module_info[$down_id]['left_id'] . ' + AND right_id < ' . $module_info[$down_id]['right_id']; + $db->sql_query($sql); + + if (sizeof($ids)) + { + $sql = 'UPDATE ' . MODULES_TABLE . ' + SET left_id = left_id - ' . ($diff_down + 1) . ', right_id = right_id - ' . ($diff_down + 1) . " + WHERE module_class = '" . $db->sql_escape($this->module_class) . "' + AND module_id IN (" . implode(', ', $ids) . ')'; + $db->sql_query($sql); + } + + $sql = 'UPDATE ' . MODULES_TABLE . ' + SET left_id = ' . $module_info[$down_id]['left_id'] . ', right_id = ' . ($module_info[$down_id]['left_id'] + $diff_up) . " + WHERE module_class = '" . $db->sql_escape($this->module_class) . "' + AND module_id = $up_id"; + $db->sql_query($sql); + + $sql = 'UPDATE ' . MODULES_TABLE . ' + SET left_id = ' . ($module_info[$up_id]['right_id'] - $diff_down) . ', right_id = ' . $module_info[$up_id]['right_id'] . " + WHERE module_class = '" . $db->sql_escape($this->module_class) . "' + AND module_id = $down_id"; + $db->sql_query($sql); + + $db->sql_transaction('commit'); + + return $move_module_name; + } } ?> \ No newline at end of file diff --git a/phpBB/includes/db/dbal.php b/phpBB/includes/db/dbal.php index e132cec706..ecfe71f1ef 100644 --- a/phpBB/includes/db/dbal.php +++ b/phpBB/includes/db/dbal.php @@ -31,7 +31,13 @@ class dbal var $user = ''; var $server = ''; var $dbname = ''; - + + // Set to true if error triggered + var $sql_error_triggered = false; + + // Holding the last sql query on sql error + var $sql_error_sql = ''; + /** * Constructor */ @@ -49,6 +55,9 @@ class dbal */ function sql_return_on_error($fail = false) { + $this->sql_error_triggered = false; + $this->sql_error_sql = ''; + $this->return_on_error = $fail; } @@ -167,6 +176,9 @@ class dbal * * Idea for this from Ikonboard * Possible query values: INSERT, INSERT_SELECT, MULTI_INSERT, UPDATE, SELECT + * + * If a key is 'module_name' and firebird used it gets adjusted to '"module_name"' + * on INSERT, INSERT_SELECT, UPDATE and SELECT */ function sql_build_array($query, $assoc_ary = false) { @@ -175,13 +187,13 @@ class dbal return false; } - $fields = array(); - $values = array(); + $fields = $values = array(); + if ($query == 'INSERT' || $query == 'INSERT_SELECT') { foreach ($assoc_ary as $key => $var) { - $fields[] = $key; + $fields[] = ($key == 'module_name' && SQL_LAYER == 'firebird') ? '"' . $key . '"' : $key; if (is_null($var)) { @@ -235,6 +247,8 @@ class dbal $values = array(); foreach ($assoc_ary as $key => $var) { + $key = ($key == 'module_name' && SQL_LAYER == 'firebird') ? '"' . $key . '"' : $key; + if (is_null($var)) { $values[] = "$key = NULL"; @@ -313,6 +327,10 @@ class dbal { global $auth, $user; + // Set var to retrieve errored status + $this->sql_error_triggered = true; + $this->sql_error_sql = $sql; + $error = $this->_sql_error(); if (!$this->return_on_error) diff --git a/phpBB/install/install_install.php b/phpBB/install/install_install.php index fc0aa675aa..192e0a7007 100755 --- a/phpBB/install/install_install.php +++ b/phpBB/install/install_install.php @@ -1136,16 +1136,10 @@ class install_install extends module /** * Populate the module tables */ - function add_modules($mode, $sub) + function add_modules() { global $db, $lang, $phpbb_root_path, $phpEx; - // Obtain any submitted data - foreach ($this->request_vars as $var) - { - $$var = request_var($var, ''); - } - include_once($phpbb_root_path . 'includes/constants.' . $phpEx); include_once($phpbb_root_path . 'includes/acp/acp_modules.' . $phpEx); @@ -1158,24 +1152,18 @@ class install_install extends module $_module = &new acp_modules(); $module_classes = array('acp', 'mcp', 'ucp'); - switch ($dbms) - { - case 'firebird': - $column_name = '"module_name"'; - break; - - default: - $column_name = 'module_name'; - } - + // Add categories foreach ($module_classes as $module_class) { $categories = array(); + // Set the module class + $_module->module_class = $module_class; + foreach ($this->module_categories[$module_class] as $cat_name => $subs) { $module_data = array( - $column_name => '', + 'module_name' => '', 'module_enabled' => 1, 'module_display' => 1, 'parent_id' => 0, @@ -1183,26 +1171,28 @@ class install_install extends module 'module_langname' => $cat_name, 'module_mode' => '', 'module_auth' => '', - - 'left_id' => 0, - 'right_id' => 0, ); - $sql = 'INSERT INTO ' . MODULES_TABLE . ' ' . $db->sql_build_array('INSERT', $module_data); - if (!$db->sql_query($sql)) + // Add category + $_module->update_module_data($module_data, true); + + // Check for last sql error happened + if ($db->sql_error_triggered) { - $error = $db->sql_error(); - $this->p_master->db_error($error['message'], $sql, __LINE__, __FILE__); + $error = $db->sql_error($db->sql_error_sql); + $this->p_master->db_error($error['message'], $db->sql_error_sql, __LINE__, __FILE__); } - $categories[$cat_name]['id'] = $db->sql_nextid(); + + $categories[$cat_name]['id'] = $module_data['module_id']; $categories[$cat_name]['parent_id'] = 0; + // Create sub-categories... if (is_array($subs)) { foreach ($subs as $level2_name) { $module_data = array( - $column_name => '', + 'module_name' => '', 'module_enabled' => 1, 'module_display' => 1, 'parent_id' => $categories[$cat_name]['id'], @@ -1210,26 +1200,24 @@ class install_install extends module 'module_langname' => $level2_name, 'module_mode' => '', 'module_auth' => '', - - 'left_id' => 0, - 'right_id' => 0, ); - $sql = 'INSERT INTO ' . MODULES_TABLE . ' ' . $db->sql_build_array('INSERT', $module_data); - if (!$db->sql_query($sql)) + $_module->update_module_data($module_data, true); + + // Check for last sql error happened + if ($db->sql_error_triggered) { - $error = $db->sql_error(); - $this->p_master->db_error($error['message'], $sql, __LINE__, __FILE__); + $error = $db->sql_error($db->sql_error_sql); + $this->p_master->db_error($error['message'], $db->sql_error_sql, __LINE__, __FILE__); } - $categories[$level2_name]['id'] = $db->sql_nextid(); + + $categories[$level2_name]['id'] = $module_data['module_id']; $categories[$level2_name]['parent_id'] = $categories[$cat_name]['id']; } } } - recalc_btree('module_id', MODULES_TABLE, $module_class); - - // Get the modules we want to add... + // Get the modules we want to add... returned sorted by name $module_info = $_module->get_module_infos('', $module_class); foreach ($module_info as $module_name => $fileinfo) @@ -1239,7 +1227,7 @@ class install_install extends module foreach ($row['cat'] as $cat_name) { $module_data = array( - $column_name => $module_name, + 'module_name' => $module_name, 'module_enabled' => 1, 'module_display' => (isset($row['display'])) ? $row['display'] : 1, 'parent_id' => $categories[$cat_name]['id'], @@ -1249,43 +1237,14 @@ class install_install extends module 'module_auth' => $row['auth'], ); - $sql = 'SELECT left_id, right_id - FROM ' . MODULES_TABLE . " - WHERE module_class = '" . $module_class . "' - AND module_id = {$module_data['parent_id']}"; - $result = $db->sql_query($sql); - - $row2 = $db->sql_fetchrow($result); - - $db->sql_freeresult($result); + $_module->update_module_data($module_data, true); - if ($categories[$cat_name]['parent_id'] || $module_class != 'acp') + // Check for last sql error happened + if ($db->sql_error_triggered) { - $sql = 'UPDATE ' . MODULES_TABLE . " - SET left_id = left_id + 2, right_id = right_id + 2 - WHERE module_class = '" . $module_class . "' - AND left_id > {$row2['right_id']}"; - $db->sql_query($sql); - - $sql = 'UPDATE ' . MODULES_TABLE . " - SET right_id = right_id + 2 - WHERE module_class = '" . $module_class . "' - AND {$row2['left_id']} BETWEEN left_id AND right_id"; - $db->sql_query($sql); + $error = $db->sql_error($db->sql_error_sql); + $this->p_master->db_error($error['message'], $db->sql_error_sql, __LINE__, __FILE__); } - else - { - $sql = 'UPDATE ' . MODULES_TABLE . " - SET left_id = left_id + 3, right_id = right_id + 3 - WHERE module_class = '" . $module_class . "' - AND left_id > {$row2['left_id']}"; - $db->sql_query($sql); - } - $module_data['left_id'] = ($categories[$cat_name]['parent_id']) ? $row2['right_id'] : $row2['left_id'] + 1; - $module_data['right_id'] = ($categories[$cat_name]['parent_id']) ? $row2['right_id'] + 1 : $row2['left_id'] + 2; - - $sql = 'INSERT INTO ' . MODULES_TABLE . ' ' . $db->sql_build_array('INSERT', $module_data); - $db->sql_query($sql); } } } @@ -1294,33 +1253,35 @@ class install_install extends module // Manage Users should ideally be the first thing you see on the Users & groups tab if ($module_class == 'acp') { - $sql = 'SELECT module_id, left_id, right_id FROM ' . MODULES_TABLE . " - WHERE module_langname = 'ACP_CAT_USERS' - AND module_class = 'acp'"; - $result = $db->sql_query_limit($sql, 1); - $row2 = $db->sql_fetchrow($result); - $db->sql_freeresult($result); - - $sql = 'UPDATE ' . MODULES_TABLE . " - SET left_id = left_id + 3, right_id = right_id + 3 - WHERE module_class = 'acp' - AND left_id > {$row2['left_id']} - AND left_id < {$row2['right_id']}"; - $db->sql_query($sql); - - $sql = 'SELECT * FROM ' . MODULES_TABLE . " - WHERE module_langname = 'ACP_MANAGE_USERS' - AND module_class = 'acp'"; - $result = $db->sql_query_limit($sql, 1); - $module_data = $db->sql_fetchrow($result); - $db->sql_freeresult($result); - - $module_data['left_id'] = $row2['left_id'] + 1; - $module_data['right_id'] = $row2['left_id'] + 2; - - $sql = 'UPDATE ' . MODULES_TABLE . ' SET ' . $db->sql_build_array('UPDATE', $module_data) . " - WHERE module_id = {$module_data['module_id']}"; - $db->sql_query($sql); + // Move main module 4 up... + for ($i = 1; $i <= 4; $i++) + { + $sql = 'SELECT * + FROM ' . MODULES_TABLE . " + WHERE module_name = 'main' + AND module_class = 'acp' + AND module_mode = 'main'"; + $result = $db->sql_query($sql); + $row = $db->sql_fetchrow($result); + $db->sql_freeresult($result); + + $_module->move_module_by($row, 'move_up', 1); + } + + // Move permissions intro screen module 4 up... + for ($i = 1; $i <= 4; $i++) + { + $sql = 'SELECT * + FROM ' . MODULES_TABLE . " + WHERE module_name = 'permissions' + AND module_class = 'acp' + AND module_mode = 'intro'"; + $result = $db->sql_query($sql); + $row = $db->sql_fetchrow($result); + $db->sql_freeresult($result); + + $_module->move_module_by($row, 'move_up', 1); + } } // And now for the special ones @@ -1340,36 +1301,31 @@ class install_install extends module { $sql = 'SELECT * FROM ' . MODULES_TABLE . " WHERE module_langname = '$mod_name' - AND module_class = '$module_class' + AND module_class = '$module_class' + AND module_name <> '' LIMIT 1"; $result = $db->sql_query($sql); $module_data = $db->sql_fetchrow($result); $db->sql_freeresult($result); - $sql = 'UPDATE ' . MODULES_TABLE . " - SET left_id = left_id + 2, right_id = right_id + 2 - WHERE module_class = '" . $module_class . "' - AND left_id > {$row2['right_id']}"; - $db->sql_query($sql); - - $sql = 'UPDATE ' . MODULES_TABLE . " - SET right_id = right_id + 2 - WHERE module_class = '" . $module_class . "' - AND {$row2['left_id']} BETWEEN left_id AND right_id"; - $db->sql_query($sql); - unset($module_data['module_id']); + unset($module_data['left_id']); + unset($module_data['right_id']); + $module_data['parent_id'] = $row2['module_id']; - $module_data['left_id'] = $row2['right_id']; - $module_data['right_id'] = $row2['right_id'] + 1; - $sql = 'INSERT INTO ' . MODULES_TABLE . ' ' . $db->sql_build_array('INSERT', $module_data); - $db->sql_query($sql); + $_module->update_module_data($module_data, true); + + // Check for last sql error happened + if ($db->sql_error_triggered) + { + $error = $db->sql_error($db->sql_error_sql); + $this->p_master->db_error($error['message'], $db->sql_error_sql, __LINE__, __FILE__); + } } } } - recalc_btree('module_id', MODULES_TABLE, $module_class); $_module->remove_cache_file(); } } @@ -1876,6 +1832,7 @@ class install_install extends module 'UCP_ZEBRA' => null, ), ); + var $module_extras = array( 'acp' => array( 'ACP_QUICK_ACCESS' => array( -- cgit v1.2.1