/** * {@inheritDoc} * * Module database table list is supposed to be updated * during module upgrade, however we don't have a feasible solution yet. * Thus module developers are encouraged to use $config['schema'] */ public function updateAction() { if ($this->skipUpgrade()) { return; } $module = $this->event->getParam('module'); $config = $this->canonizeConfig($this->config); if (isset($config['schema'])) { $schemaList = $config['schema']; } elseif (empty($config['sqlfile'])) { $schemaList = array(); } else { $sqlFile = sprintf('%s/%s/%s', Pi::path('module'), $this->event->getParam('directory'), $config['sqlfile']); if (!file_exists($sqlFile)) { $schemaList = array(); } else { $schemaList = SqlSchema::fetchSchema($sqlFile); } } $modelSchema = Pi::model('module_schema'); $rowset = $modelSchema->select(array('module' => $module)); foreach ($rowset as $row) { $name = $row->name; if (!isset($schemaList[$name])) { $row->delete(); $status = true; if (!$status) { $msg = 'Deprecated schema "%s" is not removed.'; return array('status' => false, 'message' => sprintf($msg, $name)); } } else { unset($schemaList[$row->name]); } } foreach ($schemaList as $name => $type) { $status = $modelSchema->insert(array('name' => $name, 'type' => $type, 'module' => $module)); if (!$status) { return array('status' => false, 'message' => 'Module schema is not saved.'); } } return true; }