--- /dev/null
+<?php\r
+/**\r
+ * APIException\r
+ * The API Exception class, thrown by the API layer when an API call has an issue.\r
+ *\r
+ * @author Curverider Ltd <info@elgg.com>\r
+ * @package Elgg\r
+ * @subpackage Exceptions\r
+ */\r
+class APIException extends Exception {}\r
--- /dev/null
+<?php\r
+/**\r
+ * @class AccessControlQueryComponent\r
+ * Access control component.\r
+ * @author Curverider Ltd\r
+ * @see Query\r
+ */\r
+class AccessControlQueryComponent extends QueryComponent\r
+{\r
+ /**\r
+ * Construct the ACL.\r
+ *\r
+ * @param string $acl_table The table where the access control field is.\r
+ * @param string $acl_field The field containing the access control.\r
+ * @param string $object_owner_table The table containing the owner information for the stuff you're retrieving.\r
+ * @param string $object_owner_id_field The field in $object_owner_table containing the owner information\r
+ */\r
+ function __construct($acl_table = "entities", $acl_field = "access_id", $object_owner_table = "entities", $object_owner_id_field = "owner_guid")\r
+ {\r
+ global $CONFIG;\r
+\r
+ $this->acl_table = $CONFIG->dbprefix . sanitise_string($acl_table);\r
+ $this->acl_field = sanitise_string($acl_field);\r
+ $this->object_owner_table = $CONFIG->dbprefix . sanitise_string($object_owner_table);\r
+ $this->object_owner_id_field = sanitise_string($object_owner_id_field);\r
+ }\r
+\r
+ function __toString()\r
+ {\r
+ //$access = get_access_list();\r
+ // KJ - changed to use get_access_sql_suffix\r
+ // Note: currently get_access_sql_suffix is hardwired to use\r
+ // $acl_field = "access_id", $object_owner_table = $acl_table, and\r
+ // $object_owner_id_field = "owner_guid"\r
+ // @todo recode get_access_sql_suffix to make it possible to specify alternate field names\r
+ return "and ".get_access_sql_suffix($this->acl_table); // Add access controls\r
+\r
+ //return "and ({$this->acl_table}.{$this->acl_field} in {$access} or ({$this->acl_table}.{$this->acl_field} = 0 and {$this->object_owner_table}.{$this->object_owner_id_field} = {$_SESSION['id']}))";\r
+ }\r
+}\r
--- /dev/null
+<?php\r
+/**\r
+ * CallException\r
+ * An exception thrown when there is a problem calling something.\r
+ *\r
+ * @author Curverider Ltd <info@elgg.com>\r
+ * @package Elgg\r
+ * @subpackage Exceptions\r
+ */\r
+class CallException extends Exception {}\r
--- /dev/null
+<?php\r
+/**\r
+ * ClassException\r
+ * A class Exception, throw when there is a class error.\r
+ *\r
+ * @author Curverider Ltd <info@elgg.com>\r
+ * @package Elgg\r
+ * @subpackage Exceptions\r
+ */\r
+class ClassException extends Exception {}\r
--- /dev/null
+<?php\r
+/**\r
+ * ClassNotFoundException\r
+ * An Class not found Exception, throw when an class can not be found occurs.\r
+ *\r
+ * @author Curverider Ltd <info@elgg.com>\r
+ * @package Elgg\r
+ * @subpackage Exceptions\r
+ */\r
+class ClassNotFoundException extends ClassException {}
\ No newline at end of file
--- /dev/null
+<?php\r
+/**\r
+ * ConfigurationException\r
+ * There is a configuration error\r
+ *\r
+ * @author Curverider Ltd <info@elgg.com>\r
+ * @package Elgg\r
+ * @subpackage Exceptions\r
+ */\r
+class ConfigurationException extends Exception {}\r
--- /dev/null
+<?php\r
+/**\r
+ * Data format exception\r
+ * An exception thrown when there is a problem in the format of some data.\r
+ *\r
+ * @author Curverider Ltd <info@elgg.com>\r
+ * @package Elgg\r
+ * @subpackage Exceptions\r
+ */\r
+class DataFormatException extends Exception {}\r
--- /dev/null
+<?php\r
+/**\r
+ * DatabaseException\r
+ * An database exception, throw when a database exception happens, subclass if more detail is needed.\r
+ *\r
+ * @author Curverider Ltd <info@elgg.com>\r
+ * @package Elgg\r
+ * @subpackage Exceptions\r
+ */\r
+class DatabaseException extends Exception {}\r
--- /dev/null
+<?php\r
+/**\r
+ * @class DeleteQueryTypeQueryComponent\r
+ * A delete query.\r
+ * @author Curverider Ltd\r
+ * @see Query\r
+ */\r
+class DeleteQueryTypeQueryComponent extends QueryTypeQueryComponent\r
+{\r
+ function __construct()\r
+ {\r
+ $this->query_type = "DELETE FROM";\r
+ }\r
+}\r
--- /dev/null
+<?php\r
+/**\r
+ * IOException\r
+ * An IO Exception, throw when an IO Exception occurs. Subclass for specific IO Exceptions.\r
+ *\r
+ * @author Curverider Ltd <info@elgg.com>\r
+ * @package Elgg\r
+ * @subpackage Exceptions\r
+ */\r
+class IOException extends Exception {}\r
--- /dev/null
+<?php\r
+/**\r
+ * @class InsertQueryTypeQueryComponent\r
+ * An insert query.\r
+ * @author Curverider Ltd\r
+ * @see Query\r
+ */\r
+class InsertQueryTypeQueryComponent extends QueryTypeQueryComponent\r
+{\r
+ function __construct()\r
+ {\r
+ $this->query_type = "INSERT INTO";\r
+ }\r
+}\r
--- /dev/null
+<?php\r
+/**\r
+ * InstallationException\r
+ * Thrown when there is a major problem with the installation.\r
+ *\r
+ * @author Curverider Ltd <info@elgg.com>\r
+ * @package Elgg\r
+ * @subpackage Exceptions\r
+ */\r
+class InstallationException extends ConfigurationException {}\r
--- /dev/null
+<?php\r
+/**\r
+ * InvalidClassException\r
+ * An invalid class Exception, throw when a class is invalid.\r
+ *\r
+ * @author Curverider Ltd <info@elgg.com>\r
+ * @package Elgg\r
+ * @subpackage Exceptions\r
+ */\r
+class InvalidClassException extends ClassException {}\r
--- /dev/null
+<?php\r
+/**\r
+ * InvalidParameterException\r
+ * A parameter is invalid.\r
+ *\r
+ * @author Curverider Ltd <info@elgg.com>\r
+ * @package Elgg\r
+ * @subpackage Exceptions\r
+ */\r
+class InvalidParameterException extends CallException {}\r
--- /dev/null
+<?php\r
+/**\r
+ * @class JoinQueryComponent Join query.\r
+ * Represents a join query.\r
+ * @author Curverider Ltd\r
+ * @see Query\r
+ */\r
+class JoinQueryComponent extends QueryComponent\r
+{\r
+ /**\r
+ * Construct a join query.\r
+ * @param string $table Table one to join...\r
+ * @param string $field Field 1 with...\r
+ * @param string $table2 Table 2 ...\r
+ * @param string $field2 Field...\r
+ * @param string $operator Using this operator\r
+ */\r
+ function __construct($table1, $field1, $table2, $field2, $operator = "=")\r
+ {\r
+ global $CONFIG;\r
+\r
+ $this->table1 = $CONFIG->dbprefix . sanitise_string($table1);\r
+ $this->field1 = sanitise_string($field1);\r
+ $this->table2 = $CONFIG->dbprefix . sanitise_string($table2);\r
+ $this->field2 = sanitise_string($field2);\r
+ $this->operator = sanitise_string($operator);\r
+ }\r
+\r
+ function __toString()\r
+ {\r
+ return "join {$this->table2} on {$this->$table}.{$this->$field} {$this->$operator} {$this->$table2}.{$this->$field2}";\r
+ }\r
+}\r
--- /dev/null
+<?php\r
+/**\r
+ * @class LimitOffsetQueryComponent\r
+ * Limit and offset clauses of a query.\r
+ * @author Curverider Ltd\r
+ * @see Query\r
+ */\r
+class LimitOffsetQueryComponent extends QueryComponent\r
+{\r
+ /**\r
+ * Specify a limit and an offset.\r
+ *\r
+ * @param int $limit The limit.\r
+ * @param int $offset The offset.\r
+ */\r
+ function __construct($limit = 25, $offset = 0)\r
+ {\r
+ $this->limit = (int)$limit;\r
+ $this->offset = (int)$offset;\r
+ }\r
+\r
+ function __toString()\r
+ {\r
+ return "limit {$this->offset}, {$this->limit}";\r
+ }\r
+}\r
--- /dev/null
+<?php\r
+/**\r
+ * NotImplementedException\r
+ * Thrown when a method or function has not been implemented, primarily used in development... you should\r
+ * not see these!\r
+ *\r
+ * @author Curverider Ltd <info@elgg.com>\r
+ * @package Elgg\r
+ * @subpackage Exceptions\r
+ */\r
+class NotImplementedException extends CallException {}\r
--- /dev/null
+<?php\r
+/**\r
+ * Notification exception.\r
+ * @author Curverider Ltd\r
+ */\r
+class NotificationException extends Exception {}\r
--- /dev/null
+<?php\r
+/**\r
+ * @class OrderQueryComponent\r
+ * Order the query results.\r
+ * @author Curverider Ltd\r
+ * @see Query\r
+ */\r
+class OrderQueryComponent extends QueryComponent\r
+{\r
+ function __construct($table, $field, $order = "asc")\r
+ {\r
+ global $CONFIG;\r
+\r
+ $this->table = $CONFIG->dbprefix . sanitise_string($table);\r
+ $this->field = sanitise_string($field);\r
+ $this->order = sanitise_string($order);\r
+ }\r
+\r
+ function __toString()\r
+ {\r
+ return "order by {$this->table}.{$this->field} {$this->order}";\r
+ }\r
+}\r
--- /dev/null
+<?php\r
+/**\r
+ * PluginException\r
+ *\r
+ * A plugin Exception, thrown when an Exception occurs relating to the plugin mechanism. Subclass for specific plugin Exceptions.\r
+ *\r
+ * @package Elgg\r
+ * @subpackage Exceptions\r
+ */\r
+class PluginException extends Exception {}
\ No newline at end of file
--- /dev/null
+<?php\r
+/**\r
+ * @class Query Provides a framework to construct complex queries in a safer environment.\r
+ *\r
+ * The usage of this class depends on the type of query you are executing, but the basic idea is to\r
+ * construct a query out of pluggable classes.\r
+ *\r
+ * Once constructed SQL can be generated using the toString method, this should happen automatically\r
+ * if you pass the Query object to get_data or similar.\r
+ *\r
+ * To construct a query, create a new Query() object and begin populating it with the various classes\r
+ * that define the various aspects of the query.\r
+ *\r
+ * Notes:\r
+ * - You do not have to specify things in any particular order, provided you specify all required\r
+ * components.\r
+ * - With database tables you do not have to specify your db prefix, this will be added automatically.\r
+ * - When constructing your query keep an eye on the error log - any problems will get spit out here.\r
+ * Note also that __toString won't let you throw Exceptions (!!!) so these are caught and echoed to\r
+ * the log instead.\r
+ *\r
+ * Here is an example of a select query which requests some data out of the entities table with an\r
+ * order and limit that uses a subset where and some normal where queries:\r
+ *\r
+ * <blockquote>\r
+ * // Construct the query\r
+ * $query = new Query();\r
+ *\r
+ * // Say which table we're interested in\r
+ * $query->addTable(new TableQueryComponent("entities"));\r
+ *\r
+ * // What fields are we interested in\r
+ * $query->addSelectField(new SelectFieldQueryComponent("entities","*"));\r
+ *\r
+ * // Add access control (Default access control uses default fields on entities table.\r
+ * // Note that it will error without something specified here!\r
+ * $query->setAccessControl(new AccessControlQueryComponent());\r
+ *\r
+ * // Set a limit and offset, may be omitted.\r
+ * $query->setLimitAndOffset(new LimitOffsetQueryComponent(10,0));\r
+ *\r
+ * // Specify the order, may be omitted\r
+ * $query->setOrder(new OrderQueryComponent("entities", "subtype", "desc"));\r
+ *\r
+ * // Construct a where query\r
+ * //\r
+ * // This demonstrates a WhereSet which lets you have sub wheres, a\r
+ * // WhereStatic which lets you compare a table field against a value and a\r
+ * // Where which lets you compare a table/field with another table/field.\r
+ * $query->addWhere(\r
+ * new WhereSetQueryComponent(\r
+ * array(\r
+ * new WhereStaticQueryComponent("entities", "subtype","=", 1),\r
+ * new WhereQueryComponent("entities","subtype","=", "entities", "subtype")\r
+ * )\r
+ * )\r
+ * );\r
+ *\r
+ * get_data($query);\r
+ * </blockquote>\r
+ *\r
+ * @author Curverider Ltd\r
+ */\r
+class Query\r
+{\r
+\r
+ /// The limit of the query\r
+ private $limit_and_offset;\r
+\r
+ /// Fields to return on a query\r
+ private $fields;\r
+\r
+ /// Tables to use in a from query\r
+ private $tables;\r
+\r
+ /// Join tables\r
+ private $joins;\r
+\r
+ /// Set values\r
+ private $sets;\r
+\r
+ /// Where query\r
+ private $where;\r
+\r
+ /// Order by\r
+ private $order;\r
+\r
+ /// The query type\r
+ private $query_type;\r
+\r
+ /// ACL\r
+ private $access_control;\r
+\r
+ /**\r
+ * Construct query & initialise variables\r
+ */\r
+ function __construct()\r
+ {\r
+ $this->fields = array();\r
+ $this->tables = array();\r
+ $this->joins = array();\r
+ $this->where = array();\r
+ $this->sets = array();\r
+\r
+ $this->setQueryType(new SelectQueryTypeQueryComponent());\r
+ }\r
+\r
+ /**\r
+ * Add limits and offsets to the query.\r
+ *\r
+ * @param LimitOffsetQueryComponent $component The limit and offset.\r
+ */\r
+ public function setLimitAndOffset(LimitOffsetQueryComponent $component) { $this->limit_and_offset = $component; }\r
+\r
+ /**\r
+ * Reset and set the field to the select statement.\r
+ *\r
+ * @param SelectFieldQueryComponent $component Table and field component.\r
+ */\r
+ public function setSelectField(SelectFieldQueryComponent $component)\r
+ {\r
+ $this->fields = array();\r
+ return $this->addSelectField($component);\r
+ }\r
+\r
+ /**\r
+ * Add a select field.\r
+ *\r
+ * @param SelectFieldQueryComponent $component Add a component.\r
+ */\r
+ public function addSelectField(SelectFieldQueryComponent $component) { $this->fields[] = $component; }\r
+\r
+ /**\r
+ * Add a join to the component.\r
+ *\r
+ * @param JoinQueryComponent $component The join.\r
+ */\r
+ public function addJoin(JoinQueryComponent $component) { $this->joins[] = $component; }\r
+\r
+ /**\r
+ * Set a field value in an update or insert statement.\r
+ *\r
+ * @param SetQueryComponent $component Fields to set.\r
+ */\r
+ public function addSet(SetQueryComponent $component) { $this->sets[] = $component; }\r
+\r
+ /**\r
+ * Set the query type, i.e. "select", "update", "insert" & "delete".\r
+ *\r
+ * @param QueryTypeQueryComponent $component The query type.\r
+ */\r
+ public function setQueryType(QueryTypeQueryComponent $component) { $this->query_type = $component; }\r
+\r
+ /**\r
+ * Attach an order component.\r
+ *\r
+ * @param OrderQueryComponent $component The order component.\r
+ */\r
+ public function setOrder(OrderQueryComponent $component) { $this->order = $component; }\r
+\r
+ /**\r
+ * Add a table to the query.\r
+ *\r
+ * @param TableQueryComponent $component Table to add.\r
+ */\r
+ public function addTable(TableQueryComponent $component) { $this->tables[] = $component; }\r
+\r
+ /**\r
+ * Add a where clause to the query.\r
+ *\r
+ * @param WhereQueryComponent $component The where component\r
+ */\r
+ public function addWhere(WhereQueryComponent $component) { $this->where[] = $component; }\r
+\r
+ /**\r
+ * Set access control.\r
+ *\r
+ * @param AccessControlQueryComponent $component Access control.\r
+ */\r
+ public function setAccessControl(AccessControlQueryComponent $component) { $this->access_control = $component; }\r
+\r
+ public function __toString()\r
+ {\r
+ global $CONFIG;\r
+\r
+ $sql = "";\r
+\r
+ try\r
+ {\r
+ // Query prefix & fields\r
+ if (!empty($this->query_type))\r
+ {\r
+ $sql .= "{$this->query_type} ";\r
+\r
+ if (!empty($this->fields))\r
+ {\r
+ $fields = "";\r
+\r
+ foreach ($this->fields as $field)\r
+ $fields .= "$field";\r
+\r
+ $sql .= " $fields from ";\r
+ }\r
+ else\r
+ throw new DatabaseException(elgg_echo('DatabaseException:SelectFieldsMissing'));\r
+ }\r
+ else\r
+ throw new DatabaseException(elgg_echo('DatabaseException:UnspecifiedQueryType'));\r
+\r
+ // Tables\r
+ if (!empty($this->tables))\r
+ {\r
+ foreach($this->tables as $table)\r
+ $sql .= "$table, ";\r
+\r
+ $sql = trim($sql, ", ");\r
+ }\r
+ else\r
+ throw new DatabaseException(elgg_echo('DatabaseException:NoTablesSpecified'));\r
+\r
+ // Joins on select queries\r
+ if ($this->query_type->query_type == 'select')\r
+ {\r
+ if (!empty($this->joins))\r
+ {\r
+ foreach($this->joins as $join)\r
+ $sql .= "$join ";\r
+ }\r
+ }\r
+\r
+ // Setting values\r
+ if (\r
+ ($this->query_type->query_type == 'update') ||\r
+ ($this->query_type->query_type == 'insert')\r
+ )\r
+ {\r
+ $sql .= "set ";\r
+\r
+ foreach ($this->sets as $set)\r
+ $sql .= "$set, ";\r
+\r
+ $sql = trim($sql, ", ") . " ";\r
+ }\r
+\r
+ // Where\r
+ if (!empty($this->where))\r
+ {\r
+ $sql .= " where 1 ";\r
+\r
+ foreach ($this->where as $where)\r
+ $sql .= "$where ";\r
+ }\r
+\r
+ // Access control\r
+ if (!empty($this->access_control))\r
+ {\r
+\r
+ // Catch missing Where\r
+ if (empty($this->where))\r
+ $sql .= " where 1 ";\r
+\r
+ $sql .= "{$this->access_control} ";\r
+ }\r
+ else\r
+ throw new DatabaseException(elgg_echo('DatabaseException:NoACL'));\r
+\r
+ // Order by\r
+ if (!empty($this->order))\r
+ $sql .= "{$this->order} ";\r
+\r
+ // Limits\r
+ if (!empty($this->limit_and_offset))\r
+ $sql .= "{$this->limit_and_offset} ";\r
+\r
+\r
+\r
+ } catch (Exception $e) {\r
+ trigger_error($e, E_USER_WARNING);\r
+ }\r
+\r
+\r
+ return $sql;\r
+ }\r
+\r
+}\r
+\r
--- /dev/null
+<?php\r
+/**\r
+ * @class QueryComponent Query component superclass.\r
+ * Component of a query.\r
+ * @author Curverider Ltd\r
+ * @see Query\r
+ */\r
+abstract class QueryComponent\r
+{\r
+ /**\r
+ * Associative array of fields and values\r
+ */\r
+ private $fields;\r
+\r
+ function __construct()\r
+ {\r
+ $this->fields = array();\r
+ }\r
+\r
+ /**\r
+ * Class member get overloading\r
+ *\r
+ * @param string $name\r
+ * @return mixed\r
+ */\r
+ function __get($name) {\r
+ return $this->fields[$name];\r
+ }\r
+\r
+ /**\r
+ * Class member set overloading\r
+ *\r
+ * @param string $name\r
+ * @param mixed $value\r
+ * @return void\r
+ */\r
+ function __set($name, $value) {\r
+ $this->fields[$name] = $value;\r
+\r
+ return true;\r
+ }\r
+}\r
--- /dev/null
+<?php\r
+/**\r
+ * @class QueryTypeQueryComponent\r
+ * What type of query is this?\r
+ * @author Curverider Ltd\r
+ * @see Query\r
+ */\r
+abstract class QueryTypeQueryComponent extends QueryComponent\r
+{\r
+ function __toString()\r
+ {\r
+ return $this->query_type;\r
+ }\r
+}\r
--- /dev/null
+<?php\r
+/**\r
+ * RegistrationException\r
+ * Could not register a new user for whatever reason.\r
+ *\r
+ * @author Curverider Ltd <info@elgg.com>\r
+ * @package Elgg\r
+ * @subpackage Exceptions\r
+ */\r
+class RegistrationException extends InstallationException {}
\ No newline at end of file
--- /dev/null
+<?php\r
+/**\r
+ * SecurityException\r
+ * An Security Exception, throw when a Security Exception occurs. Subclass for specific Security Execeptions (access problems etc)\r
+ *\r
+ * @author Curverider Ltd <info@elgg.com>\r
+ * @package Elgg\r
+ * @subpackage Exceptions\r
+ */\r
+class SecurityException extends Exception {}\r
--- /dev/null
+<?php\r
+/**\r
+ * @class SelectFieldQueryComponent Class representing a select field.\r
+ * This class represents a select field component.\r
+ * @author Curverider Ltd\r
+ * @see Query\r
+ */\r
+class SelectFieldQueryComponent extends QueryComponent\r
+{\r
+ /**\r
+ * Construct a select field component\r
+ *\r
+ * @param string $table The table containing the field.\r
+ * @param string $field The field or "*"\r
+ */\r
+ function __construct($table, $field)\r
+ {\r
+ global $CONFIG;\r
+\r
+ $this->table = $CONFIG->dbprefix . sanitise_string($table);\r
+ $this->field = sanitise_string($field);\r
+ }\r
+\r
+ function __toString()\r
+ {\r
+ return "{$this->table}.{$this->field}";\r
+ }\r
+}\r
--- /dev/null
+<?php\r
+/**\r
+ * @class SelectQueryTypeQueryComponent\r
+ * A select query.\r
+ * @author Curverider Ltd\r
+ * @see Query\r
+ */\r
+class SelectQueryTypeQueryComponent extends QueryTypeQueryComponent\r
+{\r
+ function __construct()\r
+ {\r
+ $this->query_type = "SELECT";\r
+ }\r
+}\r
--- /dev/null
+<?php\r
+/**\r
+ * @class SetQueryComponent Set query.\r
+ * Represents an update set query.\r
+ * @author Curverider Ltd\r
+ * @see Query\r
+ */\r
+class SetQueryComponent extends QueryComponent\r
+{\r
+ /**\r
+ * Construct a setting query\r
+ *\r
+ * @param string $table The table to modify\r
+ * @param string $field The field to modify\r
+ * @param mixed $value The value to set it to\r
+ */\r
+ function __construct($table, $field, $value)\r
+ {\r
+ global $CONFIG;\r
+\r
+ $this->table = $CONFIG->dbprefix . sanitise_string($table);\r
+ $this->field = sanitise_string($field);\r
+ if (is_numeric($value))\r
+ $this->value = (int)$value;\r
+ else\r
+ $this->value = "'".sanitise_string($value)."'";\r
+ }\r
+\r
+ function __toString()\r
+ {\r
+ return "{$this->table}.{$this->field}={$this->value}";\r
+ }\r
+}\r
--- /dev/null
+<?php\r
+/**\r
+ * @class SimpleQuery A wrapper for Query which provides simple interface for common functions.\r
+ *\r
+ * This class provides simple interface functions for constructing a (reasonably) standard database\r
+ * query.\r
+ *\r
+ * The constructor for this class sets a number of defaults, for example sets default access controls\r
+ * and a limit and offset - to change this then set it manually.\r
+ *\r
+ * @author Curverider Ltd\r
+ * @see Query\r
+ */\r
+class SimpleQuery extends Query\r
+{\r
+ function __construct()\r
+ {\r
+ parent::__construct();\r
+\r
+ // Set a default query type (select)\r
+ $this->simpleQueryType();\r
+\r
+ // Set a default access control\r
+ $this->simpleAccessControl();\r
+\r
+ // Set default limit and offset\r
+ $this->simpleLimitAndOffset();\r
+ }\r
+\r
+ /**\r
+ * Set the query type.\r
+ *\r
+ * @param string $type The type of search - available are "select", "update", "delete", "insert".\r
+ */\r
+ public function simpleQueryType($type = "select")\r
+ {\r
+ $type = strtolower(sanitise_string($type));\r
+\r
+ switch ($type)\r
+ {\r
+ case "insert" :\r
+ return $this->setQueryType(InsertQueryTypeQueryComponent());\r
+ break;\r
+ case "delete" :\r
+ return $this->setQueryType(DeleteQueryTypeQueryComponent());\r
+ break;\r
+ case "update" :\r
+ return $this->setQueryType(UpdateQueryTypeQueryComponent());\r
+ break;\r
+ default: return $this->setQueryType(SelectQueryTypeQueryComponent());\r
+ }\r
+ }\r
+\r
+ /**\r
+ * Set a field to query in a select statement.\r
+ *\r
+ * @param string $table Table to query.\r
+ * @param string $field Field in that table.\r
+ */\r
+ public function simpleSelectField($table, $field) { return $this->setSelectField(new SelectFieldQueryComponent($table, $field)); }\r
+\r
+ /**\r
+ * Add a select field to query in a select statement.\r
+ *\r
+ * @param string $table Table to query.\r
+ * @param string $field Field in that table.\r
+ */\r
+ public function simpleAddSelectField($table, $field) { return $this->addSelectField(new SelectFieldQueryComponent($table, $field)); }\r
+\r
+ /**\r
+ * Add a set value to an update query.\r
+ *\r
+ * @param string $table The table to update.\r
+ * @param string $field The field in the table.\r
+ * @param mixed $value The value to set it to.\r
+ */\r
+ public function simpleSet($table, $field, $value) { return $this->addSet(new SetQueryComponent($table, $field, $value)); }\r
+\r
+ /**\r
+ * Add a join to the table.\r
+ *\r
+ * @param string $table Table one to join...\r
+ * @param string $field Field 1 with...\r
+ * @param string $table2 Table 2 ...\r
+ * @param string $field2 Field...\r
+ * @param string $operator Using this operator\r
+ */\r
+ public function simpleJoin($table1, $field1, $table2, $field2, $operator = "=") { return $this->addJoin(new JoinQueryComponent($table1, $field1, $table2, $field2, $operator)); }\r
+\r
+ /**\r
+ * Add a table to the query.\r
+ *\r
+ * @param string $table The table.\r
+ */\r
+ public function simpleTable($table) { return $this->addTable(new TableQueryComponent($table)); }\r
+\r
+ /**\r
+ * Compare one table/field to another table/field.\r
+ *\r
+ * @param string $left_table The table on the left of the operator\r
+ * @param string $left_field The left field\r
+ * @param string $operator The operator eg "=" or "<"\r
+ * @param string $right_table The table on the right of the operator\r
+ * @param string $right_field The right field\r
+ * @param string $link_operator How this where clause links with the previous clause, eg. "and" "or"\r
+ */\r
+ public function simpleWhereOnTable($left_table, $left_field, $operator, $right_table, $right_field, $link_operator = "and") { return $this->addWhere(new WhereQueryComponent($left_table, $left_field, $operator, $right_table, $right_field, $link_operator)); }\r
+\r
+ /**\r
+ * Compare one table/field to a value.\r
+ *\r
+ * @param string $left_table The table on the left of the operator\r
+ * @param string $left_field The left field\r
+ * @param string $operator The operator eg "=" or "<"\r
+ * @param string $value The value\r
+ * @param string $link_operator How this where clause links with the previous clause, eg. "and" "or"\r
+ */\r
+ public function simpleWhereOnValue($left_table, $left_field, $operator, $value, $link_operator = "and") { return $this->addWhere(new WhereStaticQueryComponent($left_table, $left_field, $operator, $value, $link_operator)); }\r
+\r
+ /**\r
+ * Set access control.\r
+ *\r
+ * @param string $acl_table The table where the access control field is.\r
+ * @param string $acl_field The field containing the access control.\r
+ * @param string $object_owner_id_field The field in $object_owner_table containing the owner information.\r
+ */\r
+ public function simpleAccessControl($acl_table = "entities", $acl_field = "access_id", $object_owner_id_field = "owner_guid") { return $this->setAccessControl(new AccessControlQueryComponent($acl_table, $acl_field, $acl_table, $object_owner_id_field)); }\r
+\r
+ /**\r
+ * Set the limit and offset.\r
+ *\r
+ * @param int $limit The limit.\r
+ * @param int $offset The offset.\r
+ */\r
+ public function simpleLimitAndOffset($limit = 25, $offset = 0) { return $this->setLimitAndOffset(new LimitOffsetQueryComponent($limit, $offset)); }\r
+\r
+ /**\r
+ * Set the order query.\r
+ *\r
+ * @param string $table The table to query\r
+ * @param string $field The field to query\r
+ * @param string $order Order the query\r
+ */\r
+ public function simpleOrder($table, $field, $order = "desc")\r
+ {\r
+ $table = sanitise_string($table);\r
+ $field = sanitise_string($field);\r
+ $order = strtolower(sanitise_string($order));\r
+\r
+ return $this->setOrder(new OrderQueryComponent($table, $field, $order)); break;\r
+ }\r
+}\r
--- /dev/null
+<?php\r
+/**\r
+ * @class TableQueryComponent\r
+ * List of tables to select from or insert into.\r
+ * @author Curverider Ltd\r
+ * @see Query\r
+ */\r
+class TableQueryComponent extends QueryComponent\r
+{\r
+ function __construct($table)\r
+ {\r
+ global $CONFIG;\r
+\r
+ $this->table = $CONFIG->dbprefix . sanitise_string($table);\r
+ }\r
+\r
+ function __toString()\r
+ {\r
+ return $this->table;\r
+ }\r
+}\r
--- /dev/null
+<?php\r
+/**\r
+ * @class UpdateQueryTypeQueryComponent\r
+ * An update query.\r
+ * @author Curverider Ltd\r
+ * @see Query\r
+ */\r
+class UpdateQueryTypeQueryComponent extends QueryTypeQueryComponent\r
+{\r
+ function __construct()\r
+ {\r
+ $this->query_type = "UPDATE";\r
+ }\r
+}\r
--- /dev/null
+<?php\r
+/**\r
+ * @class WhereQueryComponent\r
+ * A component of a where query.\r
+ * @author Curverider Ltd\r
+ * @see Query\r
+ */\r
+class WhereQueryComponent extends QueryComponent\r
+{\r
+ /**\r
+ * A where query.\r
+ *\r
+ * @param string $left_table The table on the left of the operator\r
+ * @param string $left_field The left field\r
+ * @param string $operator The operator eg "=" or "<"\r
+ * @param string $right_table The table on the right of the operator\r
+ * @param string $right_field The right field\r
+ * @param string $link_operator How this where clause links with the previous clause, eg. "and" "or"\r
+ */\r
+ function __construct($left_table, $left_field, $operator, $right_table, $right_field, $link_operator = "and")\r
+ {\r
+ global $CONFIG;\r
+\r
+ $this->link_operator = sanitise_string($link_operator);\r
+ $this->left_table = $CONFIG->dbprefix . sanitise_string($left_table);\r
+ $this->left_field = sanitise_string($left_field);\r
+ $this->operator = sanitise_string($operator);\r
+ $this->right_table = $CONFIG->dbprefix . sanitise_string($right_table);\r
+ $this->right_field = sanitise_string($right_field);\r
+ }\r
+\r
+ /**\r
+ * Return the SQL without the link operator.\r
+ */\r
+ public function toStringNoLink()\r
+ {\r
+ return "{$this->left_table }.{$this->left_field} {$this->operator} {$this->right_table}.{$this->right_field}";\r
+ }\r
+\r
+ function __toString()\r
+ {\r
+ return "{$this->link_operator} " . $this->toStringNoLink();\r
+ }\r
+}\r
--- /dev/null
+<?php\r
+/**\r
+ * @class WhereSetQueryComponent\r
+ * A where query that may contain other where queries (in brackets).\r
+ * @author Curverider Ltd\r
+ * @see Query\r
+ */\r
+class WhereSetQueryComponent extends WhereQueryComponent\r
+{\r
+ /**\r
+ * Construct a subset of wheres.\r
+ *\r
+ * @param array $wheres An array of WhereQueryComponent\r
+ * @param string $link_operator How this where clause links with the previous clause, eg. "and" "or"\r
+ */\r
+ function __construct(array $wheres, $link_operator = "and")\r
+ {\r
+ $this->link_operator = sanitise_string($link_operator);\r
+ $this->wheres = $wheres;\r
+ }\r
+\r
+ public function toStringNoLink()\r
+ {\r
+ $cnt = 0;\r
+ $string = " (";\r
+ foreach ($this->wheres as $where) {\r
+ if (!($where instanceof WhereQueryComponent))\r
+ throw new DatabaseException(elgg_echo('DatabaseException:WhereSetNonQuery'));\r
+\r
+ if (!$cnt)\r
+ $string.= $where->toStringNoLink();\r
+ else\r
+ $string.=" $where ";\r
+\r
+ $cnt ++;\r
+ }\r
+ $string .= ")";\r
+\r
+ return $string;\r
+ }\r
+}\r
--- /dev/null
+<?php\r
+/**\r
+ * @class WhereStaticQueryComponent\r
+ * A component of a where query where there is no right hand table, rather a static value.\r
+ * @author Curverider Ltd\r
+ * @see Query\r
+ */\r
+class WhereStaticQueryComponent extends WhereQueryComponent\r
+{\r
+ /**\r
+ * A where query.\r
+ *\r
+ * @param string $left_table The table on the left of the operator\r
+ * @param string $left_field The left field\r
+ * @param string $operator The operator eg "=" or "<"\r
+ * @param string $value The value\r
+ * @param string $link_operator How this where clause links with the previous clause, eg. "and" "or"\r
+ */\r
+ function __construct($left_table, $left_field, $operator, $value, $link_operator = "and")\r
+ {\r
+ global $CONFIG;\r
+\r
+ $this->link_operator = sanitise_string($link_operator);\r
+ $this->left_table = $CONFIG->dbprefix . sanitise_string($left_table);\r
+ $this->left_field = sanitise_string($left_field);\r
+ $this->operator = sanitise_string($operator);\r
+ if (is_numeric($value))\r
+ $this->value = (int)$value;\r
+ else\r
+ $this->value = "'".sanitise_string($value)."'";\r
+ }\r
+\r
+ /**\r
+ * Return the SQL without the link operator.\r
+ */\r
+ public function toStringNoLink()\r
+ {\r
+ return "{$this->left_table }.{$this->left_field} {$this->operator} {$this->value}";\r
+ }\r
+}\r
* @link http://elgg.org/
*/
-include dirname(dirname(__FILE__)).'/classes/ElggAccess.php';
-
-
/**
* Return a string of access_ids for $user_id appropriate for inserting into an SQL IN clause.
*
return (isset($CONFIG->actions[$action]) && file_exists($CONFIG->actions[$action]['file']));
}
-
register_elgg_event_handler("init","system","actions_init");
* @link http://elgg.org/
*/
-
/**
* Register an admin page with the admin panel.
* This function extends the view "admin/main" with the provided view. This view should provide a description
return ($notice) ? TRUE : FALSE;
}
-
// Register init functions
register_elgg_event_handler('init', 'system', 'admin_init');
register_elgg_event_handler('pagesetup', 'system', 'admin_pagesetup');
* @link http://elgg.org/
*/
-require_once 'extender.php';
-
-require_once dirname(dirname(__FILE__)).'/classes/ElggAnnotation.php';
-
/**
* Convert a database row to a new ElggAnnotation
*
* @link http://elgg.org/
*/
-// Result classes /////////////////////////////////////////////////////////////////////////
-
-require_once dirname(dirname(__FILE__)).'/classes/GenericResult.php';
-require_once dirname(dirname(__FILE__)).'/classes/SuccessResult.php';
-require_once dirname(dirname(__FILE__)).'/classes/ErrorResult.php';
-require_once dirname(dirname(__FILE__)).'/classes/ElggHMACCache.php';
-
// Primary Services API Server functions /////////////////////////////////////////////////////////////////////
/**
* @subpackage API
* @author Curverider Ltd <info@elgg.com>
* @link http://elgg.org/
+ * @todo deprecate this file?
*/
-
-require_once dirname(dirname(__FILE__)).'/classes/ElggCache.php';
-require_once dirname(dirname(__FILE__)).'/classes/ElggSharedMemoryCache.php';
-require_once dirname(dirname(__FILE__)).'/classes/ElggStaticVariableCache.php';
-require_once dirname(dirname(__FILE__)).'/classes/ElggFileCache.php';
* @link http://elgg.org/
*/
-require_once dirname(dirname(__FILE__)).'/classes/Notable.php';
-
/**
* Return a timestamp for the start of a given day (defaults today).
*
* @link http://elgg.org/
*/
-require_once dirname(dirname(__FILE__)).'/classes/CronException.php';
-
/**
* Initialisation
*
return false;
}
-require_once dirname(dirname(__FILE__)).'/classes/Friendable.php';
-
/**
* Builds a URL from the a parts array like one returned by {@link parse_url()}.
*
}
}
+function __autoload($class) {
+ require_once dirname(dirname(__FILE__))."/classes/$class.php";
+}
+
/**
* Emits a shutdown:system event upon PHP shutdown, but before database connections are dropped.
*
/// Cache subtype searches
$SUBTYPE_CACHE = NULL;
-/// Require the locatable interface
-// @todo Move this into start.php?
-require_once('location.php');
-
-require_once dirname(dirname(__FILE__)).'/classes/ElggEntity.php';
-
/**
* Initialise the entity cache.
*/
* @link http://elgg.org/
*/
-// Top level //////////////////////////////////////////////////////////////////////////////
-
-/**
- * IOException
- * An IO Exception, throw when an IO Exception occurs. Subclass for specific IO Exceptions.
- *
- * @author Curverider Ltd <info@elgg.com>
- * @package Elgg
- * @subpackage Exceptions
- */
-class IOException extends Exception {}
-
-/**
- * ClassException
- * A class Exception, throw when there is a class error.
- *
- * @author Curverider Ltd <info@elgg.com>
- * @package Elgg
- * @subpackage Exceptions
- */
-class ClassException extends Exception {}
-
-/**
- * ConfigurationException
- * There is a configuration error
- *
- * @author Curverider Ltd <info@elgg.com>
- * @package Elgg
- * @subpackage Exceptions
- */
-class ConfigurationException extends Exception {}
-
-/**
- * SecurityException
- * An Security Exception, throw when a Security Exception occurs. Subclass for specific Security Execeptions (access problems etc)
- *
- * @author Curverider Ltd <info@elgg.com>
- * @package Elgg
- * @subpackage Exceptions
- */
-class SecurityException extends Exception {}
-
-/**
- * ClassNotFoundException
- * An database exception, throw when a database exception happens, subclass if more detail is needed.
- *
- * @author Curverider Ltd <info@elgg.com>
- * @package Elgg
- * @subpackage Exceptions
- */
-class DatabaseException extends Exception {}
-
-/**
- * APIException
- * The API Exception class, thrown by the API layer when an API call has an issue.
- *
- * @author Curverider Ltd <info@elgg.com>
- * @package Elgg
- * @subpackage Exceptions
- */
-class APIException extends Exception {}
-
-/**
- * CallException
- * An exception thrown when there is a problem calling something.
- *
- * @author Curverider Ltd <info@elgg.com>
- * @package Elgg
- * @subpackage Exceptions
- */
-class CallException extends Exception {}
-
-/**
- * Data format exception
- * An exception thrown when there is a problem in the format of some data.
- *
- * @author Curverider Ltd <info@elgg.com>
- * @package Elgg
- * @subpackage Exceptions
- */
-class DataFormatException extends Exception {}
-
-// Class exceptions ///////////////////////////////////////////////////////////////////////
-
-/**
- * InvalidClassException
- * An invalid class Exception, throw when a class is invalid.
- *
- * @author Curverider Ltd <info@elgg.com>
- * @package Elgg
- * @subpackage Exceptions
- */
-class InvalidClassException extends ClassException {}
-
-/**
- * ClassNotFoundException
- * An Class not found Exception, throw when an class can not be found occurs.
- *
- * @author Curverider Ltd <info@elgg.com>
- * @package Elgg
- * @subpackage Exceptions
- */
-class ClassNotFoundException extends ClassException {}
-
-// Configuration exceptions ///////////////////////////////////////////////////////////////
-
-/**
- * InstallationException
- * Thrown when there is a major problem with the installation.
- *
- * @author Curverider Ltd <info@elgg.com>
- * @package Elgg
- * @subpackage Exceptions
- */
-class InstallationException extends ConfigurationException {}
-
-// Call exceptions ////////////////////////////////////////////////////////////////////////
-
-/**
- * NotImplementedException
- * Thrown when a method or function has not been implemented, primarily used in development... you should
- * not see these!
- *
- * @author Curverider Ltd <info@elgg.com>
- * @package Elgg
- * @subpackage Exceptions
- */
-class NotImplementedException extends CallException {}
-
-/**
- * InvalidParameterException
- * A parameter is invalid.
- *
- * @author Curverider Ltd <info@elgg.com>
- * @package Elgg
- * @subpackage Exceptions
- */
-class InvalidParameterException extends CallException {}
-
-// Installation exception /////////////////////////////////////////////////////////////////
-
-/**
- * RegistrationException
- * Could not register a new user for whatever reason.
- *
- * @author Curverider Ltd <info@elgg.com>
- * @package Elgg
- * @subpackage Exceptions
- */
-class RegistrationException extends InstallationException {}
\ No newline at end of file
* @link http://elgg.org/
*/
-require_once dirname(dirname(__FILE__)).'/classes/Exportable.php';
-require_once dirname(dirname(__FILE__)).'/classes/Importable.php';
-require_once dirname(dirname(__FILE__)).'/classes/ExportException.php';
-require_once dirname(dirname(__FILE__)).'/classes/ImportException.php';
-
/**
* Get a UUID from a given object.
*
* @link http://elgg.org/
*/
-require_once dirname(dirname(__FILE__)).'/classes/ElggExtender.php';
-
/**
* Detect the value_type for a given value.
* Currently this is very crude.
* @link http://elgg.org/
*/
-include_once("objects.php");
-
-require_once dirname(dirname(__FILE__)).'/classes/ElggFilestore.php';
-require_once dirname(dirname(__FILE__)).'/classes/ElggDiskFilestore.php';
-require_once dirname(dirname(__FILE__)).'/classes/ElggFile.php';
-
/**
* Get the size of the specified directory.
*
* @link http://elgg.org/
*/
-require_once dirname(dirname(__FILE__)).'/classes/ElggGroup.php';
-
/**
* Get the group entity.
*
exit;
}
-
function input_init() {
// register an endpoint for live search / autocomplete.
register_page_handler('livesearch', 'input_livesearch_page_handler');
return $result;
}
-
/**
* Returns whether or not the database has been installed
*
* @link http://elgg.org/
*/
-require_once dirname(dirname(__FILE__)).'/classes/Locatable.php';
-
/**
* Encode a location into a latitude and longitude, caching the result.
*
* @link http://elgg.org/
*/
-require_once dirname(dirname(__FILE__)).'/classes/ElggMemcache.php';
-
/**
* Return true if memcache is available and configured.
*
* @link http://elgg.org/
*/
-require_once 'extender.php';
-
-require_once dirname(dirname(__FILE__)).'/classes/ElggMetadata.php';
-
/**
* Convert a database row to a new ElggMetadata
*
return false;
}
-/**
- * Notification exception.
- * @author Curverider Ltd
- */
-class NotificationException extends Exception {}
-
-
/**
* Send a notification via email.
*
<?php
-
/**
* Elgg objects
* Functions to manage multiple or single objects in an Elgg install
* @link http://elgg.org/
*/
-require_once dirname(dirname(__FILE__)).'/classes/ElggObject.php';
-
/**
* Return the object specific details of a object by a row.
*
* @link http://elgg.org/
*/
-include_once("xml.php");
-
-require_once dirname(dirname(__FILE__)).'/classes/ODDDocument.php';
-require_once dirname(dirname(__FILE__)).'/classes/ODD.php';
-require_once dirname(dirname(__FILE__)).'/classes/ODDEntity.php';
-
/**
* Attempt to construct an ODD object out of a XmlElement or sub-elements.
*
* @link http://elgg.org/
*/
-
/// Cache enabled plugins per page
$ENABLED_PLUGINS_CACHE = NULL;
-/**
- * PluginException
- *
- * A plugin Exception, thrown when an Exception occurs relating to the plugin mechanism. Subclass for specific plugin Exceptions.
- *
- * @package Elgg
- * @subpackage Exceptions
- */
-class PluginException extends Exception {}
-
-require_once dirname(dirname(__FILE__)).'/classes/ElggPlugin.php';
-
/**
* Returns a list of plugins to load, in the order that they should be loaded.
*
<?php
- /**
- * Elgg database query
- * Contains a wrapper for performing database queries in a structured way.
- *
- * @package Elgg
- * @subpackage Core
- * @author Curverider Ltd
- * @link http://elgg.org/
- */
-
-
- /**
- * @class QueryComponent Query component superclass.
- * Component of a query.
- * @author Curverider Ltd
- * @see Query
- */
- abstract class QueryComponent
- {
- /**
- * Associative array of fields and values
- */
- private $fields;
-
- function __construct()
- {
- $this->fields = array();
- }
-
- /**
- * Class member get overloading
- *
- * @param string $name
- * @return mixed
- */
- function __get($name) {
- return $this->fields[$name];
- }
-
- /**
- * Class member set overloading
- *
- * @param string $name
- * @param mixed $value
- * @return void
- */
- function __set($name, $value) {
- $this->fields[$name] = $value;
-
- return true;
- }
- }
-
- /**
- * @class SelectFieldQueryComponent Class representing a select field.
- * This class represents a select field component.
- * @author Curverider Ltd
- * @see Query
- */
- class SelectFieldQueryComponent extends QueryComponent
- {
- /**
- * Construct a select field component
- *
- * @param string $table The table containing the field.
- * @param string $field The field or "*"
- */
- function __construct($table, $field)
- {
- global $CONFIG;
-
- $this->table = $CONFIG->dbprefix . sanitise_string($table);
- $this->field = sanitise_string($field);
- }
-
- function __toString()
- {
- return "{$this->table}.{$this->field}";
- }
- }
-
- /**
- * @class LimitOffsetQueryComponent
- * Limit and offset clauses of a query.
- * @author Curverider Ltd
- * @see Query
- */
- class LimitOffsetQueryComponent extends QueryComponent
- {
- /**
- * Specify a limit and an offset.
- *
- * @param int $limit The limit.
- * @param int $offset The offset.
- */
- function __construct($limit = 25, $offset = 0)
- {
- $this->limit = (int)$limit;
- $this->offset = (int)$offset;
- }
-
- function __toString()
- {
- return "limit {$this->offset}, {$this->limit}";
- }
- }
-
- /**
- * @class OrderQueryComponent
- * Order the query results.
- * @author Curverider Ltd
- * @see Query
- */
- class OrderQueryComponent extends QueryComponent
- {
- function __construct($table, $field, $order = "asc")
- {
- global $CONFIG;
-
- $this->table = $CONFIG->dbprefix . sanitise_string($table);
- $this->field = sanitise_string($field);
- $this->order = sanitise_string($order);
- }
-
- function __toString()
- {
- return "order by {$this->table}.{$this->field} {$this->order}";
- }
- }
-
- /**
- * @class TableQueryComponent
- * List of tables to select from or insert into.
- * @author Curverider Ltd
- * @see Query
- */
- class TableQueryComponent extends QueryComponent
- {
- function __construct($table)
- {
- global $CONFIG;
-
- $this->table = $CONFIG->dbprefix . sanitise_string($table);
- }
-
- function __toString()
- {
- return $this->table;
- }
- }
-
- /**
- * @class AccessControlQueryComponent
- * Access control component.
- * @author Curverider Ltd
- * @see Query
- */
- class AccessControlQueryComponent extends QueryComponent
- {
- /**
- * Construct the ACL.
- *
- * @param string $acl_table The table where the access control field is.
- * @param string $acl_field The field containing the access control.
- * @param string $object_owner_table The table containing the owner information for the stuff you're retrieving.
- * @param string $object_owner_id_field The field in $object_owner_table containing the owner information
- */
- function __construct($acl_table = "entities", $acl_field = "access_id", $object_owner_table = "entities", $object_owner_id_field = "owner_guid")
- {
- global $CONFIG;
-
- $this->acl_table = $CONFIG->dbprefix . sanitise_string($acl_table);
- $this->acl_field = sanitise_string($acl_field);
- $this->object_owner_table = $CONFIG->dbprefix . sanitise_string($object_owner_table);
- $this->object_owner_id_field = sanitise_string($object_owner_id_field);
- }
-
- function __toString()
- {
- //$access = get_access_list();
- // KJ - changed to use get_access_sql_suffix
- // Note: currently get_access_sql_suffix is hardwired to use
- // $acl_field = "access_id", $object_owner_table = $acl_table, and
- // $object_owner_id_field = "owner_guid"
- // @todo recode get_access_sql_suffix to make it possible to specify alternate field names
- return "and ".get_access_sql_suffix($this->acl_table); // Add access controls
-
- //return "and ({$this->acl_table}.{$this->acl_field} in {$access} or ({$this->acl_table}.{$this->acl_field} = 0 and {$this->object_owner_table}.{$this->object_owner_id_field} = {$_SESSION['id']}))";
- }
- }
-
- /**
- * @class JoinQueryComponent Join query.
- * Represents a join query.
- * @author Curverider Ltd
- * @see Query
- */
- class JoinQueryComponent extends QueryComponent
- {
- /**
- * Construct a join query.
- * @param string $table Table one to join...
- * @param string $field Field 1 with...
- * @param string $table2 Table 2 ...
- * @param string $field2 Field...
- * @param string $operator Using this operator
- */
- function __construct($table1, $field1, $table2, $field2, $operator = "=")
- {
- global $CONFIG;
-
- $this->table1 = $CONFIG->dbprefix . sanitise_string($table1);
- $this->field1 = sanitise_string($field1);
- $this->table2 = $CONFIG->dbprefix . sanitise_string($table2);
- $this->field2 = sanitise_string($field2);
- $this->operator = sanitise_string($operator);
- }
-
- function __toString()
- {
- return "join {$this->table2} on {$this->$table}.{$this->$field} {$this->$operator} {$this->$table2}.{$this->$field2}";
- }
- }
-
- /**
- * @class SetQueryComponent Set query.
- * Represents an update set query.
- * @author Curverider Ltd
- * @see Query
- */
- class SetQueryComponent extends QueryComponent
- {
- /**
- * Construct a setting query
- *
- * @param string $table The table to modify
- * @param string $field The field to modify
- * @param mixed $value The value to set it to
- */
- function __construct($table, $field, $value)
- {
- global $CONFIG;
-
- $this->table = $CONFIG->dbprefix . sanitise_string($table);
- $this->field = sanitise_string($field);
- if (is_numeric($value))
- $this->value = (int)$value;
- else
- $this->value = "'".sanitise_string($value)."'";
- }
-
- function __toString()
- {
- return "{$this->table}.{$this->field}={$this->value}";
- }
- }
-
- /**
- * @class WhereQueryComponent
- * A component of a where query.
- * @author Curverider Ltd
- * @see Query
- */
- class WhereQueryComponent extends QueryComponent
- {
- /**
- * A where query.
- *
- * @param string $left_table The table on the left of the operator
- * @param string $left_field The left field
- * @param string $operator The operator eg "=" or "<"
- * @param string $right_table The table on the right of the operator
- * @param string $right_field The right field
- * @param string $link_operator How this where clause links with the previous clause, eg. "and" "or"
- */
- function __construct($left_table, $left_field, $operator, $right_table, $right_field, $link_operator = "and")
- {
- global $CONFIG;
-
- $this->link_operator = sanitise_string($link_operator);
- $this->left_table = $CONFIG->dbprefix . sanitise_string($left_table);
- $this->left_field = sanitise_string($left_field);
- $this->operator = sanitise_string($operator);
- $this->right_table = $CONFIG->dbprefix . sanitise_string($right_table);
- $this->right_field = sanitise_string($right_field);
- }
-
- /**
- * Return the SQL without the link operator.
- */
- public function toStringNoLink()
- {
- return "{$this->left_table }.{$this->left_field} {$this->operator} {$this->right_table}.{$this->right_field}";
- }
-
- function __toString()
- {
- return "{$this->link_operator} " . $this->toStringNoLink();
- }
- }
-
- /**
- * @class WhereStaticQueryComponent
- * A component of a where query where there is no right hand table, rather a static value.
- * @author Curverider Ltd
- * @see Query
- */
- class WhereStaticQueryComponent extends WhereQueryComponent
- {
- /**
- * A where query.
- *
- * @param string $left_table The table on the left of the operator
- * @param string $left_field The left field
- * @param string $operator The operator eg "=" or "<"
- * @param string $value The value
- * @param string $link_operator How this where clause links with the previous clause, eg. "and" "or"
- */
- function __construct($left_table, $left_field, $operator, $value, $link_operator = "and")
- {
- global $CONFIG;
-
- $this->link_operator = sanitise_string($link_operator);
- $this->left_table = $CONFIG->dbprefix . sanitise_string($left_table);
- $this->left_field = sanitise_string($left_field);
- $this->operator = sanitise_string($operator);
- if (is_numeric($value))
- $this->value = (int)$value;
- else
- $this->value = "'".sanitise_string($value)."'";
- }
-
- /**
- * Return the SQL without the link operator.
- */
- public function toStringNoLink()
- {
- return "{$this->left_table }.{$this->left_field} {$this->operator} {$this->value}";
- }
- }
-
- /**
- * @class WhereSetQueryComponent
- * A where query that may contain other where queries (in brackets).
- * @author Curverider Ltd
- * @see Query
- */
- class WhereSetQueryComponent extends WhereQueryComponent
- {
- /**
- * Construct a subset of wheres.
- *
- * @param array $wheres An array of WhereQueryComponent
- * @param string $link_operator How this where clause links with the previous clause, eg. "and" "or"
- */
- function __construct(array $wheres, $link_operator = "and")
- {
- $this->link_operator = sanitise_string($link_operator);
- $this->wheres = $wheres;
- }
-
- public function toStringNoLink()
- {
- $cnt = 0;
- $string = " (";
- foreach ($this->wheres as $where) {
- if (!($where instanceof WhereQueryComponent))
- throw new DatabaseException(elgg_echo('DatabaseException:WhereSetNonQuery'));
-
- if (!$cnt)
- $string.= $where->toStringNoLink();
- else
- $string.=" $where ";
-
- $cnt ++;
- }
- $string .= ")";
-
- return $string;
- }
- }
-
- /**
- * @class QueryTypeQueryComponent
- * What type of query is this?
- * @author Curverider Ltd
- * @see Query
- */
- abstract class QueryTypeQueryComponent extends QueryComponent
- {
- function __toString()
- {
- return $this->query_type;
- }
- }
-
- /**
- * @class SelectQueryTypeQueryComponent
- * A select query.
- * @author Curverider Ltd
- * @see Query
- */
- class SelectQueryTypeQueryComponent extends QueryTypeQueryComponent
- {
- function __construct()
- {
- $this->query_type = "SELECT";
- }
- }
-
- /**
- * @class InsertQueryTypeQueryComponent
- * An insert query.
- * @author Curverider Ltd
- * @see Query
- */
- class InsertQueryTypeQueryComponent extends QueryTypeQueryComponent
- {
- function __construct()
- {
- $this->query_type = "INSERT INTO";
- }
- }
-
- /**
- * @class DeleteQueryTypeQueryComponent
- * A delete query.
- * @author Curverider Ltd
- * @see Query
- */
- class DeleteQueryTypeQueryComponent extends QueryTypeQueryComponent
- {
- function __construct()
- {
- $this->query_type = "DELETE FROM";
- }
- }
-
- /**
- * @class UpdateQueryTypeQueryComponent
- * An update query.
- * @author Curverider Ltd
- * @see Query
- */
- class UpdateQueryTypeQueryComponent extends QueryTypeQueryComponent
- {
- function __construct()
- {
- $this->query_type = "UPDATE";
- }
- }
-
- /**
- * @class Query Provides a framework to construct complex queries in a safer environment.
- *
- * The usage of this class depends on the type of query you are executing, but the basic idea is to
- * construct a query out of pluggable classes.
- *
- * Once constructed SQL can be generated using the toString method, this should happen automatically
- * if you pass the Query object to get_data or similar.
- *
- * To construct a query, create a new Query() object and begin populating it with the various classes
- * that define the various aspects of the query.
- *
- * Notes:
- * - You do not have to specify things in any particular order, provided you specify all required
- * components.
- * - With database tables you do not have to specify your db prefix, this will be added automatically.
- * - When constructing your query keep an eye on the error log - any problems will get spit out here.
- * Note also that __toString won't let you throw Exceptions (!!!) so these are caught and echoed to
- * the log instead.
- *
- * Here is an example of a select query which requests some data out of the entities table with an
- * order and limit that uses a subset where and some normal where queries:
- *
- * <blockquote>
- * // Construct the query
- * $query = new Query();
- *
- * // Say which table we're interested in
- * $query->addTable(new TableQueryComponent("entities"));
- *
- * // What fields are we interested in
- * $query->addSelectField(new SelectFieldQueryComponent("entities","*"));
- *
- * // Add access control (Default access control uses default fields on entities table.
- * // Note that it will error without something specified here!
- * $query->setAccessControl(new AccessControlQueryComponent());
- *
- * // Set a limit and offset, may be omitted.
- * $query->setLimitAndOffset(new LimitOffsetQueryComponent(10,0));
- *
- * // Specify the order, may be omitted
- * $query->setOrder(new OrderQueryComponent("entities", "subtype", "desc"));
- *
- * // Construct a where query
- * //
- * // This demonstrates a WhereSet which lets you have sub wheres, a
- * // WhereStatic which lets you compare a table field against a value and a
- * // Where which lets you compare a table/field with another table/field.
- * $query->addWhere(
- * new WhereSetQueryComponent(
- * array(
- * new WhereStaticQueryComponent("entities", "subtype","=", 1),
- * new WhereQueryComponent("entities","subtype","=", "entities", "subtype")
- * )
- * )
- * );
- *
- * get_data($query);
- * </blockquote>
- *
- * @author Curverider Ltd
- */
- class Query
- {
-
- /// The limit of the query
- private $limit_and_offset;
-
- /// Fields to return on a query
- private $fields;
-
- /// Tables to use in a from query
- private $tables;
-
- /// Join tables
- private $joins;
-
- /// Set values
- private $sets;
-
- /// Where query
- private $where;
-
- /// Order by
- private $order;
-
- /// The query type
- private $query_type;
-
- /// ACL
- private $access_control;
-
- /**
- * Construct query & initialise variables
- */
- function __construct()
- {
- $this->fields = array();
- $this->tables = array();
- $this->joins = array();
- $this->where = array();
- $this->sets = array();
-
- $this->setQueryType(new SelectQueryTypeQueryComponent());
- }
-
- /**
- * Add limits and offsets to the query.
- *
- * @param LimitOffsetQueryComponent $component The limit and offset.
- */
- public function setLimitAndOffset(LimitOffsetQueryComponent $component) { $this->limit_and_offset = $component; }
-
- /**
- * Reset and set the field to the select statement.
- *
- * @param SelectFieldQueryComponent $component Table and field component.
- */
- public function setSelectField(SelectFieldQueryComponent $component)
- {
- $this->fields = array();
- return $this->addSelectField($component);
- }
-
- /**
- * Add a select field.
- *
- * @param SelectFieldQueryComponent $component Add a component.
- */
- public function addSelectField(SelectFieldQueryComponent $component) { $this->fields[] = $component; }
-
- /**
- * Add a join to the component.
- *
- * @param JoinQueryComponent $component The join.
- */
- public function addJoin(JoinQueryComponent $component) { $this->joins[] = $component; }
-
- /**
- * Set a field value in an update or insert statement.
- *
- * @param SetQueryComponent $component Fields to set.
- */
- public function addSet(SetQueryComponent $component) { $this->sets[] = $component; }
-
- /**
- * Set the query type, i.e. "select", "update", "insert" & "delete".
- *
- * @param QueryTypeQueryComponent $component The query type.
- */
- public function setQueryType(QueryTypeQueryComponent $component) { $this->query_type = $component; }
-
- /**
- * Attach an order component.
- *
- * @param OrderQueryComponent $component The order component.
- */
- public function setOrder(OrderQueryComponent $component) { $this->order = $component; }
-
- /**
- * Add a table to the query.
- *
- * @param TableQueryComponent $component Table to add.
- */
- public function addTable(TableQueryComponent $component) { $this->tables[] = $component; }
-
- /**
- * Add a where clause to the query.
- *
- * @param WhereQueryComponent $component The where component
- */
- public function addWhere(WhereQueryComponent $component) { $this->where[] = $component; }
-
- /**
- * Set access control.
- *
- * @param AccessControlQueryComponent $component Access control.
- */
- public function setAccessControl(AccessControlQueryComponent $component) { $this->access_control = $component; }
-
- public function __toString()
- {
- global $CONFIG;
-
- $sql = "";
-
- try
- {
- // Query prefix & fields
- if (!empty($this->query_type))
- {
- $sql .= "{$this->query_type} ";
-
- if (!empty($this->fields))
- {
- $fields = "";
-
- foreach ($this->fields as $field)
- $fields .= "$field";
-
- $sql .= " $fields from ";
- }
- else
- throw new DatabaseException(elgg_echo('DatabaseException:SelectFieldsMissing'));
- }
- else
- throw new DatabaseException(elgg_echo('DatabaseException:UnspecifiedQueryType'));
-
- // Tables
- if (!empty($this->tables))
- {
- foreach($this->tables as $table)
- $sql .= "$table, ";
-
- $sql = trim($sql, ", ");
- }
- else
- throw new DatabaseException(elgg_echo('DatabaseException:NoTablesSpecified'));
-
- // Joins on select queries
- if ($this->query_type->query_type == 'select')
- {
- if (!empty($this->joins))
- {
- foreach($this->joins as $join)
- $sql .= "$join ";
- }
- }
-
- // Setting values
- if (
- ($this->query_type->query_type == 'update') ||
- ($this->query_type->query_type == 'insert')
- )
- {
- $sql .= "set ";
-
- foreach ($this->sets as $set)
- $sql .= "$set, ";
-
- $sql = trim($sql, ", ") . " ";
- }
-
- // Where
- if (!empty($this->where))
- {
- $sql .= " where 1 ";
-
- foreach ($this->where as $where)
- $sql .= "$where ";
- }
-
- // Access control
- if (!empty($this->access_control))
- {
-
- // Catch missing Where
- if (empty($this->where))
- $sql .= " where 1 ";
-
- $sql .= "{$this->access_control} ";
- }
- else
- throw new DatabaseException(elgg_echo('DatabaseException:NoACL'));
-
- // Order by
- if (!empty($this->order))
- $sql .= "{$this->order} ";
-
- // Limits
- if (!empty($this->limit_and_offset))
- $sql .= "{$this->limit_and_offset} ";
-
-
-
- } catch (Exception $e) {
- trigger_error($e, E_USER_WARNING);
- }
-
-
- return $sql;
- }
-
- }
-
- /**
- * @class SimpleQuery A wrapper for Query which provides simple interface for common functions.
- *
- * This class provides simple interface functions for constructing a (reasonably) standard database
- * query.
- *
- * The constructor for this class sets a number of defaults, for example sets default access controls
- * and a limit and offset - to change this then set it manually.
- *
- * @author Curverider Ltd
- * @see Query
- */
- class SimpleQuery extends Query
- {
- function __construct()
- {
- parent::__construct();
-
- // Set a default query type (select)
- $this->simpleQueryType();
-
- // Set a default access control
- $this->simpleAccessControl();
-
- // Set default limit and offset
- $this->simpleLimitAndOffset();
- }
-
- /**
- * Set the query type.
- *
- * @param string $type The type of search - available are "select", "update", "delete", "insert".
- */
- public function simpleQueryType($type = "select")
- {
- $type = strtolower(sanitise_string($type));
-
- switch ($type)
- {
- case "insert" :
- return $this->setQueryType(InsertQueryTypeQueryComponent());
- break;
- case "delete" :
- return $this->setQueryType(DeleteQueryTypeQueryComponent());
- break;
- case "update" :
- return $this->setQueryType(UpdateQueryTypeQueryComponent());
- break;
- default: return $this->setQueryType(SelectQueryTypeQueryComponent());
- }
- }
-
- /**
- * Set a field to query in a select statement.
- *
- * @param string $table Table to query.
- * @param string $field Field in that table.
- */
- public function simpleSelectField($table, $field) { return $this->setSelectField(new SelectFieldQueryComponent($table, $field)); }
-
- /**
- * Add a select field to query in a select statement.
- *
- * @param string $table Table to query.
- * @param string $field Field in that table.
- */
- public function simpleAddSelectField($table, $field) { return $this->addSelectField(new SelectFieldQueryComponent($table, $field)); }
-
- /**
- * Add a set value to an update query.
- *
- * @param string $table The table to update.
- * @param string $field The field in the table.
- * @param mixed $value The value to set it to.
- */
- public function simpleSet($table, $field, $value) { return $this->addSet(new SetQueryComponent($table, $field, $value)); }
-
- /**
- * Add a join to the table.
- *
- * @param string $table Table one to join...
- * @param string $field Field 1 with...
- * @param string $table2 Table 2 ...
- * @param string $field2 Field...
- * @param string $operator Using this operator
- */
- public function simpleJoin($table1, $field1, $table2, $field2, $operator = "=") { return $this->addJoin(new JoinQueryComponent($table1, $field1, $table2, $field2, $operator)); }
-
- /**
- * Add a table to the query.
- *
- * @param string $table The table.
- */
- public function simpleTable($table) { return $this->addTable(new TableQueryComponent($table)); }
-
- /**
- * Compare one table/field to another table/field.
- *
- * @param string $left_table The table on the left of the operator
- * @param string $left_field The left field
- * @param string $operator The operator eg "=" or "<"
- * @param string $right_table The table on the right of the operator
- * @param string $right_field The right field
- * @param string $link_operator How this where clause links with the previous clause, eg. "and" "or"
- */
- public function simpleWhereOnTable($left_table, $left_field, $operator, $right_table, $right_field, $link_operator = "and") { return $this->addWhere(new WhereQueryComponent($left_table, $left_field, $operator, $right_table, $right_field, $link_operator)); }
-
- /**
- * Compare one table/field to a value.
- *
- * @param string $left_table The table on the left of the operator
- * @param string $left_field The left field
- * @param string $operator The operator eg "=" or "<"
- * @param string $value The value
- * @param string $link_operator How this where clause links with the previous clause, eg. "and" "or"
- */
- public function simpleWhereOnValue($left_table, $left_field, $operator, $value, $link_operator = "and") { return $this->addWhere(new WhereStaticQueryComponent($left_table, $left_field, $operator, $value, $link_operator)); }
-
- /**
- * Set access control.
- *
- * @param string $acl_table The table where the access control field is.
- * @param string $acl_field The field containing the access control.
- * @param string $object_owner_id_field The field in $object_owner_table containing the owner information.
- */
- public function simpleAccessControl($acl_table = "entities", $acl_field = "access_id", $object_owner_id_field = "owner_guid") { return $this->setAccessControl(new AccessControlQueryComponent($acl_table, $acl_field, $acl_table, $object_owner_id_field)); }
-
- /**
- * Set the limit and offset.
- *
- * @param int $limit The limit.
- * @param int $offset The offset.
- */
- public function simpleLimitAndOffset($limit = 25, $offset = 0) { return $this->setLimitAndOffset(new LimitOffsetQueryComponent($limit, $offset)); }
-
- /**
- * Set the order query.
- *
- * @param string $table The table to query
- * @param string $field The field to query
- * @param string $order Order the query
- */
- public function simpleOrder($table, $field, $order = "desc")
- {
- $table = sanitise_string($table);
- $field = sanitise_string($field);
- $order = strtolower(sanitise_string($order));
-
- return $this->setOrder(new OrderQueryComponent($table, $field, $order)); break;
- }
- }
+/**
+ * Elgg database query
+ * Contains a wrapper for performing database queries in a structured way.
+ *
+ * @package Elgg
+ * @subpackage Core
+ * @author Curverider Ltd
+ * @link http://elgg.org/
+ * @todo deprecate this file?
+ */
\ No newline at end of file
* @link http://elgg.org/
*/
-require_once dirname(dirname(__FILE__)).'/classes/ElggRelationship.php';
-
/**
* Convert a database row to a new ElggRelationship
*
return delete_data("delete from {$CONFIG->dbprefix}river where id = {$id}");
}
-
/**
* Sets the access ID on river items for a particular object
*
/** Elgg magic session */
global $SESSION;
-require_once dirname(dirname(__FILE__)).'/classes/ElggSession.php';
-
-
/**
* Return the current logged in user, or NULL if no user is logged in.
*
* @link http://elgg.org/
*/
-require_once dirname(dirname(__FILE__)).'/classes/ElggSite.php';
-
/**
* Return the site specific details of a site by a row.
*
* @link http://elgg.org/
*/
-require_once dirname(dirname(__FILE__)).'/classes/Loggable.php';
-
/**
* Retrieve the system log based on a number of parameters.
*
* @link http://elgg.org/
*/
-
/**
* The algorithm working out the size of font based on the number of tags.
* This is quick and dirty.
/// Map a user code to a cached GUID
$CODE_TO_GUID_MAP_CACHE = array();
-require_once dirname(dirname(__FILE__)).'/classes/ElggUser.php';
-
/**
* Return the user specific details of a user by a row.
*
* @link http://elgg.org/
*/
-require_once dirname(dirname(__FILE__)).'/classes/ElggWidget.php';
-
/**
* Register a particular context for use with widgets.
*
* @link http://elgg.org/
*/
- // XMLRPC Call ////////////////////////////////////////////////////////////////////////////
-
- require_once dirname(dirname(__FILE__)).'/classes/XMLRPCCall.php';
-
-
- // Response classes ///////////////////////////////////////////////////////////////////////
-
- require_once dirname(dirname(__FILE__)).'/classes/XMLRPCParameter.php';
- require_once dirname(dirname(__FILE__)).'/classes/XMLRPCIntParameter.php';
- require_once dirname(dirname(__FILE__)).'/classes/XMLRPCBoolParameter.php';
- require_once dirname(dirname(__FILE__)).'/classes/XMLRPCStringParameter.php';
- require_once dirname(dirname(__FILE__)).'/classes/XMLRPCDoubleParameter.php';
- require_once dirname(dirname(__FILE__)).'/classes/XMLRPCDateParameter.php';
- require_once dirname(dirname(__FILE__)).'/classes/XMLRPCBase64Parameter.php';
- require_once dirname(dirname(__FILE__)).'/classes/XMLRPCStructParameter.php';
- require_once dirname(dirname(__FILE__)).'/classes/XMLRPCArrayParameter.php';
- require_once dirname(dirname(__FILE__)).'/classes/XMLRPCResponse.php';
- require_once dirname(dirname(__FILE__)).'/classes/XMLRPCSuccessResponse.php';
- require_once dirname(dirname(__FILE__)).'/classes/XMLRPCErrorResponse.php';
-
// Helper functions ///////////////////////////////////////////////////////////////////////
/**
* @link http://elgg.org/
*/
- require_once dirname(dirname(__FILE__)).'/classes/XmlElement.php';
-
/**
* This function serialises an object recursively into an XML representation.
* The function attempts to call $data->export() which expects a stdClass in return, otherwise it will attempt to