/** * Parse an XML database file and output the corresponding SQL statements. * See lib/pkp/dtd/xmlSchema.dtd for the format of the XML files. */ function execute() { require_once './lib/pkp/lib/adodb/adodb-xmlschema.inc.php'; if (in_array($this->command, array('print', 'save'))) { // Don't connect to actual database (so parser won't build upgrade XML) $conn = new DBConnection(Config::getVar('database', 'driver'), null, null, null, null, true, Config::getVar('i18n', 'connection_charset')); $dbconn = $conn->getDBConn(); } else { // Create or upgrade existing database $dbconn =& DBConnection::getConn(); } $schema = new adoSchema($dbconn); $dict =& $schema->dict; $dict->SetCharSet(Config::getVar('i18n', 'database_charset')); if ($this->type == 'schema') { // Parse XML schema files $sql = $schema->parseSchema($this->inputFile); switch ($this->command) { case 'execute': $schema->ExecuteSchema(); break; case 'save': case 'save_upgrade': $schema->SaveSQL($this->outputFile); break; case 'print': case 'print_upgrade': default: echo @$schema->PrintSQL('TEXT') . "\n"; break; } } else { if ($this->type == 'data') { // Parse XML data files $dataXMLParser = new DBDataXMLParser(); $dataXMLParser->setDBConn($dbconn); $sql = $dataXMLParser->parseData($this->inputFile); switch ($this->command) { case 'execute': $schema->addSQL($sql); $schema->ExecuteSchema(); break; case 'save': case 'save_upgrade': $schema->addSQL($sql); $schema->SaveSQL($this->outputFile); break; case 'print': case 'print_upgrade': default: $schema->addSQL($sql); echo @$schema->PrintSQL('TEXT') . "\n"; break; } $schema->destroy(); $dataXMLParser->destroy(); } } }
/** * Execute a single installer action. * @param $action array * @return boolean */ function executeAction($action) { switch ($action['type']) { case 'schema': $fileName = $action['file']; $this->log(sprintf('schema: %s', $action['file'])); require_once './lib/pkp/lib/adodb/adodb-xmlschema.inc.php'; $schemaXMLParser = new adoSchema($this->dbconn); $dict =& $schemaXMLParser->dict; $dict->SetCharSet($this->dbconn->charSet); $sql = $schemaXMLParser->parseSchema($fileName); $schemaXMLParser->destroy(); if ($sql) { return $this->executeSQL($sql); } else { $this->setError(INSTALLER_ERROR_DB, str_replace('{$file}', $fileName, __('installer.installParseDBFileError'))); return false; } break; case 'data': $fileName = $action['file']; $condition = isset($action['attr']['condition']) ? $action['attr']['condition'] : null; $includeAction = true; if ($condition) { $funcName = create_function('$installer,$action', $condition); $includeAction = $funcName($this, $action); } $this->log('data: ' . $action['file'] . ($includeAction ? '' : ' (skipped)')); if (!$includeAction) { break; } $sql = $this->dataXMLParser->parseData($fileName); // We might get an empty SQL if the upgrade script has // been executed before. if ($sql) { return $this->executeSQL($sql); } break; case 'code': $condition = isset($action['attr']['condition']) ? $action['attr']['condition'] : null; $includeAction = true; if ($condition) { $funcName = create_function('$installer,$action', $condition); $includeAction = $funcName($this, $action); } $this->log(sprintf('code: %s %s::%s' . ($includeAction ? '' : ' (skipped)'), isset($action['file']) ? $action['file'] : 'Installer', isset($action['attr']['class']) ? $action['attr']['class'] : 'Installer', $action['attr']['function'])); if (!$includeAction) { return true; } // Condition not met; skip the action. if (isset($action['file'])) { require_once $action['file']; } if (isset($action['attr']['class'])) { return call_user_func(array($action['attr']['class'], $action['attr']['function']), $this, $action['attr']); } else { return call_user_func(array(&$this, $action['attr']['function']), $this, $action['attr']); } break; case 'note': $condition = isset($action['attr']['condition']) ? $action['attr']['condition'] : null; $includeAction = true; if ($condition) { $funcName = create_function('$installer,$action', $condition); $includeAction = $funcName($this, $action); } if (!$includeAction) { break; } $this->log(sprintf('note: %s', $action['file'])); $this->notes[] = join('', file($action['file'])); break; } return true; }
/** * Called during the install process to install the plugin schema, * if applicable. * @param $hookName string * @param $args array * @return boolean */ function updateSchema($hookName, $args) { $installer =& $args[0]; $result =& $args[1]; $schemaXMLParser = new adoSchema($installer->dbconn); $dict =& $schemaXMLParser->dict; $dict->SetCharSet($installer->dbconn->charSet); $sql = $schemaXMLParser->parseSchema($this->getInstallSchemaFile()); if ($sql) { $result = $installer->executeSQL($sql); } else { $installer->setError(INSTALLER_ERROR_DB, str_replace('{$file}', $this->getInstallSchemaFile(), __('installer.installParseDBFileError'))); $result = false; } return false; }
/** * Execute a single installer action. * @param $action array * @return boolean */ function executeAction($action) { switch ($action['type']) { case 'schema': $fileName = $action['file']; $this->log(sprintf('schema: %s', $action['file'])); require_once 'adodb-xmlschema.inc.php'; $schemaXMLParser = new adoSchema($this->dbconn); $dict =& $schemaXMLParser->dict; $dict->SetCharSet($this->dbconn->charSet); $sql = $schemaXMLParser->parseSchema($fileName); $schemaXMLParser->destroy(); if ($sql) { return $this->executeSQL($sql); } else { $this->setError(INSTALLER_ERROR_DB, str_replace('{$file}', $fileName, __('installer.installParseDBFileError'))); return false; } break; case 'data': $fileName = $action['file']; $this->log(sprintf('data: %s', $action['file'])); $sql = $this->dataXMLParser->parseData($fileName); if ($sql) { return $this->executeSQL($sql); } else { $this->setError(INSTALLER_ERROR_DB, str_replace('{$file}', $fileName, __('installer.installParseDBFileError'))); return false; } break; case 'code': $this->log(sprintf('code: %s %s::%s', isset($action['file']) ? $action['file'] : 'Installer', isset($action['attr']['class']) ? $action['attr']['class'] : 'Installer', $action['attr']['function'])); if (isset($action['file'])) { require_once $action['file']; } if (isset($action['attr']['class'])) { return call_user_func(array($action['attr']['class'], $action['attr']['function']), $this); } else { return call_user_func(array(&$this, $action['attr']['function'])); } break; case 'note': $this->log(sprintf('note: %s', $action['file'])); $this->notes[] = join('', file($action['file'])); break; } return true; }