Вход Регистрация
Файл: qa-include/qa-app-post-update.php
Строк: 1697
<?php
    
/*
    Question2Answer (c) Gideon Greenspan

    http://www.question2answer.org/

    
    File: qa-include/qa-app-post-update.php
    Version: See define()s at top of qa-include/qa-base.php
    Description: Changing questions, answer and comments (application level)


    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License
    as published by the Free Software Foundation; either version 2
    of the License, or (at your option) any later version.
    
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    More about this license: http://www.question2answer.org/license.php
*/

    
if (!defined('QA_VERSION')) { // don't allow this page to be requested directly from browser
        
header('Location: ../');
        exit;
    }

    require_once 
QA_INCLUDE_DIR.'qa-app-post-create.php';
    require_once 
QA_INCLUDE_DIR.'qa-app-updates.php';
    require_once 
QA_INCLUDE_DIR.'qa-db-post-create.php';
    require_once 
QA_INCLUDE_DIR.'qa-db-post-update.php';
    require_once 
QA_INCLUDE_DIR.'qa-db-points.php';
    require_once 
QA_INCLUDE_DIR.'qa-db-hotness.php';

    
    function 
qa_question_set_content($oldquestion$title$content$format$text$tagstring$notify$userid$handle$cookieid$extravalue=null)
/*
    Change the fields of a question (application level) to $title, $content, $format, $tagstring, $notify and
    $extravalue and reindex based on $text. Pass the question's database record before changes in $oldquestion and
    details of the user doing this in $userid, $handle and $cookieid. Reports event as appropriate.
    See qa-app-posts.php for a higher-level function which is easier to use.
*/
    
{
        
qa_post_unindex($oldquestion['postid']);
        
        
$titlechanged=strcmp($oldquestion['title'], $title) ? true false;
        
$contentchanged=strcmp($oldquestion['content'], $content) || strcmp($oldquestion['format'], $format);
        
$tagschanged=strcmp($oldquestion['tags'], $tagstring) ? true false;
        
$setupdated=$titlechanged || $contentchanged || $tagschanged;
        
        
qa_db_post_set_content($oldquestion['postid'], $title$content$format$tagstring$notify,
            
$setupdated $userid null$setupdated qa_remote_ip_address() : null,
            (
$titlechanged || $contentchanged) ? QA_UPDATE_CONTENT QA_UPDATE_TAGS);
            
        if (isset(
$extravalue)) {
            require_once 
QA_INCLUDE_DIR.'qa-db-metas.php';
            
qa_db_postmeta_set($oldquestion['postid'], 'qa_q_extra'$extravalue);
        }
        
        if (
$oldquestion['type']=='Q'// not hidden or queued
            
qa_post_index($oldquestion['postid'], 'Q'$oldquestion['postid'], $oldquestion['parentid'], $title$content$format$text$tagstring$oldquestion['categoryid']);

        
qa_report_event('q_edit'$userid$handle$cookieid, array(
            
'postid' => $oldquestion['postid'],
            
'title' => $title,
            
'content' => $content,
            
'format' => $format,
            
'text' => $text,
            
'tags' => $tagstring,
            
'extra' => $extravalue,
            
'oldquestion' => $oldquestion,
            
'oldtitle' => $oldquestion['title'],
            
'oldcontent' => $oldquestion['content'],
            
'oldformat' => $oldquestion['format'],
            
'oldtags' => $oldquestion['tags'],
            
'titlechanged' => $titlechanged,
            
'contentchanged' => $contentchanged,
            
'tagschanged' => $tagschanged,
        ));
    }
    
    
    function 
qa_question_set_selchildid($userid$handle$cookieid$oldquestion$selchildid$answers)
/*
    Set the selected answer (application level) of $oldquestion to $selchildid. Pass details of the user doing this
    in $userid, $handle and $cookieid, and the database records for all answers to the question in $answers.
    Handles user points values and notifications.
    See qa-app-posts.php for a higher-level function which is easier to use.
*/
    
{
        
$oldselchildid=$oldquestion['selchildid'];
        
        
qa_db_post_set_selchildid($oldquestion['postid'], isset($selchildid) ? $selchildid null$useridqa_remote_ip_address());
        
qa_db_points_update_ifuser($oldquestion['userid'], 'aselects');
        
qa_db_unselqcount_update();
        
        if (isset(
$oldselchildid) && isset($answers[$oldselchildid])) {
            
qa_db_points_update_ifuser($answers[$oldselchildid]['userid'], 'aselecteds');
        
            
qa_report_event('a_unselect'$userid$handle$cookieid, array(
                
'parentid' => $oldquestion['postid'],
                
'parent' => $oldquestion,
                
'postid' => $oldselchildid,
                
'answer' => $answers[$oldselchildid],
            ));
        }

        if (isset(
$selchildid)) {
            
qa_db_points_update_ifuser($answers[$selchildid]['userid'], 'aselecteds');

            
qa_report_event('a_select'$userid$handle$cookieid, array(
                
'parentid' => $oldquestion['postid'],
                
'parent' => $oldquestion,
                
'postid' => $selchildid,
                
'answer' => $answers[$selchildid],
            ));
        }
    }

    
    function 
qa_question_close_clear($oldquestion$oldclosepost$userid$handle$cookieid)
/*
    Reopen $oldquestion if it was closed. Pass details of the user doing this in $userid, $handle and $cookieid, and the
    $oldclosepost (to match $oldquestion['closedbyid']) if any.
    See qa-app-posts.php for a higher-level function which is easier to use.
*/
    
{
        if (isset(
$oldquestion['closedbyid'])) {
            
qa_db_post_set_closed($oldquestion['postid'], null$useridqa_remote_ip_address());

            if (isset(
$oldclosepost) && ($oldclosepost['parentid']==$oldquestion['postid'])) {
                
qa_post_unindex($oldclosepost['postid']);
                
qa_db_post_delete($oldclosepost['postid']);
            }

            
qa_report_event('q_reopen'$userid$handle$cookieid, array(
                
'postid' => $oldquestion['postid'],
                
'oldquestion' => $oldquestion,
            ));
        }
    }
    
    
    function 
qa_question_close_duplicate($oldquestion$oldclosepost$originalpostid$userid$handle$cookieid)
/*
    Close $oldquestion as a duplicate of the question with id $originalpostid. Pass details of the user doing this in
    $userid, $handle and $cookieid, and the $oldclosepost (to match $oldquestion['closedbyid']) if any. See
    qa-app-posts.php for a higher-level function which is easier to use.
*/
    
{
        
qa_question_close_clear($oldquestion$oldclosepost$userid$handle$cookieid);

        
qa_db_post_set_closed($oldquestion['postid'], $originalpostid$useridqa_remote_ip_address());
        
        
qa_report_event('q_close'$userid$handle$cookieid, array(
            
'postid' => $oldquestion['postid'],
            
'oldquestion' => $oldquestion,
            
'reason' => 'duplicate',
            
'originalid' => $originalpostid,
        ));
    }
    

    function 
qa_question_close_other($oldquestion$oldclosepost$note$userid$handle$cookieid)
/*
    Close $oldquestion with the reason given in $note. Pass details of the user doing this in $userid, $handle and
    $cookieid, and the $oldclosepost (to match $oldquestion['closedbyid']) if any.
    See qa-app-posts.php for a higher-level function which is easier to use.
*/
    
{
        
qa_question_close_clear($oldquestion$oldclosepost$userid$handle$cookieid);
        
        
$postid=qa_db_post_create('NOTE'$oldquestion['postid'], $userid, isset($userid) ? null $cookieid,
            
qa_remote_ip_address(), null$note''nullnull$oldquestion['categoryid']);
        
        
qa_db_posts_calc_category_path($postid);
        
        if (
$oldquestion['type']=='Q')
            
qa_post_index($postid'NOTE'$oldquestion['postid'], $oldquestion['postid'], null$note''$notenull$oldquestion['categoryid']);
        
        
qa_db_post_set_closed($oldquestion['postid'], $postid$useridqa_remote_ip_address());
        
        
qa_report_event('q_close'$userid$handle$cookieid, array(
            
'postid' => $oldquestion['postid'],
            
'oldquestion' => $oldquestion,
            
'reason' => 'other',
            
'note' => $note,
        ));
    }

    
    function 
qa_question_set_hidden($oldquestion$hidden$userid$handle$cookieid$answers$commentsfollows$closepost=null)
/*
    Set the hidden status (application level) of $oldquestion to $hidden. Pass details of the user doing this in
    $userid, $handle and $cookieid, the database records for all answers to the question in $answers, the database
    records for all comments on the question or the question's answers in $commentsfollows ($commentsfollows can also
    contain records for follow-on questions which are ignored), and $closepost to match $oldquestion['closedbyid'] (if any).
    Handles indexing, user points, cached counts and event reports.
    See qa-app-posts.php for a higher-level function which is easier to use.
*/
    
{
        require_once 
QA_INCLUDE_DIR.'qa-app-format.php';
        require_once 
QA_INCLUDE_DIR.'qa-app-updates.php';
            
        
$wasqueued=($oldquestion['type']=='Q_QUEUED');
        
        
qa_post_unindex($oldquestion['postid']);
        
        foreach (
$answers as $answer)
            
qa_post_unindex($answer['postid']);
        
        foreach (
$commentsfollows as $comment)
            if (
$comment['basetype']=='C')
                
qa_post_unindex($comment['postid']);
                
        if (@
$closepost['parentid']==$oldquestion['postid'])
            
qa_post_unindex($closepost['postid']);
                
        
$setupdated=$hidden || !$wasqueued// don't record approval of a post as an update action...
            
        
qa_db_post_set_type($oldquestion['postid'], $hidden 'Q_HIDDEN' 'Q',
            
$setupdated $userid null$setupdated qa_remote_ip_address() : nullQA_UPDATE_VISIBLE);
        
        if (!
$setupdated) { // ... for approval of a post, set created time to now instead
            
qa_db_post_set_created($oldquestion['postid'], null);
            
qa_db_hotness_update($oldquestion['postid']);
        }
        
        
qa_db_category_path_qcount_update(qa_db_post_get_category_path($oldquestion['postid']));
        
qa_db_points_update_ifuser($oldquestion['userid'], array('qposts''aselects'));
        
qa_db_qcount_update();
        
qa_db_unaqcount_update();
        
qa_db_unselqcount_update();
        
qa_db_unupaqcount_update();
        
        if (!
$hidden) {
            
qa_post_index($oldquestion['postid'], 'Q'$oldquestion['postid'], $oldquestion['parentid'], $oldquestion['title'], $oldquestion['content'],
                
$oldquestion['format'], qa_viewer_text($oldquestion['content'], $oldquestion['format']), $oldquestion['tags'], $oldquestion['categoryid']);

            foreach (
$answers as $answer)
                if (
$answer['type']=='A'// even if question visible, don't index hidden or queued answers
                    
qa_post_index($answer['postid'], $answer['type'], $oldquestion['postid'], $answer['parentid'], null,
                        
$answer['content'], $answer['format'], qa_viewer_text($answer['content'], $answer['format']), null$answer['categoryid']);
                    
            foreach (
$commentsfollows as $comment)
                if (
$comment['type']=='C') {
                    
$answer=@$answers[$comment['parentid']];
                    
                    if ( (!isset(
$answer)) || ($answer['type']=='A') ) // don't index comment if it or its parent is hidden
                        
qa_post_index($comment['postid'], $comment['type'], $oldquestion['postid'], $comment['parentid'], null,
                            
$comment['content'], $comment['format'], qa_viewer_text($comment['content'], $comment['format']), null$comment['categoryid']);
                }
                            
            if (
$closepost['parentid']==$oldquestion['postid'])
                
qa_post_index($closepost['postid'], $closepost['type'], $oldquestion['postid'], $closepost['parentid'], null,
                    
$closepost['content'], $closepost['format'], qa_viewer_text($closepost['content'], $closepost['format']), null$closepost['categoryid']);
        }

        
qa_report_event($wasqueued ? ($hidden 'q_reject' 'q_approve') : ($hidden 'q_hide' 'q_reshow'), $userid$handle$cookieid, array(
            
'postid' => $oldquestion['postid'],
            
'oldquestion' => $oldquestion,
        ));
        
        if (
$wasqueued && !$hidden) {
            require_once 
QA_INCLUDE_DIR.'qa-db-selects.php';
            require_once 
QA_INCLUDE_DIR.'qa-util-string.php';
            
            
qa_report_event('q_post'$oldquestion['userid'], $oldquestion['handle'], $oldquestion['cookieid'], array(
                
'postid' => $oldquestion['postid'],
                
'parentid' => $oldquestion['parentid'],
                
'parent' => isset($oldquestion['parentid']) ? qa_db_single_select(qa_db_full_post_selectspec(null$oldquestion['parentid'])) : null,
                
'title' => $oldquestion['title'],
                
'content' => $oldquestion['content'],
                
'format' => $oldquestion['format'],
                
'text' => qa_viewer_text($oldquestion['content'], $oldquestion['format']),
                
'tags' => $oldquestion['tags'],
                
'categoryid' => $oldquestion['categoryid'],
                
'notify' => isset($oldquestion['notify']),
                
'email' => qa_email_validate($oldquestion['notify']) ? $oldquestion['notify'] : null,
                
'delayed' => $oldquestion['created'],
            ));
        }
    }

    
    function 
qa_question_set_category($oldquestion$categoryid$userid$handle$cookieid$answers$commentsfollows$closepost=null)
/*
    Sets the category (application level) of $oldquestion to $categoryid. Pass details of the user doing this in
    $userid, $handle and $cookieid, the database records for all answers to the question in $answers, the database
    records for all comments on the question or the question's answers in $commentsfollows ($commentsfollows can also
    contain records for follow-on questions which are ignored), and $closepost to match $oldquestion['closedbyid'] (if any).
    Handles cached counts and event reports and will reset category IDs and paths for all answers and comments.
    See qa-app-posts.php for a higher-level function which is easier to use.
*/
    
{
        
$oldpath=qa_db_post_get_category_path($oldquestion['postid']);
        
        
qa_db_post_set_category($oldquestion['postid'], $categoryid$useridqa_remote_ip_address());
        
qa_db_posts_calc_category_path($oldquestion['postid']);
        
        
$newpath=qa_db_post_get_category_path($oldquestion['postid']);
        
        
qa_db_category_path_qcount_update($oldpath);
        
qa_db_category_path_qcount_update($newpath);

        
$otherpostids=array();
        foreach (
$answers as $answer)
            
$otherpostids[]=$answer['postid'];
            
        foreach (
$commentsfollows as $comment)
            if (
$comment['basetype']=='C')
                
$otherpostids[]=$comment['postid'];
                
        if (@
$closepost['parentid']==$oldquestion['postid'])
            
$otherpostids[]=$closepost['postid'];
                
        
qa_db_posts_set_category_path($otherpostids$newpath);

        
$searchmodules=qa_load_modules_with('search''move_post');
        foreach (
$searchmodules as $searchmodule) {
            
$searchmodule->move_post($oldquestion['postid'], $categoryid);
            foreach (
$otherpostids as $otherpostid)
                
$searchmodule->move_post($otherpostid$categoryid);
        }

        
qa_report_event('q_move'$userid$handle$cookieid, array(
            
'postid' => $oldquestion['postid'],
            
'oldquestion' => $oldquestion,
            
'categoryid' => $categoryid,
            
'oldcategoryid' => $oldquestion['categoryid'],
        ));
    }
    
    
    function 
qa_question_delete($oldquestion$userid$handle$cookieid$oldclosepost=null)
/*
    Permanently delete a question (application level) from the database. The question must not have any answers or
    comments on it. Pass details of the user doing this in $userid, $handle and $cookieid, and $closepost to match
    $oldquestion['closedbyid'] (if any). Handles unindexing, votes, points, cached counts and event reports.
    See qa-app-posts.php for a higher-level function which is easier to use.
*/
    
{
        require_once 
QA_INCLUDE_DIR.'qa-db-votes.php';
        
        if (
$oldquestion['type']!='Q_HIDDEN')
            
qa_fatal_error('Tried to delete a non-hidden question');
        
        if (isset(
$oldclosepost) && ($oldclosepost['parentid']==$oldquestion['postid'])) {
            
qa_db_post_set_closed($oldquestion['postid'], null); // for foreign key constraint
            
qa_post_unindex($oldclosepost['postid']);
            
qa_db_post_delete($oldclosepost['postid']);
        }

        
$useridvotes=qa_db_uservote_post_get($oldquestion['postid']);
        
$oldpath=qa_db_post_get_category_path($oldquestion['postid']);
        
        
qa_post_unindex($oldquestion['postid']);
        
qa_db_post_delete($oldquestion['postid']); // also deletes any related voteds due to cascading
        
        
qa_db_category_path_qcount_update($oldpath);
        
qa_db_points_update_ifuser($oldquestion['userid'], array('qposts''aselects''qvoteds''upvoteds''downvoteds'));
        
        foreach (
$useridvotes as $voteruserid => $vote)
            
qa_db_points_update_ifuser($voteruserid, ($vote>0) ? 'qupvotes' 'qdownvotes');
                
// could do this in one query like in qa_db_users_recalc_points() but this will do for now - unlikely to be many votes
        
        
qa_db_qcount_update();
        
qa_db_unaqcount_update();
        
qa_db_unselqcount_update();
        
qa_db_unupaqcount_update();

        
qa_report_event('q_delete'$userid$handle$cookieid, array(
            
'postid' => $oldquestion['postid'],
            
'oldquestion' => $oldquestion,
        ));
    }


    function 
qa_question_set_userid($oldquestion$userid$handle$cookieid)
/*
    Set the author (application level) of $oldquestion to $userid and also pass $handle and $cookieid
    of user. Updates points and reports events as appropriate.
*/
    
{
        
qa_db_post_set_userid($oldquestion['postid'], $userid);

        
qa_db_points_update_ifuser($oldquestion['userid'], array('qposts''aselects''qvoteds''upvoteds''downvoteds'));
        
qa_db_points_update_ifuser($userid, array('qposts''aselects''qvoteds''upvoteds''downvoteds'));
        
        
qa_report_event('q_claim'$userid$handle$cookieid, array(
            
'postid' => $oldquestion['postid'],
            
'oldquestion' => $oldquestion,
        ));
    }

    
    function 
qa_post_unindex($postid)
/*
    Remove post $postid from our index and update appropriate word counts. Calls through to all search modules.
*/
    
{
        global 
$qa_post_indexing_suspended;

        if (
$qa_post_indexing_suspended>0)
            return;
            
    
//    Send through to any search modules for unindexing
    
        
$searchmodules=qa_load_modules_with('search''unindex_post');
        foreach (
$searchmodules as $searchmodule)
            
$searchmodule->unindex_post($postid);
    }

    
    function 
qa_answer_set_content($oldanswer$content$format$text$notify$userid$handle$cookieid$question)
/*
    Change the fields of an answer (application level) to $content, $format and $notify, and reindex based on $text.
    Pass the answer's database record before changes in $oldanswer, the question's in $question, and details of the
    user doing this in $userid, $handle and $cookieid. Handle indexing and event reports as appropriate.
    See qa-app-posts.php for a higher-level function which is easier to use.
*/
    
{
        
qa_post_unindex($oldanswer['postid']);
        
        
$contentchanged=strcmp($oldanswer['content'], $content) || strcmp($oldanswer['format'], $format);
        
        
qa_db_post_set_content($oldanswer['postid'], $oldanswer['title'], $content$format$oldanswer['tags'], $notify,
            
$contentchanged $userid null$contentchanged qa_remote_ip_address() : null);
        
        if ( (
$oldanswer['type']=='A') && ($question['type']=='Q') ) // don't index if question or answer are hidden/queued
            
qa_post_index($oldanswer['postid'], 'A'$question['postid'], $oldanswer['parentid'], null$content$format$textnull$oldanswer['categoryid']);

        
qa_report_event('a_edit'$userid$handle$cookieid, array(
            
'postid' => $oldanswer['postid'],
            
'parentid' => $oldanswer['parentid'],
            
'content' => $content,
            
'format' => $format,
            
'text' => $text,
            
'oldcontent' => $oldanswer['content'],
            
'oldformat' => $oldanswer['format'],
            
'oldanswer' => $oldanswer,
            
'contentchanged' => $contentchanged,
        ));
    }

    
    function 
qa_answer_set_hidden($oldanswer$hidden$userid$handle$cookieid$question$commentsfollows)
/*
    Set the hidden status (application level) of $oldanswer to $hidden. Pass details of the user doing this
    in $userid, $handle and $cookieid, the database record for the question in $question, and the database
    records for all comments on the answer in $commentsfollows ($commentsfollows can also contain other
    records which are ignored). Handles indexing, user points, cached counts and event reports.
    See qa-app-posts.php for a higher-level function which is easier to use.
*/
    
{
        require_once 
QA_INCLUDE_DIR.'qa-app-format.php';
            
        
$wasqueued=($oldanswer['type']=='A_QUEUED');
        
        
qa_post_unindex($oldanswer['postid']);
        
        foreach (
$commentsfollows as $comment)
            if ( (
$comment['basetype']=='C') && ($comment['parentid']==$oldanswer['postid']) )
                
qa_post_unindex($comment['postid']);
        
        
$setupdated=$hidden || !$wasqueued// don't record approval of a post as an update action...
        
        
qa_db_post_set_type($oldanswer['postid'], $hidden 'A_HIDDEN' 'A',
            
$setupdated $userid null$setupdated qa_remote_ip_address() : nullQA_UPDATE_VISIBLE);

        if (!
$setupdated// ... for approval of a post, set created time to now instead
            
qa_db_post_set_created($oldanswer['postid'], null);
        
        
qa_db_points_update_ifuser($oldanswer['userid'], array('aposts''aselecteds'));
        
qa_db_post_acount_update($question['postid']);
        
qa_db_hotness_update($question['postid']);
        
qa_db_acount_update();
        
qa_db_unaqcount_update();
        
qa_db_unupaqcount_update();
        
        if ((
$question['type']=='Q') && !$hidden) { // even if answer visible, don't index if question is hidden or queued
            
qa_post_index($oldanswer['postid'], 'A'$question['postid'], $oldanswer['parentid'], null$oldanswer['content'],
                
$oldanswer['format'], qa_viewer_text($oldanswer['content'], $oldanswer['format']), null$oldanswer['categoryid']);
            
            foreach (
$commentsfollows as $comment)
                if ( (
$comment['type']=='C') && ($comment['parentid']==$oldanswer['postid']) ) // and don't index hidden/queued comments
                    
qa_post_index($comment['postid'], $comment['type'], $question['postid'], $comment['parentid'], null$comment['content'],
                        
$comment['format'], qa_viewer_text($comment['content'], $comment['format']), null$comment['categoryid']);
        }

        
qa_report_event($wasqueued ? ($hidden 'a_reject' 'a_approve') : ($hidden 'a_hide' 'a_reshow'), $userid$handle$cookieid, array(
            
'postid' => $oldanswer['postid'],
            
'parentid' => $oldanswer['parentid'],
            
'oldanswer' => $oldanswer,
        ));
        
        if (
$wasqueued && !$hidden) {
            require_once 
QA_INCLUDE_DIR.'qa-util-string.php';
            
            
qa_report_event('a_post'$oldanswer['userid'], $oldanswer['handle'], $oldanswer['cookieid'], array(
                
'postid' => $oldanswer['postid'],
                
'parentid' => $oldanswer['parentid'],
                
'parent' => $question,
                
'content' => $oldanswer['content'],
                
'format' => $oldanswer['format'],
                
'text' => qa_viewer_text($oldanswer['content'], $oldanswer['format']),
                
'categoryid' => $oldanswer['categoryid'],
                
'notify' => isset($oldanswer['notify']),
                
'email' => qa_email_validate($oldanswer['notify']) ? $oldanswer['notify'] : null,
                
'delayed' => $oldanswer['created'],
            ));
        }
    }

    
    function 
qa_answer_delete($oldanswer$question$userid$handle$cookieid)
/*
    Permanently delete an answer (application level) from the database. The answer must not have any comments or
    follow-on questions. Pass the database record for the question in $question and details of the user doing this
    in $userid, $handle and $cookieid. Handles unindexing, votes, points, cached counts and event reports.
    See qa-app-posts.php for a higher-level function which is easier to use.
*/
    
{
        require_once 
QA_INCLUDE_DIR.'qa-db-votes.php';
        
        if (
$oldanswer['type']!='A_HIDDEN')
            
qa_fatal_error('Tried to delete a non-hidden answer');
        
        
$useridvotes=qa_db_uservote_post_get($oldanswer['postid']);
        
        
qa_post_unindex($oldanswer['postid']);
        
qa_db_post_delete($oldanswer['postid']); // also deletes any related voteds due to cascading
        
        
if ($question['selchildid']==$oldanswer['postid']) {
            
qa_db_post_set_selchildid($question['postid'], null);
            
qa_db_points_update_ifuser($question['userid'], 'aselects');
            
qa_db_unselqcount_update();
        }
        
        
qa_db_points_update_ifuser($oldanswer['userid'], array('aposts''aselecteds''avoteds''upvoteds''downvoteds'));
        
        foreach (
$useridvotes as $userid => $vote)
            
qa_db_points_update_ifuser($userid, ($vote>0) ? 'aupvotes' 'adownvotes');
                
// could do this in one query like in qa_db_users_recalc_points() but this will do for now - unlikely to be many votes
        
        
qa_db_post_acount_update($question['postid']);
        
qa_db_hotness_update($question['postid']);
        
qa_db_acount_update();
        
qa_db_unaqcount_update();
        
qa_db_unupaqcount_update();

        
qa_report_event('a_delete'$userid$handle$cookieid, array(
            
'postid' => $oldanswer['postid'],
            
'parentid' => $oldanswer['parentid'],
            
'oldanswer' => $oldanswer,
        ));
    }
    
    
    function 
qa_answer_set_userid($oldanswer$userid$handle$cookieid)
/*
    Set the author (application level) of $oldanswer to $userid and also pass $handle and $cookieid
    of user. Updates points and reports events as appropriate.
*/
    
{
        
qa_db_post_set_userid($oldanswer['postid'], $userid);

        
qa_db_points_update_ifuser($oldanswer['userid'], array('aposts''aselecteds''avoteds''upvoteds''downvoteds'));
        
qa_db_points_update_ifuser($userid, array('aposts''aselecteds''avoteds''upvoteds''downvoteds'));

        
qa_report_event('a_claim'$userid$handle$cookieid, array(
            
'postid' => $oldanswer['postid'],
            
'parentid' => $oldanswer['parentid'],
            
'oldanswer' => $oldanswer,
        ));
    }

    
    function 
qa_comment_set_content($oldcomment$content$format$text$notify$userid$handle$cookieid$question$parent)
/*
    Change the fields of a comment (application level) to $content, $format and $notify, and reindex based on $text.
    Pass the comment's database record before changes in $oldcomment, details of the user doing this in  $userid,
    $handle and $cookieid, the antecedent question in $question and the answer's database record in $answer if this
    is a comment on an answer, otherwise null. Handles unindexing and event reports.
    See qa-app-posts.php for a higher-level function which is easier to use.
*/
    
{
        if (!isset(
$parent))
            
$parent=$question// for backwards compatibility with old answer parameter
        
        
qa_post_unindex($oldcomment['postid']);
        
        
$contentchanged=strcmp($oldcomment['content'], $content) || strcmp($oldcomment['format'], $format);
        
        
qa_db_post_set_content($oldcomment['postid'], $oldcomment['title'], $content$format$oldcomment['tags'], $notify,
            
$contentchanged $userid null$contentchanged qa_remote_ip_address() : null);
    
        if ( (
$oldcomment['type']=='C') && ($question['type']=='Q') && (($parent['type']=='Q') || ($parent['type']=='A')) ) // all must be visible
            
qa_post_index($oldcomment['postid'], 'C'$question['postid'], $oldcomment['parentid'], null$content$format$textnull$oldcomment['categoryid']);

        
qa_report_event('c_edit'$userid$handle$cookieid, array(
            
'postid' => $oldcomment['postid'],
            
'parentid' => $oldcomment['parentid'],
            
'parenttype' => $parent['basetype'],
            
'questionid' => $question['postid'],
            
'content' => $content,
            
'format' => $format,
            
'text' => $text,
            
'oldcontent' => $oldcomment['content'],
            
'oldformat' => $oldcomment['format'],
            
'oldcomment' => $oldcomment,
            
'contentchanged' => $contentchanged,
        ));
    }

    
    function 
qa_answer_to_comment($oldanswer$parentid$content$format$text$notify$userid$handle$cookieid$question$answers$commentsfollows)
/*
    Convert an answer to a comment (application level) and set its fields to $content, $format and $notify.
    Pass the answer's database record before changes in $oldanswer, the new comment's $parentid to be, details of the
    user doing this in $userid, $handle and $cookieid, the antecedent question's record in $question, the records for
    all answers to that question in $answers, and the records for all comments on the (old) answer and questions
    following from the (old) answer in $commentsfollows ($commentsfollows can also contain other records which are ignored).
    Handles indexing (based on $text), user points, cached counts and event reports.
*/
    
{
        
$parent=isset($answers[$parentid]) ? $answers[$parentid] : $question;
            
        
qa_post_unindex($oldanswer['postid']);
        
        
$contentchanged=strcmp($oldanswer['content'], $content) || strcmp($oldanswer['format'], $format);
        
        
qa_db_post_set_type($oldanswer['postid'], substr_replace($oldanswer['type'], 'C'01), $useridqa_remote_ip_address(), QA_UPDATE_TYPE);
        
qa_db_post_set_parent($oldanswer['postid'], $parentid);
        
qa_db_post_set_content($oldanswer['postid'], $oldanswer['title'], $content$format$oldanswer['tags'], $notify,
            
$contentchanged $userid null$contentchanged qa_remote_ip_address() : null);
        
        foreach (
$commentsfollows as $commentfollow)
            if (
$commentfollow['parentid']==$oldanswer['postid']) // do same thing for comments and follows
                
qa_db_post_set_parent($commentfollow['postid'], $parentid);

        
qa_db_points_update_ifuser($oldanswer['userid'], array('aposts''aselecteds''cposts'));

        
qa_db_post_acount_update($question['postid']);
        
qa_db_hotness_update($question['postid']);
        
qa_db_acount_update();
        
qa_db_ccount_update();
        
qa_db_unaqcount_update();
        
qa_db_unupaqcount_update();
    
        if ( (
$oldanswer['type']=='A') && ($question['type']=='Q') && (($parent['type']=='Q') || ($parent['type']=='A')) ) // only if all fully visible
            
qa_post_index($oldanswer['postid'], 'C'$question['postid'], $parentidnull$content$format$textnull$oldanswer['categoryid']);

        
qa_report_event('a_to_c'$userid$handle$cookieid, array(
            
'postid' => $oldanswer['postid'],
            
'parentid' => $parentid,
            
'parenttype' => $parent['basetype'],
            
'questionid' => $question['postid'],
            
'content' => $content,
            
'format' => $format,
            
'text' => $text,
            
'oldcontent' => $oldanswer['content'],
            
'oldformat' => $oldanswer['format'],
            
'oldanswer' => $oldanswer,
            
'contentchanged' => $contentchanged,
        ));
    }

    
    function 
qa_comment_set_hidden($oldcomment$hidden$userid$handle$cookieid$question$parent)
/*
    Set the hidden status (application level) of $oldcomment to $hidden. Pass the antecedent question's record in $question,
    details of the user doing this in $userid, $handle and $cookieid, and the answer's database record in $answer if this
    is a comment on an answer, otherwise null. Handles indexing, user points, cached counts and event reports.
    See qa-app-posts.php for a higher-level function which is easier to use.
*/
    
{
        require_once 
QA_INCLUDE_DIR.'qa-app-format.php';
        
        if (!isset(
$parent))
            
$parent=$question// for backwards compatibility with old answer parameter
        
        
$wasqueued=($oldcomment['type']=='C_QUEUED');
        
        
qa_post_unindex($oldcomment['postid']);
        
        
$setupdated=$hidden || !$wasqueued// don't record approval of a post as an update action...
        
        
qa_db_post_set_type($oldcomment['postid'], $hidden 'C_HIDDEN' 'C',
            
$setupdated $userid null$setupdated qa_remote_ip_address() : nullQA_UPDATE_VISIBLE);

        if (!
$setupdated// ... for approval of a post, set created time to now instead
            
qa_db_post_set_created($oldcomment['postid'], null);
            
        
qa_db_points_update_ifuser($oldcomment['userid'], array('cposts'));
        
qa_db_ccount_update();
        
        if ( (
$question['type']=='Q') && (($parent['type']=='Q') || ($parent['type']=='A')) && !$hidden// only index if none of the things it depends on are hidden or queued
            
qa_post_index($oldcomment['postid'], 'C'$question['postid'], $oldcomment['parentid'], null$oldcomment['content'],
                
$oldcomment['format'], qa_viewer_text($oldcomment['content'], $oldcomment['format']), null$oldcomment['categoryid']);

        
qa_report_event($wasqueued ? ($hidden 'c_reject' 'c_approve') : ($hidden 'c_hide' 'c_reshow'), $userid$handle$cookieid, array(
            
'postid' => $oldcomment['postid'],
            
'parentid' => $oldcomment['parentid'],
            
'oldcomment' => $oldcomment,
            
'parenttype' => $parent['basetype'],
            
'questionid' => $question['postid'],
        ));
        
        if (
$wasqueued && !$hidden) {
            require_once 
QA_INCLUDE_DIR.'qa-db-selects.php';
            require_once 
QA_INCLUDE_DIR.'qa-util-string.php';
            
            
$commentsfollows=qa_db_single_select(qa_db_full_child_posts_selectspec(null$oldcomment['parentid']));            
            
$thread=array();
            
            foreach (
$commentsfollows as $comment)
                if ((
$comment['type']=='C') && ($comment['parentid']==$parent['postid']))
                    
$thread[]=$comment;
                
            
qa_report_event('c_post'$oldcomment['userid'], $oldcomment['handle'], $oldcomment['cookieid'], array(
                
'postid' => $oldcomment['postid'],
                
'parentid' => $oldcomment['parentid'],
                
'parenttype' => $parent['basetype'],
                
'parent' => $parent,
                
'questionid' => $question['postid'],
                
'question' => $question,
                
'thread' => $thread,
                
'content' => $oldcomment['content'],
                
'format' => $oldcomment['format'],
                
'text' => qa_viewer_text($oldcomment['content'], $oldcomment['format']),
                
'categoryid' => $oldcomment['categoryid'],
                
'notify' => isset($oldcomment['notify']),
                
'email' => qa_email_validate($oldcomment['notify']) ? $oldcomment['notify'] : null,
                
'delayed' => $oldcomment['created'],
            ));
        }
    }

    
    function 
qa_comment_delete($oldcomment$question$parent$userid$handle$cookieid)
/*
    Permanently delete a comment in $oldcomment (application level) from the database. Pass the database question in $question
    and the answer's database record in $answer if this is a comment on an answer, otherwise null. Pass details of the user
    doing this in $userid, $handle and $cookieid. Handles unindexing, points, cached counts and event reports.
    See qa-app-posts.php for a higher-level function which is easier to use.
*/
    
{
        if (!isset(
$parent))
            
$parent=$question// for backwards compatibility with old answer parameter
        
        
if ($oldcomment['type']!='C_HIDDEN')
            
qa_fatal_error('Tried to delete a non-hidden comment');
        
        
qa_post_unindex($oldcomment['postid']);
        
qa_db_post_delete($oldcomment['postid']);
        
qa_db_points_update_ifuser($oldcomment['userid'], array('cposts'));
        
qa_db_ccount_update();

        
qa_report_event('c_delete'$userid$handle$cookieid, array(
            
'postid' => $oldcomment['postid'],
            
'parentid' => $oldcomment['parentid'],
            
'oldcomment' => $oldcomment,
            
'parenttype' => $parent['basetype'],
            
'questionid' => $question['postid'],
        ));
    }

    
    function 
qa_comment_set_userid($oldcomment$userid$handle$cookieid)
/*
    Set the author (application level) of $oldcomment to $userid and also pass $handle and $cookieid
    of user. Updates points and reports events as appropriate.
*/
    
{
        
qa_db_post_set_userid($oldcomment['postid'], $userid);
        
        
qa_db_points_update_ifuser($oldcomment['userid'], array('cposts'));
        
qa_db_points_update_ifuser($userid, array('cposts'));

        
qa_report_event('c_claim'$userid$handle$cookieid, array(
            
'postid' => $oldcomment['postid'],
            
'parentid' => $oldcomment['parentid'],
            
'oldcomment' => $oldcomment,
        ));
    }
    

/*
    Omit PHP closing tag to help avoid accidental output
*/
Онлайн: 0
Реклама