1: <?php
2: /**
3: * Object synchronization handler class.
4: *
5: * You may not change or alter any portion of this comment or credits
6: * of supporting developers from this source code or any supporting source code
7: * which is considered copyrighted (c) material of the original comment or credit authors.
8: * This program is distributed in the hope that it will be useful,
9: * but WITHOUT ANY WARRANTY; without even the implied warranty of
10: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
11: *
12: * @copyright (c) 2000-2016 XOOPS Project (www.xoops.org)
13: * @license GNU GPL 2 (https://www.gnu.org/licenses/gpl-2.0.html)
14: * @package kernel
15: * @subpackage model
16: * @since 2.3.0
17: * @author Taiwen Jiang <phppp@users.sourceforge.net>
18: */
19: defined('XOOPS_ROOT_PATH') || exit('Restricted access');
20:
21: /**
22: * Object synchronization handler class.
23: *
24: * @author Taiwen Jiang <phppp@users.sourceforge.net>
25: *
26: * {@link XoopsModelAbstract}
27: */
28:
29: /**
30: * Usage of methods provided by XoopsModelSync:
31: *
32: * Step #1: set linked table and adjoint fields through XoopsPersistableObjectHandler:
33: * $handler->table_link = $handler->db->prefix("the_linked_table"); // full name of the linked table that is used for the query
34: * $handler->field_link = "the_linked_field"; // name of field in linked table that will be used to link the linked table with current table
35: * $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
36: * Step #2: perform query
37: */
38: class XoopsModelSync extends XoopsModelAbstract
39: {
40: /**
41: * Clean orphan objects against linked objects
42: *
43: * @param string $table_link table of linked object for JOIN; deprecated, for backward compatibility
44: * @param string $field_link field of linked object for JOIN; deprecated, for backward compatibility
45: * @param string $field_object field of current object for JOIN; deprecated, for backward compatibility
46: * @return bool true on success
47: */
48: public function cleanOrphan($table_link = '', $field_link = '', $field_object = '')
49: {
50: if (!empty($table_link)) {
51: $this->handler->table_link = $table_link;
52: }
53: if (!empty($field_link)) {
54: $this->handler->field_link = $field_link;
55: }
56: if (!empty($field_object)) {
57: $this->handler->field_object = $field_object;
58: }
59:
60: if (empty($this->handler->field_object) || empty($this->handler->table_link) || empty($this->handler->field_link)) {
61: trigger_error("The link information is not set for '" . get_class($this->handler) . "' yet.", E_USER_WARNING);
62:
63: return null;
64: }
65:
66: /**
67: * for MySQL 4.1+
68: */
69: if (version_compare(mysqli_get_server_info($this->handler->db->conn), '4.1.0', 'ge')) {
70: $sql = "DELETE FROM `{$this->handler->table}`" . " WHERE (`{$this->handler->field_object}` NOT IN ( SELECT DISTINCT `{$this->handler->field_link}` FROM `{$this->handler->table_link}`) )";
71: } else {
72: // for 4.0+
73: $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)";
74: }
75: if (!$result = $this->handler->db->queryF($sql)) {
76: return false;
77: }
78:
79: return true;
80: }
81:
82: /**
83: * Synchronizing objects
84: * @deprecated
85: *
86: * @return bool true on success
87: */
88: public function synchronization()
89: {
90: $retval = $this->cleanOrphan();
91:
92: return $retval;
93: }
94: }
95: