Changeset 1948
- Timestamp:
- 04/17/08 12:38:52 (15 months ago)
- Location:
- branches/release-35
- Files:
-
- 3 modified
-
lib/MT/BackupRestore.pm (modified) (5 diffs)
-
lib/MT/BackupRestore/BackupFileHandler.pm (modified) (4 diffs)
-
t/61-to_from_xml.t (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
-
branches/release-35/lib/MT/BackupRestore.pm
r1902 r1948 178 178 $progress->("$err\n", 'Error'); 179 179 next; 180 } 181 my @metacolumns; 182 if ( exists( $class->properties->{meta} ) 183 && $class->properties->{meta} ) { 184 require MT::Meta; 185 @metacolumns = MT::Meta->metadata_by_class( $class ); 180 186 } 181 187 my $records = 0; … … 215 221 next; 216 222 } 217 $bytes += $printer->($object->to_xml(undef, $args) . "\n");223 $bytes += $printer->($object->to_xml(undef, \@metacolumns) . "\n"); 218 224 $records++; 219 225 if ($size && ($bytes >= $size)) { … … 669 675 sub to_xml { 670 676 my $obj = shift; 671 my ($namespace, $ args) = @_;677 my ($namespace, $metacolumns) = @_; 672 678 673 679 my $coldefs = $obj->column_defs; … … 696 702 } 697 703 } 704 my ( @meta_elements, @meta_blobs ); 705 if ( defined( $metacolumns ) && @$metacolumns ) { 706 foreach my $metacolumn ( @$metacolumns ) { 707 my $name = $metacolumn->{name}; 708 if ($obj->$name || (defined($obj->$name) && ('0' eq $obj->$name))) { 709 if ( 'vclob' eq $metacolumn->{type} ) { 710 push @meta_elements, $name; 711 } 712 elsif ( 'vblob' eq $metacolumn->{type} ) { 713 push @meta_blobs, $name; 714 } 715 else { 716 $xml .= " $name='" . MT::Util::encode_xml($obj->$name, 1) . "'"; 717 } 718 } 719 } 720 } 698 721 $xml .= '>'; 699 722 $xml .= "<$_>" . MT::Util::encode_xml($obj->column($_), 1) . "</$_>" foreach @elements; … … 706 729 "</$meta_col>"; 707 730 } 731 $xml .= "<$_>" . MT::Util::encode_xml($obj->$_, 1) . "</$_>" foreach @meta_elements; 732 $xml .= "<$_>" . MIME::Base64::encode_base64($obj->$_, '') . "</$_>" foreach @meta_blobs; 708 733 $xml .= '</' . $elem . '>'; 709 734 $xml; -
branches/release-35/lib/MT/BackupRestore/BackupFileHandler.pm
r1905 r1948 9 9 use strict; 10 10 use XML::SAX::Base; 11 use MIME::Base64; 11 12 12 13 @MT::BackupRestore::BackupFileHandler::ISA = qw(XML::SAX::Base); … … 91 92 $obj = $class->load({ name => $column_data{name} }); 92 93 if ($obj) { 93 if ( $obj->id == MT->instance->user->id ) { 94 if ( UNIVERSAL::isa('MT::App', MT->instance) 95 && ( $obj->id == MT->instance->user->id ) ) { 94 96 MT->log({ message => MT->translate( 95 97 "User with the same name as the name of the currently logged in ([_1]) found. Skipped the record.", $obj->name), … … 153 155 my $success = $obj->restore_parent_ids(\%column_data, $objects); 154 156 if ($success) { 155 $obj->set_values(\%column_data); 157 require MT::Meta; 158 my @metacolumns = MT::Meta->metadata_by_class( ref($obj) ); 159 my %metacolumns = map { $_->{name} => $_->{type} } @metacolumns; 160 $self->{metacolumns}{ref($obj)} = \%metacolumns; 161 my %realcolumn_data = map { $_ => $column_data{$_} } 162 grep { !exists($metacolumns{$_}) } 163 keys %column_data; 164 $obj->set_values(\%realcolumn_data); 165 foreach my $metacol ( keys %metacolumns ) { 166 next if ( 'vclob' eq $metacolumns{$metacol} ) 167 || ( 'vblob' eq $metacolumns{$metacol} ); 168 $obj->$metacol( $column_data{$metacol} ); 169 } 156 170 $self->{current} = $obj; 157 171 } else { … … 202 216 203 217 my $defs = $obj->column_defs; 204 if ('blob' eq $defs->{$column_name}->{type}) { 205 require MIME::Base64; 206 $obj->column($column_name, MIME::Base64::decode_base64($text)); 207 } else { 208 $text = MT::I18N::encode_text($text, 'utf-8'); 209 $obj->column($column_name, $text); 218 if ( exists( $defs->{$column_name} ) ) { 219 if ('blob' eq $defs->{$column_name}->{type}) { 220 $obj->column($column_name, MIME::Base64::decode_base64($text)); 221 } else { 222 $text = MT::I18N::encode_text($text, 'utf-8'); 223 $obj->column($column_name, $text); 224 } 225 } 226 elsif ( my $metacolumns = $self->{metacolumns}{ref($obj)} ) { 227 if ( my $type = $metacolumns->{$column_name} ) { 228 if ( 'vblob' eq $type ) { 229 $self->{callback}->($text); 230 $text = MIME::Base64::decode_base64($text); 231 $self->{callback}->($text); 232 $obj->$column_name( $text ); 233 } 234 else { 235 $text = MT::I18N::encode_text($text, 'utf-8'); 236 $obj->$column_name( $text ); 237 } 238 } 210 239 } 211 240 } else { -
branches/release-35/t/61-to_from_xml.t
r1104 r1948 5 5 6 6 use lib 't/lib', 'extlib', 'lib', '../lib', '../extlib'; 7 use Test::More tests => 3598;7 use Test::More qw(no_plan);#tests => 3598; 8 8 9 9 use MT; … … 49 49 foreach my $key (keys %$types) { 50 50 next if exists $skip{$key}; 51 my @data = MT->model($key)->load; 51 my $iter = MT->model($key)->load_iter; 52 my @data; 53 while ( my $obj = $iter->() ) { 54 push @data, $obj; 55 } 52 56 $oldies{$key} = \@data; 53 57 } 54 58 55 59 MT::BackupRestore->backup(undef, $printer, sub {}, sub {}, sub { print $_[0], "\n"; }, 0, 'UTF-8'); 60 open my $fh, '>', 'c:\\temp\\hoge.txt'; 61 print $fh $backup_data; 62 close $fh; 56 63 57 64 use IO::String; … … 61 68 62 69 is(scalar(keys %deferred), 0); 63 print join "\n",@errors;70 warn join "\n", @errors if @errors; 64 71 is(scalar(@errors), 0, 'no error during backup'); 65 66 72 &checkthemout(\%oldies, \%objects); 67 73 … … 73 79 foreach my $name (keys %$oldies) { 74 80 my $old_objects = $oldies->{$name}; 81 my %meta; 75 82 for my $old (@$old_objects) { 76 83 my $class = MT->model($name); … … 112 119 ); 113 120 next if ($ds eq 'category' && ($col eq 'parent')); 114 # MT::Trackback will always be created upon MT::Entry->save, 115 # and restore will just skip to restore <trackback> data, 116 # meaning trackback_created_on will not be restored but newly created. 117 next if ($name eq 'trackback' && ($col eq 'created_on')); 121 if ( ($name eq 'trackback') && ($col eq 'is_disabled') ) { 122 if ( defined($obj->is_disabled) && $obj->is_disabled 123 && (!defined($obj->entry->allow_pings) || ($obj->entry->allow_pings == 0)) ) 124 { 125 # is_disabled will be changed upon $entry->save 126 # and save may occur $comment's post_save trigger 127 # no harm for the testing purpose, ignore the case. 128 next; 129 } 130 } 118 131 if ('HASH' eq ref($old->$col)) { 119 132 is(Dumper($old->$col), Dumper($old->$col), $col); … … 125 138 } else { 126 139 is($old->$col, $obj->$col, "$class<$col>" . $obj->id); 140 } 141 } 142 } 143 unless ( exists($meta{ref($obj)}) ) { 144 my @metacolumns = MT::Meta->metadata_by_class( ref($obj) ); 145 my %metacolumns = map { $_->{name} => $_->{type} } @metacolumns; 146 $meta{ref($obj)} = \%metacolumns 147 } 148 my $metacolumns = $meta{ref($obj)}; 149 foreach my $metacol (keys %$metacolumns) { 150 if ( my $type = $metacolumns->{$metacol} ) { 151 if ( 'vblob' eq $type ) { 152 if ( defined($old->$metacol) && defined($obj->$metacol) ) { 153 is( 154 MIME::Base64::encode_base64($old->$metacol, ''), 155 MIME::Base64::encode_base64($obj->$metacol, ''), 156 "vblob - $metacol"); 157 } 158 } 159 else { 160 is($old->$metacol, $obj->$metacol, "$class<meta:$metacol>" . $obj->id); 127 161 } 128 162 }
