/
upgrade_unattended.php
158 lines (132 loc) · 5.35 KB
/
upgrade_unattended.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
<?php
# MantisBT - A PHP based bugtracking system
# MantisBT is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
#
# MantisBT is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with MantisBT. If not, see <http://www.gnu.org/licenses/>.
/**
* @package MantisBT
* @copyright Copyright (C) 2000 - 2002 Kenzaburo Ito - kenito@300baud.org
* @copyright Copyright (C) 2002 - 2010 MantisBT Team - mantisbt-dev@lists.sourceforge.net
* @link http://www.mantisbt.org
*/
@set_time_limit( 0 );
# Load the MantisDB core in maintenance mode. This mode will assume that
# config_inc.php hasn't been specified. Thus the database will not be opened
# and plugins will not be loaded.
define( 'MANTIS_MAINTENANCE_MODE', true );
/**
* MantisBT Core API's
*/
require_once( dirname( dirname( __FILE__ ) ) . DIRECTORY_SEPARATOR . 'core.php' );
$g_error_send_page_header = false; # suppress page headers in the error handler
$g_failed = false;
/* This script is probably meant to be executed from PHP CLI and hence should
* not be interpreted as text/html. However saying that, we do call gpc_
* functions that only make sense in PHP CGI mode. Given this mismatch we'll
* just assume for now that this script is meant to be used from PHP CGI and
* the output is meant to be text/plain. We also need to prevent Internet
* Explorer from ignoring our MIME type and using it's own MIME sniffing.
*/
header( 'Content-Type: text/plain;' );
header( 'X-Content-Type-Options: nosniff' );
/**
* Print the result of an upgrade step.
*
* @param integer $result GOOD or BAD.
* @param bool $p_hard_fail If result is BAD, sets the global failure flag.
* @param string $p_message The message describing the upgrade step.
* @access private
*/
function print_test_result( $p_result, $p_hard_fail = true, $p_message = '' ) {
global $g_failed;
if( BAD == $p_result ) {
if( $p_hard_fail ) {
$g_failed = true;
echo " - ERROR: ";
} else {
echo " - WARNING: ";
}
if( '' != $p_message ) {
echo $p_message;
}
}
if( GOOD == $p_result ) {
echo " - GOOD";
}
echo "\n";
}
$result = @db_connect( config_get_global( 'dsn', false ), config_get_global( 'hostname' ),
config_get_global( 'db_username' ), config_get_global( 'db_password' ),
config_get_global( 'database_name' ) );
if( false == $result ) {
echo "Opening connection to database " .
config_get_global( 'database_name' ) .
" on host " . config_get_global( 'hostname' ) .
" with username " . config_get_global( 'db_username' ) .
" failed: " . db_error_msg() . "\n";
exit( 1 );
}
# check to see if the new installer was used
if ( -1 == config_get( 'database_version', -1 ) ) {
echo "Upgrade from the current installed MantisBT version is no longer supported. If you are using MantisBT version older than 1.0.0, then upgrade to v1.0.0 first.";
exit( 1 );
}
# read control variables with defaults
$f_hostname = gpc_get( 'hostname', config_get( 'hostname', 'localhost' ) );
$f_db_type = gpc_get( 'db_type', config_get( 'db_type', '' ) );
$f_database_name = gpc_get( 'database_name', config_get( 'database_name', 'bugtrack' ) );
$f_db_username = gpc_get( 'db_username', config_get( 'db_username', '' ) );
$f_db_password = gpc_get( 'db_password', config_get( 'db_password', '' ) );
$f_db_exists = gpc_get_bool( 'db_exists', false );
# install the tables
if ( !preg_match( '/^[a-zA-Z0-9_]+$/', $f_db_type ) ||
!file_exists( dirname( dirname( __FILE__ ) ) . DIRECTORY_SEPARATOR . 'library' . DIRECTORY_SEPARATOR . 'adodb' . DIRECTORY_SEPARATOR . 'drivers' . DIRECTORY_SEPARATOR . 'adodb-' . $f_db_type . '.inc.php' ) ) {
echo 'Invalid db type ' . htmlspecialchars( $f_db_type ) . '.';
exit;
}
$GLOBALS['g_db_type'] = $f_db_type; # database_api references this
require_once( dirname( __FILE__ ) . DIRECTORY_SEPARATOR . 'schema.php' );
$g_db = ADONewConnection( $f_db_type );
echo "\nPost 1.0 schema changes\n";
echo "Connecting to database... ";
$t_result = @$g_db->Connect( $f_hostname, $f_db_username, $f_db_password, $f_database_name );
if( false == $t_result ) {
echo "failed\n";
exit( 1 );
}
echo "OK\n";
$g_db_connected = true; # fake out database access routines used by config_get
$t_last_update = config_get( 'database_version', -1, ALL_USERS, ALL_PROJECTS );
$lastid = count( $upgrade ) - 1;
$i = $t_last_update + 1;
while(( $i <= $lastid ) && !$g_failed ) {
echo 'Create Schema ( ' . $upgrade[$i][0] . ' on ' . $upgrade[$i][1][0] . ' )';
$dict = NewDataDictionary( $g_db );
if( $upgrade[$i][0] == 'InsertData' ) {
$sqlarray = call_user_func_array( $upgrade[$i][0], $upgrade[$i][1] );
} else {
$sqlarray = call_user_func_array( Array( $dict, $upgrade[$i][0] ), $upgrade[$i][1] );
}
$ret = $dict->ExecuteSQLArray( $sqlarray );
if( $ret == 2 ) {
print_test_result( GOOD );
config_set( 'database_version', $i );
} else {
print_test_result( BAD, true, $sqlarray[0] . '<br />' . $g_db->ErrorMsg() );
}
$i++;
}
if( false == $g_failed ) {
exit( 0 );
}
exit( 1 );
# vim: noexpandtab tabstop=4 softtabstop=0: