assign( 'next_step', $step );
require_once( 'install_inc.php' );
require_once( "get_databases_inc.php" );
// set the maximum execution time to very high
ini_set( "max_execution_time", "86400" );
if( isset( $_REQUEST['db_src'] ) ) {
// source database settings
$gBitSmarty->assign( 'db_src', $_REQUEST['db_src'] );
$gBitSmarty->assign( 'host_src', $_REQUEST['host_src'] );
$gBitSmarty->assign( 'user_src', $_REQUEST['user_src'] );
$gBitSmarty->assign( 'pass_src', $_REQUEST['pass_src'] );
$gBitSmarty->assign( 'name_src', $_REQUEST['name_src'] );
$gBitSmarty->assign( 'prefix_src', $_REQUEST['prefix_src'] );
// destination database settings
$gBitSmarty->assign( 'db_dst', $_REQUEST['db_dst'] );
$gBitSmarty->assign( 'host_dst', $_REQUEST['host_dst'] );
$gBitSmarty->assign( 'user_dst', $_REQUEST['user_dst'] );
$gBitSmarty->assign( 'pass_dst', $_REQUEST['pass_dst'] );
$gBitSmarty->assign( 'name_dst', $_REQUEST['name_dst'] );
$gBitSmarty->assign( 'prefix_dst', $_REQUEST['prefix_dst'] );
$skip_tables = isset($_REQUEST['skip_tables']) ? $_REQUEST['skip_tables'] : array();
$gBitSmarty->assign( 'skip_tables_select', $skip_tables );
$empty_tables = isset($_REQUEST['empty_tables']);
$gBitSmarty->assign( 'empty_tables', $empty_tables );
$convert_blobs = isset($_REQUEST['convert_blobs']);
$gBitSmarty->assign( 'convert_blobs', $convert_blobs );
$stop_on_errors = isset($_REQUEST['stop_on_errors']);
$gBitSmarty->assign( 'stop_on_errors', $stop_on_errors );
$debug = isset($_REQUEST['debug']);
$gBitSmarty->assign( 'debug', $debug );
} else {
//defaults
$gBitSmarty->assign( 'convert_blobs', TRUE );
$gBitSmarty->assign( 'stop_on_errors', TRUE );
}
if (isset($_REQUEST['fSubmitDatabase']) || isset($_REQUEST['fUpdateTables'])) {
global $gBitDbType, $gBitDbHost, $gBitDbUser, $gBitDbPassword, $gBitDbName;
global $gDb_src, $prefix_src, $gDb_dst, $prefix_dst;
// source database settings
$gBitDbType = $_REQUEST['db_src'];
$gBitDbHost = $_REQUEST['host_src'];
$gBitDbUser = $_REQUEST['user_src'];
$gBitDbPassword = $_REQUEST['pass_src'];
$gBitDbName = $_REQUEST['name_src'];
$prefix_src = $_REQUEST['prefix_src'];
if (testDatabase()) {
$gBitSmarty->assign( 'error_src', TRUE );
return;
} else {
$gDb_src = new BitDb();
}
$tables_src = $gDb_src->MetaTables();
if (isset($_REQUEST['fUpdateTables'])) {
$gBitSmarty->assign_by_ref( 'skip_tables', $tables_src );
return;
}
// destination database settings
$gBitDbType = $_REQUEST['db_dst'];
$gBitDbHost = $_REQUEST['host_dst'];
$gBitDbUser = $_REQUEST['user_dst'];
$gBitDbPassword = $_REQUEST['pass_dst'];
$gBitDbName = $_REQUEST['name_dst'];
$prefix_dst = $_REQUEST['prefix_dst'];
if (testDatabase()) {
$gBitSmarty->assign( 'error_dst', TRUE );
return;
} else {
$gDb_dst = new BitDb();
}
require_once( 'create_config_inc.php' );
$createHash = array(
"gBitDbType" => $_REQUEST['db_dst'],
"gBitDbHost" => $tmpHost,
"gBitDbUser" => $_REQUEST['user_dst'],
"gBitDbPassword" => $_REQUEST['pass_dst'],
"gBitDbName" => $_REQUEST['name_dst'],
//"gBitDbCaseSensitivity" => $_REQUEST['dbcase'],
"bit_db_prefix" => $_REQUEST['prefix_dst'],
"bit_root_url" => $_REQUEST['baseurl'],
"auto_bug_submit" => isset( $_REQUEST['auto_bug_submit'] ) ? 'TRUE' : 'FALSE',
"is_live" => isset( $_REQUEST['is_live'] ) ? 'TRUE' : 'FALSE',
);
create_config( $createHash );
// init db connections
//vd($gDb_src);
//vd($gDb_dst);die;
if($debug) {
$gDb_dst->debug();
}
// list source tables list
$tables_src = array($tables_src[2]);
$tables_dst = getTables($gDb_dst);
print_r($tables_src);die;
$table_schema = array();
// iterate through source tables
foreach($tables_src as $table) {
if (array_search($table, $skip_tables) !== FALSE) {
if ($debug)
echo "Skipping $table
\n";
continue;
}
if ($debug)
echo "Creating $table
\n";
if ($empty_tables && $gDb_dst->tableExists($table))
$gDb_dst->dropTables(array($table));
$schema = $gDb_src->MetaColumns( $table, false, true );
$t = "";
$first = true;
foreach(array_keys($schema) as $col) {
$t .= (!$first) ? ",\n" : "";
$x = $schema[$col];
$t .= $x->name . " ";
switch($x->type) {
case "tinyint":
case "int":
$i = abs(( ( (int)$x->max_length ^ 2) - 1 ));
$i = ($i == 5) ? 4 : $i;
$i = ($i == 0) ? 1 : $i;
$t .= "I" . $i;
break;
case "double":
$t .= "N";
break;
case "varchar":
case "char":
case "enum":
case "decimal":
$t .= "C(" . $x->max_length . ")";
break;
case "time":
case "timestamp":
case "datetime":
$t .= "T";
break;
case "date":
$t .= "D";
break;
case "blob":
case "longblob":
case "tinyblob":
$t .= "B";
break;
case "text":
$t .= "X";
break;
default:
die(tra("No support for type '".$x->type."' - please log a bug at http://sf.net/projects/bitweaver"));
}
$default = (!$x->binary) ? $x->has_default : false;
$t .= " " . ( ($x->unsigned) ? "UNSIGNED" : "" ) . " "
. ( ($x->not_null) ? "NOTNULL" : "" ) . " "
. ( ($x->auto_increment) ? "AUTO" : "" ) . " "
. ( ($x->primary_key) ? "PRIMARY" : "" ) . " "
. ( ($default) ? "DEFAULT ". $x->default_value : "" );
$table_schema[$table] = $t;
$first = false;
}
$indices[$table] = $gDb_src->MetaIndexes( $table, false, false );
}
//vd($table_schema);
//vd($indices);
$pOptions = array();
if ($empty_tables)
$pOptions[] = "REPLACE";
switch ($gDb_dst->mType) {
case "mysql":
// SHOULD HANDLE INNODB so foreign keys are cool - XOXO spiderr
$pOptions['mysql'] = 'TYPE=INNODB';
default:
//$pOptions[] = 'REPLACE';
}
$dict = NewDataDictionary($gDb_dst->mDb);
$result = true;
foreach(array_keys($table_schema) AS $tableName)
{
$completeTableName = $prefix_dst.$tableName;
$sql = $dict->CreateTableSQL($completeTableName, $table_schema[$tableName], $pOptions);
if ($sql && ($dict->ExecuteSQLArray($sql) > 0))
{
// Success
}
else
{
// Failure
array_push($gDb_dst->mFailed, $gDb_dst->mDb->ErrorMsg());
if ($stop_on_errors)
break;
}
foreach( array_keys( $indices ) as $index ) {
foreach( array_keys( $indices[$index] ) as $col) {
$completeTableName = $prefix_dst.$index;
$flds = implode(",", $indices[$index][$col]["columns"]);
$name = implode("_", $indices[$index][$col]["columns"]);
$sql = $dict->CreateIndexSQL( $index."_".$name, $completeTableName, $flds, (($indices[$index][$col]["unique"]) ? array("UNIQUE") : NULL) );
if( $sql && ($dict->ExecuteSQLArray($sql) > 0))
{
// Success
} else {
// Failure
array_push( $gDb_dst->mFailed, $gDb_dst->mDb->ErrorMsg());
if ($stop_on_errors)
break;
}
}
}
}
//vd($gDb_dst->mFailed);die;
foreach(array_keys($table_schema) as $table) {
$q = 0;
$c = 0;
$gDb_dst->StartTrans();
// get source data
$result = $gDb_src->Execute("SELECT * FROM $table");
// identify blob fields
//echo "$table\n";
//print_r($encoded_tables);
//var_dump(array_search($table, $encoded_tables));die;
$blobs = BitInstaller::identifyBlobs($result);
//print_r($blobs);
while ($res = $result->FetchRow()) {
//var_dump($res);die;
// convert blobs
if($convert_blobs && !empty($blobs)) {
$c++;
BitInstaller::convertBlobs($gDb_dst, $res, $blobs);
}
$q++;
// insert data into destination
if($gDb_dst->associateInsert( $table, $res) === false) {
array_push( $gDb_dst->mFailed, $gDb_dst->mDb->ErrorMsg());
if ($stop_on_errors)
break;
}
}
$gDb_dst->CompleteTrans();
$results[]= "$table: migrated $q records".(($c > 0) ? "and converted $c blobs" : "");
}
//vd($gDb_dst->mFailed);die;
$gBitSmarty->assign_by_ref( 'results', $results );
$gBitSmarty->assign_by_ref( 'errors', $gDb_dst->mFailed );
$app = "_done";
$gBitSmarty->assign( 'next_step', $step + 1 );
}
function testDatabase() {
global $gBitDbType, $gBitDbHost, $gBitDbUser, $gBitDbPassword, $gBitDbName, $gBitSmarty;
if( $gBitDbType == 'sybase' ) {
// avoid database change messages
ini_set('sybct.min_server_severity', '11');
}
$gBitDb = &ADONewConnection($gBitDbType);
if( !$gBitDb->Connect($gBitDbHost, $gBitDbUser, $gBitDbPassword, $gBitDbName) ) {
return TRUE;
}
return FALSE;
}
?>