$dummy) { dumpTable( $tn); }; printDumpFooter(); function getMysqlTableNames() { global $wgDBname; $tbl = array(); $dbw = wfGetDB( DB_MASTER ); $dbw->begin(); $res = $dbw->query( "SHOW tables" ); while( $row = $dbw->fetchRow( $res ) ) { $tbl[ $row['Tables_in_'.$wgDBname] ] = $row['Tables_in_'.$wgDBname]; } $dbw->commit(); return $tbl; } function valencode( $val) { $dbr = wfGetDB( DB_SLAVE ); return $dbr->addQuotes( $val); }; function dumpTable( $tn) { global $toDump, $mysqlTables; fprintf( STDERR, "Dumping table $tn..."); fprintf( STDERR, "\n"); $tbldesc = getTableFields( $tn); $fldnames = $tbldesc[0]; $fldtypes = $tbldesc[1]; $dataform = array(); foreach( $fldnames as $f) { $dataform[] = "'%s'"; }; $cmdform = 'INSERT INTO ' . $mysqlTables[$tn] . ' (' . implode( ', ', $fldnames) . ') VALUES ('; # echo $cmdform; $query = 'SELECT ' . implode( ', ', $fldnames) . ' FROM ' . $tn; $dbw = wfGetDB( DB_MASTER ); # $dbw->begin(); #$res = $dbw->query( $query ); $res = $dbw->select( $tn, $fldnames ); while( $row = $dbw->fetchRow( $res ) ) { $vals = array(); foreach( $fldnames as $f) { $vals[] = $row[$f]; }; echo $cmdform . implode( ', ', array_map( "valencode", $vals)) . ");\n"; } # $dbw->commit(); $dbw->freeResult( $res ); unset( $toDump[ $tn]); fprintf( STDERR, "done.\n"); return; } function getTableFields( $tn) { $dbw = wfGetDB( DB_MASTER ); # $dbw->begin(); $fld = array(); $tp = array(); $tn = $dbw->tableName( $tn ); $res = $dbw->query( "SHOW COLUMNS FROM $tn" ); while( $row = $dbw->fetchObject( $res ) ) { #echo $row->Field . "\t\t"; #echo $row->Type . "\n"; #echo "------------------------------------------------------------\n"; $fld[] = $row->Field; $fldtp = $row->Type; if( preg_match( '/(:?^int|signed)/', $fldtp) ) { $tp[ $row->Field ] = 'n' . " $fldtp"; }else { $tp[ $row->Field ] = 's' . " $fldtp"; }; } # $dbw->commit(); return array( $fld, $tp); } function printDumpHeader() { global $mysqlTables; global $commonschema, $wikischema; echo " -- Dump of MySQL Mediawiki tables for import into a Postgres Mediawiki schema -- This file can be imported manually with psql like so: -- psql -p port# -h hostname -U username -f dumpfile databasename -- This will overwrite any existing MediaWiki information, so be careful \\set ON_ERROR_STOP BEGIN; SET client_min_messages = 'WARNING'; SET timezone = 'GMT'; SET search_path TO " . $commonschema . ", " . $wikischema . ", public; -- Empty out all existing tables. Must be done in one command for PG versions up to 8.1. TRUNCATE TABLE " . implode( ', ', array_values( $mysqlTables)) . ';' . " -- Allow rc_ip to contain empty string, will convert at end ALTER TABLE recentchanges ALTER rc_ip TYPE text USING host(rc_ip); -- Changing all timestamp fields to handle raw integers ALTER TABLE archive ALTER ar_timestamp TYPE TEXT; ALTER TABLE categorylinks ALTER cl_timestamp TYPE TEXT; ALTER TABLE filearchive ALTER fa_deleted_timestamp TYPE TEXT; ALTER TABLE filearchive ALTER fa_timestamp TYPE TEXT; ALTER TABLE image ALTER img_timestamp TYPE TEXT; ALTER TABLE ipblocks ALTER ipb_expiry TYPE TEXT; ALTER TABLE ipblocks ALTER ipb_timestamp TYPE TEXT; ALTER TABLE logging ALTER log_timestamp TYPE TEXT; ALTER TABLE mediawiki_version ALTER cdate TYPE TEXT; ALTER TABLE mwuser ALTER user_email_authenticated TYPE TEXT; ALTER TABLE mwuser ALTER user_email_token_expires TYPE TEXT; ALTER TABLE mwuser ALTER user_newpass_time TYPE TEXT; ALTER TABLE mwuser ALTER user_registration TYPE TEXT; ALTER TABLE mwuser ALTER user_touched TYPE TEXT; ALTER TABLE objectcache ALTER exptime TYPE TEXT; ALTER TABLE oldimage ALTER oi_timestamp TYPE TEXT; ALTER TABLE page ALTER page_touched TYPE TEXT; ALTER TABLE page_restrictions ALTER pr_expiry TYPE TEXT; ALTER TABLE querycache_info ALTER qci_timestamp TYPE TEXT; ALTER TABLE recentchanges ALTER rc_cur_time TYPE TEXT; ALTER TABLE recentchanges ALTER rc_timestamp TYPE TEXT; ALTER TABLE revision ALTER rev_timestamp TYPE TEXT; ALTER TABLE transcache ALTER tc_time TYPE TEXT; ALTER TABLE watchlist ALTER wl_notificationtimestamp TYPE TEXT; INSERT INTO page VALUES (0,-1,'Dummy Page','',0,0,0,default,now(),0,10); SET escape_string_warning TO 'off'; \o /dev/null "; if( array_key_exists( 'user', $mysqlTables)) { echo " -- Postgres uses a table name of \"mwuser\" instead of \"user\" SELECT setval('user_user_id_seq',0,'false'); INSERT INTO mwuser VALUES (DEFAULT,'Anonymous','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,now(),now()); "; }; } function printDumpFooter() { global $mysqlTables; echo" ALTER TABLE recentchanges ALTER rc_ip TYPE cidr USING CASE WHEN rc_ip = '' THEN NULL ELSE rc_ip::cidr END; --Returning timestamps to normal ALTER TABLE archive ALTER ar_timestamp TYPE timestamptz USING TO_TIMESTAMP(ar_timestamp,'YYYYMMDDHHMISS'); ALTER TABLE categorylinks ALTER cl_timestamp TYPE timestamptz USING TO_TIMESTAMP(cl_timestamp,'YYYYMMDDHHMISS'); ALTER TABLE filearchive ALTER fa_deleted_timestamp TYPE timestamptz USING TO_TIMESTAMP(fa_deleted_timestamp,'YYYYMMDDHHMISS'); ALTER TABLE filearchive ALTER fa_timestamp TYPE timestamptz USING TO_TIMESTAMP(fa_timestamp,'YYYYMMDDHHMISS'); ALTER TABLE image ALTER img_timestamp TYPE timestamptz USING TO_TIMESTAMP(img_timestamp,'YYYYMMDDHHMISS'); ALTER TABLE ipblocks ALTER ipb_expiry TYPE timestamptz USING TO_TIMESTAMP(ipb_expiry,'YYYYMMDDHHMISS'); ALTER TABLE ipblocks ALTER ipb_timestamp TYPE timestamptz USING TO_TIMESTAMP(ipb_timestamp,'YYYYMMDDHHMISS'); ALTER TABLE logging ALTER log_timestamp TYPE timestamptz USING TO_TIMESTAMP(log_timestamp,'YYYYMMDDHHMISS'); ALTER TABLE mediawiki_version ALTER cdate TYPE timestamptz USING TO_TIMESTAMP(cdate,'YYYYMMDDHHMISS'); ALTER TABLE mwuser ALTER user_email_authenticated TYPE timestamptz USING TO_TIMESTAMP(user_email_authenticated,'YYYYMMDDHHMISS'); ALTER TABLE mwuser ALTER user_email_token_expires TYPE timestamptz USING TO_TIMESTAMP(user_email_token_expires,'YYYYMMDDHHMISS'); ALTER TABLE mwuser ALTER user_newpass_time TYPE timestamptz USING TO_TIMESTAMP(user_newpass_time,'YYYYMMDDHHMISS'); ALTER TABLE mwuser ALTER user_registration TYPE timestamptz USING TO_TIMESTAMP(user_registration,'YYYYMMDDHHMISS'); ALTER TABLE mwuser ALTER user_touched TYPE timestamptz USING TO_TIMESTAMP(user_touched,'YYYYMMDDHHMISS'); ALTER TABLE objectcache ALTER exptime TYPE timestamptz USING TO_TIMESTAMP(exptime,'YYYYMMDDHHMISS'); ALTER TABLE oldimage ALTER oi_timestamp TYPE timestamptz USING TO_TIMESTAMP(oi_timestamp,'YYYYMMDDHHMISS'); ALTER TABLE page ALTER page_touched TYPE timestamptz USING TO_TIMESTAMP(page_touched,'YYYYMMDDHHMISS'); ALTER TABLE page_restrictions ALTER pr_expiry TYPE timestamptz USING TO_TIMESTAMP(pr_expiry,'YYYYMMDDHHMISS'); ALTER TABLE querycache_info ALTER qci_timestamp TYPE timestamptz USING TO_TIMESTAMP(qci_timestamp,'YYYYMMDDHHMISS'); ALTER TABLE recentchanges ALTER rc_cur_time TYPE timestamptz USING TO_TIMESTAMP(rc_cur_time,'YYYYMMDDHHMISS'); ALTER TABLE recentchanges ALTER rc_timestamp TYPE timestamptz USING TO_TIMESTAMP(rc_timestamp,'YYYYMMDDHHMISS'); ALTER TABLE revision ALTER rev_timestamp TYPE timestamptz USING TO_TIMESTAMP(rev_timestamp,'YYYYMMDDHHMISS'); ALTER TABLE transcache ALTER tc_time TYPE timestamptz USING TO_TIMESTAMP(tc_time,'YYYYMMDDHHMISS'); ALTER TABLE watchlist ALTER wl_notificationtimestamp TYPE timestamptz USING TO_TIMESTAMP(wl_notificationtimestamp,'YYYYMMDDHHMISS'); SELECT setval('filearchive_fa_id_seq', 1+coalesce(max(fa_id) ,0),false) FROM filearchive; SELECT setval('ipblocks_ipb_id_val', 1+coalesce(max(ipb_id) ,0),false) FROM ipblocks; SELECT setval('job_job_id_seq', 1+coalesce(max(job_id) ,0),false) FROM job; SELECT setval('log_log_id_seq', 1+coalesce(max(log_id) ,0),false) FROM logging; SELECT setval('page_page_id_seq', 1+coalesce(max(page_id),0),false) FROM page; SELECT setval('pr_id_val', 1+coalesce(max(pr_id) ,0),false) FROM page_restrictions; SELECT setval('rc_rc_id_seq', 1+coalesce(max(rc_id) ,0),false) FROM recentchanges; SELECT setval('rev_rev_id_val', 1+coalesce(max(rev_id) ,0),false) FROM revision; SELECT setval('text_old_id_val', 1+coalesce(max(old_id) ,0),false) FROM pagecontent; SELECT setval('trackbacks_tb_id_seq', 1+coalesce(max(tb_id) ,0),false) FROM trackbacks; "; if( array_key_exists( 'user', $mysqlTables)) { echo " SELECT setval('user_user_id_seq', 1+coalesce(max(user_id),0),false) FROM mwuser; "; }; echo " INSERT INTO mediawiki_version (type,mw_version,notes) VALUES ('MySQL import','??', 'Imported from file created on Thu Nov 1 11:02:38 2007. Old version: 105'); COMMIT; \o -- End of dump "; } ?>