Page MenuHomePhorge

No OneTemporary

diff --git a/resources/sql/patches/059.engines.php b/resources/sql/patches/059.engines.php
new file mode 100644
index 0000000000..765d89263b
--- /dev/null
+++ b/resources/sql/patches/059.engines.php
@@ -0,0 +1,47 @@
+<?php
+
+/*
+ * Copyright 2011 Facebook, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+$conn = $schema_conn;
+
+$tables = queryfx_all(
+ $conn,
+ "SELECT TABLE_SCHEMA db, TABLE_NAME tbl
+ FROM information_schema.TABLES s
+ WHERE s.TABLE_SCHEMA LIKE %>
+ AND s.TABLE_NAME != 'search_documentfield'
+ AND s.ENGINE != 'InnoDB'",
+ 'phabricator_');
+
+if (!$tables) {
+ return;
+}
+
+echo "There are ".count($tables)." tables using the MyISAM engine. These will ".
+ "now be converted to InnoDB. This process may take a few minutes, please ".
+ "be patient.\n";
+
+foreach ($tables as $table) {
+ $name = $table['db'].'.'.$table['tbl'];
+ echo "Converting {$name}...\n";
+ queryfx(
+ $conn,
+ "ALTER TABLE %T.%T ENGINE=InnoDB",
+ $table['db'],
+ $table['tbl']);
+}
+echo "Done!\n";
diff --git a/scripts/sql/upgrade_schema.php b/scripts/sql/upgrade_schema.php
index 10d0159885..04bc25efab 100755
--- a/scripts/sql/upgrade_schema.php
+++ b/scripts/sql/upgrade_schema.php
@@ -1,196 +1,201 @@
#!/usr/bin/env php
<?php
/*
* Copyright 2011 Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
$root = dirname(dirname(dirname(__FILE__)));
require_once $root.'/scripts/__init_script__.php';
require_once $root.'/scripts/__init_env__.php';
phutil_require_module('phutil', 'console');
phutil_require_module('phabricator', 'infrastructure/setup/sql');
define('SCHEMA_VERSION_TABLE_NAME', 'schema_version');
// TODO: getopt() is super terrible, move to something less terrible.
$options = getopt('fhv:u:p:') + array(
'v' => null, // Upgrade from specific version
'u' => null, // Override MySQL User
'p' => null, // Override MySQL Pass
);
foreach (array('h', 'f') as $key) {
// By default, these keys are set to 'false' to indicate that the flag was
// passed.
if (array_key_exists($key, $options)) {
$options[$key] = true;
}
}
if (!empty($options['h']) || ($options['v'] && !is_numeric($options['v']))) {
usage();
}
if (empty($options['f'])) {
echo phutil_console_wrap(
"Before running this script, you should take down the Phabricator web ".
"interface and stop any running Phabricator daemons.");
if (!phutil_console_confirm('Are you ready to continue?')) {
echo "Cancelled.\n";
exit(1);
}
}
// Use always the version from the commandline if it is defined
$next_version = isset($options['v']) ? (int)$options['v'] : null;
$conf = DatabaseConfigurationProvider::getConfiguration();
if ($options['u']) {
$conn_user = $options['u'];
$conn_pass = $options['p'];
} else {
$conn_user = $conf->getUser();
$conn_pass = $conf->getPassword();
}
$conn_host = $conf->getHost();
// Split out port information, since the command-line client requires a
// separate flag for the port.
$uri = new PhutilURI('mysql://'.$conn_host);
if ($uri->getPort()) {
$conn_port = $uri->getPort();
$conn_bare_hostname = $uri->getDomain();
} else {
$conn_port = null;
$conn_bare_hostname = $conn_host;
}
$conn = new AphrontMySQLDatabaseConnection(
array(
'user' => $conn_user,
'pass' => $conn_pass,
'host' => $conn_host,
'database' => null,
));
try {
$create_sql = <<<END
CREATE DATABASE IF NOT EXISTS `phabricator_meta_data`;
END;
queryfx($conn, $create_sql);
$create_sql = <<<END
CREATE TABLE IF NOT EXISTS phabricator_meta_data.`schema_version` (
`version` INTEGER not null
);
END;
queryfx($conn, $create_sql);
// Get the version only if commandline argument wasn't given
if ($next_version === null) {
$version = queryfx_one(
$conn,
'SELECT * FROM phabricator_meta_data.%T',
SCHEMA_VERSION_TABLE_NAME);
if (!$version) {
print "*** No version information in the database ***\n";
print "*** Give the first patch version which to ***\n";
print "*** apply as the command line argument ***\n";
exit(-1);
}
$next_version = $version['version'] + 1;
}
$patches = PhabricatorSQLPatchList::getPatchList();
$patch_applied = false;
foreach ($patches as $patch) {
if ($patch['version'] < $next_version) {
continue;
}
$short_name = basename($patch['path']);
print "Applying patch {$short_name}...\n";
if ($conn_port) {
$port = '--port='.(int)$conn_port;
} else {
$port = null;
}
- list($stdout, $stderr) = execx(
- "mysql --user=%s --password=%s --host=%s {$port} < %s",
- $conn_user,
- $conn_pass,
- $conn_bare_hostname,
- $patch['path']);
-
- if ($stderr) {
- print $stderr;
- exit(-1);
+ if (preg_match('/\.php$/', $patch['path'])) {
+ $schema_conn = $conn;
+ require_once $patch['path'];
+ } else {
+ list($stdout, $stderr) = execx(
+ "mysql --user=%s --password=%s --host=%s {$port} < %s",
+ $conn_user,
+ $conn_pass,
+ $conn_bare_hostname,
+ $patch['path']);
+
+ if ($stderr) {
+ print $stderr;
+ exit(-1);
+ }
}
// Patch was successful, update the db with the latest applied patch version
// 'DELETE' and 'INSERT' instead of update, because the table might be empty
queryfx(
$conn,
'DELETE FROM phabricator_meta_data.%T',
SCHEMA_VERSION_TABLE_NAME);
queryfx(
$conn,
'INSERT INTO phabricator_meta_data.%T VALUES (%d)',
SCHEMA_VERSION_TABLE_NAME,
$patch['version']);
$patch_applied = true;
}
if (!$patch_applied) {
print "Your database is already up-to-date.\n";
}
} catch (AphrontQueryAccessDeniedException $ex) {
echo
"ACCESS DENIED\n".
"The user '{$conn_user}' does not have sufficient MySQL privileges to\n".
"execute the schema upgrade. Use the -u and -p flags to run as a user\n".
"with more privileges (e.g., root).".
"\n\n".
"EXCEPTION:\n".
$ex->getMessage().
"\n\n";
exit(1);
}
function usage() {
echo
"usage: upgrade_schema.php [-v version] [-u user -p pass] [-f] [-h]".
"\n\n".
"Run 'upgrade_schema.php -u root -p hunter2' to override the configured ".
"default user.\n".
"Run 'upgrade_schema.php -v 12' to apply all patches starting from ".
"version 12. It is very unlikely you need to do this.\n".
"Use the -f flag to upgrade noninteractively, without prompting.\n".
"Use the -h flag to show this help.\n";
exit(1);
}
diff --git a/src/infrastructure/setup/sql/PhabricatorSQLPatchList.php b/src/infrastructure/setup/sql/PhabricatorSQLPatchList.php
index a4fda01f5b..5487267040 100644
--- a/src/infrastructure/setup/sql/PhabricatorSQLPatchList.php
+++ b/src/infrastructure/setup/sql/PhabricatorSQLPatchList.php
@@ -1,57 +1,55 @@
<?php
/*
* Copyright 2011 Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
final class PhabricatorSQLPatchList {
public static function getPatchList() {
$root = dirname(phutil_get_library_root('phabricator'));
// Find the patch files
$patches_dir = $root.'/resources/sql/patches/';
- $finder = id(new FileFinder($patches_dir))
- ->withSuffix('sql');
+ $finder = new FileFinder($patches_dir);
$results = $finder->find();
$patches = array();
foreach ($results as $path) {
$matches = array();
- if (preg_match('/(\d+)\..*\.sql$/', $path, $matches)) {
- $patches[] = array(
- 'version' => (int)$matches[1],
- 'path' => $patches_dir.$path,
- );
- } else {
- throw new Exception("Patch file '{$path}' is not properly named.");
+ if (!preg_match('/(\d+)\..*\.(sql|php)$/', $path, $matches)) {
+ continue;
}
+ $patches[] = array(
+ 'version' => (int)$matches[1],
+ 'path' => $patches_dir.$path,
+ );
}
// Files are in some 'random' order returned by the operating system
// We need to apply them in proper order
$patches = isort($patches, 'version');
return $patches;
}
public static function getExpectedSchemaVersion() {
$patches = self::getPatchList();
$versions = ipull($patches, 'version');
$max_version = max($versions);
return $max_version;
}
}

File Metadata

Mime Type
text/x-diff
Expires
Sun, Jan 19, 14:15 (3 w, 2 d ago)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1125403
Default Alt Text
(9 KB)

Event Timeline