1
0
mirror of https://github.com/phpbb/phpbb.git synced 2025-04-11 11:24:23 +02:00

Merge pull request #5557 from senky/ticket/15088

[ticket/15088] Avoid code repetitions in extension manager
This commit is contained in:
Marc Alexander 2019-07-28 10:40:58 +02:00
commit 423345d517
No known key found for this signature in database
GPG Key ID: 50E0D2423696F995
2 changed files with 56 additions and 98 deletions

View File

@ -160,6 +160,47 @@ class manager
return $this->extensions[$name]['metadata'];
}
/**
* Update the database entry for an extension
*
* @param string $name Extension name to update
* @param array $data Data to update in the database
* @param string $action Action to perform, by default 'update', may be also 'insert' or 'delete'
*/
protected function update_state($name, $data, $action = 'update')
{
switch ($action)
{
case 'insert':
$this->extensions[$name] = $data;
$this->extensions[$name]['ext_path'] = $this->get_extension_path($name);
ksort($this->extensions);
$sql = 'INSERT INTO ' . $this->extension_table . ' ' . $this->db->sql_build_array('INSERT', $data);
$this->db->sql_query($sql);
break;
case 'update':
$this->extensions[$name] = array_merge($this->extensions[$name], $data);
$sql = 'UPDATE ' . $this->extension_table . '
SET ' . $this->db->sql_build_array('UPDATE', $data) . "
WHERE ext_name = '" . $this->db->sql_escape($name) . "'";
$this->db->sql_query($sql);
break;
case 'delete':
unset($this->extensions[$name]);
$sql = 'DELETE FROM ' . $this->extension_table . "
WHERE ext_name = '" . $this->db->sql_escape($name) . "'";
$this->db->sql_query($sql);
break;
}
if ($this->cache)
{
$this->cache->purge();
}
}
/**
* Runs a step of the extension enabling process.
*
@ -197,35 +238,7 @@ class manager
'ext_state' => serialize($state),
);
$this->extensions[$name] = $extension_data;
$this->extensions[$name]['ext_path'] = $this->get_extension_path($extension_data['ext_name']);
ksort($this->extensions);
$sql = 'SELECT COUNT(ext_name) as row_count
FROM ' . $this->extension_table . "
WHERE ext_name = '" . $this->db->sql_escape($name) . "'";
$result = $this->db->sql_query($sql);
$count = $this->db->sql_fetchfield('row_count');
$this->db->sql_freeresult($result);
if ($count)
{
$sql = 'UPDATE ' . $this->extension_table . '
SET ' . $this->db->sql_build_array('UPDATE', $extension_data) . "
WHERE ext_name = '" . $this->db->sql_escape($name) . "'";
$this->db->sql_query($sql);
}
else
{
$sql = 'INSERT INTO ' . $this->extension_table . '
' . $this->db->sql_build_array('INSERT', $extension_data);
$this->db->sql_query($sql);
}
if ($this->cache)
{
$this->cache->purge();
}
$this->update_state($name, $extension_data, $this->is_configured($name) ? 'update' : 'insert');
if ($active)
{
@ -272,46 +285,15 @@ class manager
$extension = $this->get_extension($name);
$state = $extension->disable_step($old_state);
// continue until the state is false
if ($state !== false)
{
$extension_data = array(
'ext_state' => serialize($state),
);
$this->extensions[$name]['ext_state'] = serialize($state);
$sql = 'UPDATE ' . $this->extension_table . '
SET ' . $this->db->sql_build_array('UPDATE', $extension_data) . "
WHERE ext_name = '" . $this->db->sql_escape($name) . "'";
$this->db->sql_query($sql);
if ($this->cache)
{
$this->cache->purge();
}
return true;
}
$active = ($state !== false);
$extension_data = array(
'ext_active' => false,
'ext_state' => serialize(false),
'ext_active' => $active,
'ext_state' => serialize($state),
);
$this->extensions[$name]['ext_active'] = false;
$this->extensions[$name]['ext_state'] = serialize(false);
$this->update_state($name, $extension_data);
$sql = 'UPDATE ' . $this->extension_table . '
SET ' . $this->db->sql_build_array('UPDATE', $extension_data) . "
WHERE ext_name = '" . $this->db->sql_escape($name) . "'";
$this->db->sql_query($sql);
if ($this->cache)
{
$this->cache->purge();
}
return false;
return $active;
}
/**
@ -357,40 +339,16 @@ class manager
$extension = $this->get_extension($name);
$state = $extension->purge_step($old_state);
$purged = ($state === false);
$extension_data = array(
'ext_state' => serialize($state),
);
$this->update_state($name, $extension_data, $purged ? 'delete' : 'update');
// continue until the state is false
if ($state !== false)
{
$extension_data = array(
'ext_state' => serialize($state),
);
$this->extensions[$name]['ext_state'] = serialize($state);
$sql = 'UPDATE ' . $this->extension_table . '
SET ' . $this->db->sql_build_array('UPDATE', $extension_data) . "
WHERE ext_name = '" . $this->db->sql_escape($name) . "'";
$this->db->sql_query($sql);
if ($this->cache)
{
$this->cache->purge();
}
return true;
}
unset($this->extensions[$name]);
$sql = 'DELETE FROM ' . $this->extension_table . "
WHERE ext_name = '" . $this->db->sql_escape($name) . "'";
$this->db->sql_query($sql);
if ($this->cache)
{
$this->cache->purge();
}
return false;
return !$purged;
}
/**

View File

@ -234,7 +234,7 @@ class phpbb_functional_test_case extends phpbb_test_case
{
global $phpbb_root_path, $phpEx;
$config = new \phpbb\config\config(array());
$config = new \phpbb\config\config(array('version' => PHPBB_VERSION));
$db = $this->get_db();
$factory = new \phpbb\db\tools\factory();
$db_tools = $factory->get($db);