From 641dc210aaebb8db131db9100397fc4c386963da Mon Sep 17 00:00:00 2001 From: icewing Date: Fri, 14 Mar 2008 13:52:13 +0000 Subject: Marcus Povey * Metadata code git-svn-id: https://code.elgg.org/elgg/trunk@220 36083f99-b078-4883-b0ff-0f9b5a30f544 --- engine/lib/entities.php | 9 +- engine/lib/metadata.php | 244 ++++++++++++++++++++---------------------------- 2 files changed, 104 insertions(+), 149 deletions(-) (limited to 'engine') diff --git a/engine/lib/entities.php b/engine/lib/entities.php index 2a90ea3e1..f2eed1658 100644 --- a/engine/lib/entities.php +++ b/engine/lib/entities.php @@ -112,7 +112,7 @@ */ public function getMetaData($name) { - //TODO: Writeme + return get_metadata_byname($name); } /** @@ -120,16 +120,17 @@ * * @param string $name * @param string $value + * @param string $value_type * @return bool */ - public function setMetaData($name, $value) + public function setMetaData($name, $value, $value_type = "") { - // TODO: WRITEME + return create_metadata($this->getGUID(), $name, $value, $value_type, $this->getOwner()); } public function clearMetaData() { - // TODO: WRITEME + return clear_metadata($this->getGUID()); } /** diff --git a/engine/lib/metadata.php b/engine/lib/metadata.php index 202ef60ad..e91842302 100644 --- a/engine/lib/metadata.php +++ b/engine/lib/metadata.php @@ -13,6 +13,7 @@ /** * @class ElggMetadata + * This class describes metadata that can be attached to ElggEntities. * @author Marcus Povey */ class ElggMetadata @@ -80,15 +81,18 @@ * * @return mixed */ - function getOwner() { return get_user($this->owner_id); } + function getOwner() + { + return get_user($this->owner_guid); + } function save() { if ($this->id > 0) - return update_metadata($this->id, $this->name, $this->value, $this->value_type, $this->owner_id, $this->access_id); + return update_metadata($this->id, $this->name, $this->value, $this->value_type, $this->owner_guid, $this->access_id); else { - $this->id = create_metadata($this->entity_id, $this->entity_type, $this->name, $this->value, $this->value_type, $this->owner_id, $this->access_id); + $this->id = create_metadata($this->entity_guid, $this->name, $this->value, $this->value_type, $this->owner_guid, $this->access_id); if (!$this->id) throw new IOException("Unable to save new ElggAnnotation"); return $this->id; } @@ -98,10 +102,13 @@ /** * Delete a given site. */ - function delete() { return delete_metadata($this->id); } - + function delete() + { + return delete_metadata($this->id); + } } + /** * Convert a database row to a new ElggMetadata * @@ -136,41 +143,54 @@ return 'tag'; } - + + /** + * Get a specific item of metadata. + * + * @param $id int The item of metadata being retrieved. + */ + function get_metadata($id) + { + global $CONFIG; + + $id = (int)$id; + $access = get_access_list(); + + return row_to_elggmetadata(get_data_row("SELECT * from {$CONFIG->dbprefix}metadata where id=$id and (access_id in {$access} or (access_id = 0 and owner_guid = {$_SESSION['id']}))")); + } + /** * Create a new metadata object, or update an existing one. * - * @param int $entity_id - * @param string $entity_type + * @param int $entity_guid * @param string $name * @param string $value * @param string $value_type - * @param int $owner_id + * @param int $owner_guid * @param int $access_id */ - function create_metadata($entity_id, $entity_type, $name, $value, $value_type, $owner_id, $access_id = 0) + function create_metadata($entity_guid, $name, $value, $value_type, $owner_guid, $access_id = 0) { global $CONFIG; - $entity_id = (int)$entity_id; - $entity_type = sanitise_string(trim($entity_type)); + $entity_guid = (int)$entity_guid; $name = sanitise_string(trim($name)); $value = sanitise_string(trim($value)); $value_type = detect_metadata_valuetype(sanitise_string(trim($value_type))); $time = time(); - $owner_id = (int)$owner_id; - if ($owner_id==0) $owner_id = $_SESSION['id']; + $owner_guid = (int)$owner_guid; + if ($owner_guid==0) $owner_guid = $_SESSION['id']; $access_id = (int)$access_id; $id = false; - $existing = get_data_row("SELECT * from {$CONFIG->dbprefix}metadata WHERE entity_id = $entity_id and entity_type='$entity_type' and name='$name' limit 1"); + $existing = get_data_row("SELECT * from {$CONFIG->dbprefix}metadata WHERE entity_guid = $entity_guid and name='$name' limit 1"); if ($existing) { $id = $existing->id; - $result = update_metadata($id,$name, $value, $value_type, $owner_id, $access_id); + $result = update_metadata($id, $name, $value, $value_type, $owner_guid, $access_id); if (!$result) return false; } @@ -181,7 +201,7 @@ if (!$value) return false; // If ok then add it - $id = insert_data("INSERT into {$CONFIG->dbprefix}metadata (entity_id, entity_type, name, value, value_type, owner_id, created, access_id) VALUES ($entity_id,'$entity_type','$name','$value','$value_type', $owner_id, $time, $access_id)"); + $id = insert_data("INSERT into {$CONFIG->dbprefix}metadata (entity_guid, name, value, value_type, owner_guid, time_created, access_id) VALUES ($entity_guid, '$name','$value','$value_type', $owner_guid, $time, $access_id)"); } return $id; @@ -194,10 +214,10 @@ * @param string $name * @param string $value * @param string $value_type - * @param int $owner_id + * @param int $owner_guid * @param int $access_id */ - function update_metadata($id, $name, $value, $value_type, $owner_id, $access_id) + function update_metadata($id, $name, $value, $value_type, $owner_guid, $access_id) { global $CONFIG; @@ -206,8 +226,8 @@ $value = sanitise_string(trim($value)); $value_type = detect_metadata_valuetype(sanitise_string(trim($value_type))); - $owner_id = (int)$owner_id; - if ($owner_id==0) $owner_id = $_SESSION['id']; + $owner_guid = (int)$owner_guid; + if ($owner_guid==0) $owner_guid = $_SESSION['id']; $access_id = (int)$access_id; @@ -219,165 +239,99 @@ if (!$value) return false; // If ok then add it - return update_data("UPDATE {$CONFIG->dbprefix}metadata set value='$value', value_type='$value_type', access_id=$access_id, owner_id=$owner_id where id=$id and name='$name' and (access_id in {$access} or (access_id = 0 and owner_id = {$_SESSION['id']}))"); + return update_data("UPDATE {$CONFIG->dbprefix}metadata set value='$value', value_type='$value_type', access_id=$access_id, owner_guid=$owner_guid where id=$id and name='$name' and (access_id in {$access} or (access_id = 0 and owner_guid = {$_SESSION['id']}))"); } - + + /** - * Get a specific item of metadata. + * Delete an item of metadata, where the current user has access. * - * @param $id int The item of metadata being retrieved. + * @param $id int The item of metadata to delete. */ - function get_metadata($id) + function delete_metadata($id) { global $CONFIG; $id = (int)$id; $access = get_access_list(); - return row_to_elggmetadata(get_data_row("SELECT * from {$CONFIG->dbprefix}metadata where id=$id and (access_id in {$access} or (access_id = 0 and owner_id = {$_SESSION['id']}))")); + return delete_data("DELETE from {$CONFIG->dbprefix}metadata where id=$id and (access_id in {$access} or (access_id = 0 and owner_guid = {$_SESSION['id']}))"); + } - + /** - * Get a list of metadatas for a given object/user/metadata type. - * - * @param int $entity_id - * @param string $entity_type - * @param string $entity_subtype - * @param mixed $name Either a string or an array of terms. - * @param mixed $value Either a string or an array of terms. - * @param int $owner_id - * @param string $order_by - * @param int $limit - * @param int $offset - * @return array of ElggMetadata + * Return the metadata values that match your query. + * + * @param string $meta_name */ - function get_metadatas($entity_id = 0, $entity_type = "", $entity_subtype = "", $name = "", $value = "", $value_type = "", $owner_id = 0, $order_by = "created desc", $limit = 10, $offset = 0) + function get_metadata_byname($meta_name) { global $CONFIG; - $entity_id = (int)$entity_id; - $entity_type = sanitise_string(trim($entity_type)); - $entity_subtype = sanitise_string($entity_subtype); - - if (!is_array($name)) - $name = sanitise_string($name); - if (!is_array($value)) - $value = get_metastring_id($value); - - if ((is_array($name)) && (is_array($value)) && (count($name)!=count($value))) - throw new InvalidParameterException("Name and value arrays not equal."); - - $value_type = sanitise_string(trim($value_type)); - $owner_id = (int)$owner_id; - $order_by = sanitise_string($order_by); - - $limit = (int)$limit; - $offset = (int)$offset; - - $join = ""; - - // Construct query - $where = array(); - - if ($entity_id != 0) - $where[] = "o.entity_id=$entity_id"; - - if ($entity_type != "") - $where[] = "o.entity_type='$entity_type'"; - - if ($owner_id != 0) - $where[] = "o.owner_id=$owner_id"; - - if (is_array($name)) { - foreach ($name as $n) - $where[]= "o.name='$n'"; - } else if ($name != "") - $where[] = "o.name='$name'"; - - if (is_array($value)) { - foreach ($value as $v) - $where[]= "o.value='$v'"; - } else if ($value != "") - $where[] = "o.value='$value'"; - - if ($value_type != "") - $where[] = "o.value_type='$value_type'"; - - if ($entity_subtype != "") - $where[] = "s.id=" . get_entity_subtype($entity_id, $entity_type); - - // add access controls + $meta_name = sanitise_string($meta_name); $access = get_access_list(); - $where[] = "(o.access_id in {$access} or (o.access_id = 0 and o.owner_id = {$_SESSION['id']}))"; - - if ($entity_subtype!="") - $where[] = ""; - - // construct query. - $query = "SELECT o.* from {$CONFIG->dbprefix}metadata o LEFT JOIN {$CONFIG->dbprefix}entity_subtypes s on o.entity_id=s.entity_id and o.entity_type=s.entity_type where "; - for ($n = 0; $n < count($where); $n++) - { - if ($n > 0) $query .= " and "; - $query .= $where[$n]; - } - $query .= " order by $order_by limit $offset,$limit"; - return get_data($query, "row_to_elggmetadata"); + return row_to_elggmetadata(get_data_row("SELECT * from {$CONFIG->dbprefix}metadata where name='$meta_name' and (access_id in {$access} or (access_id = 0 and owner_guid = {$_SESSION['id']}))")); } /** - * Similar to get_metadatas, but instead returns the objects associated with a given meta search. + * Return a list of entities based on the given search criteria. * - * @param int $entity_id - * @param string $entity_type - * @param string $entity_subtype - * @param mixed $name Either a string or an array of terms. - * @param mixed $value Either a string or an array of terms. - * @param int $owner_id - * @param string $order_by - * @param int $limit + * @param mixed $meta_name + * @param mixed $meta_value + * @param string $entity_type The type of entity to look for, eg 'site' or 'object' + * @param string $entity_subtype The subtype of the entity. + * @param int $limit * @param int $offset - * @return mixed Array of objects or false. + * @param string $order_by Optional ordering. */ - function get_objects_from_metadatas($entity_id = 0, $entity_type = "", $entity_subtype = "", $name = "", $value = "", $value_type = "", $owner_id = 0, $order_by = "created desc", $limit = 10, $offset = 0) + function get_entities_from_metadata($meta_name, $meta_value = "", $entity_type = "", $entity_subtype = "", $limit = 10, $offset = 0, $order_by = "e.time_created desc") { - $results = get_metadatas($entity_id, $entity_type, $entity_subtype, $name, $value, $value_type, $owner_id, $order_by, $limit, $offset); - $objects = false; + global $CONFIG; - if ($results) - { - $objects = array(); + $meta_name = sanitise_string($meta_name); + $meta_value = get_metastring_id($meta_value); - foreach ($results as $r) - { - - switch ($r->entity_type) - { - case 'object' : $objects[] = new ElggObject((int)$r->entity_id); break; - case 'user' : $objects[] = new ElggUser((int)$r->entity_id); break; - case 'collection' : $objects[] = new ElggCollection((int)$r->entity_id); break; - case 'site' : $objects[] = new ElggSite((int)$r->entity_id); break; - default: default : throw new InstallationException("Type {$r->entity_type} is not supported. This indicates an error in your installation, most likely caused by an incomplete upgrade."); - } - } - } + $entity_type = sanitise_string($entity_type); + $entity_subtype = get_subtype_id($entity_subtype); + $limit = (int)$limit; + $offset = (int)$offset; + $order_by = sanitise_string($order_by); + + $access = get_access_list(); + + $where = array(); + + if ($entity_type!="") + $where[] = "e.type='$entity_type'"; + if ($entity_subtype) + $where[] = "e.subtype=$entity_subtype"; + if ($meta_name!="") + $where[] = "m.name='$meta_name'"; + if ($meta_value!="") + $where[] = "m.value='$meta_value'"; - return $objects; + $query = "SELECT * from {$CONFIG->dbprefix}entities e JOIN {$CONFIG->dbprefix}metadata m on e.guid = m.entity_guid where"; + foreach ($where as $w) + $query .= " $w and "; + $query .= " (e.access_id in {$access} or (e.access_id = 0 and e.owner_guid = {$_SESSION['id']}))"; // Add access controls + $query .= " order by $order_by limit $offset,$limit"; // Add order and limit + + return get_data($query, "entity_row_to_elggstar"); } /** - * Delete an item of metadata, where the current user has access. + * Clear all the metadata for a given entity, assuming you have access to that metadata. * - * @param $id int The item of metadata to delete. + * @param int $guid */ - function delete_metadata($id) + function clear_metadata($guid) { global $CONFIG; - - $id = (int)$id; - $access = get_access_list(); - - return delete_data("DELETE from {$CONFIG->dbprefix}metadata where id=$id and (access_id in {$access} or (access_id = 0 and owner_id = {$_SESSION['id']}))"); + $guid = (int)$guid; + + return delete_data("DELETE from {$CONFIG->dbprefix}metadata where access_id in {$access} or (access_id = 0 and owner_guid = {$_SESSION['id']})"); } + ?> \ No newline at end of file -- cgit v1.2.3