<?php
/**
 * Extended object handlers
 *
 * You may not change or alter any portion of this comment or credits
 * of supporting developers from this source code or any supporting source code
 * which is considered copyrighted (c) material of the original comment or credit authors.
 * 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.
 *
 * @copyright       The XOOPS Project http://sourceforge.net/projects/xoops/
 * @license         http://www.fsf.org/copyleft/gpl.html GNU public license
 * @package         kernel
 * @subpackage      model
 * @since           2.3.0
 * @author          Taiwen Jiang <phppp@users.sourceforge.net>
 * @version         $Id: sync.php 2312 2008-11-09 06:23:13Z phppp $
 */

/**
 * Object synchronization handler class.
 *
 * @author      Taiwen Jiang <phppp@users.sourceforge.net>
 * @copyright   The XOOPS project http://www.xoops.org/
 *
 * {@link XoopsObjectAbstract}
 *
 */
/**
 * Usage of methods provided by XoopsModelSync:
 *
 * Step #1: set linked table and adjoint fields through XoopsPersistableObjectHandler:
 *          $handler->table_link = $handler->db->prefix("the_linked_table"); // full name of the linked table that is used for the query
 *          $handler->field_link = "the_linked_field"; // name of field in linked table that will be used to link the linked table with current table
 *          $handler->field_object = "the_object_field"; // name of field in current table that will be used to link the linked table with current table; linked field name will be used if the field name is not set
 * Step #2: perform query
 *
 */

class XoopsModelSync extends XoopsModelAbstract
{
    /**
     * Clean orphan objects against linked objects
     *
     * @param     string    $table_link     table of linked object for JOIN; deprecated, for backward compat
     * @param     string    $field_link     field of linked object for JOIN; deprecated, for backward compat
     * @param     string    $field_object   field of current object for JOIN; deprecated, for backward compat
     * @return     bool    true on success
     */
    function cleanOrphan($table_link = "", $field_link = "", $field_object = "")
    {
        if (!empty($table_link)) {
            $this->handler->table_link = $table_link;
        }
        if (!empty($field_link)) {
            $this->handler->field_link = $field_link;
        }
        if (!empty($field_object)) {
            $this->handler->field_object = $field_object;
        }

        if (empty($this->handler->field_object) || empty($this->handler->table_link) || empty($this->handler->field_link)) {
            trigger_error("The link information is not set for '" . get_class($this->handler) . "' yet.", E_USER_WARNING);
            return null;
        }

        /* for MySQL 4.1+ */
        if (version_compare( mysql_get_server_info(), "4.1.0", "ge" )):
        $sql =  "   DELETE FROM `{$this->handler->table}`" .
                "   WHERE (`{$this->handler->field_object}` NOT IN ( SELECT DISTINCT `{$this->handler->field_link}` FROM `{$this->handler->table_link}`) )";
        else:
        // for 4.0+
        $sql =  "   DELETE `{$this->handler->table}` FROM `{$this->handler->table}`" .
                "   LEFT JOIN `{$this->handler->table_link}` AS aa ON `{$this->handler->table}`.`{$this->handler->field_object}` = aa.`{$this->handler->field_link}`" .
                "   WHERE (aa.`{$this->handler->field_link}` IS NULL)";
        endif;
        if (!$result = $this->handler->db->queryF($sql)) {
            return false;
        }
        return true;
    }

    /**
     * Synchronizing objects
     *
     * @return     bool    true on success
     */
    function synchronization()
    {
        $this->cleanOrphan();
        return true;
    }
}
?>