convert tabs to spaces

git-svn-id: https://semanticscuttle.svn.sourceforge.net/svnroot/semanticscuttle/trunk@407 b3834d28-1941-0410-a4f8-b48e95affb8f
This commit is contained in:
cweiske 2009-10-24 09:12:10 +00:00
parent 5d11ae2fd5
commit 9f53c3325c
13 changed files with 2063 additions and 2063 deletions

View file

@ -70,7 +70,7 @@ class SemanticScuttle_Service_Bookmark extends SemanticScuttle_DbService
$b2tservice = SemanticScuttle_Service_Factory :: get('Bookmark2Tag'); $b2tservice = SemanticScuttle_Service_Factory :: get('Bookmark2Tag');
$row['tags'] = $b2tservice->getTagsForBookmark($bid); $row['tags'] = $b2tservice->getTagsForBookmark($bid);
} }
$output = $row; $output = $row;
} else { } else {
$output = false; $output = false;
} }
@ -109,13 +109,13 @@ class SemanticScuttle_Service_Bookmark extends SemanticScuttle_DbService
break; break;
case 'shared': case 'shared':
$sql.= ' AND bStatus = 1'; $sql.= ' AND bStatus = 1';
break; break;
case 'public': case 'public':
default: default:
$sql.= ' AND bStatus = 0'; $sql.= ' AND bStatus = 0';
break; break;
} }
if (!($dbresult = & $this->db->sql_query($sql))) { if (!($dbresult = & $this->db->sql_query($sql))) {
message_die(GENERAL_ERROR, 'Could not get vars', '', __LINE__, __FILE__, $sql, $this->db); message_die(GENERAL_ERROR, 'Could not get vars', '', __LINE__, __FILE__, $sql, $this->db);
} }
@ -178,7 +178,7 @@ class SemanticScuttle_Service_Bookmark extends SemanticScuttle_DbService
message_die(GENERAL_ERROR, 'Could not get vars', '', __LINE__, __FILE__, $sql, $this->db); message_die(GENERAL_ERROR, 'Could not get vars', '', __LINE__, __FILE__, $sql, $this->db);
} }
if($this->db->sql_fetchfield(0, 0) > 0) { if($this->db->sql_fetchfield(0, 0) > 0) {
$output = true; $output = true;
} else { } else {
$output = false; $output = false;
} }
@ -332,7 +332,7 @@ class SemanticScuttle_Service_Bookmark extends SemanticScuttle_DbService
$categories, $date = NULL, $fromApi = false $categories, $date = NULL, $fromApi = false
) { ) {
if (!is_numeric($bId)) { if (!is_numeric($bId)) {
return false; return false;
} }
// Get the client's IP address and the date; note that the date is in GMT. // Get the client's IP address and the date; note that the date is in GMT.
@ -345,10 +345,10 @@ class SemanticScuttle_Service_Bookmark extends SemanticScuttle_DbService
$ip = getenv('HTTP_X_FORWARDED_FOR'); $ip = getenv('HTTP_X_FORWARDED_FOR');
$moddatetime = gmdate('Y-m-d H:i:s', time()); $moddatetime = gmdate('Y-m-d H:i:s', time());
$address = $this->normalize($address); $address = $this->normalize($address);
//check if a new address ($address) doesn't already exist for another bookmark from the same user //check if a new address ($address) doesn't already exist for another bookmark from the same user
$bookmark = $this->getBookmark($bId); $bookmark = $this->getBookmark($bId);
if($bookmark['bAddress'] != $address && $this->bookmarkExists($address, $bookmark['uId'])) { if($bookmark['bAddress'] != $address && $this->bookmarkExists($address, $bookmark['uId'])) {
message_die(GENERAL_ERROR, 'Could not update bookmark (URL already existing = '.$address.')', '', __LINE__, __FILE__); message_die(GENERAL_ERROR, 'Could not update bookmark (URL already existing = '.$address.')', '', __LINE__, __FILE__);
@ -415,7 +415,7 @@ class SemanticScuttle_Service_Bookmark extends SemanticScuttle_DbService
* @param string $terms Search terms separated by spaces * @param string $terms Search terms separated by spaces
* @param string $sortOrder One of the following values: * @param string $sortOrder One of the following values:
* "date_asc", "date_desc", * "date_asc", "date_desc",
* "title_desc", "title_asc", * "title_desc", "title_asc",
* "url_desc", "url_asc" * "url_desc", "url_asc"
* @param boolean $watched True if only watched bookmarks * @param boolean $watched True if only watched bookmarks
* shall be returned (FIXME) * shall be returned (FIXME)
@ -540,7 +540,7 @@ class SemanticScuttle_Service_Bookmark extends SemanticScuttle_DbService
if ($terms) { if ($terms) {
// Multiple search terms okay // Multiple search terms okay
$aTerms = explode(' ', $terms); $aTerms = explode(' ', $terms);
$aTerms = array_map('trim', $aTerms); $aTerms = array_map('trim', $aTerms);
// Search terms in tags as well when none given // Search terms in tags as well when none given
if (!count($tags)) { if (!count($tags)) {
@ -555,7 +555,7 @@ class SemanticScuttle_Service_Bookmark extends SemanticScuttle_DbService
$query_4 .= ' AND (B.bTitle LIKE "%'. $this->db->sql_escape($aTerms[$i]) .'%"'; $query_4 .= ' AND (B.bTitle LIKE "%'. $this->db->sql_escape($aTerms[$i]) .'%"';
$query_4 .= ' OR B.bDescription LIKE "%'. $this->db->sql_escape($aTerms[$i]) .'%"'; $query_4 .= ' OR B.bDescription LIKE "%'. $this->db->sql_escape($aTerms[$i]) .'%"';
$query_4 .= ' OR B.bPrivateNote LIKE "'. $this->db->sql_escape($aTerms[$i]) .'%"'; //warning : search in private notes of everybody but private notes won't appear if not allowed. $query_4 .= ' OR B.bPrivateNote LIKE "'. $this->db->sql_escape($aTerms[$i]) .'%"'; //warning : search in private notes of everybody but private notes won't appear if not allowed.
$query_4 .= ' OR U.username = "'. $this->db->sql_escape($aTerms[$i]) .'"'; //exact match for username $query_4 .= ' OR U.username = "'. $this->db->sql_escape($aTerms[$i]) .'"'; //exact match for username
if ($dotags) { if ($dotags) {
$query_4 .= ' OR T.tag LIKE "'. $this->db->sql_escape($aTerms[$i]) .'%"'; $query_4 .= ' OR T.tag LIKE "'. $this->db->sql_escape($aTerms[$i]) .'%"';
} }
@ -622,8 +622,8 @@ class SemanticScuttle_Service_Bookmark extends SemanticScuttle_DbService
message_die(GENERAL_ERROR, 'Could not delete bookmarks', '', __LINE__, __FILE__, $query, $this->db); message_die(GENERAL_ERROR, 'Could not delete bookmarks', '', __LINE__, __FILE__, $query, $this->db);
return false; return false;
} }
$query = 'DELETE FROM '. $GLOBALS['tableprefix'] .'bookmarks2tags WHERE bId = '. intval($bookmarkid); $query = 'DELETE FROM '. $GLOBALS['tableprefix'] .'bookmarks2tags WHERE bId = '. intval($bookmarkid);
$this->db->sql_transaction('begin'); $this->db->sql_transaction('begin');
@ -679,7 +679,7 @@ class SemanticScuttle_Service_Bookmark extends SemanticScuttle_DbService
if (!($dbresult = & $this->db->sql_query($sql))) { if (!($dbresult = & $this->db->sql_query($sql))) {
message_die(GENERAL_ERROR, 'Could not get vars', '', __LINE__, __FILE__, $sql, $this->db); message_die(GENERAL_ERROR, 'Could not get vars', '', __LINE__, __FILE__, $sql, $this->db);
} }
$output = $this->db->sql_fetchfield(0, 0) - 1; $output = $this->db->sql_fetchfield(0, 0) - 1;
$this->db->sql_freeresult($dbresult); $this->db->sql_freeresult($dbresult);
return $output; return $output;

View file

@ -8,475 +8,475 @@ class SemanticScuttle_Service_Bookmark2Tag extends SemanticScuttle_DbService
* *
* @return SemanticScuttle_Service * @return SemanticScuttle_Service
*/ */
public static function getInstance($db) public static function getInstance($db)
{ {
static $instance; static $instance;
if (!isset($instance)) { if (!isset($instance)) {
$instance = new self($db); $instance = new self($db);
} }
return $instance; return $instance;
} }
public function __construct($db) public function __construct($db)
{ {
$this->db = $db; $this->db = $db;
$this->tablename = $GLOBALS['tableprefix'] .'bookmarks2tags'; $this->tablename = $GLOBALS['tableprefix'] .'bookmarks2tags';
} }
function isNotSystemTag($var) { function isNotSystemTag($var) {
if (utf8_substr($var, 0, 7) == 'system:') if (utf8_substr($var, 0, 7) == 'system:')
return false; return false;
else else
return true; return true;
} }
function attachTags($bookmarkid, $tags, $fromApi = false, $extension = NULL, $replace = true, $fromImport = false) { function attachTags($bookmarkid, $tags, $fromApi = false, $extension = NULL, $replace = true, $fromImport = false) {
// Make sure that categories is an array of trimmed strings, and that if the categories are // Make sure that categories is an array of trimmed strings, and that if the categories are
// coming in from an API call to add a bookmark, that underscores are converted into strings. // coming in from an API call to add a bookmark, that underscores are converted into strings.
if (!is_array($tags)) {
$tags = trim($tags);
if ($tags != '') {
if (substr($tags, -1) == ',') {
$tags = substr($tags, 0, -1);
}
if ($fromApi) {
$tags = explode(' ', $tags);
} else {
$tags = explode(',', $tags);
}
} else {
$tags = null;
}
}
$tagservice =SemanticScuttle_Service_Factory::get('Tag'); if (!is_array($tags)) {
$tags = $tagservice->normalize($tags); $tags = trim($tags);
if ($tags != '') {
if (substr($tags, -1) == ',') {
$tags = substr($tags, 0, -1);
}
if ($fromApi) {
$tags = explode(' ', $tags);
} else {
$tags = explode(',', $tags);
}
} else {
$tags = null;
}
}
$tagservice =SemanticScuttle_Service_Factory::get('Tag');
$tags = $tagservice->normalize($tags);
$tags_count = is_array($tags)?count($tags):0; $tags_count = is_array($tags)?count($tags):0;
for ($i = 0; $i < $tags_count; $i++) {
$tags[$i] = trim(strtolower($tags[$i]));
if ($fromApi) {
include_once 'SemanticScuttle/functions.php';
$tags[$i] = convertTag($tags[$i], 'in');
}
}
if ($tags_count > 0) { for ($i = 0; $i < $tags_count; $i++) {
// Remove system tags $tags[$i] = trim(strtolower($tags[$i]));
$tags = array_filter($tags, array($this, "isNotSystemTag")); if ($fromApi) {
include_once 'SemanticScuttle/functions.php';
$tags[$i] = convertTag($tags[$i], 'in');
}
}
// Eliminate any duplicate categories if ($tags_count > 0) {
$temp = array_unique($tags); // Remove system tags
$tags = array_values($temp); $tags = array_filter($tags, array($this, "isNotSystemTag"));
} else {
// Unfiled
$tags[] = 'system:unfiled';
}
// Media and file types // Eliminate any duplicate categories
if (!is_null($extension)) { $temp = array_unique($tags);
include_once 'SemanticScuttle/functions.php'; $tags = array_values($temp);
} else {
if ($keys = multi_array_search($extension, $GLOBALS['filetypes'])) { // Unfiled
$tags[] = 'system:filetype:'. $extension; $tags[] = 'system:unfiled';
$tags[] = 'system:media:'. array_shift($keys); }
}
}
// Imported // Media and file types
if ($fromImport) { if (!is_null($extension)) {
$tags[] = 'system:imported'; include_once 'SemanticScuttle/functions.php';
}
$this->db->sql_transaction('begin'); if ($keys = multi_array_search($extension, $GLOBALS['filetypes'])) {
$tags[] = 'system:filetype:'. $extension;
$tags[] = 'system:media:'. array_shift($keys);
}
}
if ($replace) { // Imported
if (!$this->deleteTagsForBookmark($bookmarkid)){ if ($fromImport) {
$this->db->sql_transaction('rollback'); $tags[] = 'system:imported';
message_die(GENERAL_ERROR, 'Could not attach tags (deleting old ones failed)', '', __LINE__, __FILE__, $sql, $this->db); }
return false;
}
}
$bs =SemanticScuttle_Service_Factory::get('Bookmark'); $this->db->sql_transaction('begin');
$tts =SemanticScuttle_Service_Factory::get('Tag2Tag');
// Create links between tags if ($replace) {
foreach($tags as $key => $tag) { if (!$this->deleteTagsForBookmark($bookmarkid)){
if(strpos($tag, '=')) { $this->db->sql_transaction('rollback');
// case "=" message_die(GENERAL_ERROR, 'Could not attach tags (deleting old ones failed)', '', __LINE__, __FILE__, $sql, $this->db);
$pieces = explode('=', $tag); return false;
$nbPieces = count($pieces); }
if($nbPieces > 1) { }
for($i = 0; $i < $nbPieces-1; $i++) {
$bookmark = $bs->getBookmark($bookmarkid); $bs =SemanticScuttle_Service_Factory::get('Bookmark');
$uId = $bookmark['uId']; $tts =SemanticScuttle_Service_Factory::get('Tag2Tag');
$tts->addLinkedTags($pieces[$i], $pieces[$i+1], '=', $uId);
} // Create links between tags
$tags[$key] = $pieces[0]; // Attach just the last tag to the bookmark foreach($tags as $key => $tag) {
} if(strpos($tag, '=')) {
} else { // case "="
// case ">" $pieces = explode('=', $tag);
$pieces = explode('>', $tag); $nbPieces = count($pieces);
$nbPieces = count($pieces); if($nbPieces > 1) {
if($nbPieces > 1) { for($i = 0; $i < $nbPieces-1; $i++) {
for($i = 0; $i < $nbPieces-1; $i++) { $bookmark = $bs->getBookmark($bookmarkid);
$bookmark = $bs->getBookmark($bookmarkid); $uId = $bookmark['uId'];
$uId = $bookmark['uId']; $tts->addLinkedTags($pieces[$i], $pieces[$i+1], '=', $uId);
$tts->addLinkedTags($pieces[$i], $pieces[$i+1], '>', $uId); }
} $tags[$key] = $pieces[0]; // Attach just the last tag to the bookmark
$tags[$key] = $pieces[$nbPieces-1]; // Attach just the last tag to the bookmark }
} } else {
} // case ">"
$pieces = explode('>', $tag);
$nbPieces = count($pieces);
if($nbPieces > 1) {
for($i = 0; $i < $nbPieces-1; $i++) {
$bookmark = $bs->getBookmark($bookmarkid);
$uId = $bookmark['uId'];
$tts->addLinkedTags($pieces[$i], $pieces[$i+1], '>', $uId);
}
$tags[$key] = $pieces[$nbPieces-1]; // Attach just the last tag to the bookmark
}
}
} }
// Add the categories to the DB. // Add the categories to the DB.
for ($i = 0; $i < count($tags); $i++) { for ($i = 0; $i < count($tags); $i++) {
if ($tags[$i] != '') { if ($tags[$i] != '') {
$values = array( $values = array(
'bId' => intval($bookmarkid), 'bId' => intval($bookmarkid),
'tag' => $tags[$i] 'tag' => $tags[$i]
); );
if (!$this->hasTag($bookmarkid, $tags[$i])) { if (!$this->hasTag($bookmarkid, $tags[$i])) {
$sql = 'INSERT INTO '. $this->getTableName() .' '. $this->db->sql_build_array('INSERT', $values); $sql = 'INSERT INTO '. $this->getTableName() .' '. $this->db->sql_build_array('INSERT', $values);
if (!($dbresult =& $this->db->sql_query($sql))) { if (!($dbresult =& $this->db->sql_query($sql))) {
$this->db->sql_transaction('rollback'); $this->db->sql_transaction('rollback');
message_die(GENERAL_ERROR, 'Could not attach tags', '', __LINE__, __FILE__, $sql, $this->db); message_die(GENERAL_ERROR, 'Could not attach tags', '', __LINE__, __FILE__, $sql, $this->db);
return false; return false;
} }
} }
} }
} }
$this->db->sql_transaction('commit'); $this->db->sql_transaction('commit');
return true; return true;
} }
function deleteTag($uId, $tag) { function deleteTag($uId, $tag) {
$bs =SemanticScuttle_Service_Factory::get('Bookmark'); $bs =SemanticScuttle_Service_Factory::get('Bookmark');
$query = 'DELETE FROM '. $this->getTableName(); $query = 'DELETE FROM '. $this->getTableName();
$query.= ' USING '. $this->getTableName() .', '. $bs->getTableName(); $query.= ' USING '. $this->getTableName() .', '. $bs->getTableName();
$query.= ' WHERE '. $this->getTableName() .'.bId = '. $bs->getTableName() .'.bId'; $query.= ' WHERE '. $this->getTableName() .'.bId = '. $bs->getTableName() .'.bId';
$query.= ' AND '. $bs->getTableName() .'.uId = '. $uId; $query.= ' AND '. $bs->getTableName() .'.uId = '. $uId;
$query.= ' AND '. $this->getTableName() .'.tag = "'. $this->db->sql_escape($tag) .'"'; $query.= ' AND '. $this->getTableName() .'.tag = "'. $this->db->sql_escape($tag) .'"';
if (!($dbresult =& $this->db->sql_query($query))) { if (!($dbresult =& $this->db->sql_query($query))) {
message_die(GENERAL_ERROR, 'Could not delete tags', '', __LINE__, __FILE__, $query, $this->db); message_die(GENERAL_ERROR, 'Could not delete tags', '', __LINE__, __FILE__, $query, $this->db);
return false; return false;
} }
return true; return true;
} }
function deleteTagsForBookmark($bookmarkid) { function deleteTagsForBookmark($bookmarkid) {
if (!is_int($bookmarkid)) { if (!is_int($bookmarkid)) {
message_die(GENERAL_ERROR, 'Could not delete tags (invalid bookmarkid)', '', __LINE__, __FILE__, $query); message_die(GENERAL_ERROR, 'Could not delete tags (invalid bookmarkid)', '', __LINE__, __FILE__, $query);
return false; return false;
} }
$query = 'DELETE FROM '. $this->getTableName() .' WHERE bId = '. intval($bookmarkid); $query = 'DELETE FROM '. $this->getTableName() .' WHERE bId = '. intval($bookmarkid);
if (!($dbresult =& $this->db->sql_query($query))) { if (!($dbresult =& $this->db->sql_query($query))) {
message_die(GENERAL_ERROR, 'Could not delete tags', '', __LINE__, __FILE__, $query, $this->db); message_die(GENERAL_ERROR, 'Could not delete tags', '', __LINE__, __FILE__, $query, $this->db);
return false; return false;
} }
return true; return true;
} }
/* Allow deletion in admin page */ /* Allow deletion in admin page */
function deleteTagsForUser($uId) { function deleteTagsForUser($uId) {
$qmask = 'DELETE FROM %s USING %s, %s WHERE %s.bId = %s.bId AND %s.uId = %d'; $qmask = 'DELETE FROM %s USING %s, %s WHERE %s.bId = %s.bId AND %s.uId = %d';
$query = sprintf($qmask, $query = sprintf($qmask,
$this->getTableName(), $this->getTableName(),
$this->getTableName(), $this->getTableName(),
$GLOBALS['tableprefix'].'bookmarks', $GLOBALS['tableprefix'].'bookmarks',
$this->getTableName(), $this->getTableName(),
$GLOBALS['tableprefix'].'bookmarks', $GLOBALS['tableprefix'].'bookmarks',
$GLOBALS['tableprefix'].'bookmarks', $GLOBALS['tableprefix'].'bookmarks',
$uId); $uId);
if (!($dbresult =& $this->db->sql_query($query))) { if (!($dbresult =& $this->db->sql_query($query))) {
message_die(GENERAL_ERROR, 'Could not delete tags', '', __LINE__, __FILE__, $query, $this->db); message_die(GENERAL_ERROR, 'Could not delete tags', '', __LINE__, __FILE__, $query, $this->db);
return false; return false;
} }
return true; return true;
} }
function &getTagsForBookmark($bookmarkid) { function &getTagsForBookmark($bookmarkid) {
if (!is_numeric($bookmarkid)) { if (!is_numeric($bookmarkid)) {
message_die(GENERAL_ERROR, 'Could not get tags (invalid bookmarkid)', '', __LINE__, __FILE__, $query); message_die(GENERAL_ERROR, 'Could not get tags (invalid bookmarkid)', '', __LINE__, __FILE__, $query);
return false; return false;
} }
$query = 'SELECT tag FROM '. $this->getTableName() .' WHERE bId = '. intval($bookmarkid) .' AND LEFT(tag, 7) <> "system:" ORDER BY id ASC'; $query = 'SELECT tag FROM '. $this->getTableName() .' WHERE bId = '. intval($bookmarkid) .' AND LEFT(tag, 7) <> "system:" ORDER BY id ASC';
if (!($dbresult =& $this->db->sql_query($query))) { if (!($dbresult =& $this->db->sql_query($query))) {
message_die(GENERAL_ERROR, 'Could not get tags', '', __LINE__, __FILE__, $query, $this->db); message_die(GENERAL_ERROR, 'Could not get tags', '', __LINE__, __FILE__, $query, $this->db);
return false; return false;
} }
$tags = array(); $tags = array();
while ($row =& $this->db->sql_fetchrow($dbresult)) { while ($row =& $this->db->sql_fetchrow($dbresult)) {
$tags[] = $row['tag']; $tags[] = $row['tag'];
} }
$this->db->sql_freeresult($dbresult); $this->db->sql_freeresult($dbresult);
return $tags; return $tags;
} }
function &getTags($userid = NULL) { function &getTags($userid = NULL) {
$userservice =SemanticScuttle_Service_Factory::get('User'); $userservice =SemanticScuttle_Service_Factory::get('User');
$logged_on_user = $userservice->getCurrentUserId(); $logged_on_user = $userservice->getCurrentUserId();
$query = 'SELECT T.tag, COUNT(B.bId) AS bCount FROM '. $GLOBALS['tableprefix'] .'bookmarks AS B INNER JOIN '. $userservice->getTableName() .' AS U ON B.uId = U.'. $userservice->getFieldName('primary') .' INNER JOIN '. $GLOBALS['tableprefix'] .'bookmarks2tags AS T ON B.bId = T.bId'; $query = 'SELECT T.tag, COUNT(B.bId) AS bCount FROM '. $GLOBALS['tableprefix'] .'bookmarks AS B INNER JOIN '. $userservice->getTableName() .' AS U ON B.uId = U.'. $userservice->getFieldName('primary') .' INNER JOIN '. $GLOBALS['tableprefix'] .'bookmarks2tags AS T ON B.bId = T.bId';
$conditions = array(); $conditions = array();
if (!is_null($userid)) { if (!is_null($userid)) {
$conditions['U.'. $userservice->getFieldName('primary')] = intval($userid); $conditions['U.'. $userservice->getFieldName('primary')] = intval($userid);
if ($logged_on_user != $userid) if ($logged_on_user != $userid)
$conditions['B.bStatus'] = 0; $conditions['B.bStatus'] = 0;
} else { } else {
$conditions['B.bStatus'] = 0; $conditions['B.bStatus'] = 0;
} }
$query .= ' WHERE '. $this->db->sql_build_array('SELECT', $conditions) .' AND LEFT(T.tag, 7) <> "system:" GROUP BY T.tag ORDER BY bCount DESC, tag'; $query .= ' WHERE '. $this->db->sql_build_array('SELECT', $conditions) .' AND LEFT(T.tag, 7) <> "system:" GROUP BY T.tag ORDER BY bCount DESC, tag';
if (!($dbresult =& $this->db->sql_query($query))) { if (!($dbresult =& $this->db->sql_query($query))) {
message_die(GENERAL_ERROR, 'Could not get tags', '', __LINE__, __FILE__, $query, $this->db); message_die(GENERAL_ERROR, 'Could not get tags', '', __LINE__, __FILE__, $query, $this->db);
return false; return false;
} }
$output = $this->db->sql_fetchrowset($dbresult); $output = $this->db->sql_fetchrowset($dbresult);
$this->db->sql_freeresult($dbresult); $this->db->sql_freeresult($dbresult);
return $output; return $output;
} }
// Returns the tags related to the specified tags; i.e. attached to the same bookmarks // Returns the tags related to the specified tags; i.e. attached to the same bookmarks
function &getRelatedTags($tags, $for_user = NULL, $logged_on_user = NULL, $limit = 10) { function &getRelatedTags($tags, $for_user = NULL, $logged_on_user = NULL, $limit = 10) {
$conditions = array(); $conditions = array();
// Only count the tags that are visible to the current user. // Only count the tags that are visible to the current user.
if ($for_user != $logged_on_user || is_null($for_user)) if ($for_user != $logged_on_user || is_null($for_user))
$conditions['B.bStatus'] = 0; $conditions['B.bStatus'] = 0;
if (!is_null($for_user)) if (!is_null($for_user))
$conditions['B.uId'] = $for_user; $conditions['B.uId'] = $for_user;
// Set up the tags, if need be. // Set up the tags, if need be.
if (is_numeric($tags)) if (is_numeric($tags))
$tags = NULL; $tags = NULL;
if (!is_array($tags) and !is_null($tags)) if (!is_array($tags) and !is_null($tags))
$tags = explode('+', trim($tags)); $tags = explode('+', trim($tags));
$tagcount = count($tags); $tagcount = count($tags);
for ($i = 0; $i < $tagcount; $i++) { for ($i = 0; $i < $tagcount; $i++) {
$tags[$i] = trim($tags[$i]); $tags[$i] = trim($tags[$i]);
} }
// Set up the SQL query. // Set up the SQL query.
$query_1 = 'SELECT DISTINCTROW T0.tag, COUNT(B.bId) AS bCount FROM '. $GLOBALS['tableprefix'] .'bookmarks AS B, '. $this->getTableName() .' AS T0'; $query_1 = 'SELECT DISTINCTROW T0.tag, COUNT(B.bId) AS bCount FROM '. $GLOBALS['tableprefix'] .'bookmarks AS B, '. $this->getTableName() .' AS T0';
$query_2 = ''; $query_2 = '';
$query_3 = ' WHERE B.bId = T0.bId '; $query_3 = ' WHERE B.bId = T0.bId ';
if (count($conditions) > 0) if (count($conditions) > 0)
$query_4 = ' AND '. $this->db->sql_build_array('SELECT', $conditions); $query_4 = ' AND '. $this->db->sql_build_array('SELECT', $conditions);
else else
$query_4 = ''; $query_4 = '';
// Handle the parts of the query that depend on any tags that are present. // Handle the parts of the query that depend on any tags that are present.
for ($i = 1; $i <= $tagcount; $i++) { for ($i = 1; $i <= $tagcount; $i++) {
$query_2 .= ', '. $this->getTableName() .' AS T'. $i; $query_2 .= ', '. $this->getTableName() .' AS T'. $i;
$query_4 .= ' AND T'. $i .'.bId = B.bId AND T'. $i .'.tag = "'. $this->db->sql_escape($tags[$i - 1]) .'" AND T0.tag <> "'. $this->db->sql_escape($tags[$i - 1]) .'"'; $query_4 .= ' AND T'. $i .'.bId = B.bId AND T'. $i .'.tag = "'. $this->db->sql_escape($tags[$i - 1]) .'" AND T0.tag <> "'. $this->db->sql_escape($tags[$i - 1]) .'"';
} }
$query_5 = ' AND LEFT(T0.tag, 7) <> "system:" GROUP BY T0.tag ORDER BY bCount DESC, T0.tag'; $query_5 = ' AND LEFT(T0.tag, 7) <> "system:" GROUP BY T0.tag ORDER BY bCount DESC, T0.tag';
$query = $query_1 . $query_2 . $query_3 . $query_4 . $query_5; $query = $query_1 . $query_2 . $query_3 . $query_4 . $query_5;
if (! ($dbresult =& $this->db->sql_query_limit($query, $limit)) ){ if (! ($dbresult =& $this->db->sql_query_limit($query, $limit)) ){
message_die(GENERAL_ERROR, 'Could not get related tags', '', __LINE__, __FILE__, $query, $this->db); message_die(GENERAL_ERROR, 'Could not get related tags', '', __LINE__, __FILE__, $query, $this->db);
return false; return false;
} }
$output = $this->db->sql_fetchrowset($dbresult); $output = $this->db->sql_fetchrowset($dbresult);
$this->db->sql_freeresult($dbresult); $this->db->sql_freeresult($dbresult);
return $output; return $output;
} }
// Returns the most popular tags used for a particular bookmark hash // Returns the most popular tags used for a particular bookmark hash
function &getRelatedTagsByHash($hash, $limit = 20) { function &getRelatedTagsByHash($hash, $limit = 20) {
$userservice = SemanticScuttle_Service_Factory :: get('User'); $userservice = SemanticScuttle_Service_Factory :: get('User');
$sId = $userservice->getCurrentUserId(); $sId = $userservice->getCurrentUserId();
// Logged in // Logged in
if ($userservice->isLoggedOn()) { if ($userservice->isLoggedOn()) {
$arrWatch = $userservice->getWatchList($sId); $arrWatch = $userservice->getWatchList($sId);
// From public bookmarks or user's own // From public bookmarks or user's own
$privacy = ' AND ((B.bStatus = 0) OR (B.uId = '. $sId .')'; $privacy = ' AND ((B.bStatus = 0) OR (B.uId = '. $sId .')';
// From shared bookmarks in watchlist // From shared bookmarks in watchlist
foreach ($arrWatch as $w) { foreach ($arrWatch as $w) {
$privacy .= ' OR (B.uId = '. $w .' AND B.bStatus = 1)'; $privacy .= ' OR (B.uId = '. $w .' AND B.bStatus = 1)';
} }
$privacy .= ') '; $privacy .= ') ';
// Not logged in // Not logged in
} else { } else {
$privacy = ' AND B.bStatus = 0 '; $privacy = ' AND B.bStatus = 0 ';
} }
$query = 'SELECT T.tag, COUNT(T.tag) AS bCount FROM '.$GLOBALS['tableprefix'].'bookmarks AS B LEFT JOIN '.$GLOBALS['tableprefix'].'bookmarks2tags AS T ON B.bId = T.bId WHERE B.bHash = "'. $hash .'" '. $privacy .'AND LEFT(T.tag, 7) <> "system:" GROUP BY T.tag ORDER BY bCount DESC'; $query = 'SELECT T.tag, COUNT(T.tag) AS bCount FROM '.$GLOBALS['tableprefix'].'bookmarks AS B LEFT JOIN '.$GLOBALS['tableprefix'].'bookmarks2tags AS T ON B.bId = T.bId WHERE B.bHash = "'. $hash .'" '. $privacy .'AND LEFT(T.tag, 7) <> "system:" GROUP BY T.tag ORDER BY bCount DESC';
if (!($dbresult =& $this->db->sql_query_limit($query, $limit))) { if (!($dbresult =& $this->db->sql_query_limit($query, $limit))) {
message_die(GENERAL_ERROR, 'Could not get related tags for this hash', '', __LINE__, __FILE__, $query, $this->db); message_die(GENERAL_ERROR, 'Could not get related tags for this hash', '', __LINE__, __FILE__, $query, $this->db);
return false; return false;
} }
$output = $this->db->sql_fetchrowset($dbresult); $output = $this->db->sql_fetchrowset($dbresult);
$this->db->sql_freeresult($dbresult); $this->db->sql_freeresult($dbresult);
return $output; return $output;
} }
function &getAdminTags($limit = 30, $logged_on_user = NULL, $days = NULL) {
// look for admin ids
$userservice = SemanticScuttle_Service_Factory :: get('User');
$adminIds = $userservice->getAdminIds();
// ask for their tags
return $this->getPopularTags($adminIds, $limit, $logged_on_user, $days);
}
function &getContactTags($user, $limit = 30, $logged_on_user = NULL, $days = NULL) {
// look for contact ids
$userservice = SemanticScuttle_Service_Factory :: get('User');
$contacts = $userservice->getWatchlist($user);
// add the user (to show him/her also his/her tags)
if(!is_null($logged_on_user)) {
$contacts[] = $logged_on_user;
}
// ask for their tags
return $this->getPopularTags($contacts, $limit, $logged_on_user, $days);
}
// $users can be {NULL, an id, an array of id} function &getAdminTags($limit = 30, $logged_on_user = NULL, $days = NULL) {
function &getPopularTags($user = NULL, $limit = 30, $logged_on_user = NULL, $days = NULL) { // look for admin ids
// Only count the tags that are visible to the current user. $userservice = SemanticScuttle_Service_Factory :: get('User');
if (($user != $logged_on_user) || is_null($user) || ($user === false)) $adminIds = $userservice->getAdminIds();
$privacy = ' AND B.bStatus = 0';
else
$privacy = '';
if (is_null($days) || !is_int($days)) // ask for their tags
$span = ''; return $this->getPopularTags($adminIds, $limit, $logged_on_user, $days);
else }
$span = ' AND B.bDatetime > "'. date('Y-m-d H:i:s', time() - (86400 * $days)) .'"';
$query = 'SELECT T.tag, COUNT(T.bId) AS bCount FROM '. $this->getTableName() .' AS T, '. $GLOBALS['tableprefix'] .'bookmarks AS B WHERE '; function &getContactTags($user, $limit = 30, $logged_on_user = NULL, $days = NULL) {
if (is_null($user) || ($user === false)) { // look for contact ids
$query .= 'B.bId = T.bId AND B.bStatus = 0'; $userservice = SemanticScuttle_Service_Factory :: get('User');
} elseif(is_array($user)) { $contacts = $userservice->getWatchlist($user);
$query .= ' (1 = 0'; //tricks
foreach($user as $u) {
$query .= ' OR B.uId = '. $this->db->sql_escape($u) .' AND B.bId = T.bId';
}
$query .= ' )';
} else {
$query .= 'B.uId = '. $this->db->sql_escape($user) .' AND B.bId = T.bId'. $privacy;
}
$query .= $span .' AND LEFT(T.tag, 7) <> "system:" GROUP BY T.tag ORDER BY bCount DESC, tag';
if (!($dbresult =& $this->db->sql_query_limit($query, $limit))) { // add the user (to show him/her also his/her tags)
message_die(GENERAL_ERROR, 'Could not get popular tags', '', __LINE__, __FILE__, $query, $this->db); if(!is_null($logged_on_user)) {
return false; $contacts[] = $logged_on_user;
} }
$output = $this->db->sql_fetchrowset($dbresult); // ask for their tags
$this->db->sql_freeresult($dbresult); return $this->getPopularTags($contacts, $limit, $logged_on_user, $days);
return $output; }
}
function hasTag($bookmarkid, $tag) { // $users can be {NULL, an id, an array of id}
$query = 'SELECT COUNT(*) AS tCount FROM '. $this->getTableName() .' WHERE bId = '. intval($bookmarkid) .' AND tag ="'. $this->db->sql_escape($tag) .'"'; function &getPopularTags($user = NULL, $limit = 30, $logged_on_user = NULL, $days = NULL) {
// Only count the tags that are visible to the current user.
if (($user != $logged_on_user) || is_null($user) || ($user === false))
$privacy = ' AND B.bStatus = 0';
else
$privacy = '';
if (! ($dbresult =& $this->db->sql_query($query)) ) { if (is_null($days) || !is_int($days))
message_die(GENERAL_ERROR, 'Could not find tag', '', __LINE__, __FILE__, $query, $this->db); $span = '';
return false; else
} $span = ' AND B.bDatetime > "'. date('Y-m-d H:i:s', time() - (86400 * $days)) .'"';
if ($row =& $this->db->sql_fetchrow($dbresult)) { $query = 'SELECT T.tag, COUNT(T.bId) AS bCount FROM '. $this->getTableName() .' AS T, '. $GLOBALS['tableprefix'] .'bookmarks AS B WHERE ';
if ($row['tCount'] > 0) { if (is_null($user) || ($user === false)) {
$output = true; $query .= 'B.bId = T.bId AND B.bStatus = 0';
} } elseif(is_array($user)) {
} $query .= ' (1 = 0'; //tricks
$output = false; foreach($user as $u) {
$this->db->sql_freeresult($dbresult); $query .= ' OR B.uId = '. $this->db->sql_escape($u) .' AND B.bId = T.bId';
return $output; }
} $query .= ' )';
} else {
$query .= 'B.uId = '. $this->db->sql_escape($user) .' AND B.bId = T.bId'. $privacy;
}
$query .= $span .' AND LEFT(T.tag, 7) <> "system:" GROUP BY T.tag ORDER BY bCount DESC, tag';
function renameTag($userid, $old, $new, $fromApi = false) { if (!($dbresult =& $this->db->sql_query_limit($query, $limit))) {
$bookmarkservice =SemanticScuttle_Service_Factory::get('Bookmark'); message_die(GENERAL_ERROR, 'Could not get popular tags', '', __LINE__, __FILE__, $query, $this->db);
$tagservice =SemanticScuttle_Service_Factory::get('Tag'); return false;
}
if (is_null($userid) || is_null($old) || is_null($new)) $output = $this->db->sql_fetchrowset($dbresult);
return false; $this->db->sql_freeresult($dbresult);
return $output;
}
// Find bookmarks with old tag function hasTag($bookmarkid, $tag) {
$bookmarksInfo =& $bookmarkservice->getBookmarks(0, NULL, $userid, $old); $query = 'SELECT COUNT(*) AS tCount FROM '. $this->getTableName() .' WHERE bId = '. intval($bookmarkid) .' AND tag ="'. $this->db->sql_escape($tag) .'"';
$bookmarks =& $bookmarksInfo['bookmarks'];
// Delete old tag if (! ($dbresult =& $this->db->sql_query($query)) ) {
$this->deleteTag($userid, $old); message_die(GENERAL_ERROR, 'Could not find tag', '', __LINE__, __FILE__, $query, $this->db);
return false;
}
// Attach new tags if ($row =& $this->db->sql_fetchrow($dbresult)) {
$new = $tagservice->normalize($new); if ($row['tCount'] > 0) {
$output = true;
foreach(array_keys($bookmarks) as $key) { }
$row =& $bookmarks[$key]; }
$this->attachTags($row['bId'], $new, $fromApi, NULL, false); $output = false;
} $this->db->sql_freeresult($dbresult);
return $output;
}
return true; function renameTag($userid, $old, $new, $fromApi = false) {
} $bookmarkservice =SemanticScuttle_Service_Factory::get('Bookmark');
$tagservice =SemanticScuttle_Service_Factory::get('Tag');
function &tagCloud($tags = NULL, $steps = 5, $sizemin = 90, $sizemax = 225, $sortOrder = NULL) { if (is_null($userid) || is_null($old) || is_null($new))
return false;
if (is_null($tags) || count($tags) < 1) { // Find bookmarks with old tag
$output = false; $bookmarksInfo =& $bookmarkservice->getBookmarks(0, NULL, $userid, $old);
return $output; $bookmarks =& $bookmarksInfo['bookmarks'];
}
$min = $tags[count($tags) - 1]['bCount']; // Delete old tag
$max = $tags[0]['bCount']; $this->deleteTag($userid, $old);
for ($i = 1; $i <= $steps; $i++) { // Attach new tags
$delta = ($max - $min) / (2 * $steps - $i); $new = $tagservice->normalize($new);
$limit[$i] = $i * $delta + $min;
}
$sizestep = ($sizemax - $sizemin) / $steps;
foreach ($tags as $row) {
$next = false;
for ($i = 1; $i <= $steps; $i++) {
if (!$next && $row['bCount'] <= $limit[$i]) {
$size = $sizestep * ($i - 1) + $sizemin;
$next = true;
}
}
$tempArray = array('size' => $size .'%');
$row = array_merge($row, $tempArray);
$output[] = $row;
}
if ($sortOrder == 'alphabet_asc') { foreach(array_keys($bookmarks) as $key) {
usort($output, create_function('$a,$b','return strcasecmp(utf8_deaccent($a["tag"]), utf8_deaccent($b["tag"]));')); $row =& $bookmarks[$key];
} $this->attachTags($row['bId'], $new, $fromApi, NULL, false);
}
return $output; return true;
} }
function deleteAll() { function &tagCloud($tags = NULL, $steps = 5, $sizemin = 90, $sizemax = 225, $sortOrder = NULL) {
$query = 'TRUNCATE TABLE `'. $this->getTableName() .'`';
$this->db->sql_query($query); if (is_null($tags) || count($tags) < 1) {
} $output = false;
return $output;
}
$min = $tags[count($tags) - 1]['bCount'];
$max = $tags[0]['bCount'];
for ($i = 1; $i <= $steps; $i++) {
$delta = ($max - $min) / (2 * $steps - $i);
$limit[$i] = $i * $delta + $min;
}
$sizestep = ($sizemax - $sizemin) / $steps;
foreach ($tags as $row) {
$next = false;
for ($i = 1; $i <= $steps; $i++) {
if (!$next && $row['bCount'] <= $limit[$i]) {
$size = $sizestep * ($i - 1) + $sizemin;
$next = true;
}
}
$tempArray = array('size' => $size .'%');
$row = array_merge($row, $tempArray);
$output[] = $row;
}
if ($sortOrder == 'alphabet_asc') {
usort($output, create_function('$a,$b','return strcasecmp(utf8_deaccent($a["tag"]), utf8_deaccent($b["tag"]));'));
}
return $output;
}
function deleteAll() {
$query = 'TRUNCATE TABLE `'. $this->getTableName() .'`';
$this->db->sql_query($query);
}
} }
?> ?>

View file

@ -11,18 +11,18 @@ class SemanticScuttle_Service_Cache extends SemanticScuttle_Service
* *
* @return SemanticScuttle_Service * @return SemanticScuttle_Service
*/ */
public static function getInstance($db) public static function getInstance($db)
{ {
static $instance; static $instance;
if (!isset($instance)) { if (!isset($instance)) {
$instance = new self($db); $instance = new self($db);
} }
return $instance; return $instance;
} }
protected function __construct() protected function __construct()
{ {
$this->basedir = $GLOBALS['dir_cache']; $this->basedir = $GLOBALS['dir_cache'];
} }
function Start($hash, $time = 300) { function Start($hash, $time = 300) {
@ -37,7 +37,7 @@ class SemanticScuttle_Service_Cache extends SemanticScuttle_Service
} }
function End($hash) { function End($hash) {
$cachefile = $this->basedir .'/'. $hash . $this->fileextension; $cachefile = $this->basedir .'/'. $hash . $this->fileextension;
$handle = fopen($cachefile, 'w'); $handle = fopen($cachefile, 'w');
fwrite($handle, ob_get_contents()); fwrite($handle, ob_get_contents());
fclose($handle); fclose($handle);

View file

@ -8,165 +8,165 @@ class SemanticScuttle_Service_CommonDescription extends SemanticScuttle_DbServic
* *
* @return SemanticScuttle_Service * @return SemanticScuttle_Service
*/ */
public static function getInstance($db) public static function getInstance($db)
{ {
static $instance; static $instance;
if (!isset($instance)) { if (!isset($instance)) {
$instance = new self($db); $instance = new self($db);
} }
return $instance; return $instance;
} }
public function __construct($db) public function __construct($db)
{ {
$this->db = $db; $this->db = $db;
$this->tablename = $GLOBALS['tableprefix'] .'commondescription'; $this->tablename = $GLOBALS['tableprefix'] .'commondescription';
} }
function addTagDescription($tag, $desc, $uId, $time) { function addTagDescription($tag, $desc, $uId, $time) {
// Check if no modification // Check if no modification
$lastDesc = $this->getLastTagDescription($tag); $lastDesc = $this->getLastTagDescription($tag);
if($lastDesc['cdDescription'] == $desc) { if($lastDesc['cdDescription'] == $desc) {
return true; return true;
} }
// If modification // If modification
$datetime = gmdate('Y-m-d H:i:s', $time); $datetime = gmdate('Y-m-d H:i:s', $time);
$values = array('tag'=>$tag, 'cdDescription'=>$desc, 'uId'=>$uId, 'cdDatetime'=>$datetime); $values = array('tag'=>$tag, 'cdDescription'=>$desc, 'uId'=>$uId, 'cdDatetime'=>$datetime);
$sql = 'INSERT INTO '. $this->getTableName() .' '. $this->db->sql_build_array('INSERT', $values); $sql = 'INSERT INTO '. $this->getTableName() .' '. $this->db->sql_build_array('INSERT', $values);
if (!($dbresult =& $this->db->sql_query($sql))) { if (!($dbresult =& $this->db->sql_query($sql))) {
$this->db->sql_transaction('rollback'); $this->db->sql_transaction('rollback');
message_die(GENERAL_ERROR, 'Could not add tag description', '', __LINE__, __FILE__, $sql, $this->db); message_die(GENERAL_ERROR, 'Could not add tag description', '', __LINE__, __FILE__, $sql, $this->db);
return false; return false;
} }
return true; return true;
} }
function getLastTagDescription($tag) { function getLastTagDescription($tag) {
$query = "SELECT *"; $query = "SELECT *";
$query.= " FROM `". $this->getTableName() ."`"; $query.= " FROM `". $this->getTableName() ."`";
$query.= " WHERE tag='".$tag."'"; $query.= " WHERE tag='".$tag."'";
$query.= " ORDER BY cdDatetime DESC"; $query.= " ORDER BY cdDatetime DESC";
if (!($dbresult = & $this->db->sql_query_limit($query, 1, 0))) { if (!($dbresult = & $this->db->sql_query_limit($query, 1, 0))) {
message_die(GENERAL_ERROR, 'Could not get tag description', '', __LINE__, __FILE__, $query, $this->db); message_die(GENERAL_ERROR, 'Could not get tag description', '', __LINE__, __FILE__, $query, $this->db);
return false; return false;
} }
if ($row =& $this->db->sql_fetchrow($dbresult)) { if ($row =& $this->db->sql_fetchrow($dbresult)) {
return $row; return $row;
} else { } else {
return false; return false;
} }
} }
function getAllTagsDescription($tag) { function getAllTagsDescription($tag) {
$query = "SELECT *"; $query = "SELECT *";
$query.= " FROM `". $this->getTableName() ."`"; $query.= " FROM `". $this->getTableName() ."`";
$query.= " WHERE tag='".$tag."'"; $query.= " WHERE tag='".$tag."'";
$query.= " ORDER BY cdDatetime DESC"; $query.= " ORDER BY cdDatetime DESC";
if (!($dbresult = & $this->db->sql_query($query))) { if (!($dbresult = & $this->db->sql_query($query))) {
message_die(GENERAL_ERROR, 'Could not get tag descriptions', '', __LINE__, __FILE__, $query, $this->db); message_die(GENERAL_ERROR, 'Could not get tag descriptions', '', __LINE__, __FILE__, $query, $this->db);
return false; return false;
} }
return $this->db->sql_fetchrowset($dbresult); return $this->db->sql_fetchrowset($dbresult);
} }
function getDescriptionById($cdId) { function getDescriptionById($cdId) {
$query = "SELECT *"; $query = "SELECT *";
$query.= " FROM `". $this->getTableName() ."`"; $query.= " FROM `". $this->getTableName() ."`";
$query.= " WHERE cdId='".$cdId."'"; $query.= " WHERE cdId='".$cdId."'";
if (!($dbresult = & $this->db->sql_query($query))) { if (!($dbresult = & $this->db->sql_query($query))) {
message_die(GENERAL_ERROR, 'Could not get tag descriptions', '', __LINE__, __FILE__, $query, $this->db); message_die(GENERAL_ERROR, 'Could not get tag descriptions', '', __LINE__, __FILE__, $query, $this->db);
return false; return false;
} }
if ($row =& $this->db->sql_fetchrow($dbresult)) { if ($row =& $this->db->sql_fetchrow($dbresult)) {
return $row; return $row;
} else { } else {
return false; return false;
} }
} }
function addBookmarkDescription($bHash, $title, $desc, $uId, $time) { function addBookmarkDescription($bHash, $title, $desc, $uId, $time) {
// Check if no modification // Check if no modification
$lastDesc = $this->getLastBookmarkDescription($bHash); $lastDesc = $this->getLastBookmarkDescription($bHash);
if($lastDesc['cdTitle'] == $title && $lastDesc['cdDescription'] == $desc) { if($lastDesc['cdTitle'] == $title && $lastDesc['cdDescription'] == $desc) {
return true; return true;
} }
// If modification // If modification
$datetime = gmdate('Y-m-d H:i:s', $time); $datetime = gmdate('Y-m-d H:i:s', $time);
$values = array('bHash'=>$bHash, 'cdTitle'=>$title, 'cdDescription'=>$desc, 'uId'=>$uId, 'cdDatetime'=>$datetime); $values = array('bHash'=>$bHash, 'cdTitle'=>$title, 'cdDescription'=>$desc, 'uId'=>$uId, 'cdDatetime'=>$datetime);
$sql = 'INSERT INTO '. $this->getTableName() .' '. $this->db->sql_build_array('INSERT', $values); $sql = 'INSERT INTO '. $this->getTableName() .' '. $this->db->sql_build_array('INSERT', $values);
if (!($dbresult =& $this->db->sql_query($sql))) { if (!($dbresult =& $this->db->sql_query($sql))) {
$this->db->sql_transaction('rollback'); $this->db->sql_transaction('rollback');
message_die(GENERAL_ERROR, 'Could not add bookmark description', '', __LINE__, __FILE__, $sql, $this->db); message_die(GENERAL_ERROR, 'Could not add bookmark description', '', __LINE__, __FILE__, $sql, $this->db);
return false; return false;
} }
return true; return true;
} }
function getLastBookmarkDescription($bHash) { function getLastBookmarkDescription($bHash) {
$query = "SELECT *"; $query = "SELECT *";
$query.= " FROM `". $this->getTableName() ."`"; $query.= " FROM `". $this->getTableName() ."`";
$query.= " WHERE bHash='".$bHash."'"; $query.= " WHERE bHash='".$bHash."'";
$query.= " ORDER BY cdDatetime DESC"; $query.= " ORDER BY cdDatetime DESC";
if (!($dbresult = & $this->db->sql_query_limit($query, 1, 0))) { if (!($dbresult = & $this->db->sql_query_limit($query, 1, 0))) {
message_die(GENERAL_ERROR, 'Could not get bookmark description', '', __LINE__, __FILE__, $query, $this->db); message_die(GENERAL_ERROR, 'Could not get bookmark description', '', __LINE__, __FILE__, $query, $this->db);
return false; return false;
} }
if ($row =& $this->db->sql_fetchrow($dbresult)) { if ($row =& $this->db->sql_fetchrow($dbresult)) {
return $row; return $row;
} else { } else {
return false; return false;
} }
} }
function getAllBookmarksDescription($bHash) { function getAllBookmarksDescription($bHash) {
$query = "SELECT *"; $query = "SELECT *";
$query.= " FROM `". $this->getTableName() ."`"; $query.= " FROM `". $this->getTableName() ."`";
$query.= " WHERE bHash='".$bHash."'"; $query.= " WHERE bHash='".$bHash."'";
$query.= " ORDER BY cdDatetime DESC"; $query.= " ORDER BY cdDatetime DESC";
if (!($dbresult = & $this->db->sql_query($query))) { if (!($dbresult = & $this->db->sql_query($query))) {
message_die(GENERAL_ERROR, 'Could not get bookmark descriptions', '', __LINE__, __FILE__, $query, $this->db); message_die(GENERAL_ERROR, 'Could not get bookmark descriptions', '', __LINE__, __FILE__, $query, $this->db);
return false; return false;
} }
return $this->db->sql_fetchrowset($dbresult); return $this->db->sql_fetchrowset($dbresult);
} }
function deleteDescriptionsForUser($uId){ function deleteDescriptionsForUser($uId){
$query = 'DELETE FROM '. $this->getTableName() . ' WHERE uId = '. intval($uId); $query = 'DELETE FROM '. $this->getTableName() . ' WHERE uId = '. intval($uId);
$this->db->sql_transaction('begin'); $this->db->sql_transaction('begin');
if (!($dbresult = & $this->db->sql_query($query))) { if (!($dbresult = & $this->db->sql_query($query))) {
$this->db->sql_transaction('rollback'); $this->db->sql_transaction('rollback');
message_die(GENERAL_ERROR, 'Could not delete user descriptions', '', message_die(GENERAL_ERROR, 'Could not delete user descriptions', '',
__LINE__, __FILE__, $query, $this->db); __LINE__, __FILE__, $query, $this->db);
return false; return false;
} }
return true; return true;
} }
function deleteAll() { function deleteAll() {
$query = 'TRUNCATE TABLE `'. $this->getTableName() .'`'; $query = 'TRUNCATE TABLE `'. $this->getTableName() .'`';
$this->db->sql_query($query); $this->db->sql_query($query);
} }
} }
?> ?>

View file

@ -112,7 +112,7 @@ class SemanticScuttle_Service_Factory
*/ */
protected static function loadDb() protected static function loadDb()
{ {
global $dbhost, $dbuser, $dbpass, $dbname, global $dbhost, $dbuser, $dbpass, $dbname,
$dbport, $dbpersist, $dbtype; $dbport, $dbpersist, $dbtype;
if (self::$db !== null) { if (self::$db !== null) {

View file

@ -1,7 +1,7 @@
<?php <?php
class SemanticScuttle_Service_SearchHistory extends SemanticScuttle_DbService class SemanticScuttle_Service_SearchHistory extends SemanticScuttle_DbService
{ {
var $sizeSearchHistory; var $sizeSearchHistory;
/** /**
* Returns the single service instance * Returns the single service instance
@ -10,121 +10,121 @@ class SemanticScuttle_Service_SearchHistory extends SemanticScuttle_DbService
* *
* @return SemanticScuttle_Service * @return SemanticScuttle_Service
*/ */
public static function getInstance($db) public static function getInstance($db)
{ {
static $instance; static $instance;
if (!isset($instance)) { if (!isset($instance)) {
$instance = new self($db); $instance = new self($db);
} }
return $instance; return $instance;
} }
public function __construct($db) public function __construct($db)
{ {
$this->db = $db; $this->db = $db;
$this->tablename = $GLOBALS['tableprefix'] .'searchhistory'; $this->tablename = $GLOBALS['tableprefix'] .'searchhistory';
if(isset($GLOBALS['sizeSearchHistory'])) { if(isset($GLOBALS['sizeSearchHistory'])) {
$this->sizeSearchHistory = $GLOBALS['sizeSearchHistory']; $this->sizeSearchHistory = $GLOBALS['sizeSearchHistory'];
} else { } else {
$this->sizeSearchHistory = 10; $this->sizeSearchHistory = 10;
} }
} }
function addSearch($terms, $range, $nbResults, $uId=0) { function addSearch($terms, $range, $nbResults, $uId=0) {
if(strlen($terms) == 0) { if(strlen($terms) == 0) {
return false; return false;
} }
$datetime = gmdate('Y-m-d H:i:s', time()); $datetime = gmdate('Y-m-d H:i:s', time());
//Insert values //Insert values
$values = array('shTerms'=>$terms, 'shRange'=>$range, 'shDatetime'=>$datetime, 'shNbResults'=>$nbResults, 'uId'=>$uId); $values = array('shTerms'=>$terms, 'shRange'=>$range, 'shDatetime'=>$datetime, 'shNbResults'=>$nbResults, 'uId'=>$uId);
$sql = 'INSERT INTO '. $this->getTableName() .' '. $this->db->sql_build_array('INSERT', $values); $sql = 'INSERT INTO '. $this->getTableName() .' '. $this->db->sql_build_array('INSERT', $values);
$this->db->sql_transaction('begin'); $this->db->sql_transaction('begin');
if (!($dbresult = & $this->db->sql_query($sql))) { if (!($dbresult = & $this->db->sql_query($sql))) {
$this->db->sql_transaction('rollback'); $this->db->sql_transaction('rollback');
message_die(GENERAL_ERROR, 'Could not insert search history', '', __LINE__, __FILE__, $sql, $this->db); message_die(GENERAL_ERROR, 'Could not insert search history', '', __LINE__, __FILE__, $sql, $this->db);
return false; return false;
} }
if($this->sizeSearchHistory != -1 && if($this->sizeSearchHistory != -1 &&
$this->countSearches() > $this->sizeSearchHistory) { $this->countSearches() > $this->sizeSearchHistory) {
$this->deleteOldestSearch(); $this->deleteOldestSearch();
} }
} }
function getAllSearches($range = NULL, $uId = NULL, $nb = NULL, $start = NULL, $distinct = false, $withResults = false) { function getAllSearches($range = NULL, $uId = NULL, $nb = NULL, $start = NULL, $distinct = false, $withResults = false) {
$sql = 'SELECT DISTINCT(shTerms), shId, shRange, shNbResults, shDatetime, uId'; $sql = 'SELECT DISTINCT(shTerms), shId, shRange, shNbResults, shDatetime, uId';
$sql.= ' FROM '. $this->getTableName(); $sql.= ' FROM '. $this->getTableName();
$sql.= ' WHERE 1=1'; $sql.= ' WHERE 1=1';
if($range != NULL) { if($range != NULL) {
$sql.= ' AND shRange = "'.$range.'"'; $sql.= ' AND shRange = "'.$range.'"';
} else { } else {
$sql.= ' AND shRange = "all"'; $sql.= ' AND shRange = "all"';
} }
if($uId != NULL) { if($uId != NULL) {
$sql.= ' AND uId = '.$uId; $sql.= ' AND uId = '.$uId;
} }
if($withResults = true) { if($withResults = true) {
$sql.= ' AND shNbResults > 0'; $sql.= ' AND shNbResults > 0';
} }
if($distinct) { if($distinct) {
$sql.= ' GROUP BY shTerms'; $sql.= ' GROUP BY shTerms';
} }
$sql.= ' ORDER BY shId DESC'; $sql.= ' ORDER BY shId DESC';
if (!($dbresult = & $this->db->sql_query_limit($sql, $nb, $start))) { if (!($dbresult = & $this->db->sql_query_limit($sql, $nb, $start))) {
message_die(GENERAL_ERROR, 'Could not get searches', '', __LINE__, __FILE__, $sql, $this->db); message_die(GENERAL_ERROR, 'Could not get searches', '', __LINE__, __FILE__, $sql, $this->db);
return false; return false;
} }
$searches = array(); $searches = array();
while ($row = & $this->db->sql_fetchrow($dbresult)) { while ($row = & $this->db->sql_fetchrow($dbresult)) {
$searches[] = $row; $searches[] = $row;
} }
$this->db->sql_freeresult($dbresult); $this->db->sql_freeresult($dbresult);
return $searches; return $searches;
} }
function countSearches() { function countSearches() {
$sql = 'SELECT COUNT(*) AS `total` FROM '. $this->getTableName(); $sql = 'SELECT COUNT(*) AS `total` FROM '. $this->getTableName();
if (!($dbresult = & $this->db->sql_query($sql)) || (!($row = & $this->db->sql_fetchrow($dbresult)))) { if (!($dbresult = & $this->db->sql_query($sql)) || (!($row = & $this->db->sql_fetchrow($dbresult)))) {
message_die(GENERAL_ERROR, 'Could not get total searches', '', __LINE__, __FILE__, $sql, $this->db); message_die(GENERAL_ERROR, 'Could not get total searches', '', __LINE__, __FILE__, $sql, $this->db);
return false; return false;
} }
$this->db->sql_freeresult($dbresult); $this->db->sql_freeresult($dbresult);
return $row['total']; return $row['total'];
} }
/* This function allows to limit the number of saved searches /* This function allows to limit the number of saved searches
by deleting the oldest one */ by deleting the oldest one */
function deleteOldestSearch() { function deleteOldestSearch() {
$sql = 'DELETE FROM '.$this->getTableName(); $sql = 'DELETE FROM '.$this->getTableName();
$sql.= ' ORDER BY shId ASC LIMIT 1'; // warning: here the limit is important $sql.= ' ORDER BY shId ASC LIMIT 1'; // warning: here the limit is important
$this->db->sql_transaction('begin'); $this->db->sql_transaction('begin');
if (!($dbresult = & $this->db->sql_query($sql))) { if (!($dbresult = & $this->db->sql_query($sql))) {
$this->db->sql_transaction('rollback'); $this->db->sql_transaction('rollback');
message_die(GENERAL_ERROR, 'Could not delete bookmarks', '', __LINE__, __FILE__, $query, $this->db); message_die(GENERAL_ERROR, 'Could not delete bookmarks', '', __LINE__, __FILE__, $query, $this->db);
return false; return false;
} }
} }
function deleteSearchHistoryForUser($uId) { function deleteSearchHistoryForUser($uId) {
$query = 'DELETE FROM '. $this->getTableName() .' WHERE uId = '. intval($uId); $query = 'DELETE FROM '. $this->getTableName() .' WHERE uId = '. intval($uId);
if (!($dbresult = & $this->db->sql_query($query))) { if (!($dbresult = & $this->db->sql_query($query))) {
message_die(GENERAL_ERROR, 'Could not delete search history', '', message_die(GENERAL_ERROR, 'Could not delete search history', '',
__LINE__, __FILE__, $query, $this->db); __LINE__, __FILE__, $query, $this->db);
return false; return false;
} }
return true; return true;
} }
function deleteAll() { function deleteAll() {
$query = 'TRUNCATE TABLE `'. $this->getTableName() .'`'; $query = 'TRUNCATE TABLE `'. $this->getTableName() .'`';
$this->db->sql_query($query); $this->db->sql_query($query);
} }
} }
?> ?>

View file

@ -8,121 +8,121 @@ class SemanticScuttle_Service_Tag extends SemanticScuttle_DbService
* *
* @return SemanticScuttle_Service * @return SemanticScuttle_Service
*/ */
public static function getInstance($db) public static function getInstance($db)
{ {
static $instance; static $instance;
if (!isset($instance)) { if (!isset($instance)) {
$instance = new self($db); $instance = new self($db);
} }
return $instance; return $instance;
} }
public function __construct($db) public function __construct($db)
{ {
$this->db = $db; $this->db = $db;
$this->tablename = $GLOBALS['tableprefix'] .'tags'; $this->tablename = $GLOBALS['tableprefix'] .'tags';
} }
function getDescription($tag, $uId) { function getDescription($tag, $uId) {
$query = 'SELECT tag, uId, tDescription'; $query = 'SELECT tag, uId, tDescription';
$query.= ' FROM '.$this->getTableName(); $query.= ' FROM '.$this->getTableName();
$query.= ' WHERE tag = "'.$tag.'"'; $query.= ' WHERE tag = "'.$tag.'"';
$query.= ' AND uId = "'.$uId.'"'; $query.= ' AND uId = "'.$uId.'"';
if (!($dbresult = & $this->db->sql_query($query))) { if (!($dbresult = & $this->db->sql_query($query))) {
message_die(GENERAL_ERROR, 'Could not get tag description', '', __LINE__, __FILE__, $query, $this->db); message_die(GENERAL_ERROR, 'Could not get tag description', '', __LINE__, __FILE__, $query, $this->db);
return false; return false;
} }
if ($row =& $this->db->sql_fetchrow($dbresult)) { if ($row =& $this->db->sql_fetchrow($dbresult)) {
return $row; return $row;
} else { } else {
return array('tDescription'=>''); return array('tDescription'=>'');
} }
} }
function existsDescription($tag, $uId) {
$query = 'SELECT tag, uId, tDescription';
$query.= ' FROM '.$this->getTableName();
$query.= ' WHERE tag = "'.$tag.'"';
$query.= ' AND uId = "'.$uId.'"';
if (!($dbresult = & $this->db->sql_query($query))) { function existsDescription($tag, $uId) {
message_die(GENERAL_ERROR, 'Could not get tag description', '', __LINE__, __FILE__, $query, $this->db); $query = 'SELECT tag, uId, tDescription';
return false; $query.= ' FROM '.$this->getTableName();
} $query.= ' WHERE tag = "'.$tag.'"';
$query.= ' AND uId = "'.$uId.'"';
if ($row =& $this->db->sql_fetchrow($dbresult)) { if (!($dbresult = & $this->db->sql_query($query))) {
return true; message_die(GENERAL_ERROR, 'Could not get tag description', '', __LINE__, __FILE__, $query, $this->db);
} else { return false;
return false; }
}
}
function getAllDescriptions($tag) { if ($row =& $this->db->sql_fetchrow($dbresult)) {
$query = 'SELECT tag, uId, tDescription'; return true;
$query.= ' FROM '.$this->getTableName(); } else {
$query.= ' WHERE tag = "'.$tag.'"'; return false;
}
}
if (!($dbresult = & $this->db->sql_query($query))) { function getAllDescriptions($tag) {
message_die(GENERAL_ERROR, 'Could not get tag description', '', __LINE__, __FILE__, $query, $this->db); $query = 'SELECT tag, uId, tDescription';
return false; $query.= ' FROM '.$this->getTableName();
} $query.= ' WHERE tag = "'.$tag.'"';
return $this->db->sql_fetchrowset($dbresult); if (!($dbresult = & $this->db->sql_query($query))) {
} message_die(GENERAL_ERROR, 'Could not get tag description', '', __LINE__, __FILE__, $query, $this->db);
return false;
}
function updateDescription($tag, $uId, $desc) { return $this->db->sql_fetchrowset($dbresult);
if($this->existsDescription($tag, $uId)) { }
$query = 'UPDATE '.$this->getTableName();
$query.= ' SET tDescription="'.$this->db->sql_escape($desc).'"';
$query.= ' WHERE tag="'.$tag.'" AND uId="'.$uId.'"';
} else {
$values = array('tag'=>$tag, 'uId'=>$uId, 'tDescription'=>$desc);
$query = 'INSERT INTO '. $this->getTableName() .' '. $this->db->sql_build_array('INSERT', $values);
}
$this->db->sql_transaction('begin'); function updateDescription($tag, $uId, $desc) {
if (!($dbresult = & $this->db->sql_query($query))) { if($this->existsDescription($tag, $uId)) {
$this->db->sql_transaction('rollback'); $query = 'UPDATE '.$this->getTableName();
message_die(GENERAL_ERROR, 'Could not delete bookmarks', '', __LINE__, __FILE__, $query, $this->db); $query.= ' SET tDescription="'.$this->db->sql_escape($desc).'"';
return false; $query.= ' WHERE tag="'.$tag.'" AND uId="'.$uId.'"';
} } else {
$this->db->sql_transaction('commit'); $values = array('tag'=>$tag, 'uId'=>$uId, 'tDescription'=>$desc);
return true; $query = 'INSERT INTO '. $this->getTableName() .' '. $this->db->sql_build_array('INSERT', $values);
} }
function renameTag($uId, $oldName, $newName) { $this->db->sql_transaction('begin');
$newname = $this->normalize($newName); if (!($dbresult = & $this->db->sql_query($query))) {
$this->db->sql_transaction('rollback');
$query = 'UPDATE `'. $this->getTableName() .'`'; message_die(GENERAL_ERROR, 'Could not delete bookmarks', '', __LINE__, __FILE__, $query, $this->db);
$query.= ' SET tag="'.$newName.'"'; return false;
$query.= ' WHERE tag="'.$oldName.'"'; }
$query.= ' AND uId="'.$uId.'"'; $this->db->sql_transaction('commit');
$this->db->sql_query($query); return true;
return true; }
}
/* normalize the input tags which could be a string or an array*/
function normalize($tags) {
//clean tags from strange characters
$tags = str_replace(array('"', '\'', '/'), "_", $tags);
//normalize
if(!is_array($tags)) {
$tags = strtolower(trim($tags));
} else {
for($i=0; $i<count($tags); $i++) {
$tags[$i] = strtolower(trim($tags[$i]));
}
}
return $tags;
}
function deleteAll() { function renameTag($uId, $oldName, $newName) {
$query = 'TRUNCATE TABLE `'. $this->getTableName() .'`'; $newname = $this->normalize($newName);
$this->db->sql_query($query);
} $query = 'UPDATE `'. $this->getTableName() .'`';
$query.= ' SET tag="'.$newName.'"';
$query.= ' WHERE tag="'.$oldName.'"';
$query.= ' AND uId="'.$uId.'"';
$this->db->sql_query($query);
return true;
}
/* normalize the input tags which could be a string or an array*/
function normalize($tags) {
//clean tags from strange characters
$tags = str_replace(array('"', '\'', '/'), "_", $tags);
//normalize
if(!is_array($tags)) {
$tags = strtolower(trim($tags));
} else {
for($i=0; $i<count($tags); $i++) {
$tags[$i] = strtolower(trim($tags[$i]));
}
}
return $tags;
}
function deleteAll() {
$query = 'TRUNCATE TABLE `'. $this->getTableName() .'`';
$this->db->sql_query($query);
}
} }
?> ?>

View file

@ -8,376 +8,376 @@ class SemanticScuttle_Service_Tag2Tag extends SemanticScuttle_DbService
* *
* @return SemanticScuttle_Service * @return SemanticScuttle_Service
*/ */
public static function getInstance($db) public static function getInstance($db)
{ {
static $instance; static $instance;
if (!isset($instance)) { if (!isset($instance)) {
$instance = new self($db); $instance = new self($db);
} }
return $instance; return $instance;
} }
function __construct(&$db) function __construct(&$db)
{ {
$this->db =& $db; $this->db =& $db;
$this->tablename = $GLOBALS['tableprefix'] .'tags2tags'; $this->tablename = $GLOBALS['tableprefix'] .'tags2tags';
} }
function addLinkedTags($tag1, $tag2, $relationType, $uId) { function addLinkedTags($tag1, $tag2, $relationType, $uId) {
$tagservice =SemanticScuttle_Service_Factory::get('Tag'); $tagservice =SemanticScuttle_Service_Factory::get('Tag');
$tag1 = $tagservice->normalize($tag1); $tag1 = $tagservice->normalize($tag1);
$tag2 = $tagservice->normalize($tag2); $tag2 = $tagservice->normalize($tag2);
if($tag1 == $tag2 || strlen($tag1) == 0 || strlen($tag2) == 0 if($tag1 == $tag2 || strlen($tag1) == 0 || strlen($tag2) == 0
|| ($relationType != ">" && $relationType != "=") || ($relationType != ">" && $relationType != "=")
|| !is_numeric($uId) || $uId<=0 || !is_numeric($uId) || $uId<=0
|| ($this->existsLinkedTags($tag1, $tag2, $relationType, $uId))) { || ($this->existsLinkedTags($tag1, $tag2, $relationType, $uId))) {
return false; return false;
} }
$values = array('tag1' => $tag1, 'tag2' => $tag2, 'relationType'=> $relationType, 'uId'=> $uId); $values = array('tag1' => $tag1, 'tag2' => $tag2, 'relationType'=> $relationType, 'uId'=> $uId);
$query = 'INSERT INTO '. $this->getTableName() .' '. $this->db->sql_build_array('INSERT', $values); $query = 'INSERT INTO '. $this->getTableName() .' '. $this->db->sql_build_array('INSERT', $values);
//die($query); //die($query);
if (!($dbresult =& $this->db->sql_query($query))) { if (!($dbresult =& $this->db->sql_query($query))) {
$this->db->sql_transaction('rollback'); $this->db->sql_transaction('rollback');
message_die(GENERAL_ERROR, 'Could not attach tag to tag', '', __LINE__, __FILE__, $query, $this->db); message_die(GENERAL_ERROR, 'Could not attach tag to tag', '', __LINE__, __FILE__, $query, $this->db);
return false; return false;
} }
$this->db->sql_transaction('commit'); $this->db->sql_transaction('commit');
// Update stats and cache // Update stats and cache
$this->update($tag1, $tag2, $relationType, $uId); $this->update($tag1, $tag2, $relationType, $uId);
return true; return true;
} }
// Return linked tags just for admin users // Return linked tags just for admin users
function getAdminLinkedTags($tag, $relationType, $inverseRelation = false, $stopList = array()) { function getAdminLinkedTags($tag, $relationType, $inverseRelation = false, $stopList = array()) {
// look for admin ids // look for admin ids
$userservice = SemanticScuttle_Service_Factory :: get('User'); $userservice = SemanticScuttle_Service_Factory :: get('User');
$adminIds = $userservice->getAdminIds(); $adminIds = $userservice->getAdminIds();
//ask for their linked tags
return $this->getLinkedTags($tag, $relationType, $adminIds, $inverseRelation, $stopList);
}
// Return the target linked tags. If inverseRelation is true, return the source linked tags.
function getLinkedTags($tag, $relationType, $uId = null, $inverseRelation = false, $stopList = array()) {
// Set up the SQL query.
if($inverseRelation) {
$queriedTag = "tag1";
$givenTag = "tag2";
} else {
$queriedTag = "tag2";
$givenTag = "tag1";
}
$query = "SELECT DISTINCT ". $queriedTag ." as 'tag'"; //ask for their linked tags
$query.= " FROM `". $this->getTableName() ."`"; return $this->getLinkedTags($tag, $relationType, $adminIds, $inverseRelation, $stopList);
$query.= " WHERE 1=1"; }
if($tag !=null) {
$query.= " AND ". $givenTag ." = '". $tag ."'";
}
if($relationType) {
$query.= " AND relationType = '". $relationType ."'";
}
if(is_array($uId)) {
$query.= " AND ( 1=0 "; //tricks always false
foreach($uId as $u) {
$query.= " OR uId = '".$u."'";
}
$query.= " ) ";
} elseif($uId != null) {
$query.= " AND uId = '".$uId."'";
}
//die($query);
if (! ($dbresult =& $this->db->sql_query($query)) ){
message_die(GENERAL_ERROR, 'Could not get related tags', '', __LINE__, __FILE__, $query, $this->db);
return false;
}
$rowset = $this->db->sql_fetchrowset($dbresult); // Return the target linked tags. If inverseRelation is true, return the source linked tags.
$output = array(); function getLinkedTags($tag, $relationType, $uId = null, $inverseRelation = false, $stopList = array()) {
foreach($rowset as $row) { // Set up the SQL query.
if(!in_array($row['tag'], $stopList)) { if($inverseRelation) {
$output[] = $row['tag']; $queriedTag = "tag1";
} $givenTag = "tag2";
} } else {
$queriedTag = "tag2";
$givenTag = "tag1";
}
//bijective case for '=' $query = "SELECT DISTINCT ". $queriedTag ." as 'tag'";
if($relationType == '=' && $inverseRelation == false) { $query.= " FROM `". $this->getTableName() ."`";
//$stopList[] = $tag; $query.= " WHERE 1=1";
$bijectiveOutput = $this->getLinkedTags($tag, $relationType, $uId, true, $stopList); if($tag !=null) {
$output = array_merge($output, $bijectiveOutput); $query.= " AND ". $givenTag ." = '". $tag ."'";
//$output = array_unique($output); // remove duplication }
} if($relationType) {
$query.= " AND relationType = '". $relationType ."'";
}
if(is_array($uId)) {
$query.= " AND ( 1=0 "; //tricks always false
foreach($uId as $u) {
$query.= " OR uId = '".$u."'";
}
$query.= " ) ";
} elseif($uId != null) {
$query.= " AND uId = '".$uId."'";
}
//die($query);
if (! ($dbresult =& $this->db->sql_query($query)) ){
message_die(GENERAL_ERROR, 'Could not get related tags', '', __LINE__, __FILE__, $query, $this->db);
return false;
}
$this->db->sql_freeresult($dbresult); $rowset = $this->db->sql_fetchrowset($dbresult);
return $output; $output = array();
} foreach($rowset as $row) {
if(!in_array($row['tag'], $stopList)) {
$output[] = $row['tag'];
}
}
/* //bijective case for '='
* Returns all linked tags (all descendants if relation is >, if($relationType == '=' && $inverseRelation == false) {
* all synonyms if relation is = ) //$stopList[] = $tag;
* $stopList allows to avoid cycle (a > b > a) between tags $bijectiveOutput = $this->getLinkedTags($tag, $relationType, $uId, true, $stopList);
*/ $output = array_merge($output, $bijectiveOutput);
function getAllLinkedTags($tag1, $relationType, $uId, $stopList=array()) { //$output = array_unique($output); // remove duplication
if(in_array($tag1, $stopList) || $tag1 == '') { }
return array();
}
// try to find data in cache $this->db->sql_freeresult($dbresult);
$tcs = SemanticScuttle_Service_Factory::get('TagCache'); return $output;
if(count($stopList) == 0) { }
$activatedCache = true;
} else {
$activatedCache = false;
}
// look for existing links /*
$stopList[] = $tag1; * Returns all linked tags (all descendants if relation is >,
$linkedTags = $this->getLinkedTags($tag1, $relationType, $uId, false, $stopList); * all synonyms if relation is = )
if($relationType != '=') { * $stopList allows to avoid cycle (a > b > a) between tags
$linkedTags = array_merge($linkedTags, $this->getLinkedTags($tag1, '=', $uId, false, $stopList)); */
} function getAllLinkedTags($tag1, $relationType, $uId, $stopList=array()) {
if(in_array($tag1, $stopList) || $tag1 == '') {
return array();
}
if(count($linkedTags) == 0) { // try to find data in cache
return array(); $tcs = SemanticScuttle_Service_Factory::get('TagCache');
if(count($stopList) == 0) {
$activatedCache = true;
} else {
$activatedCache = false;
}
} else { // look for existing links
// use cache if possible $stopList[] = $tag1;
if($activatedCache) { $linkedTags = $this->getLinkedTags($tag1, $relationType, $uId, false, $stopList);
if($relationType == '>') { if($relationType != '=') {
$output = $tcs->getChildren($tag1, $uId); $linkedTags = array_merge($linkedTags, $this->getLinkedTags($tag1, '=', $uId, false, $stopList));
} elseif($relationType == '=') { }
$output = $tcs->getSynonyms($tag1, $uId);
}
if(count($output)>0) {
return $output;
}
}
// else compute the links if(count($linkedTags) == 0) {
$output = array(); return array();
foreach($linkedTags as $linkedTag) { } else {
$allLinkedTags = $this->getAllLinkedTags($linkedTag, $relationType, $uId, $stopList); // use cache if possible
$output[] = $linkedTag; if($activatedCache) {
if(is_array($allLinkedTags)) { if($relationType == '>') {
$output = array_merge($output, $allLinkedTags); $output = $tcs->getChildren($tag1, $uId);
} else { } elseif($relationType == '=') {
$output[] = $allLinkedTags; $output = $tcs->getSynonyms($tag1, $uId);
} }
} if(count($output)>0) {
return $output;
}
}
// and save in cache // else compute the links
if($activatedCache == true && $uId>0) { $output = array();
$tcs->updateTag($tag1, $relationType, $output, $uId);
}
//$output = array_unique($output); // remove duplication
return $output;
} foreach($linkedTags as $linkedTag) {
} $allLinkedTags = $this->getAllLinkedTags($linkedTag, $relationType, $uId, $stopList);
$output[] = $linkedTag;
if(is_array($allLinkedTags)) {
$output = array_merge($output, $allLinkedTags);
} else {
$output[] = $allLinkedTags;
}
}
function getOrphewTags($relationType, $uId = 0, $limit = null, $orderBy = null) { // and save in cache
$query = "SELECT DISTINCT tts.tag1 as tag"; if($activatedCache == true && $uId>0) {
$query.= " FROM `". $this->getTableName() ."` tts"; $tcs->updateTag($tag1, $relationType, $output, $uId);
if($orderBy != null) { }
$tsts =SemanticScuttle_Service_Factory::get('TagStat');
$query.= ", ".$tsts->getTableName() ." tsts";
}
$query.= " WHERE tts.tag1 <> ALL";
$query.= " (SELECT DISTINCT tag2 FROM `". $this->getTableName() ."`";
$query.= " WHERE relationType = '".$relationType."'";
if($uId > 0) {
$query.= " AND uId = '".$uId."'";
}
$query.= ")";
if($uId > 0) {
$query.= " AND tts.uId = '".$uId."'";
}
switch($orderBy) { //$output = array_unique($output); // remove duplication
case "nb": return $output;
$query.= " AND tts.tag1 = tsts.tag1";
$query.= " AND tsts.relationType = '".$relationType."'";
if($uId > 0) {
$query.= " AND tsts.uId = ".$uId;
}
$query.= " ORDER BY tsts.nb DESC";
break;
case "depth": // by nb of descendants
$query.= " AND tts.tag1 = tsts.tag1";
$query.= " AND tsts.relationType = '".$relationType."'";
if($uId > 0) {
$query.= " AND tsts.uId = ".$uId;
}
$query.= " ORDER BY tsts.depth DESC";
break;
case "nbupdate":
$query.= " AND tts.tag1 = tsts.tag1";
$query.= " AND tsts.relationType = '".$relationType."'";
if($uId > 0) {
$query.= " AND tsts.uId = ".$uId;
}
$query.= " ORDER BY tsts.nbupdate DESC";
break;
}
if($limit != null) { }
$query.= " LIMIT 0,".$limit; }
}
if (! ($dbresult =& $this->db->sql_query($query)) ){ function getOrphewTags($relationType, $uId = 0, $limit = null, $orderBy = null) {
message_die(GENERAL_ERROR, 'Could not get linked tags', '', __LINE__, __FILE__, $query, $this->db); $query = "SELECT DISTINCT tts.tag1 as tag";
return false; $query.= " FROM `". $this->getTableName() ."` tts";
} if($orderBy != null) {
$output = $this->db->sql_fetchrowset($dbresult); $tsts =SemanticScuttle_Service_Factory::get('TagStat');
$this->db->sql_freeresult($dbresult); $query.= ", ".$tsts->getTableName() ." tsts";
return $output; }
} $query.= " WHERE tts.tag1 <> ALL";
$query.= " (SELECT DISTINCT tag2 FROM `". $this->getTableName() ."`";
$query.= " WHERE relationType = '".$relationType."'";
if($uId > 0) {
$query.= " AND uId = '".$uId."'";
}
$query.= ")";
if($uId > 0) {
$query.= " AND tts.uId = '".$uId."'";
}
function getMenuTags($uId) { switch($orderBy) {
if(strlen($GLOBALS['menuTag']) < 1) { case "nb":
return array(); $query.= " AND tts.tag1 = tsts.tag1";
} else { $query.= " AND tsts.relationType = '".$relationType."'";
// we don't use the getAllLinkedTags function in order to improve performance if($uId > 0) {
$query = "SELECT tag2 as 'tag', COUNT(tag2) as 'count'"; $query.= " AND tsts.uId = ".$uId;
$query.= " FROM `". $this->getTableName() ."`"; }
$query.= " WHERE tag1 = '".$GLOBALS['menuTag']."'"; $query.= " ORDER BY tsts.nb DESC";
$query.= " AND relationType = '>'"; break;
if($uId > 0) { case "depth": // by nb of descendants
$query.= " AND uId = '".$uId."'"; $query.= " AND tts.tag1 = tsts.tag1";
} $query.= " AND tsts.relationType = '".$relationType."'";
$query.= " GROUP BY tag2"; if($uId > 0) {
$query.= " ORDER BY count DESC"; $query.= " AND tsts.uId = ".$uId;
$query.= " LIMIT 0, ".$GLOBALS['maxSizeMenuBlock']; }
$query.= " ORDER BY tsts.depth DESC";
break;
case "nbupdate":
$query.= " AND tts.tag1 = tsts.tag1";
$query.= " AND tsts.relationType = '".$relationType."'";
if($uId > 0) {
$query.= " AND tsts.uId = ".$uId;
}
$query.= " ORDER BY tsts.nbupdate DESC";
break;
}
if (! ($dbresult =& $this->db->sql_query($query)) ){ if($limit != null) {
message_die(GENERAL_ERROR, 'Could not get linked tags', '', __LINE__, __FILE__, $query, $this->db); $query.= " LIMIT 0,".$limit;
return false; }
}
$output = $this->db->sql_fetchrowset($dbresult); if (! ($dbresult =& $this->db->sql_query($query)) ){
$this->db->sql_freeresult($dbresult); message_die(GENERAL_ERROR, 'Could not get linked tags', '', __LINE__, __FILE__, $query, $this->db);
return $output; return false;
} }
} $output = $this->db->sql_fetchrowset($dbresult);
$this->db->sql_freeresult($dbresult);
return $output;
}
function getMenuTags($uId) {
if(strlen($GLOBALS['menuTag']) < 1) {
return array();
} else {
// we don't use the getAllLinkedTags function in order to improve performance
$query = "SELECT tag2 as 'tag', COUNT(tag2) as 'count'";
$query.= " FROM `". $this->getTableName() ."`";
$query.= " WHERE tag1 = '".$GLOBALS['menuTag']."'";
$query.= " AND relationType = '>'";
if($uId > 0) {
$query.= " AND uId = '".$uId."'";
}
$query.= " GROUP BY tag2";
$query.= " ORDER BY count DESC";
$query.= " LIMIT 0, ".$GLOBALS['maxSizeMenuBlock'];
if (! ($dbresult =& $this->db->sql_query($query)) ){
message_die(GENERAL_ERROR, 'Could not get linked tags', '', __LINE__, __FILE__, $query, $this->db);
return false;
}
$output = $this->db->sql_fetchrowset($dbresult);
$this->db->sql_freeresult($dbresult);
return $output;
}
}
function existsLinkedTags($tag1, $tag2, $relationType, $uId) { function existsLinkedTags($tag1, $tag2, $relationType, $uId) {
//$tag1 = mysql_real_escape_string($tag1); //$tag1 = mysql_real_escape_string($tag1);
//$tag2 = mysql_real_escape_string($tag2); //$tag2 = mysql_real_escape_string($tag2);
$query = "SELECT tag1, tag2, relationType, uId FROM `". $this->getTableName() ."`"; $query = "SELECT tag1, tag2, relationType, uId FROM `". $this->getTableName() ."`";
$query.= " WHERE tag1 = '" .$tag1 ."'"; $query.= " WHERE tag1 = '" .$tag1 ."'";
$query.= " AND tag2 = '".$tag2."'"; $query.= " AND tag2 = '".$tag2."'";
$query.= " AND relationType = '". $relationType ."'"; $query.= " AND relationType = '". $relationType ."'";
$query.= " AND uId = '".$uId."'"; $query.= " AND uId = '".$uId."'";
//echo($query."<br>\n"); //echo($query."<br>\n");
return $this->db->sql_numrows($this->db->sql_query($query)) > 0; return $this->db->sql_numrows($this->db->sql_query($query)) > 0;
} }
function getLinks($uId) { function getLinks($uId) {
$query = "SELECT tag1, tag2, relationType, uId FROM `". $this->getTableName() ."`"; $query = "SELECT tag1, tag2, relationType, uId FROM `". $this->getTableName() ."`";
$query.= " WHERE 1=1"; $query.= " WHERE 1=1";
if($uId > 0) { if($uId > 0) {
$query.= " AND uId = '".$uId."'"; $query.= " AND uId = '".$uId."'";
} }
return $this->db->sql_fetchrowset($this->db->sql_query($query)); return $this->db->sql_fetchrowset($this->db->sql_query($query));
} }
function removeLinkedTags($tag1, $tag2, $relationType, $uId) { function removeLinkedTags($tag1, $tag2, $relationType, $uId) {
if(($tag1 != '' && $tag1 == $tag2) || if(($tag1 != '' && $tag1 == $tag2) ||
($relationType != ">" && $relationType != "=" && $relationType != "") || ($relationType != ">" && $relationType != "=" && $relationType != "") ||
($tag1 == '' && $tag2 == '')) { ($tag1 == '' && $tag2 == '')) {
return false; return false;
} }
$query = 'DELETE FROM '. $this->getTableName(); $query = 'DELETE FROM '. $this->getTableName();
$query.= ' WHERE 1=1'; $query.= ' WHERE 1=1';
$query.= strlen($tag1)>0 ? ' AND tag1 = "'. $tag1 .'"' : ''; $query.= strlen($tag1)>0 ? ' AND tag1 = "'. $tag1 .'"' : '';
$query.= strlen($tag2)>0 ? ' AND tag2 = "'. $tag2 .'"' : ''; $query.= strlen($tag2)>0 ? ' AND tag2 = "'. $tag2 .'"' : '';
$query.= strlen($relationType)>0 ? ' AND relationType = "'. $relationType .'"' : ''; $query.= strlen($relationType)>0 ? ' AND relationType = "'. $relationType .'"' : '';
$query.= strlen($uId)>0 ? ' AND uId = "'. $uId .'"' : ''; $query.= strlen($uId)>0 ? ' AND uId = "'. $uId .'"' : '';
if (!($dbresult =& $this->db->sql_query($query))) { if (!($dbresult =& $this->db->sql_query($query))) {
message_die(GENERAL_ERROR, 'Could not remove tag relation', '', __LINE__, __FILE__, $query, $this->db); message_die(GENERAL_ERROR, 'Could not remove tag relation', '', __LINE__, __FILE__, $query, $this->db);
return false; return false;
} }
// Update stats and cache // Update stats and cache
$this->update($tag1, $tag2, $relationType, $uId); $this->update($tag1, $tag2, $relationType, $uId);
$this->db->sql_freeresult($dbresult);
return true;
}
function removeLinkedTagsForUser($uId) {
$query = 'DELETE FROM '. $this->getTableName();
$query.= ' WHERE uId = "'. $uId .'"';
if (!($dbresult =& $this->db->sql_query($query))) { $this->db->sql_freeresult($dbresult);
message_die(GENERAL_ERROR, 'Could not remove tag relation', '', __LINE__, __FILE__, $query, $this->db); return true;
return false; }
}
function removeLinkedTagsForUser($uId) {
$query = 'DELETE FROM '. $this->getTableName();
$query.= ' WHERE uId = "'. $uId .'"';
if (!($dbresult =& $this->db->sql_query($query))) {
message_die(GENERAL_ERROR, 'Could not remove tag relation', '', __LINE__, __FILE__, $query, $this->db);
return false;
}
// Update stats and cache // Update stats and cache
$this->update('', '', '', $uId); $this->update('', '', '', $uId);
$this->db->sql_freeresult($dbresult);
return true;
}
function renameTag($uId, $oldName, $newName) { $this->db->sql_freeresult($dbresult);
$tagservice =SemanticScuttle_Service_Factory::get('Tag'); return true;
$newName = $tagservice->normalize($newName); }
$query = 'UPDATE `'. $this->getTableName() .'`'; function renameTag($uId, $oldName, $newName) {
$query.= ' SET tag1="'.$newName.'"'; $tagservice =SemanticScuttle_Service_Factory::get('Tag');
$query.= ' WHERE tag1="'.$oldName.'"'; $newName = $tagservice->normalize($newName);
$query.= ' AND uId="'.$uId.'"';
$this->db->sql_query($query);
$query = 'UPDATE `'. $this->getTableName() .'`'; $query = 'UPDATE `'. $this->getTableName() .'`';
$query.= ' SET tag2="'.$newName.'"'; $query.= ' SET tag1="'.$newName.'"';
$query.= ' WHERE tag2="'.$oldName.'"'; $query.= ' WHERE tag1="'.$oldName.'"';
$query.= ' AND uId="'.$uId.'"'; $query.= ' AND uId="'.$uId.'"';
$this->db->sql_query($query); $this->db->sql_query($query);
$query = 'UPDATE `'. $this->getTableName() .'`';
$query.= ' SET tag2="'.$newName.'"';
$query.= ' WHERE tag2="'.$oldName.'"';
$query.= ' AND uId="'.$uId.'"';
$this->db->sql_query($query);
// Update stats and cache // Update stats and cache
$this->update($oldName, NULL, '=', $uId); $this->update($oldName, NULL, '=', $uId);
$this->update($oldName, NULL, '>', $uId); $this->update($oldName, NULL, '>', $uId);
$this->update($newName, NULL, '=', $uId); $this->update($newName, NULL, '=', $uId);
$this->update($newName, NULL, '>', $uId); $this->update($newName, NULL, '>', $uId);
return true; return true;
} }
function update($tag1, $tag2, $relationType, $uId) { function update($tag1, $tag2, $relationType, $uId) {
$tsts =SemanticScuttle_Service_Factory::get('TagStat'); $tsts =SemanticScuttle_Service_Factory::get('TagStat');
$tsts->updateStat($tag1, $relationType, $uId); $tsts->updateStat($tag1, $relationType, $uId);
$tcs = SemanticScuttle_Service_Factory::get('TagCache'); $tcs = SemanticScuttle_Service_Factory::get('TagCache');
$tcs->deleteByUser($uId); $tcs->deleteByUser($uId);
} }
function deleteAll() { function deleteAll() {
$query = 'TRUNCATE TABLE `'. $this->getTableName() .'`'; $query = 'TRUNCATE TABLE `'. $this->getTableName() .'`';
$this->db->sql_query($query); $this->db->sql_query($query);
$tsts =SemanticScuttle_Service_Factory::get('TagStat'); $tsts =SemanticScuttle_Service_Factory::get('TagStat');
$tsts->deleteAll(); $tsts->deleteAll();
} }
} }
?> ?>

View file

@ -20,338 +20,338 @@ class SemanticScuttle_Service_TagCache extends SemanticScuttle_DbService
* *
* @return SemanticScuttle_Service * @return SemanticScuttle_Service
*/ */
public static function getInstance($db) public static function getInstance($db)
{ {
static $instance; static $instance;
if (!isset($instance)) { if (!isset($instance)) {
$instance = new self($db); $instance = new self($db);
} }
return $instance; return $instance;
} }
protected function __construct($db) protected function __construct($db)
{ {
$this->db =$db; $this->db =$db;
$this->tablename = $GLOBALS['tableprefix'] .'tagscache'; $this->tablename = $GLOBALS['tableprefix'] .'tagscache';
} }
function getChildren($tag1, $uId) { function getChildren($tag1, $uId) {
$tagservice =SemanticScuttle_Service_Factory::get('Tag'); $tagservice =SemanticScuttle_Service_Factory::get('Tag');
$tag1 = $tagservice->normalize($tag1); $tag1 = $tagservice->normalize($tag1);
if($tag1 == '') return false; if($tag1 == '') return false;
$query = "SELECT DISTINCT tag2 as 'tag'"; $query = "SELECT DISTINCT tag2 as 'tag'";
$query.= " FROM `". $this->getTableName() ."`"; $query.= " FROM `". $this->getTableName() ."`";
$query.= " WHERE relationType = '>'"; $query.= " WHERE relationType = '>'";
$query.= " AND tag1 = '".$tag1."'"; $query.= " AND tag1 = '".$tag1."'";
$query.= " AND uId = '".$uId."'"; $query.= " AND uId = '".$uId."'";
//die($query); //die($query);
if (! ($dbresult =& $this->db->sql_query($query)) ){ if (! ($dbresult =& $this->db->sql_query($query)) ){
message_die(GENERAL_ERROR, 'Could not get related tags', '', __LINE__, __FILE__, $query, $this->db); message_die(GENERAL_ERROR, 'Could not get related tags', '', __LINE__, __FILE__, $query, $this->db);
return false; return false;
} }
$rowset = $this->db->sql_fetchrowset($dbresult); $rowset = $this->db->sql_fetchrowset($dbresult);
$output = array(); $output = array();
foreach($rowset as $row) { foreach($rowset as $row) {
$output[] = $row['tag']; $output[] = $row['tag'];
} }
$this->db->sql_freeresult($dbresult); $this->db->sql_freeresult($dbresult);
return $output; return $output;
} }
function addChild($tag1, $tag2, $uId) { function addChild($tag1, $tag2, $uId) {
$tagservice =SemanticScuttle_Service_Factory::get('Tag'); $tagservice =SemanticScuttle_Service_Factory::get('Tag');
$tag1 = $tagservice->normalize($tag1); $tag1 = $tagservice->normalize($tag1);
$tag2 = $tagservice->normalize($tag2); $tag2 = $tagservice->normalize($tag2);
if($tag1 == $tag2 || strlen($tag1) == 0 || strlen($tag2) == 0 if($tag1 == $tag2 || strlen($tag1) == 0 || strlen($tag2) == 0
|| ($this->existsChild($tag1, $tag2, $uId))) { || ($this->existsChild($tag1, $tag2, $uId))) {
return false; return false;
} }
$values = array('tag1' => $tag1, 'tag2' => $tag2, 'relationType'=> '>', 'uId'=> $uId); $values = array('tag1' => $tag1, 'tag2' => $tag2, 'relationType'=> '>', 'uId'=> $uId);
$query = 'INSERT INTO '. $this->getTableName() .' '. $this->db->sql_build_array('INSERT', $values); $query = 'INSERT INTO '. $this->getTableName() .' '. $this->db->sql_build_array('INSERT', $values);
//die($query); //die($query);
if (!($dbresult =& $this->db->sql_query($query))) { if (!($dbresult =& $this->db->sql_query($query))) {
$this->db->sql_transaction('rollback'); $this->db->sql_transaction('rollback');
message_die(GENERAL_ERROR, 'Could not add tag cache inference', '', __LINE__, __FILE__, $query, $this->db); message_die(GENERAL_ERROR, 'Could not add tag cache inference', '', __LINE__, __FILE__, $query, $this->db);
return false; return false;
} }
$this->db->sql_transaction('commit'); $this->db->sql_transaction('commit');
} }
function removeChild($tag1, $tag2, $uId) { function removeChild($tag1, $tag2, $uId) {
if(($tag1 != '' && $tag1 == $tag2) || if(($tag1 != '' && $tag1 == $tag2) ||
($tag1 == '' && $tag2 == '' && $uId == '')) { ($tag1 == '' && $tag2 == '' && $uId == '')) {
return false; return false;
} }
$query = 'DELETE FROM '. $this->getTableName(); $query = 'DELETE FROM '. $this->getTableName();
$query.= ' WHERE 1=1'; $query.= ' WHERE 1=1';
$query.= strlen($tag1)>0 ? ' AND tag1 = "'. $tag1 .'"' : ''; $query.= strlen($tag1)>0 ? ' AND tag1 = "'. $tag1 .'"' : '';
$query.= strlen($tag2)>0 ? ' AND tag2 = "'. $tag2 .'"' : ''; $query.= strlen($tag2)>0 ? ' AND tag2 = "'. $tag2 .'"' : '';
$query.= ' AND relationType = ">"'; $query.= ' AND relationType = ">"';
$query.= strlen($uId)>0 ? ' AND uId = "'. $uId .'"' : ''; $query.= strlen($uId)>0 ? ' AND uId = "'. $uId .'"' : '';
if (!($dbresult =& $this->db->sql_query($query))) { if (!($dbresult =& $this->db->sql_query($query))) {
message_die(GENERAL_ERROR, 'Could not remove tag cache inference', '', __LINE__, __FILE__, $query, $this->db); message_die(GENERAL_ERROR, 'Could not remove tag cache inference', '', __LINE__, __FILE__, $query, $this->db);
return false; return false;
} }
} }
function removeChildren($tag1, $uId) {
$this->removeChild($tag1, NULL, $uId);
}
function existsChild($tag1, $tag2, $uId) { function removeChildren($tag1, $uId) {
$tagservice =SemanticScuttle_Service_Factory::get('Tag'); $this->removeChild($tag1, NULL, $uId);
$tag1 = $tagservice->normalize($tag1); }
$tag2 = $tagservice->normalize($tag2);
$query = "SELECT tag1, tag2, relationType, uId FROM `". $this->getTableName() ."`"; function existsChild($tag1, $tag2, $uId) {
$query.= " WHERE tag1 = '" .$tag1 ."'"; $tagservice =SemanticScuttle_Service_Factory::get('Tag');
$query.= " AND tag2 = '".$tag2."'"; $tag1 = $tagservice->normalize($tag1);
$query.= " AND relationType = '>'"; $tag2 = $tagservice->normalize($tag2);
$query.= " AND uId = '".$uId."'";
//echo($query."<br>\n"); $query = "SELECT tag1, tag2, relationType, uId FROM `". $this->getTableName() ."`";
$query.= " WHERE tag1 = '" .$tag1 ."'";
$query.= " AND tag2 = '".$tag2."'";
$query.= " AND relationType = '>'";
$query.= " AND uId = '".$uId."'";
return $this->db->sql_numrows($this->db->sql_query($query)) > 0; //echo($query."<br>\n");
} return $this->db->sql_numrows($this->db->sql_query($query)) > 0;
/* }
* Synonyms of a same concept are a group. A group has one main synonym called key
* and a list of synonyms called values.
*/
function addSynonym($tag1, $tag2, $uId) {
if($tag1 == $tag2 || strlen($tag1) == 0 || strlen($tag2) == 0 /*
|| ($this->existsSynonym($tag1, $tag2, $uId))) { * Synonyms of a same concept are a group. A group has one main synonym called key
return false; * and a list of synonyms called values.
} */
function addSynonym($tag1, $tag2, $uId) {
$case1 = '0'; // not in DB if($tag1 == $tag2 || strlen($tag1) == 0 || strlen($tag2) == 0
if($this->_isSynonymKey($tag1, $uId)) { || ($this->existsSynonym($tag1, $tag2, $uId))) {
$case1 = 'key'; return false;
} elseif($this->_isSynonymValue($tag1, $uId)) { }
$case1 = 'value';
}
$case2 = '0'; // not in DB $case1 = '0'; // not in DB
if($this->_isSynonymKey($tag2, $uId)) { if($this->_isSynonymKey($tag1, $uId)) {
$case2 = 'key'; $case1 = 'key';
} elseif($this->_isSynonymValue($tag2, $uId)) { } elseif($this->_isSynonymValue($tag1, $uId)) {
$case2 = 'value'; $case1 = 'value';
} }
$case = $case1.$case2;
// all the possible cases $case2 = '0'; // not in DB
switch ($case) { if($this->_isSynonymKey($tag2, $uId)) {
case 'keykey': $case2 = 'key';
$values = $this->_getSynonymValues($tag2, $uId); } elseif($this->_isSynonymValue($tag2, $uId)) {
$this->removeSynonymGroup($tag2, $uId); $case2 = 'value';
foreach($values as $value) { }
$this->addSynonym($tag1, $value['tag'], $uId); $case = $case1.$case2;
}
$this->addSynonym($tag1, $tag2, $uId);
break;
case 'valuekey': // all the possible cases
$key = $this->_getSynonymKey($tag1, $uId); switch ($case) {
$this->addSynonym($key, $tag2, $uId); case 'keykey':
break; $values = $this->_getSynonymValues($tag2, $uId);
$this->removeSynonymGroup($tag2, $uId);
foreach($values as $value) {
$this->addSynonym($tag1, $value['tag'], $uId);
}
$this->addSynonym($tag1, $tag2, $uId);
break;
case 'keyvalue': case 'valuekey':
$this->addSynonym($tag2, $tag1, $uId); $key = $this->_getSynonymKey($tag1, $uId);
break; $this->addSynonym($key, $tag2, $uId);
case 'valuevalue': break;
$key1 = $this->_getSynonymKey($tag1, $uId);
$key2 = $this->_getSynonymKey($tag2, $uId);
$this->addSynonym($key1, $key2, $uId);
break;
case '0value':
$key = $this->_getSynonymKey($tag2, $uId);
$this->addSynonym($key, $tag1, $uId);
break;
case 'value0':
$this->addSynonym($tag2, $tag1, $uId);
break;
case '0key':
$this->addSynonym($tag2, $tag1, $uId);
break;
default:
$values = array('tag1' => $tag1, 'tag2' => $tag2, 'relationType'=> '=', 'uId'=> $uId);
$query = 'INSERT INTO '. $this->getTableName() .' '. $this->db->sql_build_array('INSERT', $values);
//die($query);
if (!($dbresult =& $this->db->sql_query($query))) {
$this->db->sql_transaction('rollback');
message_die(GENERAL_ERROR, 'Could not add tag cache synonymy', '', __LINE__, __FILE__, $query, $this->db);
return false;
}
$this->db->sql_transaction('commit');
break;
}
}
function removeSynonymGroup($tag1, $uId) { case 'keyvalue':
$query = 'DELETE FROM '. $this->getTableName(); $this->addSynonym($tag2, $tag1, $uId);
$query.= ' WHERE 1=1'; break;
$query.= ' AND tag1 = "'. $tag1 .'"'; case 'valuevalue':
$query.= ' AND relationType = "="'; $key1 = $this->_getSynonymKey($tag1, $uId);
$query.= ' AND uId = "'. $uId .'"'; $key2 = $this->_getSynonymKey($tag2, $uId);
$this->addSynonym($key1, $key2, $uId);
break;
case '0value':
$key = $this->_getSynonymKey($tag2, $uId);
$this->addSynonym($key, $tag1, $uId);
break;
case 'value0':
$this->addSynonym($tag2, $tag1, $uId);
break;
case '0key':
$this->addSynonym($tag2, $tag1, $uId);
break;
default:
$values = array('tag1' => $tag1, 'tag2' => $tag2, 'relationType'=> '=', 'uId'=> $uId);
$query = 'INSERT INTO '. $this->getTableName() .' '. $this->db->sql_build_array('INSERT', $values);
//die($query);
if (!($dbresult =& $this->db->sql_query($query))) {
$this->db->sql_transaction('rollback');
message_die(GENERAL_ERROR, 'Could not add tag cache synonymy', '', __LINE__, __FILE__, $query, $this->db);
return false;
}
$this->db->sql_transaction('commit');
break;
}
}
if (!($dbresult =& $this->db->sql_query($query))) { function removeSynonymGroup($tag1, $uId) {
message_die(GENERAL_ERROR, 'Could not remove tag cache inference', '', __LINE__, __FILE__, $query, $this->db); $query = 'DELETE FROM '. $this->getTableName();
return false; $query.= ' WHERE 1=1';
} $query.= ' AND tag1 = "'. $tag1 .'"';
} $query.= ' AND relationType = "="';
$query.= ' AND uId = "'. $uId .'"';
function _isSynonymKey($tag1, $uId) { if (!($dbresult =& $this->db->sql_query($query))) {
$tagservice =SemanticScuttle_Service_Factory::get('Tag'); message_die(GENERAL_ERROR, 'Could not remove tag cache inference', '', __LINE__, __FILE__, $query, $this->db);
$tag1 = $tagservice->normalize($tag1); return false;
}
}
$query = "SELECT tag1 FROM `". $this->getTableName() ."`"; function _isSynonymKey($tag1, $uId) {
$query.= " WHERE tag1 = '" .$tag1 ."'"; $tagservice =SemanticScuttle_Service_Factory::get('Tag');
$query.= " AND relationType = '='"; $tag1 = $tagservice->normalize($tag1);
$query.= " AND uId = '".$uId."'";
return $this->db->sql_numrows($this->db->sql_query($query)) > 0; $query = "SELECT tag1 FROM `". $this->getTableName() ."`";
} $query.= " WHERE tag1 = '" .$tag1 ."'";
$query.= " AND relationType = '='";
$query.= " AND uId = '".$uId."'";
function _isSynonymValue($tag2, $uId) { return $this->db->sql_numrows($this->db->sql_query($query)) > 0;
$tagservice =SemanticScuttle_Service_Factory::get('Tag'); }
$tag2 = $tagservice->normalize($tag2);
$query = "SELECT tag2 FROM `". $this->getTableName() ."`"; function _isSynonymValue($tag2, $uId) {
$query.= " WHERE tag2 = '" .$tag2 ."'"; $tagservice =SemanticScuttle_Service_Factory::get('Tag');
$query.= " AND relationType = '='"; $tag2 = $tagservice->normalize($tag2);
$query.= " AND uId = '".$uId."'";
return $this->db->sql_numrows($this->db->sql_query($query)) > 0; $query = "SELECT tag2 FROM `". $this->getTableName() ."`";
} $query.= " WHERE tag2 = '" .$tag2 ."'";
$query.= " AND relationType = '='";
$query.= " AND uId = '".$uId."'";
function getSynonyms($tag1, $uId) { return $this->db->sql_numrows($this->db->sql_query($query)) > 0;
$values = array(); }
if($this->_isSynonymKey($tag1, $uId)) {
$values = $this->_getSynonymValues($tag1, $uId);
} elseif($this->_isSynonymValue($tag1, $uId)) {
$key = $this->_getSynonymKey($tag1, $uId);
$values = $this->_getSynonymValues($key, $uId, $tag1);
$values[] = $key;
}
return $values;
}
function _getSynonymKey($tag2, $uId) { function getSynonyms($tag1, $uId) {
$tagservice =SemanticScuttle_Service_Factory::get('Tag'); $values = array();
$tag2 = $tagservice->normalize($tag2); if($this->_isSynonymKey($tag1, $uId)) {
$values = $this->_getSynonymValues($tag1, $uId);
} elseif($this->_isSynonymValue($tag1, $uId)) {
$key = $this->_getSynonymKey($tag1, $uId);
$values = $this->_getSynonymValues($key, $uId, $tag1);
$values[] = $key;
}
return $values;
}
if($this->_isSynonymKey($tag2)) return $tag2; function _getSynonymKey($tag2, $uId) {
$tagservice =SemanticScuttle_Service_Factory::get('Tag');
if($tag2 == '') return false; $tag2 = $tagservice->normalize($tag2);
$query = "SELECT DISTINCT tag1 as 'tag'"; if($this->_isSynonymKey($tag2)) return $tag2;
$query.= " FROM `". $this->getTableName() ."`";
$query.= " WHERE relationType = '='";
$query.= " AND tag2 = '".$tag2."'";
$query.= " AND uId = '".$uId."'";
//die($query); if($tag2 == '') return false;
if (! ($dbresult =& $this->db->sql_query($query)) ){
message_die(GENERAL_ERROR, 'Could not get related tags', '', __LINE__, __FILE__, $query, $this->db);
return false;
}
$row = $this->db->sql_fetchrow($dbresult); $query = "SELECT DISTINCT tag1 as 'tag'";
$this->db->sql_freeresult($dbresult); $query.= " FROM `". $this->getTableName() ."`";
return $row['tag']; $query.= " WHERE relationType = '='";
} $query.= " AND tag2 = '".$tag2."'";
$query.= " AND uId = '".$uId."'";
/* //die($query);
* Return values associated with a key. if (! ($dbresult =& $this->db->sql_query($query)) ){
* $tagExcepted allows to hide a value. message_die(GENERAL_ERROR, 'Could not get related tags', '', __LINE__, __FILE__, $query, $this->db);
*/ return false;
function _getSynonymValues($tag1, $uId, $tagExcepted = NULL) { }
$tagservice =SemanticScuttle_Service_Factory::get('Tag');
$tag1 = $tagservice->normalize($tag1);
$tagExcepted = $tagservice->normalize($tagExcepted);
if($tag1 == '') return false; $row = $this->db->sql_fetchrow($dbresult);
$this->db->sql_freeresult($dbresult);
return $row['tag'];
}
$query = "SELECT DISTINCT tag2 as 'tag'"; /*
$query.= " FROM `". $this->getTableName() ."`"; * Return values associated with a key.
$query.= " WHERE relationType = '='"; * $tagExcepted allows to hide a value.
$query.= " AND tag1 = '".$tag1."'"; */
$query.= " AND uId = '".$uId."'"; function _getSynonymValues($tag1, $uId, $tagExcepted = NULL) {
$query.= $tagExcepted!=''?" AND tag2!='".$tagExcepted."'":""; $tagservice =SemanticScuttle_Service_Factory::get('Tag');
$tag1 = $tagservice->normalize($tag1);
$tagExcepted = $tagservice->normalize($tagExcepted);
if (! ($dbresult =& $this->db->sql_query($query)) ){ if($tag1 == '') return false;
message_die(GENERAL_ERROR, 'Could not get related tags', '', __LINE__, __FILE__, $query, $this->db);
return false;
}
$rowset = $this->db->sql_fetchrowset($dbresult); $query = "SELECT DISTINCT tag2 as 'tag'";
$query.= " FROM `". $this->getTableName() ."`";
$query.= " WHERE relationType = '='";
$query.= " AND tag1 = '".$tag1."'";
$query.= " AND uId = '".$uId."'";
$query.= $tagExcepted!=''?" AND tag2!='".$tagExcepted."'":"";
$output = array(); if (! ($dbresult =& $this->db->sql_query($query)) ){
foreach($rowset as $row) { message_die(GENERAL_ERROR, 'Could not get related tags', '', __LINE__, __FILE__, $query, $this->db);
$output[] = $row['tag']; return false;
} }
$this->db->sql_freeresult($dbresult);
return $output;
}
function existsSynonym($tag1, $tag2, $uId) { $rowset = $this->db->sql_fetchrowset($dbresult);
if($this->_getSynonymKey($tag1, $uId) == $tag2 || $this->_getSynonymKey($tag2, $uId) == $tag1) {
return true; $output = array();
} else { foreach($rowset as $row) {
return false; $output[] = $row['tag'];
} }
}
$this->db->sql_freeresult($dbresult);
return $output;
}
function existsSynonym($tag1, $tag2, $uId) {
if($this->_getSynonymKey($tag1, $uId) == $tag2 || $this->_getSynonymKey($tag2, $uId) == $tag1) {
return true;
} else {
return false;
}
}
function updateTag($tag1, $relationType, $otherTags, $uId) { function updateTag($tag1, $relationType, $otherTags, $uId) {
if($relationType == '=') { if($relationType == '=') {
if($this->getSynonyms($tag1, $uId)) { // remove previous data avoiding unconstistency if($this->getSynonyms($tag1, $uId)) { // remove previous data avoiding unconstistency
$this->removeSynonymGroup($tag1, $uId); $this->removeSynonymGroup($tag1, $uId);
} }
foreach($otherTags as $tag2) {
$this->addSynonym($tag1, $tag2, $uId);
}
} elseif($relationType == '>') {
if(count($this->getChildren($tag1, $uId))>0) { // remove previous data avoiding unconstistency
$this->removeChildren($tag1);
}
foreach($otherTags as $tag2) {
$this->addChild($tag1, $tag2, $uId);
}
}
}
function deleteByUser($uId) { foreach($otherTags as $tag2) {
$query = 'DELETE FROM '. $this->getTableName() .' WHERE uId = '. intval($uId); $this->addSynonym($tag1, $tag2, $uId);
}
} elseif($relationType == '>') {
if(count($this->getChildren($tag1, $uId))>0) { // remove previous data avoiding unconstistency
$this->removeChildren($tag1);
}
if (!($dbresult = & $this->db->sql_query($query))) { foreach($otherTags as $tag2) {
message_die(GENERAL_ERROR, 'Could not delete user tags cache', '', __LINE__, __FILE__, $query, $this->db); $this->addChild($tag1, $tag2, $uId);
return false; }
} }
}
return true; function deleteByUser($uId) {
$query = 'DELETE FROM '. $this->getTableName() .' WHERE uId = '. intval($uId);
} if (!($dbresult = & $this->db->sql_query($query))) {
message_die(GENERAL_ERROR, 'Could not delete user tags cache', '', __LINE__, __FILE__, $query, $this->db);
return false;
}
function deleteAll() { return true;
$query = 'TRUNCATE TABLE `'. $this->getTableName() .'`';
$this->db->sql_query($query); }
}
function deleteAll() {
$query = 'TRUNCATE TABLE `'. $this->getTableName() .'`';
$this->db->sql_query($query);
}
} }
?> ?>

View file

@ -8,191 +8,191 @@ class SemanticScuttle_Service_TagStat extends SemanticScuttle_DbService
* *
* @return SemanticScuttle_Service * @return SemanticScuttle_Service
*/ */
public static function getInstance($db) public static function getInstance($db)
{ {
static $instance; static $instance;
if (!isset($instance)) { if (!isset($instance)) {
$instance = new self($db); $instance = new self($db);
} }
return $instance; return $instance;
} }
protected function __construct($db) protected function __construct($db)
{ {
$this->db = $db; $this->db = $db;
$this->tablename = $GLOBALS['tableprefix'] .'tagsstats'; $this->tablename = $GLOBALS['tableprefix'] .'tagsstats';
} }
function getNbChildren($tag1, $relationType, $uId) { function getNbChildren($tag1, $relationType, $uId) {
$tts =SemanticScuttle_Service_Factory::get('Tag2Tag'); $tts =SemanticScuttle_Service_Factory::get('Tag2Tag');
$query = "SELECT tag1, relationType, uId FROM `". $tts->getTableName() ."`"; $query = "SELECT tag1, relationType, uId FROM `". $tts->getTableName() ."`";
$query.= " WHERE tag1 = '" .$tag1 ."'"; $query.= " WHERE tag1 = '" .$tag1 ."'";
$query.= " AND relationType = '". $relationType ."'"; $query.= " AND relationType = '". $relationType ."'";
$query.= " AND uId = '".$uId."'"; $query.= " AND uId = '".$uId."'";
return $this->db->sql_numrows($this->db->sql_query($query)); return $this->db->sql_numrows($this->db->sql_query($query));
} }
function getNbDescendants($tag1, $relationType, $uId) { function getNbDescendants($tag1, $relationType, $uId) {
$query = "SELECT nb FROM `". $this->getTableName() ."`"; $query = "SELECT nb FROM `". $this->getTableName() ."`";
$query.= " WHERE tag1 = '" .$tag1 ."'"; $query.= " WHERE tag1 = '" .$tag1 ."'";
$query.= " AND relationType = '". $relationType ."'"; $query.= " AND relationType = '". $relationType ."'";
$query.= " AND uId = '".$uId."'"; $query.= " AND uId = '".$uId."'";
$dbresults =& $this->db->sql_query($query); $dbresults =& $this->db->sql_query($query);
$row = $this->db->sql_fetchrow($dbresults); $row = $this->db->sql_fetchrow($dbresults);
if($row['nb'] == null) { if($row['nb'] == null) {
return 0; return 0;
} else { } else {
return (int) $row['nb']; return (int) $row['nb'];
} }
} }
function getMaxDepth($tag1, $relationType, $uId) { function getMaxDepth($tag1, $relationType, $uId) {
$query = "SELECT depth FROM `". $this->getTableName() ."`"; $query = "SELECT depth FROM `". $this->getTableName() ."`";
$query.= " WHERE tag1 = '" .$tag1 ."'"; $query.= " WHERE tag1 = '" .$tag1 ."'";
$query.= " AND relationType = '". $relationType ."'"; $query.= " AND relationType = '". $relationType ."'";
$query.= " AND uId = '".$uId."'"; $query.= " AND uId = '".$uId."'";
$dbresults =& $this->db->sql_query($query); $dbresults =& $this->db->sql_query($query);
$row = $this->db->sql_fetchrow($dbresults); $row = $this->db->sql_fetchrow($dbresults);
if($row['depth'] == null) { if($row['depth'] == null) {
return 0; return 0;
} else { } else {
return (int) $row['depth']; return (int) $row['depth'];
}; };
} }
function getNbUpdates($tag1, $relationType, $uId) { function getNbUpdates($tag1, $relationType, $uId) {
$query = "SELECT nbupdate FROM `". $this->getTableName() ."`"; $query = "SELECT nbupdate FROM `". $this->getTableName() ."`";
$query.= " WHERE tag1 = '" .$tag1 ."'"; $query.= " WHERE tag1 = '" .$tag1 ."'";
$query.= " AND relationType = '". $relationType ."'"; $query.= " AND relationType = '". $relationType ."'";
$query.= " AND uId = '".$uId."'"; $query.= " AND uId = '".$uId."'";
$dbresults =& $this->db->sql_query($query); $dbresults =& $this->db->sql_query($query);
$row = $this->db->sql_fetchrow($dbresults); $row = $this->db->sql_fetchrow($dbresults);
if($row['nbupdate'] == null) { if($row['nbupdate'] == null) {
return 0; return 0;
} else { } else {
return (int) $row['nbupdate']; return (int) $row['nbupdate'];
} }
} }
function existStat($tag1, $relationType, $uId) { function existStat($tag1, $relationType, $uId) {
$query = "SELECT tag1, relationType, uId FROM `". $this->getTableName() ."`"; $query = "SELECT tag1, relationType, uId FROM `". $this->getTableName() ."`";
$query.= " WHERE tag1 = '" .$tag1 ."'"; $query.= " WHERE tag1 = '" .$tag1 ."'";
$query.= " AND relationType = '". $relationType ."'"; $query.= " AND relationType = '". $relationType ."'";
$query.= " AND uId = '".$uId."'"; $query.= " AND uId = '".$uId."'";
return $this->db->sql_numrows($this->db->sql_query($query))>0; return $this->db->sql_numrows($this->db->sql_query($query))>0;
} }
function createStat($tag1, $relationType, $uId) { function createStat($tag1, $relationType, $uId) {
$query = "INSERT INTO `". $this->getTableName() ."`"; $query = "INSERT INTO `". $this->getTableName() ."`";
$query.= "(tag1, relationType, uId)"; $query.= "(tag1, relationType, uId)";
$query.= " VALUES ('".$tag1."','".$relationType."','".$uId."')"; $query.= " VALUES ('".$tag1."','".$relationType."','".$uId."')";
$this->db->sql_query($query); $this->db->sql_query($query);
} }
function updateStat($tag1, $relationType, $uId=null, $stoplist=array()) { function updateStat($tag1, $relationType, $uId=null, $stoplist=array()) {
if(in_array($tag1, $stoplist)) { if(in_array($tag1, $stoplist)) {
return false; return false;
} }
$tts =SemanticScuttle_Service_Factory::get('Tag2Tag'); $tts =SemanticScuttle_Service_Factory::get('Tag2Tag');
$linkedTags = $tts->getLinkedTags($tag1, $relationType, $uId); $linkedTags = $tts->getLinkedTags($tag1, $relationType, $uId);
$nbDescendants = 0; $nbDescendants = 0;
$maxDepth = 0; $maxDepth = 0;
foreach($linkedTags as $linkedTag) { foreach($linkedTags as $linkedTag) {
$nbDescendants+= 1 + $this->getNbDescendants($linkedTag, $relationType, $uId); $nbDescendants+= 1 + $this->getNbDescendants($linkedTag, $relationType, $uId);
$maxDepth = max($maxDepth, 1 + $this->getMaxDepth($linkedTag, $relationType, $uId)); $maxDepth = max($maxDepth, 1 + $this->getMaxDepth($linkedTag, $relationType, $uId));
} }
$this->setNbDescendants($tag1, $relationType, $uId, $nbDescendants); $this->setNbDescendants($tag1, $relationType, $uId, $nbDescendants);
$this->setMaxDepth($tag1, $relationType, $uId, $maxDepth); $this->setMaxDepth($tag1, $relationType, $uId, $maxDepth);
$this->increaseNbUpdate($tag1, $relationType, $uId); $this->increaseNbUpdate($tag1, $relationType, $uId);
// propagation to the precedent tags // propagation to the precedent tags
$linkedTags = $tts->getLinkedTags($tag1, $relationType, $uId, true); $linkedTags = $tts->getLinkedTags($tag1, $relationType, $uId, true);
$stoplist[] = $tag1; $stoplist[] = $tag1;
foreach($linkedTags as $linkedTag) { foreach($linkedTags as $linkedTag) {
$this->updateStat($linkedTag, $relationType, $uId, $stoplist); $this->updateStat($linkedTag, $relationType, $uId, $stoplist);
} }
} }
function updateAllStat() { function updateAllStat() {
$tts =SemanticScuttle_Service_Factory::get('Tag2Tag'); $tts =SemanticScuttle_Service_Factory::get('Tag2Tag');
$query = "SELECT tag1, uId FROM `". $tts->getTableName() ."`"; $query = "SELECT tag1, uId FROM `". $tts->getTableName() ."`";
$query.= " WHERE relationType = '>'"; $query.= " WHERE relationType = '>'";
//die($query); //die($query);
if (! ($dbresult =& $this->db->sql_query($query)) ){ if (! ($dbresult =& $this->db->sql_query($query)) ){
message_die(GENERAL_ERROR, 'Could not update stats', '', __LINE__, __FILE__, $query, $this->db); message_die(GENERAL_ERROR, 'Could not update stats', '', __LINE__, __FILE__, $query, $this->db);
return false; return false;
} }
$rowset = $this->db->sql_fetchrowset($dbresult); $rowset = $this->db->sql_fetchrowset($dbresult);
foreach($rowset as $row) { foreach($rowset as $row) {
$this->updateStat($row['tag1'], '>', $row['uId']); $this->updateStat($row['tag1'], '>', $row['uId']);
} }
} }
function setNbDescendants($tag1, $relationType, $uId, $nb) { function setNbDescendants($tag1, $relationType, $uId, $nb) {
if(!$this->existStat($tag1, $relationType, $uId)) { if(!$this->existStat($tag1, $relationType, $uId)) {
$this->createStat($tag1, $relationType, $uId); $this->createStat($tag1, $relationType, $uId);
} }
$query = "UPDATE `". $this->getTableName() ."`"; $query = "UPDATE `". $this->getTableName() ."`";
$query.= " SET nb = ". $nb; $query.= " SET nb = ". $nb;
$query.= " WHERE tag1 = '" .$tag1 ."'"; $query.= " WHERE tag1 = '" .$tag1 ."'";
$query.= " AND relationType = '". $relationType ."'"; $query.= " AND relationType = '". $relationType ."'";
$query.= " AND uId = '".$uId."'"; $query.= " AND uId = '".$uId."'";
$this->db->sql_query($query); $this->db->sql_query($query);
} }
function setMaxDepth($tag1, $relationType, $uId, $depth) { function setMaxDepth($tag1, $relationType, $uId, $depth) {
if(!$this->existStat($tag1, $relationType, $uId)) { if(!$this->existStat($tag1, $relationType, $uId)) {
$this->createStat($tag1, $relationType, $uId); $this->createStat($tag1, $relationType, $uId);
} }
$query = "UPDATE `". $this->getTableName() ."`"; $query = "UPDATE `". $this->getTableName() ."`";
$query.= " SET depth = ". $depth; $query.= " SET depth = ". $depth;
$query.= " WHERE tag1 = '" .$tag1 ."'"; $query.= " WHERE tag1 = '" .$tag1 ."'";
$query.= " AND relationType = '". $relationType ."'"; $query.= " AND relationType = '". $relationType ."'";
$query.= " AND uId = '".$uId."'"; $query.= " AND uId = '".$uId."'";
$this->db->sql_query($query); $this->db->sql_query($query);
} }
function increaseNbUpdate($tag1, $relationType, $uId) { function increaseNbUpdate($tag1, $relationType, $uId) {
if(!$this->existStat($tag1, $relationType, $uId)) { if(!$this->existStat($tag1, $relationType, $uId)) {
$this->createStat($tag1, $relationType, $uId); $this->createStat($tag1, $relationType, $uId);
} }
$query = "UPDATE `". $this->getTableName() ."`"; $query = "UPDATE `". $this->getTableName() ."`";
$query.= " SET nbupdate = nbupdate + 1"; $query.= " SET nbupdate = nbupdate + 1";
$query.= " WHERE tag1 = '" .$tag1 ."'"; $query.= " WHERE tag1 = '" .$tag1 ."'";
$query.= " AND relationType = '". $relationType ."'"; $query.= " AND relationType = '". $relationType ."'";
$query.= " AND uId = '".$uId."'"; $query.= " AND uId = '".$uId."'";
//die($query); //die($query);
$this->db->sql_query($query); $this->db->sql_query($query);
} }
function deleteTagStatForUser($uId) { function deleteTagStatForUser($uId) {
$query = 'DELETE FROM '. $this->getTableName() .' WHERE uId = '. intval($uId); $query = 'DELETE FROM '. $this->getTableName() .' WHERE uId = '. intval($uId);
if (!($dbresult = & $this->db->sql_query($query))) { if (!($dbresult = & $this->db->sql_query($query))) {
message_die(GENERAL_ERROR, 'Could not delete tag stats', '', __LINE__, message_die(GENERAL_ERROR, 'Could not delete tag stats', '', __LINE__,
__FILE__, $query, $this->db); __FILE__, $query, $this->db);
return false; return false;
} }
return true; return true;
} }
function deleteAll() { function deleteAll() {
$query = 'TRUNCATE TABLE `'. $this->getTableName() .'`'; $query = 'TRUNCATE TABLE `'. $this->getTableName() .'`';
$this->db->sql_query($query); $this->db->sql_query($query);
} }
} }
?> ?>

View file

@ -1,7 +1,7 @@
<?php <?php
class SemanticScuttle_Service_Template extends SemanticScuttle_Service class SemanticScuttle_Service_Template extends SemanticScuttle_Service
{ {
protected $basedir; protected $basedir;
/** /**
* Returns the single service instance * Returns the single service instance
@ -10,48 +10,48 @@ class SemanticScuttle_Service_Template extends SemanticScuttle_Service
* *
* @return SemanticScuttle_Service * @return SemanticScuttle_Service
*/ */
public static function getInstance($db) public static function getInstance($db)
{ {
static $instance; static $instance;
if (!isset($instance)) { if (!isset($instance)) {
$instance = new self($db); $instance = new self($db);
} }
return $instance; return $instance;
} }
public function __construct() public function __construct()
{ {
$this->basedir = $GLOBALS['TEMPLATES_DIR']; $this->basedir = $GLOBALS['TEMPLATES_DIR'];
} }
function loadTemplate($template, $vars = NULL) { function loadTemplate($template, $vars = NULL) {
if (substr($template, -4) != '.php') if (substr($template, -4) != '.php')
$template .= '.php'; $template .= '.php';
$tpl =& new Template($this->basedir .'/'. $template, $vars, $this); $tpl =& new Template($this->basedir .'/'. $template, $vars, $this);
$tpl->parse(); $tpl->parse();
return $tpl; return $tpl;
} }
} }
class Template { class Template {
var $vars = array(); var $vars = array();
var $file = ''; var $file = '';
var $templateservice; var $templateservice;
function Template($file, $vars = NULL, &$templateservice) { function Template($file, $vars = NULL, &$templateservice) {
$this->vars = $vars; $this->vars = $vars;
$this->file = $file; $this->file = $file;
$this->templateservice = $templateservice; $this->templateservice = $templateservice;
} }
function parse() { function parse() {
if (isset($this->vars)) if (isset($this->vars))
extract($this->vars); extract($this->vars);
include($this->file); include($this->file);
} }
function includeTemplate($name) { function includeTemplate($name) {
return $this->templateservice->loadTemplate($name, $this->vars); return $this->templateservice->loadTemplate($name, $this->vars);
} }
} }
?> ?>

File diff suppressed because it is too large Load diff

View file

@ -142,7 +142,7 @@ class SemanticScuttle_Service_Vote extends SemanticScuttle_DbService
/** /**
* Returns if the user has already voted for * Returns if the user has already voted for
* the given bookmark. * the given bookmark.
* *
* @param integer $bookmark Bookmark ID * @param integer $bookmark Bookmark ID
@ -220,7 +220,7 @@ class SemanticScuttle_Service_Vote extends SemanticScuttle_DbService
* *
* @internal * @internal
* We check if voting is enabled or not, * We check if voting is enabled or not,
* and if the user has already voted. * and if the user has already voted.
* It is up to the calling code to make sure * It is up to the calling code to make sure
* the user is authorized to vote. * the user is authorized to vote.
* *