/** * Deletes a record from the database. * @param Dataface_Record $record Dataface_Record object to be deleted. * @param boolean $secure Whether to check permissions. * @returns mixed true if successful, or PEAR_Error if failed. */ function delete(&$record, $secure = false) { if ($secure && !$record->checkPermission('delete')) { // Use security to check to see if we are allowed to delete this // record. return Dataface_Error::permissionDenied(df_translate('scripts.Dataface.IO.delete.PERMISSION_DENIED', 'Could not delete record "' . $record->getTitle() . '" from table "' . $record->_table->tablename . '" because you have insufficient permissions.', array('title' => $record->getTitle(), 'table' => $record->_table->tablename))); } $builder = new Dataface_QueryBuilder($this->_table->tablename); if ($this->fireTriggers) { $res = $this->fireBeforeDelete($record); if (PEAR::isError($res)) { return $res; } } // do the deleting $keys =& $record->_table->keys(); if (!$keys || count($keys) == 0) { trigger_error(df_translate('scripts.Dataface.IO.delete.ERROR_NO_PRIMARY_KEY', 'Could not delete record from table "' . $record->_table->tablename . '" because no primary key was defined.', array('tablename' => $record->_table->tablename))); exit; } $query = array(); foreach (array_keys($keys) as $key) { if (!$record->strval($key)) { return PEAR::raiseError(Dataface_LanguageTool::translate('Could not delete record because missing keys', 'Could not delete record ' . $record->getTitle() . ' because not all of the keys were included.', array('title' => $record->getTitle(), 'key' => $key)), DATAFACE_E_DELETE_FAILED); } $query[$key] = '=' . $record->strval($key); } $sql = $builder->delete($query); if (PEAR::isError($sql)) { return $sql; } //$res = mysql_query($sql); $res = $this->dbObj->query($sql, null, $this->lang); if (!$res || PEAR::isError($res)) { if (PEAR::isError($res)) { $msg = $res->getMessage(); } else { $msg = mysql_error(df_db()); } return PEAR::raiseError(Dataface_LanguageTool::translate('Failed to delete record. SQL error', 'Failed to delete record ' . $record->getTitle() . ' because of an sql error. ' . mysql_error(df_db()), array('title' => $record->getTitle(), 'sql' => $sql, 'mysql_error' => $msg)), DATAFACE_E_DELETE_FAILED); } $parentIO =& $this->getParentIO(); if (isset($parentIO)) { $parentRecord =& $record->getParentRecord(); if (isset($parentRecord)) { $res = $parentIO->delete($parentRecord, $secure); if (PEAR::isError($res)) { return $res; } } } if ($this->fireTriggers) { $res2 = $this->fireAfterDelete($record); if (PEAR::isError($res2)) { return $res2; } } self::touchTable($this->_table->tablename); return $res; }
function test_query_builder_delete() { $builder = new Dataface_QueryBuilder('Profiles'); $s =& $this->table1; $this->assertEquals($builder->delete(), "DELETE FROM `Profiles`"); $this->assertEquals($builder->delete(array('-skip' => 5, '-limit' => 2)), "DELETE FROM `Profiles` LIMIT 5,2"); $this->assertEquals($builder->delete(array('-skip' => 5, '-limit' => 2, 'fname' => 'John')), "DELETE FROM `Profiles` WHERE `Profiles`.`fname` LIKE '%John%' LIMIT 5,2"); }