| 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: |