#! /usr/bin/perl -w
#
# This script extracts data from the database and formats it into
# a text file containing the messages organized chronologically, or
# split into threads
#
# Logic:
#   For 1 -> last message_id
#       Get all message fields
#       If parent == message_id
#           print message data
#           Get all messages with parent == current message_id
#               print message data
#       (otherwise don't print it)
#
# Script Copyright (C) 2003, Christopher Swingley.  Licensed under the
# terms of the GNU General Public License (GPL)
use DBI;
use strict;

my $passwd = shift;
my $switch = shift;

my $driver = "mysql";
my $database = "oldtools";
my $dsn = "DBI:$driver:database=$database";
my $dbh = DBI->connect ($dsn, "www", $passwd);

# Get the maximum message_id
my $sth = $dbh->prepare ("
    SELECT message_id from header
    ORDER BY message_id DESC
    LIMIT 1
    ");
$sth->execute ();

my $ref = $sth->fetchrow_hashref ();
my $max_message_id = $ref->{'message_id'};

my $thread_count = 1;
my $increment = 2500;

for (my $message_id = 1; $message_id <= $max_message_id; $message_id++) {

    # Get all the database data for this message
    $sth = $dbh->prepare ("
            SELECT h.efrom, h.date, h.subject, h.parent, m.body
            FROM header h, message m
            WHERE m.message_id = $message_id AND
                m.message_id = h.message_id
        ");
    $sth->execute ();

    if ($ref = $sth->fetchrow_hashref () ) {
        my $efrom = $ref->{'efrom'};
        my $date = $ref->{'date'};
        my $subject = $ref->{'subject'};
        my $parent = $ref->{'parent'};
        my $body = $ref->{'body'};

        open_file ($message_id);

        if (!defined ($switch)) {
            if ($parent == $message_id) {
                print FH "++++ Start of thread $thread_count ++++\n\n";
                print_message ($message_id, $efrom, $date, $subject, $body, 
                        $thread_count);
                get_children ($message_id, $thread_count);
                print FH "++++ End of thread $thread_count ++++\n\n";
                $thread_count++;
            }
        } else {
            print_message ($message_id, $efrom, $date, $subject, $body, 0);
        }
    }
}

$sth->finish ();

$dbh->disconnect ();

sub print_message  {
    my $message_id = shift;
    my $efrom = shift;
    my $date = shift;
    my $subject = shift;
    my $body = shift;
    my $thread_count = shift;

    if ($thread_count) {
        print FH "    ---- Start of Message $message_id ";
        print FH "(thread $thread_count) ----\n\n";
    } else {
        print FH "    ---- Start of Message $message_id ----\n\n";
    }
    print FH "From: $efrom\n";
    print FH "Date: $date\n";
    if (defined ($subject) ) {
        print FH "Subject: $subject\n";
    }
    print FH "\n$body";
}
sub get_children {
    my $parent = shift;
    my $thread_count = shift;

    my $sth = $dbh->prepare ("
            SELECT h.message_id, h.efrom, h.date, h.subject, h.parent, m.body
            FROM header h, message m
            WHERE h.parent = $parent AND
                m.message_id = h.message_id AND
                m.message_id != $parent
            ORDER BY h.message_id
        ");
    $sth->execute ();

    while (my $ref = $sth->fetchrow_hashref () ) {
        my $message_id = $ref->{'message_id'};
        my $efrom = $ref->{'efrom'};
        my $date = $ref->{'date'};
        my $subject = $ref->{'subject'};
        my $parent = $ref->{'parent'};
        my $body = $ref->{'body'};

        print_message ($message_id, $efrom, $date, $subject, $body,
                $thread_count);
    }

    $sth->finish ();
}
sub open_file {
    my $message_id = shift;

    if ( ( ($message_id - 1) % $increment) == 0) {
        if ( ($message_id - 1) ) {
            close (FH);
        }
        my $filename = format_filename ($message_id); 
        open (FH, ">$filename");
    }
}
sub format_filename {
    my $message_id = shift;
    # my $prefix = "oldtools_";
    my $prefix = "";

    if (defined ($switch) ) {
        $prefix = $prefix . "flat_";
    } else {
        $prefix = $prefix . "thread_";
    }

    my $start_id = format_number ($message_id);
    my $finish_id = format_number ($start_id + $increment);

    my $filename = $prefix . $start_id . "-" . $finish_id;

    return $filename;
}
sub format_number {
    my $value = shift;

    while (length ($value) < 6) {
        $value = "0" . $value;
    }

    return $value;
}
