コード例 #1
0
ファイル: Mapper.class.php プロジェクト: evilgeny/bob
    /**
     *	Adds permission check to query. Parameters can be following:
     *		PARAM			TYPE			DEFAULT			DESC
     *      join-table		string							Table to join to
     *      permissions		string|hash<id:perm>  			Permissions to check. Can be passed in format:
     *      												'permissions' => 'GRANT'
     *															or
     *														'permissions' => array('read' => 'READ', 'grnt' => 'GRANT')
     *															or
     *														'permissions' => array('read' => array( $userId, 'READ') )
     *														For every key, alias {SELF-PREFIX}{KEY} will be added.
     *														When permissions is a string, KEY='result'
     *      self-alias		string			access			Permission table alias.
     *      self-prefix		string			access_   		Prefix for self aliases
     *      access-id-field	string			access_id		field with access ID in "join-table"
     *      owner-id-field	string			owner_id		field with owner ID in "join-table"
     *
     *	Short example:
     *  	addPermissionToQuery($query, $aliases, array(
     *  		'join-table'  => 'mytable',
     *  		'self-prefix' => 'file_access_',
     *  		'permissions' => array('read' => 'READ-INFO'),
     *  	));
     *   	$request = $storage->request($query, $aliases);
     *
     *   	// required PERM_ALLOW
     *   	$request->filter('file_access_read = ?', PERM_ALLOW);
     *   	// required PERM_ALLOW or PERM_UNDEF
     *		$request->filter('(file_access_read & ?)', PERM_ALLOW|PERM_UNDEF);
     *
     *	@param		query	RM_Db_Query			Query object
     *	@param		aliases hashref				Hash to store aliases
     *	@param		conf	hash<name:value>	Configuration params
     *	@return		void
     */
    public function addPermissionToQuery(RM_Db_Query $query, array &$aliases = array(), array $origConf = array())
    {
        $conf = array();
        foreach (qw2('join-table> permissions> self-alias>access self-prefix>access_
					access-id-field>access_id owner-id-field>owner_id ps-id>') as $id => $v) {
            if (array_key_exists($id, $origConf)) {
                $conf[$id] = $origConf[$id];
                unset($origConf[$id]);
            } else {
                $conf[$id] = $v;
            }
        }
        if (count($origConf)) {
            throw new RM_Base_Exception_BadUsage("Unknown params: " . join(',', array_keys($origConf)));
        }
        if (!$conf['join-table']) {
            throw new RM_Base_Exception_BadUsage("'join-table' parameter is required");
        }
        $query->join($conf['join-table'], sprintf("LEFT JOIN %s AS %s ON %s = %s", $this->_pdTable, $conf['self-alias'], M('Db')->field($conf['self-alias'], 'pd_access_id'), M('Db')->field($conf['join-table'], $conf['access-id-field'])));
        $perms = is_array($conf['permissions']) ? $conf['permissions'] : array('result' => $conf['permissions']);
        if (!count($perms)) {
            throw new RM_Base_Exception_BadUsage("You must specify at least one permission if you call this method...");
        }
        $binds = array();
        foreach ($perms as $key => $value) {
            list($uid, $value) = is_array($value) ? $value : array(NULL, $value);
            $ids = $this->permToIds($value);
            if (count($ids) != 1) {
                throw new RM_Base_Exception_BadUsage("'permission' must be specified and must be the single permission (multiple permissions not implemented yet, contact Permission lib developer if you really need it)");
            }
            list($aliases[$conf['self-prefix'] . $key], $binds[$key]) = $this->_fmtCheckAccessCall($ids[0], $uid, $conf['ps-id'], M('Db')->field($conf['join-table'], $conf['owner-id-field']), M('Db')->field($conf['self-alias'], 'pd_data'), M('Db')->field($conf['self-alias'], 'pd_access_id'));
        }
        return $binds;
    }
コード例 #2
0
ファイル: Mapper.class.php プロジェクト: evilgeny/bob
 protected function _addDependenceOfBricksToQuery(RM_Db_Query $q, array $brickList)
 {
     $nameList = array();
     foreach ($brickList as $brick) {
         if (!isNull($brick)) {
             $nameList[] = $brick->getBrickSystemName();
         }
     }
     if ($nameList) {
         $q->join('v', 'LEFT JOIN ' . $this->table('dependency') . ' dep on dep.value_id=v.id and dep.brick_code in (' . sqlBinds($nameList) . ')', $nameList);
         $q->what('dep.brick_code');
         $q->where('dep.value_id is null');
     }
 }
コード例 #3
0
ファイル: Db.class.php プロジェクト: evilgeny/bob
 /**
  *	Adds tree table to query. Conf:
  *		PARAM			TYPE		DEFAULT			DESC
  *      self-alias		string		tree			Tree table alias.
  *      self-prefix		string		tree_   		Prefix for self aliases
  *      self-field		string		descendent_id	Field to link agains: descendent_id, ancestor_id
  *      join-table		string		''				Table to join to
  *      join-field		string		id				Field in "join-table"
  *
  *  Adds aliases:
  *   	ancestor_id
  *   	descendent_id
  *   	level
  *   (with prefix "self-prefix")
  *
  *	@param		query		RM_Db_Query		Source query
  *	@param		aliases		arrayref		Array for aliases
  *	@param		conf		hash			Configuration. See above
  *	@return		void
  */
 public function addTreeToQuery(RM_Db_Query $query, array &$aliases = array(), array $conf = array())
 {
     $conf = array_merge(qw2('self-alias>tree self-prefix>tree_ self-field>descendent_id join-table> join-field>id'), $conf);
     $query->join($conf['join-table'], sprintf("LEFT JOIN %s AS %s ON %s = %s", $this->_table, $conf['self-alias'], M('Db')->field($conf['self-alias'], $conf['self-field']), M('Db')->field($conf['join-table'], $conf['join-field'])));
     foreach (qw2('ancestor_id descendent_id level') as $f) {
         $aliases[$conf['self-prefix'] . $f] = M('Db')->field($conf['self-alias'], $f);
     }
 }