| 1 |
nanocaio |
1.1 |
<?php |
| 2 |
nanocaio |
1.1 |
/********************************************* |
| 3 |
nanocaio |
1.1 |
Dragonfly CMS, Copyright (c) 2004 by DragonflyCMS Dev. Team. |
| 4 |
nanocaio |
1.1 |
http://dragonflycms.org |
| 5 |
nanocaio |
1.1 |
  |
| 6 |
nanocaio |
1.1 |
Dragonfly is released under the terms and conditions |
| 7 |
nanocaio |
1.1 |
of the GNU GPL version 2 or any later version |
| 8 |
nanocaio |
1.1 |
  |
| 9 |
nanocaio |
1.2 |
$Source: /cvs/html/includes/classes/installer_module.php,v $ |
| 10 |
nanocaio |
10.7 |
$Revision: 10.6 $ |
| 11 |
nanocaio |
10.7 |
$Author: nanocaiordo $ |
| 12 |
nanocaio |
10.7 |
$Date: 2012/03/26 01:32:50 $ |
| 13 |
nanocaio |
1.1 |
**********************************************/ |
| 14 |
nanocaio |
1.1 |
  |
| 15 |
nanocaio |
10.2 |
class Installer_Module extends Installer |
| 16 |
nanocaio |
1.1 |
{ |
| 17 |
nanocaio |
1.1 |
  |
| 18 |
nanocaio |
10.2 |
public $error; |
| 19 |
nanocaio |
10.2 |
  |
| 20 |
nanocaio |
10.2 |
protected $module; |
| 21 |
nanocaio |
10.2 |
protected $id; |
| 22 |
nanocaio |
10.2 |
protected $name; |
| 23 |
nanocaio |
10.2 |
protected $path; |
| 24 |
nanocaio |
10.2 |
  |
| 25 |
nanocaio |
10.2 |
public function __construct($name, $bypass=false) |
| 26 |
nanocaio |
1.2 |
{ |
| 27 |
nanocaio |
10.2 |
if (!preg_match('#^[a-z0-9_\-]+$#i', $name)) { |
| 28 |
nanocaio |
10.2 |
return trigger_error('Module install error', E_USER_); |
| 29 |
nanocaio |
1.1 |
} |
| 30 |
nanocaio |
10.2 |
$this->path = MODULE_PATH.$name.DS.'install'.DS; |
| 31 |
nanocaio |
10.2 |
if (is_file($this->path .'cpg_inst.php')) { |
| 32 |
nanocaio |
10.2 |
require($this->path .'cpg_inst.php'); |
| 33 |
nanocaio |
10.2 |
if (!class_exists($name)) { |
| 34 |
nanocaio |
10.2 |
$this->error = 'Cannot continue, mismatch between module name and installer class name.'; |
| 35 |
nanocaio |
10.2 |
return; |
| 36 |
nanocaio |
10.2 |
} |
| 37 |
nanocaio |
10.2 |
} else { |
| 38 |
nanocaio |
10.2 |
$this->error = 'Cannot continue, module installer is missing.'; |
| 39 |
nanocaio |
10.2 |
return; |
| 40 |
nanocaio |
10.2 |
} |
| 41 |
nanocaio |
10.2 |
parent::__construct($bypass); |
| 42 |
nanocaio |
10.2 |
$this->name = $name; |
| 43 |
nanocaio |
10.2 |
$this->module = new $name(); |
| 44 |
nanocaio |
10.2 |
if (!$this->bypass && isset($this->module->bypass)) { $this->bypass = $this->module->bypass; } |
| 45 |
nanocaio |
10.2 |
if (!$this->test && isset($this->module->test)) { $this->test = $this->module->test; } |
| 46 |
nanocaio |
10.2 |
return true; |
| 47 |
nanocaio |
10.2 |
} |
| 48 |
nanocaio |
10.2 |
  |
| 49 |
nanocaio |
10.2 |
public function add_module() |
| 50 |
nanocaio |
10.2 |
{ |
| 51 |
nanocaio |
10.2 |
global $db, $prefix; |
| 52 |
nanocaio |
10.2 |
try { |
| 53 |
nanocaio |
10.2 |
$db->begin(); |
| 54 |
nanocaio |
10.4 |
$this->module->pre_install() && $this->module->exec(); |
| 55 |
nanocaio |
10.2 |
if (false === $this->sync_from_file('schema')) { |
| 56 |
nanocaio |
10.2 |
return; |
| 57 |
nanocaio |
1.1 |
} |
| 58 |
nanocaio |
10.2 |
$db->commit(); |
| 59 |
nanocaio |
10.2 |
$db->begin(); |
| 60 |
nanocaio |
10.2 |
if (false === $this->sync_from_file('data')) { |
| 61 |
nanocaio |
10.2 |
return; |
| 62 |
nanocaio |
10.2 |
} |
| 63 |
nanocaio |
10.2 |
$this->id = $db->insert('modules', array('title'=>$this->name, 'uninstall'=>1, 'version'=>$this->module->version), 'mid'); |
| 64 |
nanocaio |
10.2 |
$this->sync_config() || $this->sync_radmin() || $this->sync_blocks() || $this->sync_userconfig(); |
| 65 |
nanocaio |
10.4 |
$this->exec() && $this->module->post_install() && $this->module->exec(); |
| 66 |
nanocaio |
10.2 |
$db->commit(); |
| 67 |
nanocaio |
10.2 |
} catch (Poodle_SQL_Exception $e) { |
| 68 |
nanocaio |
10.7 |
$this->error = $e->__tostring(); |
| 69 |
nanocaio |
10.2 |
$this->rollback(); |
| 70 |
nanocaio |
10.4 |
$this->module->rollback(); |
| 71 |
nanocaio |
10.2 |
$db->query("DELETE FROM {$prefix}_modules WHERE title='{$this->name}'"); |
| 72 |
nanocaio |
10.2 |
return; |
| 73 |
nanocaio |
1.1 |
} |
| 74 |
nanocaio |
10.2 |
return true; |
| 75 |
nanocaio |
10.2 |
} |
| 76 |
nanocaio |
10.2 |
  |
| 77 |
nanocaio |
10.2 |
public function upgrade_module($prev_version) |
| 78 |
nanocaio |
10.2 |
{ |
| 79 |
nanocaio |
10.2 |
global $db, $prefix; |
| 80 |
nanocaio |
10.2 |
try { |
| 81 |
nanocaio |
10.2 |
$db->begin(); |
| 82 |
nanocaio |
10.4 |
$this->module->pre_upgrade($prev_version) && $this->module->exec(); |
| 83 |
nanocaio |
10.6 |
if (false === $this->sync_from_file('data')) { |
| 84 |
nanocaio |
10.6 |
return; |
| 85 |
nanocaio |
10.6 |
} |
| 86 |
nanocaio |
10.6 |
$db->commit(); |
| 87 |
nanocaio |
10.6 |
  |
| 88 |
nanocaio |
10.2 |
$db->begin(); |
| 89 |
nanocaio |
10.2 |
$this->sync_config() || $this->sync_radmin() || $this->sync_userconfig(); |
| 90 |
nanocaio |
10.4 |
$this->exec() && $this->module->post_upgrade($prev_version) && $this->module->exec(); |
| 91 |
nanocaio |
10.2 |
$db->query('UPDATE '.$prefix."_modules SET version='".$this->module->version."' WHERE title='{$this->name}'"); |
| 92 |
nanocaio |
10.2 |
$db->commit(); |
| 93 |
nanocaio |
10.2 |
} catch (Poodle_SQL_Exception $e) { |
| 94 |
nanocaio |
10.7 |
$this->error = $e->__tostring(); |
| 95 |
nanocaio |
10.2 |
$this->rollback(); |
| 96 |
nanocaio |
10.4 |
$this->module->rollback(); |
| 97 |
nanocaio |
10.2 |
$db->query('UPDATE '.$prefix."_modules SET version='".$prev_version."' WHERE title='{$this->name}'"); |
| 98 |
nanocaio |
10.2 |
return; |
| 99 |
nanocaio |
10.2 |
} |
| 100 |
nanocaio |
10.2 |
return true; |
| 101 |
nanocaio |
10.2 |
} |
| 102 |
nanocaio |
10.2 |
  |
| 103 |
nanocaio |
10.2 |
public function remove_module() |
| 104 |
nanocaio |
10.2 |
{ |
| 105 |
nanocaio |
10.2 |
global $db, $prefix, $CPG_SESS; |
| 106 |
nanocaio |
10.2 |
$CPG_SESS['admin']['uninstall'] = ''; |
| 107 |
nanocaio |
10.2 |
unset($CPG_SESS['admin']['uninstall']); |
| 108 |
nanocaio |
10.2 |
try { |
| 109 |
nanocaio |
10.2 |
$db->begin(); |
| 110 |
nanocaio |
10.4 |
$this->module->pre_uninstall() && $this->module->exec(); |
| 111 |
nanocaio |
10.3 |
foreach ($this->module->dbtables as $table) { |
| 112 |
nanocaio |
10.2 |
$this->add_query('DROP', $table); |
| 113 |
nanocaio |
1.2 |
} |
| 114 |
nanocaio |
10.2 |
if ($this->module->config) { |
| 115 |
nanocaio |
10.2 |
$this->add_query('DELETE', 'config_custom', "cfg_name='".strtolower($this->name)."'"); |
| 116 |
nanocaio |
10.2 |
} |
| 117 |
nanocaio |
10.2 |
if ($this->module->radmin) { |
| 118 |
nanocaio |
10.2 |
$this->drop_radmin('radmin'.strtolower($this->name)); |
| 119 |
nanocaio |
10.2 |
} |
| 120 |
nanocaio |
10.2 |
$this->exec(); |
| 121 |
nanocaio |
10.2 |
if ($this->id = $db->sql_fetchrow($db->sql_query('SELECT mid FROM '.$prefix."_modules WHERE title='{$this->name}'"))) { |
| 122 |
nanocaio |
10.2 |
$this->id = $this->id[0]; |
| 123 |
nanocaio |
10.2 |
$db->query('DELETE FROM '.$prefix.'_blocks_custom WHERE mid='.$this->id); |
| 124 |
nanocaio |
10.2 |
} |
| 125 |
nanocaio |
10.2 |
$db->query('DELETE FROM '.$prefix."_modules WHERE title='{$this->name}'"); |
| 126 |
nanocaio |
10.2 |
$db->commit(); |
| 127 |
nanocaio |
10.4 |
$this->module->post_uninstall() && $this->module->exec(); |
| 128 |
nanocaio |
10.2 |
$db->optimize('modules'); |
| 129 |
nanocaio |
10.2 |
if ($this->module->config) { $db->optimize('config_custom'); } |
| 130 |
nanocaio |
10.2 |
if ($this->module->blocks) { $db->optimize('blocks_custom'); } |
| 131 |
nanocaio |
10.2 |
} catch (Poodle_SQL_Exception $e) { |
| 132 |
nanocaio |
10.7 |
$this->error = $e->__tostring(); |
| 133 |
nanocaio |
10.2 |
$this->rollback(); |
| 134 |
nanocaio |
10.4 |
$this->module->rollback(); |
| 135 |
nanocaio |
10.4 |
$this->rollback(); |
| 136 |
nanocaio |
10.2 |
return; |
| 137 |
nanocaio |
1.2 |
} |
| 138 |
nanocaio |
10.2 |
return true; |
| 139 |
nanocaio |
1.1 |
} |
| 140 |
nanocaio |
1.1 |
  |
| 141 |
nanocaio |
10.2 |
public function sync_from_file($file) |
| 142 |
nanocaio |
1.2 |
{ |
| 143 |
nanocaio |
10.2 |
global $db; |
| 144 |
nanocaio |
10.2 |
if ('schema' !== $file && 'data' !== $file) return; |
| 145 |
nanocaio |
10.2 |
if (!is_file($this->path .$file .'.xml')) return; |
| 146 |
djmaze |
10.5 |
if ($db->XML->syncSchemaFromFile($this->path .$file .'.xml')) { |
| 147 |
nanocaio |
10.2 |
foreach ($db->XML->queries as $query) { |
| 148 |
nanocaio |
10.2 |
$db->query($query); |
| 149 |
nanocaio |
10.2 |
} |
| 150 |
nanocaio |
10.2 |
} else { |
| 151 |
nanocaio |
10.2 |
$this->error = print_r('<pre>'.$db->XML->errors.'</pre>', true); |
| 152 |
nanocaio |
10.2 |
return false; |
| 153 |
nanocaio |
1.1 |
} |
| 154 |
nanocaio |
10.2 |
return true; |
| 155 |
nanocaio |
10.2 |
} |
| 156 |
nanocaio |
10.2 |
  |
| 157 |
nanocaio |
10.2 |
public function sync_config() { |
| 158 |
nanocaio |
10.2 |
global $db, $prefix; |
| 159 |
nanocaio |
10.4 |
if (!empty($this->module->config) && is_array($this->module->config)) { |
| 160 |
nanocaio |
10.2 |
$sql = array(); |
| 161 |
nanocaio |
10.2 |
foreach ($this->module->config as $field => $value) { |
| 162 |
nanocaio |
10.2 |
if (preg_match('#^[a-z0-9_\-]+$#i', $field)) { |
| 163 |
nanocaio |
10.2 |
$sql[] = "('{$this->name}', '{$field}', ".$db->quote($value).")"; |
| 164 |
nanocaio |
10.2 |
} |
| 165 |
nanocaio |
1.1 |
} |
| 166 |
nanocaio |
10.2 |
$this->add_query( |
| 167 |
nanocaio |
10.2 |
'INSERT_MULTIPLE', |
| 168 |
nanocaio |
10.2 |
'config_custom', |
| 169 |
nanocaio |
10.2 |
array ( |
| 170 |
nanocaio |
10.2 |
'cfg_name, cfg_field, cfg_value', |
| 171 |
nanocaio |
10.2 |
implode(',', $sql) |
| 172 |
nanocaio |
10.2 |
), |
| 173 |
nanocaio |
10.2 |
"cfg_name='{$this->name}'" |
| 174 |
nanocaio |
10.2 |
); |
| 175 |
nanocaio |
1.1 |
} |
| 176 |
nanocaio |
1.1 |
} |
| 177 |
nanocaio |
1.2 |
  |
| 178 |
nanocaio |
10.2 |
public function sync_radmin() { |
| 179 |
nanocaio |
10.2 |
$radmin = 'radmin' .strtolower($this->name); |
| 180 |
nanocaio |
10.3 |
if (isset($this->module->radmin) && $this->module->radmin && !isset($_SESSION['CPG_ADMIN'][$radmin])) { |
| 181 |
nanocaio |
10.2 |
$this->add_radmin($radmin); |
| 182 |
nanocaio |
10.3 |
} elseif ((!isset($this->module->radmin) || !$this->module->radmin) && isset($_SESSION['CPG_ADMIN'][$radmin])) { |
| 183 |
nanocaio |
10.2 |
$this->drop_radmin($radmin); |
| 184 |
nanocaio |
10.2 |
} |
| 185 |
nanocaio |
10.2 |
} |
| 186 |
djmaze |
10.5 |
  |
| 187 |
nanocaio |
10.3 |
private function add_radmin($radmin) |
| 188 |
nanocaio |
1.3 |
{ |
| 189 |
nanocaio |
10.2 |
$this->add_query('ADD', 'admins', array($radmin, 'INT1(1)', false, 0)); |
| 190 |
nanocaio |
10.2 |
unset($_SESSION['CPG_ADMIN']); |
| 191 |
nanocaio |
10.2 |
} |
| 192 |
djmaze |
10.5 |
  |
| 193 |
nanocaio |
10.3 |
private function drop_radmin($radmin) |
| 194 |
nanocaio |
10.2 |
{ |
| 195 |
nanocaio |
10.2 |
$this->add_query('DEL', 'admins', $radmin, array($radmin, 'INT1(1)', false, 0)); |
| 196 |
nanocaio |
10.2 |
unset($_SESSION['CPG_ADMIN']); |
| 197 |
nanocaio |
10.2 |
} |
| 198 |
nanocaio |
10.2 |
  |
| 199 |
nanocaio |
10.2 |
public function sync_blocks() { |
| 200 |
nanocaio |
10.2 |
global $db, $prefix; |
| 201 |
nanocaio |
10.3 |
if (isset($this->module->blocks) && $this->module->blocks) { |
| 202 |
nanocaio |
10.2 |
$result = $db->query('SELECT bid, bposition FROM '.$prefix.'_blocks WHERE active=1'); |
| 203 |
nanocaio |
10.2 |
if ($result->num_rows) { |
| 204 |
nanocaio |
10.2 |
$in_modules = array(); |
| 205 |
nanocaio |
10.2 |
$l = $c = $r = $d = 1; |
| 206 |
nanocaio |
10.2 |
while ($row = $result->fetch_row()) { |
| 207 |
nanocaio |
10.2 |
$in_modules[] = "({$row[0]}, {$this->id}, '{$row[1]}', ".$$row[1].")"; |
| 208 |
nanocaio |
10.2 |
++$$row[1]; |
| 209 |
nanocaio |
10.2 |
} |
| 210 |
nanocaio |
10.2 |
$this->add_query( |
| 211 |
nanocaio |
10.2 |
'INSERT_MULTIPLE', |
| 212 |
nanocaio |
10.2 |
'blocks_custom', |
| 213 |
nanocaio |
10.2 |
array ( |
| 214 |
nanocaio |
10.2 |
'bid, mid, side, weight', |
| 215 |
nanocaio |
10.2 |
implode(',', $in_modules) |
| 216 |
nanocaio |
10.2 |
), |
| 217 |
nanocaio |
10.2 |
'mid='.$this->id |
| 218 |
nanocaio |
10.2 |
); |
| 219 |
nanocaio |
10.2 |
} |
| 220 |
nanocaio |
10.2 |
$result->free(); |
| 221 |
nanocaio |
1.3 |
} |
| 222 |
nanocaio |
10.2 |
} |
| 223 |
nanocaio |
10.2 |
  |
| 224 |
nanocaio |
10.2 |
public function sync_userconfig() { |
| 225 |
nanocaio |
10.4 |
if (!empty($this->module->userconfig) && is_array($this->module->userconfig)) {} |
| 226 |
nanocaio |
1.3 |
} |
| 227 |
nanocaio |
1.3 |
  |
| 228 |
nanocaio |
1.2 |
public function __get($key) |
| 229 |
nanocaio |
1.2 |
{ |
| 230 |
nanocaio |
10.2 |
$allowed = array('radmin', 'version', 'name', 'description', 'author', 'website'); |
| 231 |
nanocaio |
1.1 |
if (in_array($key, $allowed)) { return $this->$key; } |
| 232 |
nanocaio |
1.1 |
  |
| 233 |
nanocaio |
1.1 |
} |
| 234 |
djmaze |
10.5 |
} |