Pulled out SQL statements into separate lines to allow for easier debugability, fixed up the documentation, prettied up the code to Campware coding conventions.
This commit is contained in:
parent
3a90898e3b
commit
8b40272996
1 changed files with 385 additions and 258 deletions
|
@ -46,11 +46,12 @@ define('ALIBERR_BADSMEMB', 21);
|
||||||
class Subjects extends ObjClasses {
|
class Subjects extends ObjClasses {
|
||||||
var $subjTable;
|
var $subjTable;
|
||||||
var $smembTable;
|
var $smembTable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor
|
* Constructor
|
||||||
*
|
*
|
||||||
* @param dbc object
|
* @param object $dbc
|
||||||
* @param config array
|
* @param array $config
|
||||||
* @return this
|
* @return this
|
||||||
*/
|
*/
|
||||||
function Subjects(&$dbc, $config)
|
function Subjects(&$dbc, $config)
|
||||||
|
@ -58,117 +59,146 @@ class Subjects extends ObjClasses{
|
||||||
parent::ObjClasses($dbc, $config);
|
parent::ObjClasses($dbc, $config);
|
||||||
$this->subjTable = $config['tblNamePrefix'].'subjs';
|
$this->subjTable = $config['tblNamePrefix'].'subjs';
|
||||||
$this->smembTable = $config['tblNamePrefix'].'smemb';
|
$this->smembTable = $config['tblNamePrefix'].'smemb';
|
||||||
}
|
} // constructor
|
||||||
|
|
||||||
|
|
||||||
/* ======================================================= public methods */
|
/* ======================================================= public methods */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add new subject
|
* Add new subject
|
||||||
*
|
*
|
||||||
* @param login string
|
* @param string $login
|
||||||
* @param pass string, optional
|
* @param string $pass, optional
|
||||||
* @param realname string, optional
|
* @param string $realname, optional
|
||||||
* @param passenc boolean, optional, password already encrypted if true
|
* @param boolean $passenc, optional, password already encrypted if true
|
||||||
* @return int/err
|
* @return int/err
|
||||||
*/
|
*/
|
||||||
function addSubj($login, $pass=NULL, $realname='', $passenc=FALSE)
|
function addSubj($login, $pass=NULL, $realname='', $passenc=FALSE)
|
||||||
{
|
{
|
||||||
if(!$login) return $this->dbc->raiseError(
|
if(!$login) {
|
||||||
get_class($this)."::addSubj: empty login"
|
return $this->dbc->raiseError(get_class($this)."::addSubj: empty login");
|
||||||
);
|
}
|
||||||
$id = $this->dbc->nextId("{$this->subjTable}_id_seq");
|
$id = $this->dbc->nextId("{$this->subjTable}_id_seq");
|
||||||
if(PEAR::isError($id)) return $id;
|
if (PEAR::isError($id)) {
|
||||||
if(!is_null($pass) && !$passenc) $pass = md5($pass);
|
|
||||||
$r = $this->dbc->query("
|
|
||||||
INSERT INTO {$this->subjTable} (id, login, pass, type, realname)
|
|
||||||
VALUES ($id, '$login', ".
|
|
||||||
(is_null($pass) ? "'!', 'G'" : "'$pass', 'U'").",
|
|
||||||
'$realname')
|
|
||||||
");
|
|
||||||
if(PEAR::isError($r)) return $r;
|
|
||||||
return $id;
|
return $id;
|
||||||
}
|
}
|
||||||
|
if (!is_null($pass) && !$passenc) {
|
||||||
|
$pass = md5($pass);
|
||||||
|
}
|
||||||
|
$sql = "INSERT INTO {$this->subjTable} (id, login, pass, type, realname)
|
||||||
|
VALUES ($id, '$login', ".
|
||||||
|
(is_null($pass) ? "'!', 'G'" : "'$pass', 'U'").",
|
||||||
|
'$realname')";
|
||||||
|
$r = $this->dbc->query($sql);
|
||||||
|
if (PEAR::isError($r)) {
|
||||||
|
return $r;
|
||||||
|
}
|
||||||
|
return $id;
|
||||||
|
} // fn addSubj
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Remove subject by uid or by login
|
* Remove subject by uid or by login
|
||||||
*
|
*
|
||||||
* @param login string
|
* @param string $login
|
||||||
* @param uid int, optional, default: null
|
* @param int $uid, optional, default: null
|
||||||
* @return boolean/err
|
* @return boolean/err
|
||||||
*/
|
*/
|
||||||
function removeSubj($login, $uid=NULL)
|
function removeSubj($login, $uid=NULL)
|
||||||
{
|
{
|
||||||
if(is_null($uid)) $uid = $this->getSubjId($login);
|
if (is_null($uid)) {
|
||||||
if(PEAR::isError($uid)) return $uid;
|
$uid = $this->getSubjId($login);
|
||||||
$r = $this->dbc->query("DELETE FROM {$this->smembTable}
|
|
||||||
WHERE (uid='$uid' OR gid='$uid') AND mid is null");
|
|
||||||
if(PEAR::isError($r)) return $r;
|
|
||||||
$r = $this->dbc->query("DELETE FROM {$this->subjTable}
|
|
||||||
WHERE login='$login'");
|
|
||||||
if(PEAR::isError($r)) return $r;
|
|
||||||
return $this->_rebuildRels();
|
|
||||||
}
|
}
|
||||||
|
if (PEAR::isError($uid)) {
|
||||||
|
return $uid;
|
||||||
|
}
|
||||||
|
$sql = "DELETE FROM {$this->smembTable}
|
||||||
|
WHERE (uid='$uid' OR gid='$uid') AND mid is null";
|
||||||
|
$r = $this->dbc->query($sql);
|
||||||
|
if (PEAR::isError($r)) {
|
||||||
|
return $r;
|
||||||
|
}
|
||||||
|
$sql2 = "DELETE FROM {$this->subjTable}
|
||||||
|
WHERE login='$login'";
|
||||||
|
$r = $this->dbc->query($sql2);
|
||||||
|
if (PEAR::isError($r)) {
|
||||||
|
return $r;
|
||||||
|
}
|
||||||
|
return $this->_rebuildRels();
|
||||||
|
} // fn removeSubj
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check login and password
|
* Check login and password
|
||||||
*
|
*
|
||||||
* @param login string
|
* @param string $login
|
||||||
* @param pass string, optional
|
* @param string $pass, optional
|
||||||
* @return boolean/int/err
|
* @return boolean/int/err
|
||||||
*/
|
*/
|
||||||
function authenticate($login, $pass='')
|
function authenticate($login, $pass='')
|
||||||
{
|
{
|
||||||
$cpass = md5($pass);
|
$cpass = md5($pass);
|
||||||
$id = $this->dbc->getOne("
|
$sql = "SELECT id FROM {$this->subjTable}
|
||||||
SELECT id FROM {$this->subjTable}
|
WHERE login='$login' AND pass='$cpass' AND type='U'";
|
||||||
WHERE login='$login' AND pass='$cpass' AND type='U'
|
$id = $this->dbc->getOne($sql);
|
||||||
");
|
if (PEAR::isError($id)) {
|
||||||
if(PEAR::isError($id)) return $id;
|
return $id;
|
||||||
return (is_null($id) ? FALSE : $id);
|
|
||||||
}
|
}
|
||||||
|
return (is_null($id) ? FALSE : $id);
|
||||||
|
} // fn authenticate
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set lastlogin or lastfail timestamp
|
* Set lastlogin or lastfail timestamp
|
||||||
*
|
*
|
||||||
* @param login string
|
* @param string $login
|
||||||
* @param failed boolean, true=> set lastfail, false=> set lastlogin
|
* @param boolean $failed, true=> set lastfail, false=> set lastlogin
|
||||||
* @return boolean/int/err
|
* @return boolean/int/err
|
||||||
*/
|
*/
|
||||||
function setTimeStamp($login, $failed=FALSE)
|
function setTimeStamp($login, $failed=FALSE)
|
||||||
{
|
{
|
||||||
$fld = ($failed ? 'lastfail' : 'lastlogin');
|
$fld = ($failed ? 'lastfail' : 'lastlogin');
|
||||||
$r = $this->dbc->query("
|
$sql = "UPDATE {$this->subjTable} SET $fld=now()
|
||||||
UPDATE {$this->subjTable} SET $fld=now()
|
WHERE login='$login'";
|
||||||
WHERE login='$login'
|
$r = $this->dbc->query($sql);
|
||||||
");
|
if (PEAR::isError($r)) {
|
||||||
if(PEAR::isError($r)) return $r;
|
return $r;
|
||||||
return TRUE;
|
|
||||||
}
|
}
|
||||||
|
return TRUE;
|
||||||
|
} // fn setTimeStamp
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Change user password
|
* Change user password
|
||||||
*
|
*
|
||||||
* @param login string
|
* @param string $login
|
||||||
* @param oldpass string, old password (optional for 'superuser mode')
|
* @param string $oldpass, old password (optional for 'superuser mode')
|
||||||
* @param pass string, optional
|
* @param string $pass, optional
|
||||||
* @param passenc boolean, optional, password already encrypted if true
|
* @param boolean $passenc, optional, password already encrypted if true
|
||||||
* @return boolean/err
|
* @return boolean/err
|
||||||
*/
|
*/
|
||||||
function passwd($login, $oldpass=null, $pass='', $passenc=FALSE)
|
function passwd($login, $oldpass=null, $pass='', $passenc=FALSE)
|
||||||
{
|
{
|
||||||
if(!$passenc) $cpass = md5($pass);
|
if (!$passenc) {
|
||||||
else $cpass = $pass;
|
$cpass = md5($pass);
|
||||||
|
} else {
|
||||||
|
$cpass = $pass;
|
||||||
|
}
|
||||||
if (!is_null($oldpass)) {
|
if (!is_null($oldpass)) {
|
||||||
$oldcpass = md5($oldpass);
|
$oldcpass = md5($oldpass);
|
||||||
$oldpCond = "AND pass='$oldcpass'";
|
$oldpCond = "AND pass='$oldcpass'";
|
||||||
}else{ $oldpCond = ''; }
|
} else {
|
||||||
$r = $this->dbc->query("
|
$oldpCond = '';
|
||||||
UPDATE {$this->subjTable} SET pass='$cpass'
|
|
||||||
WHERE login='$login' $oldpCond AND type='U'
|
|
||||||
");
|
|
||||||
if(PEAR::isError($r)) return $r;
|
|
||||||
return TRUE;
|
|
||||||
}
|
}
|
||||||
|
$sql = "UPDATE {$this->subjTable} SET pass='$cpass'
|
||||||
|
WHERE login='$login' $oldpCond AND type='U'";
|
||||||
|
$r = $this->dbc->query($sql);
|
||||||
|
if (PEAR::isError($r)) {
|
||||||
|
return $r;
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
} // fn passwd
|
||||||
|
|
||||||
|
|
||||||
/* --------------------------------------------------------------- groups */
|
/* --------------------------------------------------------------- groups */
|
||||||
|
|
||||||
|
@ -176,90 +206,131 @@ class Subjects extends ObjClasses{
|
||||||
* Add {login} and direct/indirect members to {gname} and to groups,
|
* Add {login} and direct/indirect members to {gname} and to groups,
|
||||||
* where {gname} is [in]direct member
|
* where {gname} is [in]direct member
|
||||||
*
|
*
|
||||||
* @param login string
|
* @param string $login
|
||||||
* @param gname string
|
* @param string $gname
|
||||||
* @return int/err
|
* @return int/err
|
||||||
*/
|
*/
|
||||||
function addSubj2Gr($login, $gname)
|
function addSubj2Gr($login, $gname)
|
||||||
{
|
{
|
||||||
$uid = $this->getSubjId($login); if(PEAR::isError($uid)) return $uid;
|
$uid = $this->getSubjId($login);
|
||||||
$gid = $this->getSubjId($gname); if(PEAR::isError($gid)) return $gid;
|
if (PEAR::isError($uid)) {
|
||||||
$isgr = $this->isGroup($gid); if(PEAR::isError($isgr)) return $isgr;
|
return $uid;
|
||||||
if(!$isgr) return PEAR::raiseError(
|
}
|
||||||
"Subjects::addSubj2Gr: Not a group ($gname)", ALIBERR_NOTGR
|
$gid = $this->getSubjId($gname);
|
||||||
);
|
if (PEAR::isError($gid)) {
|
||||||
|
return $gid;
|
||||||
|
}
|
||||||
|
$isgr = $this->isGroup($gid);
|
||||||
|
if (PEAR::isError($isgr)) {
|
||||||
|
return $isgr;
|
||||||
|
}
|
||||||
|
if (!$isgr) {
|
||||||
|
return PEAR::raiseError("Subjects::addSubj2Gr: Not a group ($gname)", ALIBERR_NOTGR);
|
||||||
|
}
|
||||||
// add subject and all [in]direct members to group $gname:
|
// add subject and all [in]direct members to group $gname:
|
||||||
$mid = $this->_plainAddSubj2Gr($uid, $gid);
|
$mid = $this->_plainAddSubj2Gr($uid, $gid);
|
||||||
if(PEAR::isError($mid)) return $mid;
|
if (PEAR::isError($mid)) {
|
||||||
|
return $mid;
|
||||||
|
}
|
||||||
// add it to all groups where $gname is [in]direct member:
|
// add it to all groups where $gname is [in]direct member:
|
||||||
$marr = $this->_listRMemb($gid); if(PEAR::isError($marr)) return $marr;
|
$marr = $this->_listRMemb($gid);
|
||||||
|
if (PEAR::isError($marr)) {
|
||||||
|
return $marr;
|
||||||
|
}
|
||||||
foreach($marr as $k=>$v){
|
foreach($marr as $k=>$v){
|
||||||
$r = $this->_plainAddSubj2Gr(
|
$r = $this->_plainAddSubj2Gr(
|
||||||
$uid, $v['gid'], intval($v['level'])+1, $v['id']);
|
$uid, $v['gid'], intval($v['level'])+1, $v['id']);
|
||||||
if(PEAR::isError($r)) return $r;
|
if (PEAR::isError($r)) {
|
||||||
|
return $r;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return $mid;
|
return $mid;
|
||||||
}
|
} // fn addSubj2Gr
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Remove subject from group
|
* Remove subject from group
|
||||||
*
|
*
|
||||||
* @param login string
|
* @param string $login
|
||||||
* @param gname string
|
* @param string $gname
|
||||||
* @return boolean/err
|
* @return boolean/err
|
||||||
*/
|
*/
|
||||||
function removeSubjFromGr($login, $gname)
|
function removeSubjFromGr($login, $gname)
|
||||||
{
|
{
|
||||||
$uid = $this->getSubjId($login); if(PEAR::isError($uid)) return $uid;
|
$uid = $this->getSubjId($login);
|
||||||
$gid = $this->getSubjId($gname); if(PEAR::isError($gid)) return $gid;
|
if (PEAR::isError($uid)) {
|
||||||
$mid = $this->dbc->getOne($q = "SELECT id FROM {$this->smembTable}
|
return $uid;
|
||||||
WHERE uid='$uid' AND gid='$gid' AND mid is null");
|
|
||||||
if(is_null($mid)) return FALSE;
|
|
||||||
if(PEAR::isError($mid)) return $mid;
|
|
||||||
// remove it:
|
|
||||||
$r = $this->_removeMemb($mid); if(PEAR::isError($r)) return $r;
|
|
||||||
// and rebuild indirect memberships:
|
|
||||||
$r = $this->_rebuildRels(); if(PEAR::isError($r)) return $r;
|
|
||||||
return TRUE;
|
|
||||||
}
|
}
|
||||||
|
$gid = $this->getSubjId($gname);
|
||||||
|
if (PEAR::isError($gid)) {
|
||||||
|
return $gid;
|
||||||
|
}
|
||||||
|
$sql = "SELECT id FROM {$this->smembTable}
|
||||||
|
WHERE uid='$uid' AND gid='$gid' AND mid is null";
|
||||||
|
$mid = $this->dbc->getOne($sql);
|
||||||
|
if (is_null($mid)) {
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
if (PEAR::isError($mid)) {
|
||||||
|
return $mid;
|
||||||
|
}
|
||||||
|
// remove it:
|
||||||
|
$r = $this->_removeMemb($mid);
|
||||||
|
if (PEAR::isError($r)) {
|
||||||
|
return $r;
|
||||||
|
}
|
||||||
|
// and rebuild indirect memberships:
|
||||||
|
$r = $this->_rebuildRels();
|
||||||
|
if (PEAR::isError($r)) {
|
||||||
|
return $r;
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
} // fn removeSubjFromGr
|
||||||
|
|
||||||
|
|
||||||
/* --------------------------------------------------------- info methods */
|
/* --------------------------------------------------------- info methods */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get subject id from login
|
* Get subject id from login
|
||||||
*
|
*
|
||||||
* @param login string
|
* @param string $login
|
||||||
* @return int/err
|
* @return int/err
|
||||||
*/
|
*/
|
||||||
function getSubjId($login)
|
function getSubjId($login)
|
||||||
{
|
{
|
||||||
return $this->dbc->getOne("SELECT id FROM {$this->subjTable}
|
$sql = "SELECT id FROM {$this->subjTable}
|
||||||
WHERE login='$login'");
|
WHERE login='$login'";
|
||||||
}
|
return $this->dbc->getOne($sql);
|
||||||
|
} // fn getSubjId
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get subject name (login) from id
|
* Get subject name (login) from id
|
||||||
*
|
*
|
||||||
* @param id int
|
* @param int $id
|
||||||
* @param fld string
|
* @param string $fld
|
||||||
* @return string/err
|
* @return string/err
|
||||||
*/
|
*/
|
||||||
function getSubjName($id, $fld='login')
|
function getSubjName($id, $fld='login')
|
||||||
{
|
{
|
||||||
return $this->dbc->getOne("SELECT $fld FROM {$this->subjTable}
|
$sql = "SELECT $fld FROM {$this->subjTable}
|
||||||
WHERE id='$id'");
|
WHERE id='$id'";
|
||||||
}
|
return $this->dbc->getOne($sql);
|
||||||
|
} // fn getSubjName
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get all subjects
|
* Get all subjects
|
||||||
*
|
*
|
||||||
* @param flds string, optional
|
* @param string $flds, optional
|
||||||
* @return array/err
|
* @return array/err
|
||||||
*/
|
*/
|
||||||
function getSubjects($flds='id, login')
|
function getSubjects($flds='id, login')
|
||||||
{
|
{
|
||||||
return $this->dbc->getAll("SELECT $flds FROM {$this->subjTable}");
|
$sql = "SELECT $flds FROM {$this->subjTable}";
|
||||||
}
|
return $this->dbc->getAll($sql);
|
||||||
|
} // fn getSubjects
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get subjects with count of direct members
|
* Get subjects with count of direct members
|
||||||
|
@ -268,162 +339,199 @@ class Subjects extends ObjClasses{
|
||||||
*/
|
*/
|
||||||
function getSubjectsWCnt()
|
function getSubjectsWCnt()
|
||||||
{
|
{
|
||||||
return $this->dbc->getAll("
|
$sql = "
|
||||||
SELECT count(m.uid)as cnt, s.id, s.login, s.type
|
SELECT count(m.uid)as cnt, s.id, s.login, s.type
|
||||||
FROM {$this->subjTable} s
|
FROM {$this->subjTable} s
|
||||||
LEFT JOIN {$this->smembTable} m ON m.gid=s.id
|
LEFT JOIN {$this->smembTable} m ON m.gid=s.id
|
||||||
WHERE m.mid is null
|
WHERE m.mid is null
|
||||||
GROUP BY s.id, s.login, s.type
|
GROUP BY s.id, s.login, s.type
|
||||||
ORDER BY s.id"
|
ORDER BY s.id";
|
||||||
);
|
return $this->dbc->getAll($sql);
|
||||||
}
|
} // fn getSubjectsWCnt
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return true if subject is a group
|
* Return true if subject is a group
|
||||||
*
|
*
|
||||||
* @param gid int
|
* @param int $gid
|
||||||
* @return boolean/err
|
* @return boolean/err
|
||||||
*/
|
*/
|
||||||
function isGroup($gid)
|
function isGroup($gid)
|
||||||
{
|
{
|
||||||
$r = $this->dbc->getOne("SELECT type FROM {$this->subjTable}
|
$sql = "SELECT type FROM {$this->subjTable}
|
||||||
WHERE id='$gid'");
|
WHERE id='$gid'";
|
||||||
if(PEAR::isError($r)) return $r;
|
$r = $this->dbc->getOne($sql);
|
||||||
return ($r === 'G' );
|
if (PEAR::isError($r)) {
|
||||||
|
return $r;
|
||||||
}
|
}
|
||||||
|
return ($r === 'G');
|
||||||
|
} // fn isGroup
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* List direct members of group
|
* List direct members of group
|
||||||
*
|
*
|
||||||
* @param gid int
|
* @param int $gid
|
||||||
* @return array/err
|
* @return array/err
|
||||||
*/
|
*/
|
||||||
function listGroup($gid)
|
function listGroup($gid)
|
||||||
{
|
{
|
||||||
return $this->dbc->getAll("SELECT s.id, s.login, s.type
|
$sql = "SELECT s.id, s.login, s.type
|
||||||
FROM {$this->smembTable} m, {$this->subjTable} s
|
FROM {$this->smembTable} m, {$this->subjTable} s
|
||||||
WHERE m.uid=s.id AND m.mid is null AND m.gid='$gid'");
|
WHERE m.uid=s.id AND m.mid is null AND m.gid='$gid'";
|
||||||
}
|
return $this->dbc->getAll($sql);
|
||||||
|
} // fn listGroup
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return true if uid is [id]direct member of gid
|
* Return true if uid is [id]direct member of gid
|
||||||
*
|
*
|
||||||
* @param uid int, local user id
|
* @param int $uid, local user id
|
||||||
* @param gid int, local group id
|
* @param int $gid, local group id
|
||||||
* @return boolean
|
* @return boolean
|
||||||
*/
|
*/
|
||||||
function isMemberOf($uid, $gid)
|
function isMemberOf($uid, $gid)
|
||||||
{
|
{
|
||||||
$res = $this->dbc->getOne("
|
$sql = "
|
||||||
SELECT count(*)as cnt
|
SELECT count(*)as cnt
|
||||||
FROM {$this->smembTable}
|
FROM {$this->smembTable}
|
||||||
WHERE uid='$uid' AND gid='$gid'
|
WHERE uid='$uid' AND gid='$gid'
|
||||||
");
|
";
|
||||||
if(PEAR::isError($res)) return $res;
|
$res = $this->dbc->getOne($sql);
|
||||||
return (intval($res) > 0);
|
if (PEAR::isError($res)) {
|
||||||
|
return $res;
|
||||||
}
|
}
|
||||||
|
return (intval($res) > 0);
|
||||||
|
} // fn isMemberOf
|
||||||
|
|
||||||
|
|
||||||
/* ==================================================== "private" methods */
|
/* ==================================================== "private" methods */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create membership record
|
* Create membership record
|
||||||
*
|
*
|
||||||
* @param uid int
|
* @param int $uid
|
||||||
* @param gid int
|
* @param int $gid
|
||||||
* @param level int, optional
|
* @param int $level, optional
|
||||||
* @param mid int, optional
|
* @param int $mid, optional
|
||||||
* @return int/err
|
* @return int/err
|
||||||
*/
|
*/
|
||||||
function _addMemb($uid, $gid, $level=0, $mid='null')
|
function _addMemb($uid, $gid, $level=0, $mid='null')
|
||||||
{
|
{
|
||||||
if($uid == $gid) return PEAR::raiseError(
|
if($uid == $gid) {
|
||||||
"Subjects::_addMemb: uid==gid ($uid)", ALIBERR_BADSMEMB
|
return PEAR::raiseError("Subjects::_addMemb: uid==gid ($uid)", ALIBERR_BADSMEMB);
|
||||||
);
|
}
|
||||||
$a = $this->dbc->getAll("SELECT id, level, mid FROM {$this->smembTable}
|
$sql = "SELECT id, level, mid FROM {$this->smembTable}
|
||||||
WHERE uid='$uid' AND gid='$gid' ORDER BY level ASC");
|
WHERE uid='$uid' AND gid='$gid' ORDER BY level ASC";
|
||||||
if(PEAR::isError($a)) return $a;
|
$a = $this->dbc->getAll($sql);
|
||||||
|
if (PEAR::isError($a)) {
|
||||||
|
return $a;
|
||||||
|
}
|
||||||
if (count($a) > 0) {
|
if (count($a) > 0) {
|
||||||
$a0 = $a[0];
|
$a0 = $a[0];
|
||||||
$id = $a0['id'];
|
$id = $a0['id'];
|
||||||
if ($level < intval($a0['level'])){
|
if ($level < intval($a0['level'])){
|
||||||
$r = $this->dbc->query("UPDATE {$this->smembTable}
|
$sql2 = "UPDATE {$this->smembTable}
|
||||||
SET level='$level', mid=$mid WHERE id='{$a0['id']}'");
|
SET level='$level', mid=$mid WHERE id='{$a0['id']}'";
|
||||||
if(PEAR::isError($r)) return $r;
|
$r = $this->dbc->query($sql2);
|
||||||
|
if (PEAR::isError($r)) {
|
||||||
|
return $r;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
$id = $this->dbc->nextId("{$this->smembTable}_id_seq");
|
$id = $this->dbc->nextId("{$this->smembTable}_id_seq");
|
||||||
if(PEAR::isError($id)) return $id;
|
if (PEAR::isError($id)) {
|
||||||
$r = $this->dbc->query("
|
|
||||||
INSERT INTO {$this->smembTable} (id, uid, gid, level, mid)
|
|
||||||
VALUES ($id, $uid, $gid, $level, $mid)
|
|
||||||
");
|
|
||||||
if(PEAR::isError($r)) return $r;
|
|
||||||
}
|
|
||||||
return $id;
|
return $id;
|
||||||
}
|
}
|
||||||
|
$sql3 = "
|
||||||
|
INSERT INTO {$this->smembTable} (id, uid, gid, level, mid)
|
||||||
|
VALUES ($id, $uid, $gid, $level, $mid)
|
||||||
|
";
|
||||||
|
$r = $this->dbc->query($sql3);
|
||||||
|
if (PEAR::isError($r)) {
|
||||||
|
return $r;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $id;
|
||||||
|
} // fn _addMemb
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Remove membership record
|
* Remove membership record
|
||||||
*
|
*
|
||||||
* @param mid int
|
* @param int $mid
|
||||||
* @return null/err
|
* @return null/err
|
||||||
*/
|
*/
|
||||||
function _removeMemb($mid)
|
function _removeMemb($mid)
|
||||||
{
|
{
|
||||||
return $this->dbc->query("DELETE FROM {$this->smembTable}
|
$sql = "DELETE FROM {$this->smembTable}
|
||||||
WHERE id='$mid'");
|
WHERE id='$mid'";
|
||||||
}
|
return $this->dbc->query($sql);
|
||||||
|
} // fn _removeMemb
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* List [in]direct members of group
|
* List [in]direct members of group
|
||||||
*
|
*
|
||||||
* @param gid int
|
* @param int $gid
|
||||||
* @param uid int, optional
|
* @param int $uid, optional
|
||||||
* @return array/err
|
* @return array/err
|
||||||
*/
|
*/
|
||||||
function _listMemb($gid, $uid=NULL)
|
function _listMemb($gid, $uid=NULL)
|
||||||
{
|
{
|
||||||
return $this->dbc->getAll("
|
$sql = "
|
||||||
SELECT id, uid, level FROM {$this->smembTable}
|
SELECT id, uid, level FROM {$this->smembTable}
|
||||||
WHERE gid='$gid'".(is_null($uid) ? '' : " AND uid='$uid'"));
|
WHERE gid='$gid'".(is_null($uid) ? '' : " AND uid='$uid'");
|
||||||
}
|
return $this->dbc->getAll($sql);
|
||||||
|
} // fn _listMemb
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* List groups where uid is [in]direct member
|
* List groups where uid is [in]direct member
|
||||||
*
|
*
|
||||||
* @param gid int
|
* @param int $gid
|
||||||
* @param uid int, optional
|
* @param int $uid, optional
|
||||||
* @return array/err
|
* @return array/err
|
||||||
*/
|
*/
|
||||||
function _listRMemb($uid, $gid=NULL)
|
function _listRMemb($uid, $gid=NULL)
|
||||||
{
|
{
|
||||||
return $this->dbc->getAll("
|
$sql = "
|
||||||
SELECT id, gid, level FROM {$this->smembTable}
|
SELECT id, gid, level FROM {$this->smembTable}
|
||||||
WHERE uid='$uid'".(is_null($gid) ? '' : " AND gid='$gid'"));
|
WHERE uid='$uid'".(is_null($gid) ? '' : " AND gid='$gid'");
|
||||||
}
|
return $this->dbc->getAll($sql);
|
||||||
|
} // fn listRMemb
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add uid and its [in]direct members to gid
|
* Add uid and its [in]direct members to gid
|
||||||
*
|
*
|
||||||
* @param uid int
|
* @param int $uid
|
||||||
* @param gid int
|
* @param int $gid
|
||||||
* @param level int
|
* @param int $level
|
||||||
* @param rmid int //
|
* @param int $rmid //
|
||||||
* @return int/err
|
* @return int/err
|
||||||
*/
|
*/
|
||||||
function _plainAddSubj2Gr($uid, $gid, $level=0, $rmid='null')
|
function _plainAddSubj2Gr($uid, $gid, $level=0, $rmid='null')
|
||||||
{
|
{
|
||||||
$mid = $this->_addMemb($uid, $gid, $level, $rmid);
|
$mid = $this->_addMemb($uid, $gid, $level, $rmid);
|
||||||
if(PEAR::isError($mid)) return $mid;
|
if (PEAR::isError($mid)) {
|
||||||
$marr = $this->_listMemb($uid); if(PEAR::isError($marr)) return $marr;
|
return $mid;
|
||||||
|
}
|
||||||
|
$marr = $this->_listMemb($uid);
|
||||||
|
if (PEAR::isError($marr)) {
|
||||||
|
return $marr;
|
||||||
|
}
|
||||||
foreach ($marr as $k => $v) {
|
foreach ($marr as $k => $v) {
|
||||||
$r = $this->_addMemb(
|
$r = $this->_addMemb(
|
||||||
$v['uid'], $gid, intval($v['level'])+$level+1, $mid
|
$v['uid'], $gid, intval($v['level'])+$level+1, $mid
|
||||||
);
|
);
|
||||||
if(PEAR::isError($r)) return $r;
|
if (PEAR::isError($r)) {
|
||||||
|
return $r;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return $mid;
|
return $mid;
|
||||||
}
|
} // fn _plainAddSubj2Gr
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Rebuild indirect membership records<br>
|
* Rebuild indirect membership records<br>
|
||||||
|
@ -435,26 +543,36 @@ class Subjects extends ObjClasses{
|
||||||
{
|
{
|
||||||
$this->dbc->query("BEGIN");
|
$this->dbc->query("BEGIN");
|
||||||
$r = $this->dbc->query("LOCK TABLE {$this->smembTable}");
|
$r = $this->dbc->query("LOCK TABLE {$this->smembTable}");
|
||||||
if(PEAR::isError($r)) return $r;
|
if (PEAR::isError($r)) {
|
||||||
|
return $r;
|
||||||
|
}
|
||||||
$r = $this->dbc->query("DELETE FROM {$this->smembTable}
|
$r = $this->dbc->query("DELETE FROM {$this->smembTable}
|
||||||
WHERE mid is not null");
|
WHERE mid is not null");
|
||||||
if(PEAR::isError($r)) return $r;
|
if (PEAR::isError($r)) {
|
||||||
|
return $r;
|
||||||
|
}
|
||||||
$arr = $this->dbc->getAll("SELECT uid, gid FROM {$this->smembTable}");
|
$arr = $this->dbc->getAll("SELECT uid, gid FROM {$this->smembTable}");
|
||||||
// WHERE mid is null
|
// WHERE mid is null
|
||||||
if(PEAR::isError($arr)) return $arr;
|
if (PEAR::isError($arr)) {
|
||||||
|
return $arr;
|
||||||
|
}
|
||||||
foreach ($arr as $it) {
|
foreach ($arr as $it) {
|
||||||
$marr = $this->_listRMemb($it['gid']);
|
$marr = $this->_listRMemb($it['gid']);
|
||||||
if(PEAR::isError($marr)) return $marr;
|
if (PEAR::isError($marr)) {
|
||||||
|
return $marr;
|
||||||
|
}
|
||||||
foreach ($marr as $k => $v) {
|
foreach ($marr as $k => $v) {
|
||||||
$r = $this->_plainAddSubj2Gr(
|
$r = $this->_plainAddSubj2Gr(
|
||||||
$it['uid'], $v['gid'], intval($v['level'])+1, $v['id']
|
$it['uid'], $v['gid'], intval($v['level'])+1, $v['id']
|
||||||
);
|
);
|
||||||
if(PEAR::isError($r)) return $r;
|
if (PEAR::isError($r)) {
|
||||||
|
return $r;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$r = $this->dbc->query("COMMIT"); if(PEAR::isError($r)) return $r;
|
$r = $this->dbc->query("COMMIT"); if(PEAR::isError($r)) return $r;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
} // fn _rebuildRels
|
||||||
|
|
||||||
|
|
||||||
/* =============================================== test and debug methods */
|
/* =============================================== test and debug methods */
|
||||||
|
@ -462,8 +580,8 @@ class Subjects extends ObjClasses{
|
||||||
/**
|
/**
|
||||||
* Dump subjects for debug
|
* Dump subjects for debug
|
||||||
*
|
*
|
||||||
* @param indstr string // indentation string
|
* @param string $indstr // indentation string
|
||||||
* @param ind string // aktual indentation
|
* @param string $ind // aktual indentation
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
function dumpSubjects($indstr=' ', $ind='')
|
function dumpSubjects($indstr=' ', $ind='')
|
||||||
|
@ -473,7 +591,8 @@ class Subjects extends ObjClasses{
|
||||||
$this->getSubjectsWCnt()
|
$this->getSubjectsWCnt()
|
||||||
))."\n";
|
))."\n";
|
||||||
return $r;
|
return $r;
|
||||||
}
|
} // fn dumpSubjects
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Delete all subjects and membership records
|
* Delete all subjects and membership records
|
||||||
|
@ -485,7 +604,8 @@ class Subjects extends ObjClasses{
|
||||||
$this->dbc->query("DELETE FROM {$this->subjTable}");
|
$this->dbc->query("DELETE FROM {$this->subjTable}");
|
||||||
$this->dbc->query("DELETE FROM {$this->smembTable}");
|
$this->dbc->query("DELETE FROM {$this->smembTable}");
|
||||||
parent::deleteData();
|
parent::deleteData();
|
||||||
}
|
} // fn deleteData
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Insert test data
|
* Insert test data
|
||||||
|
@ -513,7 +633,8 @@ class Subjects extends ObjClasses{
|
||||||
$this->addSubj2Gr('gr4', 'gr3');
|
$this->addSubj2Gr('gr4', 'gr3');
|
||||||
$this->addSubj2Gr('gr3', 'gr2');
|
$this->addSubj2Gr('gr3', 'gr2');
|
||||||
return $this->tdata['subjects'] = $o;
|
return $this->tdata['subjects'] = $o;
|
||||||
}
|
} // fn testData
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Make basic test
|
* Make basic test
|
||||||
|
@ -521,7 +642,9 @@ class Subjects extends ObjClasses{
|
||||||
*/
|
*/
|
||||||
function test()
|
function test()
|
||||||
{
|
{
|
||||||
if(PEAR::isError($p = parent::test())) return $p;
|
if (PEAR::isError($p = parent::test())) {
|
||||||
|
return $p;
|
||||||
|
}
|
||||||
$this->deleteData();
|
$this->deleteData();
|
||||||
$this->testData();
|
$this->testData();
|
||||||
$this->test_correct = "root(0), test1(0), test2(0), test3(0),".
|
$this->test_correct = "root(0), test1(0), test2(0), test3(0),".
|
||||||
|
@ -535,14 +658,17 @@ class Subjects extends ObjClasses{
|
||||||
" gr1(0), gr2(1), gr3(1), gr4(1)\n";
|
" gr1(0), gr2(1), gr3(1), gr4(1)\n";
|
||||||
$this->test_dump .= $this->dumpSubjects();
|
$this->test_dump .= $this->dumpSubjects();
|
||||||
$this->deleteData();
|
$this->deleteData();
|
||||||
if($this->test_dump == $this->test_correct)
|
if ($this->test_dump == $this->test_correct) {
|
||||||
{
|
$this->test_log.="subj: OK\n";
|
||||||
$this->test_log.="subj: OK\n"; return TRUE;
|
return TRUE;
|
||||||
}else return PEAR::raiseError(
|
} else {
|
||||||
|
return PEAR::raiseError(
|
||||||
'Subjects::test:', 1, PEAR_ERROR_DIE, '%s'.
|
'Subjects::test:', 1, PEAR_ERROR_DIE, '%s'.
|
||||||
"<pre>\ncorrect:\n{$this->test_correct}\n".
|
"<pre>\ncorrect:\n{$this->test_correct}\n".
|
||||||
"dump:\n{$this->test_dump}\n</pre>\n");
|
"dump:\n{$this->test_dump}\n</pre>\n");
|
||||||
}
|
}
|
||||||
|
} // fn test
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create tables + initialize
|
* Create tables + initialize
|
||||||
|
@ -576,8 +702,8 @@ class Subjects extends ObjClasses{
|
||||||
$this->dbc->query("CREATE UNIQUE INDEX {$this->smembTable}_id_idx
|
$this->dbc->query("CREATE UNIQUE INDEX {$this->smembTable}_id_idx
|
||||||
ON {$this->smembTable} (id)");
|
ON {$this->smembTable} (id)");
|
||||||
$this->dbc->createSequence("{$this->smembTable}_id_seq");
|
$this->dbc->createSequence("{$this->smembTable}_id_seq");
|
||||||
|
} // fn install
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Drop tables etc.
|
* Drop tables etc.
|
||||||
|
@ -591,6 +717,7 @@ class Subjects extends ObjClasses{
|
||||||
$this->dbc->query("DROP TABLE {$this->smembTable}");
|
$this->dbc->query("DROP TABLE {$this->smembTable}");
|
||||||
$this->dbc->dropSequence("{$this->smembTable}_id_seq");
|
$this->dbc->dropSequence("{$this->smembTable}_id_seq");
|
||||||
parent::uninstall();
|
parent::uninstall();
|
||||||
}
|
} // fn uninstall
|
||||||
}
|
|
||||||
|
} // class Subjects
|
||||||
?>
|
?>
|
Loading…
Add table
Add a link
Reference in a new issue