Completed
Pull Request — master (#541)
by Richard
07:06
created

Sync   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 53
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 3

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
dl 0
loc 53
rs 10
c 0
b 0
f 0
ccs 12
cts 12
cp 1
wmc 7
lcom 1
cbo 3

1 Method

Rating   Name   Duplication   Size   Complexity  
C cleanOrphan() 0 38 7
1
<?php
2
/*
3
 You may not change or alter any portion of this comment or credits
4
 of supporting developers from this source code or any supporting source code
5
 which is considered copyrighted (c) material of the original comment or credit authors.
6
7
 This program is distributed in the hope that it will be useful,
8
 but WITHOUT ANY WARRANTY; without even the implied warranty of
9
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
10
*/
11
12
namespace Xoops\Core\Kernel\Model;
13
14
use Xoops\Core\Kernel\XoopsModelAbstract;
15
16
/**
17
 * Object synchronization handler class.
18
 *
19
 * Usage of methods provided by XoopsModelSync:
20
 *
21
 * Step #1: set linked table and joint fields through XoopsPersistableObjectHandler:
22
 *      $handler->table_link = $handler->db2->prefix("the_linked_table");
23
 *          full name of the linked table that is used for the query
24
 *      $handler->field_link = "the_linked_field";
25
 *          name of field in linked table that will be used to link
26
 *          the linked table with current table
27
 *      $handler->field_object = "the_object_field";
28
 *          name of field in current table that will be used to link
29
 *          the linked table with current table; linked field name will
30
 *          be used if the field name is not set
31
 * Step #2: perform query
32
 *
33
 * @category  Xoops\Core\Kernel\Model\Sync
34
 * @package   Xoops\Core\Kernel
35
 * @author    Taiwen Jiang <[email protected]>
36
 * @copyright 2000-2015 XOOPS Project (http://xoops.org)
37
 * @license   GNU GPL 2 or later (http://www.gnu.org/licenses/gpl-2.0.html)
38
 * @link      http://xoops.org
39
 * @since     2.3.0
40
 */
41
class Sync extends XoopsModelAbstract
42
{
43
    /**
44
     * Clean orphan objects in this handler (child table) that are not in parent table
45
     *
46
     * The parameters can be defined in the handler. Naming should be updated to reflect
47
     * standard relational terminology.
48
     *
49
     * @param string $table_link   parent table
50
     * @param string $field_link   primary key (parent table)
51
     * @param string $field_object foreign key (child table)
52
     *
53
     * @return bool true on success
54
     */
55 1
    public function cleanOrphan($table_link = '', $field_link = '', $field_object = '')
56
    {
57 1
        if (!empty($table_link)) {
58
            $this->handler->table_link = $table_link;
59
        }
60 1
        if (!empty($field_link)) {
61
            $this->handler->field_link = $field_link;
62
        }
63 1
        if (!empty($field_object)) {
64
            $this->handler->field_object = $field_object;
65
        }
66
67 1
        if (empty($this->handler->field_object)
68 1
            || empty($this->handler->table_link)
69 1
            || empty($this->handler->field_link)
70
        ) {
71
            trigger_error(
72
                "The link information is not set for '" . get_class($this->handler) . "' yet.",
73
                E_USER_WARNING
74
            );
75
            return false;
76
        }
77
78
        // there were two versions of this sql, first for mysql 4.1+ and
79
        // the second for earlier versions.
80
        // TODO: Need to analyse and find the most portable query to use here
81
        /*
82
        $sql = "DELETE FROM `{$this->handler->table}`"
83
            . " WHERE (`{$this->handler->field_object}` NOT IN "
84
            . "( SELECT DISTINCT `{$this->handler->field_link}` FROM `{$this->handler->table_link}`) )";
85
        */
86 1
        $sql = "DELETE `{$this->handler->table}` FROM `{$this->handler->table}`"
87 1
            . " LEFT JOIN `{$this->handler->table_link}` AS aa "
88 1
            . " ON `{$this->handler->table}`.`{$this->handler->field_object}` = aa.`{$this->handler->field_link}`"
89 1
            . " WHERE (aa.`{$this->handler->field_link}` IS NULL)";
90
91 1
        return $this->handler->db2->executeUpdate($sql);
92
    }
93
}
94