home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / FAQ / discus_admin_1357211388 / source / fcn-msmv.pl < prev    next >
Text File  |  2009-11-06  |  8KB  |  183 lines

  1. # FILE: fcn-msmv.pl
  2. # DESCRIPTION: Message Management (Move Message)
  3. #-------------------------------------------------------------------------------
  4. # DISCUS COPYRIGHT NOTICE
  5. #
  6. # Discus is copyright (c) 2002 by DiscusWare, LLC, all rights reserved.
  7. # The use of Discus is governed by the Discus License Agreement which is
  8. # available from the Discus WWW site at:
  9. #    http://www.discusware.com/discus/license
  10. #
  11. # Pursuant to the Discus License Agreement, this copyright notice may not be
  12. # removed or altered in any way.
  13. #-------------------------------------------------------------------------------
  14.  
  15. use strict;
  16. use vars qw($GLOBAL_OPTIONS $DCONF $PARAMS);
  17.  
  18. ###
  19. ### move_message
  20. ###
  21. ### Moves one or more messages from one page to another
  22. ###
  23.  
  24. sub move_message {
  25.     my ($arg, $file_in, $old_topic_tree, $new_topic_tree) = @_;
  26.     return undef if $arg->{new_page} == $arg->{page} && $arg->{new_topic} == $arg->{topic};
  27.     my $old_file = defined $file_in ? $file_in : GetPage($arg->{topic}, $arg->{page}, { lock => 1 });
  28.     my $old_tree_cache = defined $old_topic_tree ? $old_topic_tree : read_tree($arg->{topic}, { lock => 1 });
  29.     my $new_tree_cache = $arg->{topic} == $arg->{new_topic} ? $old_tree_cache : (defined $new_topic_tree ? $new_topic_tree : read_tree($arg->{new_topic}, { lock => 1 }));
  30.     my $new_file = undef;
  31.  
  32.     # Moves the messages themselves from old page to new page
  33.  
  34.     my @_ag = (); my @m1 = (); my @m2 = (); my @p = (); my @m2L = ();
  35.     my %u = map { $_, 1 } split(/,/, $arg->{messages});
  36.     foreach my $l (@{ $old_file->{messages} }) {
  37.         if ($u{$l->{number}} == 1) {
  38.             if ($arg->{topic} != $arg->{new_topic}) {
  39.                 my $att = attachment_scan($l->{text});
  40.                 foreach my $Z (@{$att}) {
  41.                     $l->{text} =~ s%/$arg->{topic}/$Z->{filename}%/$arg->{new_topic}/$Z->{filename}%gi;
  42.                     push @_ag, $Z->{filename};
  43.                 }
  44.             }
  45.             push @m2, $l;
  46.             push @m2L, $l->{number};
  47.             push @p, { postindex => $l->{number}, time => $l->{'time'}, old_topic => $arg->{topic}, old_page => $arg->{page}, new_topic => $arg->{new_topic}, new_page => $arg->{new_page} };
  48.         } else {
  49.             push (@m1, $l);
  50.         }
  51.     }
  52.     if ($arg->{create_new_page}) {
  53.         dreq("fcn-pgad");
  54.         my $narg = {};
  55.         $narg->{topic} = $arg->{new_topic} == 0 ? $arg->{topic} : $arg->{new_topic};
  56.         $narg->{host} = $arg->{new_page} == 0 ? $arg->{page} : $arg->{new_page};
  57.         $narg->{type} = defined $arg->{type} ? $arg->{type} : 0;
  58.         $narg->{type} = 4 if $arg->{archive};
  59.         $narg->{name} = $arg->{create_new_page_name};
  60.         $narg->{pagehash} = $old_file;
  61.         $narg->{messages} = \@m2;
  62.         $narg->{post_list} = join(",", @m2L);
  63.         my @X = sort { $b->{'time'} <=> $a->{'time'} } @m2;
  64.         $narg->{lastmod} = $X[0]->{'time'};
  65.         $narg->{last_poster} = $X[0]->{'author'};
  66.         $narg->{originator} = $X[$#X]->{'author'} if $#X >= 0;
  67.         $narg->{tree_ref} = $new_tree_cache if defined $new_tree_cache;
  68.         $narg->{msg_count} = scalar(@m2);
  69.         if ($arg->{force_new_page_number}) {
  70.             $narg->{force_new_page_number} = $arg->{force_new_page_number};
  71.         }
  72.         my $ap = add_page($narg);
  73.         $old_file = $ap->{pghash};
  74.         $new_file = $ap->{newfile};
  75.         $arg->{new_page} = $ap->{number};
  76.         $arg->{new_topic} = $narg->{topic};
  77.         $old_file->{general}->{sublist_raw} = 0;
  78.         $new_tree_cache = $ap->{tree};
  79.         $old_tree_cache = $ap->{tree} if $arg->{new_topic} == $arg->{topic};
  80.         foreach my $p (@p) {
  81.             $p->{new_page} = $ap->{number};
  82.         }
  83.     } else {
  84.         $new_file = GetPage($arg->{new_topic}, $arg->{new_page}, { lock => 1 });
  85.         $new_file->{head}->{param} .= "Messages" if $new_file->{head}->{param} !~ /Messages/;
  86.         if ($arg->{archive}) {
  87.             $new_file->{head}->{param} .= "Archive" if $new_file->{head}->{param} !~ /Archive/;
  88.             $new_file->{head}->{param} =~ s/Add//g;
  89.         }        
  90.         push @{ $new_file->{messages} }, @m2;
  91.         $new_file->{general}->{messages_raw} = 0;
  92.         SetPage($new_file, { unlock => 1 });
  93.     }
  94.     $old_file->{general}->{messages_raw} = 0;
  95.     $old_file->{messages} = \@m1;
  96.     SetPage($old_file, { unlock => 1 }) if ! defined $arg->{play_oldfile};
  97.     
  98.     # Update posting and search logs, if necessary
  99.  
  100.     dreq("fcn-logs");
  101.     update_entry_post_location(\@p) if $arg->{topic} != $arg->{new_topic};
  102.     
  103.     # Move attachments to new directory, if needed
  104.     
  105.     if ($arg->{topic} != $arg->{new_topic} && scalar(@_ag)) {
  106.         my $srcdir = -e "$DCONF->{message_dir}/$arg->{topic}" ? "$DCONF->{message_dir}/$arg->{topic}" : "$DCONF->{secdir}/$arg->{topic}";
  107.         my $destdir = -e "$DCONF->{message_dir}/$arg->{new_topic}" ? "$DCONF->{message_dir}/$arg->{new_topic}" : "$DCONF->{secdir}/$arg->{new_topic}";
  108.         foreach my $file (@_ag) {
  109.             writefile_binary("$destdir/$file", readfile_binary("$srcdir/$file")) && unlink "$srcdir/$file";
  110.         }
  111.     }
  112.     
  113.     # Update the tree files and message counts on affected pages
  114.  
  115.     dreq("fcn-tree");
  116.     my $uh1 = {};
  117.     my $uh2 = {};
  118.     my @j1 = (); my @j2 = ();
  119.     foreach my $j (@m1) { push @j1, $j->{number}; }
  120.     foreach my $j (@{ $new_file->{messages} }) { push @j2, $j->{number}; }
  121.     $uh1 = { page => $arg->{page}, post_list => join(",", @j1) };
  122.     $uh2 = { page => $arg->{new_page}, post_list => join(",", @j2) };
  123.     my $moved = scalar(@m2);
  124.     if ($arg->{new_topic} == $arg->{topic}) {
  125.         my $treeX = defined $old_tree_cache ? $old_tree_cache : read_tree($arg->{topic}, { no_unlock => 1 });
  126.         $treeX = tree_record_update($treeX, undef, $uh1, 1);
  127.         $treeX = tree_record_update($treeX->{tree}, $treeX->{cat}, $uh2, 1);
  128.         if (! $arg->{create_new_page}) {
  129.             ($treeX->{tree}, $treeX->{cat}) = tree_upward_update($treeX->{tree}, $treeX->{cat}, $arg->{page}, { metoo => 1, posts => "-$moved" });
  130.             ($treeX->{tree}, $treeX->{cat}) = tree_upward_update($treeX->{tree}, $treeX->{cat}, $arg->{new_page}, { metoo => 1, posts => "+$moved" });
  131.         } else {
  132.             ($treeX->{tree}, $treeX->{cat}) = tree_upward_update($treeX->{tree}, $treeX->{cat}, $arg->{new_page}, { metoo => 0, pages => "+1" });
  133.         }
  134.         if (! defined $old_topic_tree || ! defined $arg->{play_oldtree}) {
  135.             write_tree($arg->{topic}, $treeX->{tree}, { no_lock => 1 });
  136.         }
  137.         if ($arg->{pages_upward_update}) {
  138.             pages_upward_update($treeX->{tree}, $treeX->{cat}, [ $arg->{page}, $arg->{new_page} ]);
  139.         }    
  140.         return {
  141.             old_topic_tree => $treeX->{tree},
  142.             new_topic_tree => $treeX->{tree},
  143.             moved => $moved,
  144.             arg => $arg,
  145.             oldfile => $old_file,
  146.             newfile => $new_file,
  147.             cat => $treeX->{cat},
  148.         };
  149.     } else {
  150.         my $treeX = defined $old_tree_cache ? $old_tree_cache : read_tree($arg->{topic}, { no_unlock => 1 });
  151.         my $treeY = defined $new_tree_cache ? $new_tree_cache : read_tree($arg->{new_topic}, { no_unlock => 1 });
  152.         $treeX = tree_record_update($treeX, undef, $uh1, 1);
  153.         $treeY = tree_record_update($treeY, undef, $uh2, 1);
  154.         if (! $arg->{create_new_page}) {
  155.             ($treeX->{tree}, $treeX->{cat}) = tree_upward_update($treeX->{tree}, $treeX->{cat}, $arg->{page}, { metoo => 1, posts => "-$moved" });
  156.             ($treeY->{tree}, $treeY->{cat}) = tree_upward_update($treeY->{tree}, $treeY->{cat}, $arg->{new_page}, { metoo => 1, posts => "+$moved" });
  157.         } else {
  158.             ($treeY->{tree}, $treeY->{cat}) = tree_upward_update($treeY->{tree}, $treeY->{cat}, $arg->{new_page}, { metoo => 0, pages => "+1" });
  159.         }            
  160.         if (! defined $old_topic_tree || ! defined $arg->{play_oldtree}) {
  161.             write_tree($arg->{topic}, $treeX->{tree}, { no_lock => 1 });
  162.         }
  163.         if (! defined $new_topic_tree || ! defined $arg->{play_newtree}) {
  164.             write_tree($arg->{new_topic}, $treeY->{tree}, { no_lock => 1 });
  165.         }
  166.         if ($arg->{pages_upward_update}) {
  167.             pages_upward_update($treeX->{tree}, $treeX->{cat}, [ $arg->{page} ]);
  168.             pages_upward_update($treeY->{tree}, $treeY->{cat}, [ $arg->{new_page} ]);
  169.         }    
  170.         return {
  171.             old_topic_tree => $treeX->{tree},
  172.             new_topic_tree => $treeY->{tree},
  173.             moved => $moved,
  174.             arg => $arg,
  175.             oldfile => $old_file,
  176.             newfile => $new_file,
  177.         };
  178.     }
  179. }
  180.  
  181.  
  182. 1;
  183.