2012-01-29 19:32:33 +01:00
< ? php
/**
* ownCloud - bookmarks plugin
*
* @ author Arthur Schiwon
* @ copyright 2011 Arthur Schiwon blizzz @ arthur - schiwon . de
*
* This library is free software ; you can redistribute it and / or
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
* License as published by the Free Software Foundation ; either
* version 3 of the License , or any later version .
*
* This library is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU AFFERO GENERAL PUBLIC LICENSE for more details .
*
* You should have received a copy of the GNU Affero General Public
* License along with this library . If not , see < http :// www . gnu . org / licenses />.
*
*/
/**
* This class manages bookmarks
*/
class OC_Bookmarks_Bookmarks {
2012-06-27 17:37:38 +02:00
/**
* @ brief Find People with whome we shared bookmarks and how much
*/
public static function findSharing ( $offset = 0 , $limit = 10 ){
$query = OCP\DB :: prepare ( 'SELECT \'@public\' as name, count(*) as nbr from *PREFIX*bookmarks where public=1 group by public LIMIT ' . $offset . ', ' . $limit );
$tags = $query -> execute () -> fetchAll ();
return $tags ;
}
2012-06-26 17:43:03 +02:00
/**
* @ brief Finds all tags for bookmarks
*/
2012-06-27 23:44:20 +02:00
public static function findTags ( $filterTags = array (), $offset = 0 , $limit = 10 ){
//$query = OCP\DB::prepare('SELECT tag, count(*) as nbr from *PREFIX*bookmarks_tags group by tag LIMIT '.$offset.', '.$limit);
$params = array_merge ( $filterTags , $filterTags );
$not_in = '' ;
if ( ! empty ( $filterTags ) ) {
$not_in = ' where tag not in (' . implode ( ',' , array_fill ( 0 , count ( $filterTags ) , '?' ) ) . ')' .
str_repeat ( " AND exists (select 1 from *PREFIX*bookmarks_tags t2 where t2.bookmark_id = t.bookmark_id and tag = ?) " , count ( $filterTags ));
}
$sql = 'SELECT tag, count(*) as nbr from *PREFIX*bookmarks_tags t ' . $not_in .
'group by tag Order by nbr DESC LIMIT ' . $offset . ', ' . $limit ;
$query = OCP\DB :: prepare ( $sql );
$tags = $query -> execute ( $params ) -> fetchAll ();
2012-06-26 17:43:03 +02:00
return $tags ;
}
2012-01-29 19:32:33 +01:00
/**
* @ brief Finds all bookmarks , matching the filter
* @ param offset result offset
* @ param sqlSortColumn sort result with this column
2012-07-02 12:41:40 +02:00
* @ param filters can be : empty -> no filter , a string -> filter this , a string array -> filter for all strings
2012-06-27 14:14:45 +02:00
* @ param filterTagOnly if true , filter affects only tags , else filter affects url , title and tags
2012-01-29 19:32:33 +01:00
* @ return void
*/
2012-07-02 12:41:40 +02:00
public static function findBookmarks ( $offset , $sqlSortColumn , $filters , $filterTagOnly ){
2012-07-02 09:43:37 +02:00
$CONFIG_DBTYPE = OCP\Config :: getSystemValue ( 'dbtype' , 'sqlite' );
2012-07-02 12:41:40 +02:00
if ( is_string ( $filters )) $filters = array ( $filters );
2012-06-27 14:14:45 +02:00
$limit = 10 ;
2012-05-01 18:50:31 +02:00
$params = array ( OCP\USER :: getUser ());
2012-07-02 09:43:37 +02:00
if ( $CONFIG_DBTYPE == 'pgsql' ) {
$group_fct = 'array_agg(tag)' ;
}
else {
$group_fct = 'GROUP_CONCAT(tag)' ;
}
$sql = " SELECT *, (select $group_fct from *PREFIX*bookmarks_tags where bookmark_id = b.id) as tags
2012-06-27 23:44:20 +02:00
FROM * PREFIX * bookmarks b
WHERE user_id = ? " ;
2012-06-27 14:14:45 +02:00
2012-06-27 23:44:20 +02:00
if ( $filterTagOnly ) {
2012-07-02 12:41:40 +02:00
$sql .= str_repeat ( " AND exists (select id from *PREFIX*bookmarks_tags t2 where t2.bookmark_id = b.id and tag = ?) " , count ( $filters ));
$params = array_merge ( $params , $filters );
} else {
foreach ( $filters as $filter ) {
$sql .= ' AND lower(url || title || description || tags ) like ? ' ;
$params [] = '%' . strtolower ( $filter ) . '%' ;
}
2012-01-29 19:32:33 +01:00
}
2012-06-27 23:44:20 +02:00
$sql .= " ORDER BY " . $sqlSortColumn . " DESC
LIMIT $limit
OFFSET $offset " ;
2012-01-29 19:32:33 +01:00
2012-06-27 23:44:20 +02:00
$query = OCP\DB :: prepare ( $sql );
2012-06-27 14:14:45 +02:00
$results = $query -> execute ( $params ) -> fetchAll ();
$bookmarks = array ();
foreach ( $results as $result ){
$result [ 'tags' ] = explode ( ',' , $result [ 'tags' ]);
$bookmarks [] = $result ;
}
2012-01-29 19:32:33 +01:00
return $bookmarks ;
}
2012-05-03 17:29:08 +02:00
public static function deleteUrl ( $id )
{
$user = OCP\USER :: getUser ();
$query = OCP\DB :: prepare ( "
2012-07-30 20:46:14 +02:00
SELECT `id` FROM `*PREFIX*bookmarks`
WHERE `id` = ?
AND `user_id` = ?
2012-05-03 17:29:08 +02:00
" );
$result = $query -> execute ( array ( $id , $user ));
$id = $result -> fetchOne ();
if ( $id === false ) {
return false ;
}
$query = OCP\DB :: prepare ( "
2012-07-30 20:46:14 +02:00
DELETE FROM `*PREFIX*bookmarks`
WHERE `id` = $id
2012-05-03 17:29:08 +02:00
" );
$result = $query -> execute ();
$query = OCP\DB :: prepare ( "
2012-07-30 20:46:14 +02:00
DELETE FROM `*PREFIX*bookmarks_tags`
WHERE `bookmark_id` = $id
2012-05-03 17:29:08 +02:00
" );
$result = $query -> execute ();
return true ;
}
2012-06-29 15:50:19 +02:00
public static function renameTag ( $old , $new )
{
$user_id = OCP\USER :: getUser ();
// Update the record
$query = OCP\DB :: prepare ( "
UPDATE * PREFIX * bookmarks_tags SET
tag = ?
WHERE tag = ?
AND exists ( select id from * PREFIX * bookmarks where user_id = ? and bookmark_id = id )
" );
$params = array (
$new ,
$old ,
$user_id ,
);
$result = $query -> execute ( $params );
return true ;
}
public static function deleteTag ( $old )
{
$user_id = OCP\USER :: getUser ();
// Update the record
$query = OCP\DB :: prepare ( "
DELETE FROM * PREFIX * bookmarks_tags
WHERE tag = ?
AND exists ( select id from * PREFIX * bookmarks where user_id = ? and bookmark_id = id )
" );
$params = array (
$old ,
$user_id ,
);
$result = $query -> execute ( $params );
return true ;
}
2012-07-01 17:45:37 +02:00
/**
* get a string corresponding to the current time depending
* of the OC database system
* @ return string
*/
protected static function getNowValue () {
$CONFIG_DBTYPE = OCP\Config :: getSystemValue ( " dbtype " , " sqlite " );
if ( $CONFIG_DBTYPE == 'sqlite' or $CONFIG_DBTYPE == 'sqlite3' ){
$_ut = " strftime('%s','now') " ;
} elseif ( $CONFIG_DBTYPE == 'pgsql' ) {
$_ut = 'date_part(\'epoch\',now())::integer' ;
} else {
$_ut = " UNIX_TIMESTAMP() " ;
}
return $_ut ;
}
/**
* Edit a bookmark
* @ param int $id The id of the bookmark to edit
* @ param string $url
* @ param string $title Name of the bookmark
* @ param array $tags Simple array of tags to qualify the bookmark ( different tags are taken from values )
* @ param string $description A longer description about the bookmark
* @ param boolean $is_public True if the bookmark is publishable to not registered users
* @ return null
*/
public static function editBookmark ( $id , $url , $title , $tags = array (), $description = '' , $is_public = false ) {
$is_public = $is_public ? 1 : 0 ;
$user_id = OCP\USER :: getUser ();
// Update the record
$query = OCP\DB :: prepare ( "
UPDATE * PREFIX * bookmarks SET
url = ? , title = ? , public = ? , description = ? ,
lastmodified = " .self::getNowValue() . "
WHERE id = ?
AND user_id = ?
" );
$params = array (
htmlspecialchars_decode ( $url ),
htmlspecialchars_decode ( $title ),
$is_public ,
htmlspecialchars_decode ( $description ),
$id ,
$user_id ,
);
$result = $query -> execute ( $params );
// Abort the operation if bookmark couldn't be set
// (probably because the user is not allowed to edit this bookmark)
if ( $result -> numRows () == 0 ) exit ();
// Remove old tags
$sql = " DELETE from *PREFIX*bookmarks_tags WHERE bookmark_id = ? " ;
$query = OCP\DB :: prepare ( $sql );
$query -> execute ( array ( $id ));
// Add New Tags
self :: addTags ( $id , $tags );
}
/**
* Add a bookmark
* @ param string $url
* @ param string $title Name of the bookmark
* @ param array $tags Simple array of tags to qualify the bookmark ( different tags are taken from values )
* @ param string $description A longer description about the bookmark
* @ param boolean $is_public True if the bookmark is publishable to not registered users
* @ return int The id of the bookmark created
*/
public static function addBookmark ( $url , $title , $tags = array (), $description = '' , $is_public = false ) {
$is_public = $is_public ? 1 : 0 ;
//FIXME: Detect and do smth when user adds a known URL
$_ut = self :: getNowValue ();
$query = OCP\DB :: prepare ( "
INSERT INTO * PREFIX * bookmarks
( url , title , user_id , public , added , lastmodified , description )
VALUES ( ? , ? , ? , ? , $_ut , $_ut , ? )
" );
$params = array (
htmlspecialchars_decode ( $url ),
htmlspecialchars_decode ( $title ),
OCP\USER :: getUser (),
$is_public ,
$description ,
);
$query -> execute ( $params );
$b_id = OCP\DB :: insertid ( '*PREFIX*bookmarks' );
if ( $b_id !== false ) {
self :: addTags ( $b_id , $tags );
return $b_id ;
}
}
/**
* Add a set of tags for a bookmark
* @ param int $bookmark_id The bookmark reference
* @ param array $tags Set of tags to add to the bookmark
* @ return null
**/
private static function addTags ( $bookmark_id , $tags ) {
$query = OCP\DB :: prepare ( "
INSERT INTO * PREFIX * bookmarks_tags
( bookmark_id , tag )
VALUES ( ? , ? ) " );
foreach ( $tags as $tag ) {
if ( empty ( $tag )) {
//avoid saving blankspaces
continue ;
}
$params = array ( $bookmark_id , trim ( $tag ));
$query -> execute ( $params );
}
}
2012-07-02 12:41:40 +02:00
/**
* Simple function to search for bookmark . call findBookmarks
* @ param array $search_words Set of words to look for in bookmars fields
* @ return array An Array of bookmarks
**/
public static function searchBookmarks ( $search_words ) {
return self :: findBookmarks ( 0 , 'id' , $search_words , false );
}
2012-01-29 19:32:33 +01:00
}