#!/usr/bin/php -q
<?php

require_once('constants.ini');
require_once($nusoap_include);
require_once('forum_upload.ini');
require_once('script_functions.ini');

// -------------------------------------------------------------------------
// defaults and definitions
//

$progname = basename($argv[0]);

$soap = NULL;
$soap_session_ser = NULL;

$stdin = fopen("php://stdin", "w");
$stderr = fopen("php://stderr", "w");

// -------------------------------------------------------------------------
// functions
//

function error_clean_up() {

	global $stderr;
	global $progname;

	soap_log_out();

	forum_close();

	fwrite($stderr, "$progname: bailing out\n");

	return;

} // end error_clean_up()

// -------------------------------------------------------------------------
// command line stuff
//

if ($argc == 1) {
?>

usage: <?php echo $progname; ?> <upload ID>

Deletes forum messages and attachments uploaded using upload_forum.

<?php
	exit(1);
}

if ($argc > 2) {
	command_line_error("too many arguments");
	exit(1);
}

if (!check_int($argv[1])) {
	command_line_error("bad upload ID \"" . $argv[1] . "\"");
	exit(1);
}

$upload_id = intval($argv[1]);

// -------------------------------------------------------------------------
// get information about the upload
//

if (!forum_init()) {
	error_clean_up();
	exit(1);
}

$res = pg_query($db, "SELECT * FROM forum_upload WHERE id = $upload_id");
if (!$res) {
	error_clean_up();
	exit(1);
}

if (pg_num_rows($res) == 0) {
	fwrite($stderr, "$progname: can't find upload ID $upload_id\n");
	error_clean_up();
	exit(1);
}

$arr = pg_fetch_array($res);
print "upload ID $upload_id\n";
print "uploaded by " . $arr["uploaded_by"] . "\n";
print "uploaded " . $arr["upload_time"] . "\n";
if (!is_null($arr["note"]))
	print "note: " . $arr["note"] . "\n";

pg_free_result($res);

// we get an error below if we try to delete a message that doesn't exist
// deleteing a message deletes all its followups
// we don't want to implicitly delete followups or we'll get an error when 
//     we then explicitly try to delete the followups
// so we order by msg_id desc to get followups first
$query = "SELECT msg_id " . 
         "  FROM forum_upload_message " . 
         " WHERE forum_upload = $upload_id" . 
         "   AND msg_id IN (SELECT msg_id FROM forum)" . 
         " ORDER BY msg_id DESC";
$res = pg_query($db, $query);
if (!$res) {
	error_clean_up();
	exit(1);
}

$message_ids = array();
for($i = 0;$i < pg_num_rows($res);$i++) {
	$arr = pg_fetch_array($res, $i);
	$message_ids[] = intval($arr["msg_id"]);
}
pg_free_result($res);

print count($message_ids) . " messages to delete\n";

$query = "SELECT forum_upload_attachment.doc_id AS doc_id, " . 
         "       doc_groups.group_id AS group_id " . 
         "  FROM forum_upload_attachment, doc_data, doc_groups " . 
         " WHERE forum_upload_attachment.forum_upload = $upload_id " . 
         "   AND forum_upload_attachment.doc_id = doc_data.docid " . 
         "   AND doc_data.doc_group = doc_groups.doc_group";
$res = pg_query($db, $query);
if (!$res) {
	error_clean_up();
	exit(1);
}
$document_and_group_ids = array();
for($i = 0;$i < pg_num_rows($res);$i++) {
	$arr = pg_fetch_array($res, $i);
	$document_and_group_ids[] = array("doc_id"   => intval($arr["doc_id"]), 
	                                  "group_id" => intval($arr["group_id"]));
}
pg_free_result($res);

print count($document_and_group_ids) . " documents to delete\n";

if (count($document_and_group_ids) > 0) {
	if (!soap_log_in()) {
		error_clean_up();
		exit(1);
	}
}


// -------------------------------------------------------------------------
// delete the messages
//

foreach ($message_ids as $msg_id) {
	print "deleting message ID $msg_id...\n";
	$rv = delete_message($msg_id);
	if (!$rv) {
		error_clean_up();
		exit(1);
	}
}

// -------------------------------------------------------------------------
// delete the documents
//

foreach ($document_and_group_ids as $arr) {
	print "deleting document ID " . $arr["doc_id"] . "...\n";
	$soap_vars = array("session_ser" => $soap_session_ser, 
	                   "group_id"    => $arr["group_id"], 
	                   "doc_id"      => $arr["doc_id"]);
	$rv = $soap->call("documentDelete", $soap_vars);
	if ($rv === true) {
		// no error
	} else {
		fwrite($stderr, "$progname: error deleting document\n");
		if ($rv === false)
			fwrite($stderr, "$progname: $soap->error_str\n");
		elseif (isset($rv["faultstring"]))
			fwrite($stderr, "$progname: " . $rv["faultstring"] . "\n");
		error_clean_up();
		exit(1);
	}
}

// -------------------------------------------------------------------------
// clean up and exit
//

if (count($document_and_group_ids) > 0)
	soap_log_out();

forum_close();

exit(0);

?>
