diff --git a/core/cmdbsource.class.inc.php b/core/cmdbsource.class.inc.php index 78481186c..4e020779b 100644 --- a/core/cmdbsource.class.inc.php +++ b/core/cmdbsource.class.inc.php @@ -243,6 +243,11 @@ class CMDBSource return false; } + public static function DeleteFrom($sSQLQuery) + { + self::Query($sSQLQuery); + } + public static function QueryToScalar($sSql) { $result = mysql_query($sSql, self::$m_resDBLink); diff --git a/core/dbobject.class.php b/core/dbobject.class.php index 6a40f03ab..274258fb0 100644 --- a/core/dbobject.class.php +++ b/core/dbobject.class.php @@ -1183,18 +1183,37 @@ abstract class DBObject } } + private function DBDeleteSingleTable($sTableClass) + { + $sTable = MetaModel::DBGetTable($sTableClass); + // Abstract classes or classes having no specific attribute do not have an associated table + if ($sTable == '') return; + + $sPKField = '`'.MetaModel::DBGetKey($sTableClass).'`'; + $sKey = CMDBSource::Quote($this->m_iKey); + + $sDeleteSQL = "DELETE FROM `$sTable` WHERE $sPKField = $sKey"; + CMDBSource::DeleteFrom($sDeleteSQL); + } + + private function DBDeleteInternal() + { + $sClass = get_class($this); + + foreach(MetaModel::EnumParentClasses($sClass, ENUM_PARENT_CLASSES_ALL) as $sParentClass) + { + $this->DBDeleteSingleTable($sParentClass); + } + } + // Delete a record public function DBDelete() { - $oFilter = new DBObjectSearch(get_class($this)); - $oFilter->AddCondition('id', $this->m_iKey, '='); - $this->OnDelete(); - $sSQL = MetaModel::MakeDeleteQuery($oFilter); if (!MetaModel::DBIsReadOnly()) { - CMDBSource::Query($sSQL); + $this->DBDeleteInternal(); } $this->AfterDelete();