Changeset 1948

Show
Ignore:
Timestamp:
04/17/08 12:38:52 (15 months ago)
Author:
fumiakiy
Message:

New metadata structure is now backup- and restore-able. BugId:79317

Location:
branches/release-35
Files:
3 modified

Legend:

Unmodified
Added
Removed
  • branches/release-35/lib/MT/BackupRestore.pm

    r1902 r1948  
    178178            $progress->("$err\n", 'Error'); 
    179179            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 ); 
    180186        } 
    181187        my $records = 0; 
     
    215221                    next; 
    216222                } 
    217                 $bytes += $printer->($object->to_xml(undef, $args) . "\n"); 
     223                $bytes += $printer->($object->to_xml(undef, \@metacolumns) . "\n"); 
    218224                $records++; 
    219225                if ($size && ($bytes >= $size)) { 
     
    669675sub to_xml { 
    670676    my $obj = shift; 
    671     my ($namespace, $args) = @_; 
     677    my ($namespace, $metacolumns) = @_; 
    672678 
    673679    my $coldefs = $obj->column_defs; 
     
    696702        } 
    697703    } 
     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    } 
    698721    $xml .= '>'; 
    699722    $xml .= "<$_>" . MT::Util::encode_xml($obj->column($_), 1) . "</$_>" foreach @elements; 
     
    706729                "</$meta_col>"; 
    707730    } 
     731    $xml .= "<$_>" . MT::Util::encode_xml($obj->$_, 1) . "</$_>" foreach @meta_elements; 
     732    $xml .= "<$_>" . MIME::Base64::encode_base64($obj->$_, '') . "</$_>" foreach @meta_blobs; 
    708733    $xml .= '</' . $elem . '>'; 
    709734    $xml; 
  • branches/release-35/lib/MT/BackupRestore/BackupFileHandler.pm

    r1905 r1948  
    99use strict; 
    1010use XML::SAX::Base; 
     11use MIME::Base64; 
    1112 
    1213@MT::BackupRestore::BackupFileHandler::ISA = qw(XML::SAX::Base); 
     
    9192                    $obj = $class->load({ name => $column_data{name} }); 
    9293                    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 ) ) { 
    9496                            MT->log({ message => MT->translate( 
    9597                                "User with the same name as the name of the currently logged in ([_1]) found.  Skipped the record.", $obj->name), 
     
    153155                    my $success = $obj->restore_parent_ids(\%column_data, $objects); 
    154156                    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                        } 
    156170                        $self->{current} = $obj; 
    157171                    } else { 
     
    202216             
    203217            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                } 
    210239            } 
    211240        } else { 
  • branches/release-35/t/61-to_from_xml.t

    r1104 r1948  
    55 
    66use lib 't/lib', 'extlib', 'lib', '../lib', '../extlib'; 
    7 use Test::More tests => 3598; 
     7use Test::More qw(no_plan);#tests => 3598; 
    88 
    99use MT; 
     
    4949foreach my $key (keys %$types) { 
    5050    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    } 
    5256    $oldies{$key} = \@data; 
    5357} 
    5458 
    5559MT::BackupRestore->backup(undef, $printer, sub {}, sub {}, sub { print $_[0], "\n"; }, 0, 'UTF-8'); 
     60open my $fh, '>', 'c:\\temp\\hoge.txt'; 
     61print $fh $backup_data; 
     62close $fh; 
    5663 
    5764use IO::String; 
     
    6168 
    6269is(scalar(keys %deferred), 0); 
    63 print join "\n", @errors; 
     70warn join "\n", @errors if @errors; 
    6471is(scalar(@errors), 0, 'no error during backup'); 
    65  
    6672&checkthemout(\%oldies, \%objects); 
    6773 
     
    7379    foreach my $name (keys %$oldies) { 
    7480        my $old_objects = $oldies->{$name}; 
     81        my %meta; 
    7582        for my $old (@$old_objects) { 
    7683            my $class = MT->model($name); 
     
    112119                    ); 
    113120                    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                    } 
    118131                    if ('HASH' eq ref($old->$col)) { 
    119132                        is(Dumper($old->$col), Dumper($old->$col), $col); 
     
    125138                    } else { 
    126139                        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); 
    127161                    } 
    128162                }