]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Moved all the long descriptions out of the bugs table, and into a new
authorterry%mozilla.org <>
Fri, 21 Jan 2000 05:31:18 +0000 (05:31 +0000)
committerterry%mozilla.org <>
Fri, 21 Jan 2000 05:31:18 +0000 (05:31 +0000)
table.  There is now a separate entry for each new long description,
rather than appending them all together in one big field.

buglist.cgi
checksetup.pl
globals.pl
post_bug.cgi
process_bug.cgi

index 27e67e39000af342a3d0a9ce0e3fcbeac3511628..2309b3205b08fa3bba7630dda64460ac33e68ac6 100755 (executable)
@@ -480,15 +480,23 @@ foreach my $f ("short_desc", "long_desc", "bug_file_loc",
     if (defined $::FORM{$f}) {
         my $s = trim($::FORM{$f});
         if ($s ne "") {
+            my $n = $f;
             $s = SqlQuote($s);
-            if ($::FORM{$f . "_type"} eq "regexp") {
-                $query .= "and $f regexp $s\n";
-            } elsif ($::FORM{$f . "_type"} eq "notregexp") {
-                $query .= "and $f not regexp $s\n";
-            } elsif ($::FORM{$f . "_type"} eq "casesubstring") {
-                $query .= "and instr($f, $s)\n";
+            my $type = $::FORM{$f . "_type"};
+            if ($f eq "long_desc") {
+                # Patch in the longdescs table.
+                $query =~ s/where/, longdescs where/;
+                $query .= "and longdescs.bug_id = bugs.bug_id\n";
+                $n = "longdescs.thetext";
+            }
+            if ($type eq "regexp") {
+                $query .= "and $n regexp $s\n";
+            } elsif ($type eq "notregexp") {
+                $query .= "and $n not regexp $s\n";
+            } elsif ($type eq "casesubstring") {
+                $query .= "and instr($n, $s)\n";
             } else {
-                $query .= "and instr(lower($f), lower($s))\n";
+                $query .= "and instr(lower($n), lower($s))\n";
             }
         }
     }
index 69e31919af9019b81ecd9a44ead378b8e4dd24b2..14445c2b680c136eb366c8dddcba3b1cd2c2a498 100755 (executable)
@@ -107,6 +107,14 @@ use vars qw(
 );
 
 
+# Trim whitespace from front and back.
+
+sub trim {
+    ($_) = (@_);
+    s/^\s+//g;
+    s/\s+$//g;
+    return $_;
+}
 
 
 
@@ -519,7 +527,6 @@ $table{bugs} =
     creation_ts datetime not null,
     delta_ts timestamp,
     short_desc mediumtext,
-    long_desc mediumtext,
     op_sys enum($opsys) not null,
     priority enum($priorities) not null,
     product varchar(64) not null,
@@ -561,6 +568,16 @@ $table{cc} =
     index(who)';
 
 
+$table{longdescs} = 
+   'bug_id mediumint not null,
+    who mediumint not null,
+    bug_when datetime not null,
+    thetext mediumtext,
+
+    index(bug_id),
+    index(bug_when)';
+
+
 $table{components} =
    'value tinytext,
     program varchar(64),
@@ -1035,6 +1052,142 @@ AddField('profiles', 'disabledtext',  'mediumtext not null');
 
 
 
+# 2000-01-20 Added a new "longdescs" table, which is supposed to have all the
+# long descriptions in it, replacing the old long_desc field in the bugs 
+# table.  The below hideous code populates this new table with things from
+# the old field, with ugly parsing and heuristics.
+
+sub WriteOneDesc {
+    my ($id, $who, $when, $buffer) = (@_);
+    $buffer = trim($buffer);
+    if ($buffer eq '') {
+        return;
+    }
+    $dbh->do("INSERT INTO longdescs (bug_id, who, bug_when, thetext) VALUES " .
+             "($id, $who, " .  time2str("'%Y/%m/%d %H:%M:%S'", $when) .
+             ", " . $dbh->quote($buffer) . ")");
+}
+
+
+if (GetFieldDef('bugs', 'long_desc')) {
+    eval("use Date::Parse");
+    eval("use Date::Format");
+    my $sth = $dbh->prepare("SELECT count(*) FROM bugs");
+    $sth->execute();
+    my ($total) = ($sth->fetchrow_array);
+
+    print "Populating new long_desc table.  This is slow.  There are $total\n";
+    print "bugs to process; a line of dots will be printed for each 50.\n\n";
+    $| = 1;
+
+    $dbh->do("LOCK TABLES bugs write, longdescs write, profiles write");
+
+    $dbh->do('DELETE FROM longdescs');
+
+    $sth = $dbh->prepare("SELECT bug_id, creation_ts, reporter, long_desc " .
+                         "FROM bugs ORDER BY bug_id");
+    $sth->execute();
+    my $count = 0;
+    while (1) {
+        my ($id, $createtime, $reporterid, $desc) = ($sth->fetchrow_array());
+        if (!$id) {
+            last;
+        }
+        print ".";
+        $count++;
+        if ($count % 10 == 0) {
+            print " ";
+            if ($count % 50 == 0) {
+                print "$count/$total (" . int($count * 100 / $total) . "%)\n";
+            }
+        }
+        $desc =~ s/\r//g;
+        my $who = $reporterid;
+        my $when = str2time($createtime);
+        my $buffer = "";
+        foreach my $line (split(/\n/, $desc)) {
+            $line =~ s/\s+$//g;       # Trim trailing whitespace.
+            if ($line =~ /^------- Additional Comments From ([^\s]+)\s+(\d.+\d)\s+-------$/) {
+                my $name = $1;
+                my $date = str2time($2);
+                $date += 59;    # Oy, what a hack.  The creation time is
+                                # accurate to the second.  But we the long
+                                # text only contains things accurate to the
+                                # minute.  And so, if someone makes a comment
+                                # within a minute of the original bug creation,
+                                # then the comment can come *before* the
+                                # bug creation.  So, we add 59 seconds to
+                                # the time of all comments, so that they
+                                # are always considered to have happened at
+                                # the *end* of the given minute, not the
+                                # beginning.
+                if ($date >= $when) {
+                    WriteOneDesc($id, $who, $when, $buffer);
+                    $buffer = "";
+                    $when = $date;
+                    my $s2 = $dbh->prepare("SELECT userid FROM profiles " .
+                                           "WHERE login_name = " .
+                                           $dbh->quote($name));
+                    $s2->execute();
+                    ($who) = ($s2->fetchrow_array());
+                    if (!$who) {
+                        # This username doesn't exist.  Try a special
+                        # netscape-only hack (sorry about that, but I don't
+                        # think it will hurt any other installations).  We
+                        # have many entries in the bugsystem from an ancient
+                        # world where the "@netscape.com" part of the loginname
+                        # was omitted.  So, look up the user again with that
+                        # appended, and use it if it's there.
+                        if ($name !~ /\@/) {
+                            my $nsname = $name . "\@netscape.com";
+                            $s2 =
+                                $dbh->prepare("SELECT userid FROM profiles " .
+                                              "WHERE login_name = " .
+                                              $dbh->quote($nsname));
+                            $s2->execute();
+                            ($who) = ($s2->fetchrow_array());
+                        }
+                    }
+                            
+                    if (!$who) {
+                        # This username doesn't exist.  Maybe someone renamed
+                        # him or something.  Invent a new profile entry,
+                        # disabled, just to represent him.
+                        $dbh->do("INSERT INTO profiles " .
+                                 "(login_name, password, cryptpassword," .
+                                 " disabledtext) VALUES (" .
+                                 $dbh->quote($name) .
+                                 ", 'okthen', encrypt('okthen'), " .
+                                 "'Account created only to maintain database integrity')");
+                        $s2 = $dbh->prepare("SELECT LAST_INSERT_ID()");
+                        $s2->execute();
+                        ($who) = ($s2->fetchrow_array());
+                    }
+                    next;
+                } else {
+#                    print "\nDecided this line of bug $id has a date of " .
+#                        time2str("'%Y/%m/%d %H:%M:%S'", $date) .
+#                            "\nwhich is less than previous line:\n$line\n\n";
+                }
+
+            }
+            $buffer .= $line . "\n";
+        }
+        WriteOneDesc($id, $who, $when, $buffer);
+    }
+                
+
+    print "\n\n";
+
+    DropField('bugs', 'long_desc');
+
+    $dbh->do("UNLOCK TABLES");
+    print "Now regenerating the shadow database for all bugs.\n";
+    system("./processmail regenerate");
+
+}
+
+
 #
 # If you had to change the --TABLE-- definition in any way, then add your
 # differential change code *** A B O V E *** this comment.
index 856048c4d724db87f9aad4232e6848b9bfe6b0ab..90d2513b795f41d8e558bde560e88cdfde81e63c 100644 (file)
@@ -51,6 +51,7 @@ sub globals_pl_sillyness {
 use Mysql;
 
 use Date::Format;               # For time2str().
+use Date::Parse;               # For str2time().
 # use Carp;                       # for confess
 
 # Contains the version string for the current running Bugzilla.
@@ -109,14 +110,11 @@ sub AppendComment {
     if ($comment =~ /^\s*$/) {  # Nothin' but whitespace.
         return;
     }
-    SendSQL("select long_desc from bugs where bug_id = $bugid");
-    
-    my $desc = FetchOneColumn();
-    my $now = time2str("%Y-%m-%d %H:%M", time());
-    $desc .= "\n\n------- Additional Comments From $who  $now -------\n";
-    $desc .= $comment;
-    SendSQL("update bugs set long_desc=" . SqlQuote($desc) .
-            " where bug_id=$bugid");
+
+    my $whoid = DBNameToIdAndCheck($who);
+
+    SendSQL("INSERT INTO longdescs (bug_id, who, bug_when, thetext) " .
+            "VALUES($bugid, $whoid, now(), " . SqlQuote($comment) . ")");
 }
 
 sub lsearch {
@@ -464,8 +462,25 @@ sub DBNameToIdAndCheck {
 
 sub GetLongDescription {
     my ($id) = (@_);
-    SendSQL("select long_desc from bugs where bug_id = $id");
-    return FetchOneColumn();
+    my $result = "";
+    SendSQL("SELECT profiles.login_name, longdescs.bug_when, " .
+            "       longdescs.thetext " .
+            "FROM longdescs, profiles " .
+            "WHERE profiles.userid = longdescs.who " .
+            "      AND longdescs.bug_id = $id " .
+            "ORDER BY longdescs.bug_when");
+    my $count = 0;
+    while (MoreSQLData()) {
+        my ($who, $when, $text) = (FetchSQLData());
+        if ($count) {
+            $result .= "\n\n------- Additional Comments From $who  " .
+                time2str("%Y-%m-%d %H:%M", str2time($when)) . " -------\n";
+        }
+        $result .= $text;
+        $count++;
+    }
+
+    return $result;
 }
 
 
index 93e7b32262437a16665448112a79ebd820cd3ece..c3be5c67ba041bf0b05a363ae284660711a8bdbd 100755 (executable)
@@ -128,7 +128,7 @@ foreach my $f (@bug_fields) {
 }
 
 my $query = "insert into bugs (\n" . join(",\n", @used_fields) . ",
-creation_ts, long_desc )
+creation_ts )
 values (
 ";
 
@@ -142,7 +142,7 @@ $comment =~ s/\r\n/\n/g;     # Get rid of windows-style line endings.
 $comment =~ s/\r/\n/g;       # Get rid of mac-style line endings.
 $comment = trim($comment);
 
-$query .= "now(), " . SqlQuote($comment) . " )\n";
+$query .= "now())\n";
 
 
 my %ccids;
@@ -164,6 +164,9 @@ SendSQL($query);
 SendSQL("select LAST_INSERT_ID()");
 my $id = FetchOneColumn();
 
+SendSQL("INSERT INTO longdescs (bug_id, who, bug_when, thetext) VALUES " .
+        "($id, $::FORM{'reporter'}, now(), " . SqlQuote($comment) . ")");
+
 foreach my $person (keys %ccids) {
     SendSQL("insert into cc (bug_id, who) values ($id, $person)");
 }
index 5016d5b8addf09cc84beac1c9203cb2f6601c586..027579cee932a09ec2cd642f03cda5bc11130a9f 100755 (executable)
@@ -476,7 +476,7 @@ sub LogDependencyActivity {
 #
 foreach my $id (@idlist) {
     my %dependencychanged;
-    SendSQL("lock tables bugs write, bugs_activity write, cc write, profiles write, dependencies write, votes write, keywords write, keyworddefs read");
+    SendSQL("lock tables bugs write, bugs_activity write, cc write, profiles write, dependencies write, votes write, keywords write, longdescs write, keyworddefs read");
     my @oldvalues = SnapShotBug($id);
 
     if (defined $::FORM{'delta_ts'} && $::FORM{'delta_ts'} ne $delta_ts) {