svn: /pear/pearweb/trunk/scripts/ rollbackProposal.php

[email protected] (Brett Bieber) Fri, 07 Jan 2011 17:36:21 +0000
Newsgroups php.pear.cvs,php.pear.core
Message-ID <[email protected]>
saltybeagle                              Fri, 07 Jan 2011 17:36:21 +0000

Revision: http://svn.php.net/viewvc?view=revision&revision=307229

Log:
Add script from Till to rollback a proposal from 'Called for votes' to 'Proposed'

Changed paths:
    A   pear/pearweb/trunk/scripts/rollbackProposal.php

Added: pear/pearweb/trunk/scripts/rollbackProposal.php
===================================================================
--- pear/pearweb/trunk/scripts/rollbackProposal.php	                        (rev 0)
+++ pear/pearweb/trunk/scripts/rollbackProposal.php	2011-01-07 17:36:21 UTC (rev 307229)
@@ -0,0 +1,121 @@
+#!/usr/bin/env php
+<?php
+require_once 'MDB2.php';
+$dsn  = 'mysql://pear:pear@localhost/pearweb';
+
+try {
+    $proposal_id = (int) $argv[1];
+    if ($proposal_id < 1) {
+        throw new InvalidArgumentException("Please supply a number: ./rollback.php NUM");
+    }
+
+    $mdb2 = MDB2::connect($dsn);
+    if (MDB2::isError($mdb2)) {
+        throw new RuntimeException("Could not connect to database: {$mdb2->getDebugInfo()}");
+    }
+    $pearweb = new Pearweb_Rollback($proposal_id, $mdb2);
+    $pearweb->rollback();
+
+} catch (Exception $e) {
+    echo $e->getMessage();
+    exit(1);
+}
+
+echo "All is well.\n";
+exit;
+
+class Pearweb_Rollback
+{
+    protected $mdb2;
+    protected $proposal;
+
+    public function __construct($proposal, MDB2_Driver_Common $mdb2)
+    {
+        if (!is_int($proposal)) {
+            throw new InvalidArgumentException('$proposal must be an int');
+        }
+        $this->proposal = $proposal;
+        $this->mdb2     = $mdb2;
+    }
+
+    public function rollback()
+    {
+        $this->moveVotes();
+        echo "Moved votes to comments...\n";
+
+        $this->resetDate();
+        echo "Reset vote date...\n";
+
+        $this->resetStatus();
+        echo "Reset status...\n";
+    }
+
+    protected function moveVotes()
+    {
+        $sql = "SELECT * FROM package_proposal_votes WHERE pkg_prop_id = {$this->proposal}";
+        $res = $this->mdb2->query($sql);
+        if (MDB2::isError($res)) {
+            throw new RuntimeException("DB error occurred: {$res->getDebugInfo()}");
+        }
+        if ($res->numRows() == 0) {
+            return; // nothing to do
+        }
+
+        $insert  = "INSERT INTO package_proposal_comments (";
+        $insert .= "user_handle, pkg_prop_id, timestamp, comment";
+        $insert .= ") VALUES(%s, {$this->proposal}, %d, %s)";
+
+        $delete  = "DELETE FROM package_proposal_votes WHERE";
+        $delete .= " pkg_prop_id = {$this->proposal}";
+        $delete .= " AND user_handle = %s";
+
+        while ($row = $res->fetchRow(MDB2_FETCHMODE_OBJECT)) {
+
+            $comment  = "Original vote: {$row->value}\n";
+            $comment .= "Conditional vote: " . (($row->is_conditional != 0)?'yes':'no') . "\n";
+            $comment .= "Comment on vote: " . $row->comment . "\n";
+            $comment .= "Reviewed: " . implode(", ", unserialize($row->reviews));
+
+            $sql = sprintf(
+                $insert,
+                $this->mdb2->quote($row->user_handle),
+                $row->timestamp,
+                $this->mdb2->quote($comment)
+            );
+            $this->queryChange($sql);
+
+            $sql = sprintf(
+                $delete,
+                $this->mdb2->quote($row->user_handle)
+            );
+            $this->queryChange($sql);
+        }
+
+        $res->free();
+        return true;
+    }
+
+    protected function queryChange($sql)
+    {
+        $affected = $this->mdb2->exec($sql);
+        if (MDB2::isError($affected)) {
+            throw new RuntimeException("DB error occurred: " . $affected->getDebugInfo());
+        }
+        if ($affected < 1) {
+            throw new UnexpectedValueException("No rows affected. Invalid proposal ID?");
+        }
+        return true;
+    }
+
+    protected function resetDate()
+    {
+        $sql = "UPDATE package_proposals SET vote_date = null WHERE id = {$this->proposal}";
+        return $this->queryChange($sql);
+    }
+
+    protected function resetStatus()
+    {
+        $sql = "UPDATE package_proposals SET status='proposal' WHERE id = {$this->proposal}";
+        return $this->queryChange($sql);
+    }
+}