. * */ /** * This class manages bookmarks */ class OC_Bookmarks_Bookmarks{ /** * @brief Finds all bookmarks, matching the filter * @param offset result offset * @param sqlSortColumn sort result with this column * @param filter can be: empty -> no filter, a string -> filter this, a string array -> filter for all strings * @param filterTagOnly if true, filter affacts only tags, else filter affects url, title and tags * @return void */ public static function findBookmarks($offset, $sqlSortColumn, $filter, $filterTagOnly){ //OC_Log::write('bookmarks', 'findBookmarks ' .$offset. ' '.$sqlSortColumn.' '. $filter.' '. $filterTagOnly ,OC_Log::DEBUG); $CONFIG_DBTYPE = OC_Config::getValue( 'dbtype', 'sqlite' ); $params=array(OC_User::getUser()); if( $CONFIG_DBTYPE == 'sqlite' or $CONFIG_DBTYPE == 'sqlite3' ){ $_gc_separator = ', \' \''; } else { $_gc_separator = 'SEPARATOR \' \''; } if($filter){ if($CONFIG_DBTYPE == 'pgsql' ) $tagString = 'array_to_string(array_agg(tag), \' \')'; else $tagString = 'tags'; $sqlFilterTag = 'HAVING '; if(is_array($filter)){ $first = true; $filterstring = ''; foreach ($filter as $singleFilter){ $filterstring = $filterstring . ($first?'':' AND ') . $tagString.' LIKE ? '; $params[] = '%'.$singleFilter.'%'; $first=false; } $sqlFilterTag = $sqlFilterTag . $filterstring; } else{ $sqlFilterTag = $sqlFilterTag .$tagString.' LIKE ? '; $params[] = '%'.$filter.'%'; } } else { $sqlFilterTag = ''; } if($CONFIG_DBTYPE == 'pgsql' ){ $query = OC_DB::prepare(' SELECT id, url, title, '.($filterTagOnly?'':'url || title ||').' array_to_string(array_agg(tag), \' \') as tags FROM *PREFIX*bookmarks LEFT JOIN *PREFIX*bookmarks_tags ON *PREFIX*bookmarks.id = *PREFIX*bookmarks_tags.bookmark_id WHERE *PREFIX*bookmarks.user_id = ? GROUP BY id, url, title '.$sqlFilterTag.' ORDER BY *PREFIX*bookmarks.'.$sqlSortColumn.' DESC LIMIT 10 OFFSET '. $offset); } else { if( $CONFIG_DBTYPE == 'sqlite' or $CONFIG_DBTYPE == 'sqlite3' ) $concatFunction = '(url || title || '; else $concatFunction = 'Concat(Concat( url, title), '; $query = OC_DB::prepare(' SELECT id, url, title, ' .($filterTagOnly?'':$concatFunction). 'CASE WHEN *PREFIX*bookmarks.id = *PREFIX*bookmarks_tags.bookmark_id THEN GROUP_CONCAT( tag ' .$_gc_separator. ' ) ELSE \' \' END ' .($filterTagOnly?'':')').' AS tags FROM *PREFIX*bookmarks LEFT JOIN *PREFIX*bookmarks_tags ON 1=1 WHERE (*PREFIX*bookmarks.id = *PREFIX*bookmarks_tags.bookmark_id OR *PREFIX*bookmarks.id NOT IN ( SELECT *PREFIX*bookmarks_tags.bookmark_id FROM *PREFIX*bookmarks_tags ) ) AND *PREFIX*bookmarks.user_id = ? GROUP BY url '.$sqlFilterTag.' ORDER BY *PREFIX*bookmarks.'.$sqlSortColumn.' DESC LIMIT '.$offset.', 10'); } $bookmarks = $query->execute($params)->fetchAll(); return $bookmarks; } } ?>