/**
  * Define a new User Right
  * 
  * @param string $right
  */
 public static function define_right($right)
 {
     $error = new argent_error();
     $db = new argent_database();
     if (!is_string($right)) {
         $error->add('1050', 'Invalid data type: expecting STRING', $right, 'argent_uauth');
     }
     if (self::right_exists($right)) {
         $error->add('1043', 'Right exists', $right, 'argent_uauth');
     }
     if ($error->has_errors()) {
         return $error;
     }
     $meta = array('object_id' => argent_identifier::object_id('URT'));
     $meta = argent_meta::add_meta($meta);
     $sql = "\r\n                        INSERT INTO\r\n                            `ua_rights`\r\n                        VALUES\r\n                            (\r\n                                '{$db->escape($meta['meta_guid'])}',\r\n                                '{$db->escape($meta['object_id'])}',\r\n                                '{$db->escape($right)}',\r\n                                '{$db->escape($meta['meta_timestamp'])}',\r\n                                '{$db->escape($meta['meta_user'])}',\r\n                                '{$db->escape($meta['meta_ip'])}'\r\n                            )\r\n                        ";
     $db->query($sql);
     return true;
 }
 /**
  * Clears the current session from the database, and unsets the
  * session cookie
  * 
  * @since 1.0.1
  * @return true
  */
 public function end_session()
 {
     $db = new argent_database();
     $query = "\r\n                            DELETE FROM \r\n                                `ua_sessions`\r\n                            WHERE \r\n                                `session_id` = '{$db->escape_value($this->id)}'\r\n                            AND\r\n                                `session_name` = '{$db->escape_value($this->name)}'";
     $db->query($query);
     if (!headers_sent()) {
         setcookie($this->name, '', time() - 3600, $this->path, $this->domain, $this->secure);
     }
     return true;
 }
 /**
  * Creates a head view for a given table name, after dropping any
  * existing head view as part of a transaction
  * 
  * @since 1.0.1
  * @param string $table_name 
  * @return true
  */
 public static function create_head_view($table_name)
 {
     $db = new argent_database();
     $db->start_transaction();
     $sql = "\r\n                        DROP VIEW IF EXISTS\r\n                            `{$table_name}_head`\r\n                        ";
     $db->query($sql);
     $sql = "\r\n                        CREATE VIEW \r\n                            `{$table_name}_head` \r\n                        AS \r\n                            SELECT \r\n                                `{$table_name}`.* \r\n                            FROM\r\n                                `{$table_name}` \r\n                            WHERE \r\n                                `{$table_name}`.`meta_guid` \r\n                            IN\r\n                                (SELECT max(`{$table_name}`.`meta_guid`) \r\n                                AS `max(meta_guid)` from `{$table_name}` group by `{$table_name}`.`object_id`)\r\n                        ";
     $db->query($sql);
     $db->end_transaction();
     return true;
 }
 /**
  * Break a defined relationship relationship between two objects
  * 
  * @param string $primary_object_id
  * @param string $secondary_object_id
  * @param string $relationship
  * @return array|\argent_error
  */
 public static function unrelate($primary_object_id, $secondary_object_id, $relationship, $include_reverse = false)
 {
     $error = new argent_error();
     $db = new argent_database();
     $related = self::related($primary_object_id, $secondary_object_id, $relationship, $include_reverse);
     if (argent_error::check($related)) {
         return $related;
     }
     if (!$related) {
         return $related;
     }
     $sql = "\r\n                    DELETE FROM\r\n                        `ua_relationships`\r\n                    WHERE\r\n                        (`primary_object_id` = '{$db->escape_value($primary_object_id)}'\r\n                    AND\r\n                        `secondary_object_id` = '{$db->escape_value($secondary_object_id)}' )\r\n                    ";
     if ($include_reverse) {
         $sql .= "\r\n                    OR\r\n                        (`primary_object_id` = '{$db->escape_value($secondary_object_id)}'\r\n                    AND\r\n                        `secondary_object_id` = '{$db->escape_value($primary_object_id)}' )\r\n                    ";
     }
     $sql .= "\r\n                    AND\r\n                        `relationship` = '{$db->escape_value($relationship)}'\r\n                    ";
     $db->query($sql);
     return true;
 }