Index: openacs-4/packages/bookmarks/bookmarks.info =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/bookmarks/bookmarks.info,v diff -u -r1.28 -r1.29 --- openacs-4/packages/bookmarks/bookmarks.info 18 Apr 2014 06:49:48 -0000 1.28 +++ openacs-4/packages/bookmarks/bookmarks.info 26 Jan 2016 08:43:56 -0000 1.29 @@ -9,7 +9,7 @@ f t - + Peter Marklund Web based user bookmark application. 2002-10-27 @@ -27,7 +27,7 @@ </ul> - + Index: openacs-4/packages/bookmarks/sql/postgresql/bookmarks-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/bookmarks/sql/postgresql/bookmarks-create.sql,v diff -u -r1.26 -r1.27 --- openacs-4/packages/bookmarks/sql/postgresql/bookmarks-create.sql 9 Sep 2013 11:21:42 -0000 1.26 +++ openacs-4/packages/bookmarks/sql/postgresql/bookmarks-create.sql 26 Jan 2016 08:43:56 -0000 1.27 @@ -285,7 +285,7 @@ not null constraint bm_in_closed_p_bookmark_id_fk references bm_bookmarks (bookmark_id), - in_closed_p_id integer + in_closed_p_id bigint constraint bm_in_closed_p_id_nn not null, in_closed_p boolean default 't', @@ -550,8 +550,8 @@ END; ' LANGUAGE 'plpgsql'; -CREATE FUNCTION bookmark__update_in_closed_p_one_user (integer, integer) -RETURNS integer AS ' +CREATE OR REPLACE FUNCTION bookmark__update_in_closed_p_one_user (integer, bigint) +RETURNS integer AS $$ DECLARE p_bookmark_id ALIAS FOR $1; -- in bm_bookmarks.bookmark_id%TYPE, p_browsing_user_id ALIAS FOR $2; -- in bm_bookmarks.owner_id%TYPE @@ -575,8 +575,8 @@ select bm.bookmark_id from bm_bookmarks bm, bm_in_closed_p bip where bm.bookmark_id = bip.bookmark_id - and bm.folder_p = ''t'' - and bip.closed_p = ''t'' + and bm.folder_p = 't' + and bip.closed_p = 't' and bip.in_closed_p_id = p_browsing_user_id LOOP UPDATE bm_in_closed_p set in_closed_p = TRUE @@ -596,7 +596,7 @@ END LOOP; RETURN 0; END; -' LANGUAGE 'plpgsql'; +$$ LANGUAGE plpgsql; CREATE FUNCTION bookmark__update_in_closed_p_all_users (integer, integer) @@ -622,8 +622,8 @@ ' LANGUAGE 'plpgsql'; -CREATE FUNCTION bookmark__toggle_open_close (integer, integer) -RETURNS integer AS ' +CREATE OR REPLACE FUNCTION bookmark__toggle_open_close (integer, bigint) +RETURNS integer AS $$ DECLARE p_bookmark_id ALIAS FOR $1; -- in bm_bookmarks.bookmark_id%TYPE, p_browsing_user_id ALIAS FOR $2; -- in bm_bookmarks.owner_id%TYPE @@ -645,7 +645,7 @@ perform bookmark__update_in_closed_p_one_user (p_bookmark_id, p_browsing_user_id); RETURN 0; END; -' LANGUAGE 'plpgsql'; +$$ LANGUAGE plpgsql; CREATE FUNCTION bookmark__toggle_open_close_all (integer, boolean, integer) RETURNS integer AS ' @@ -823,16 +823,16 @@ ' LANGUAGE 'plpgsql'; -CREATE FUNCTION bookmark__initialize_in_closed_p (integer, integer, integer) -RETURNS integer AS ' +CREATE OR REPLACE FUNCTION bookmark__initialize_in_closed_p (integer, bigint, integer) +RETURNS integer AS $$ DECLARE - p_viewed_user_id ALIAS FOR $1; -- in users.user_id%TYPE, - p_in_closed_p_id ALIAS FOR $2; -- in users.user_id%TYPE - p_package_id ALIAS FOR $3; -- in apm_packages.package_id%TYPE - v_root_id bm_bookmarks.bookmark_id%TYPE; - c_bookmark RECORD; - v_in_closed_p bm_in_closed_p.in_closed_p%TYPE; - v_closed_p bm_in_closed_p.closed_p%TYPE; + p_viewed_user_id ALIAS FOR $1; -- in users.user_id%TYPE + p_in_closed_p_id ALIAS FOR $2; -- in users.user_id%TYPE + p_package_id ALIAS FOR $3; -- in apm_packages.package_id%TYPE + v_root_id bm_bookmarks.bookmark_id%TYPE; + c_bookmark RECORD; + v_in_closed_p bm_in_closed_p.in_closed_p%TYPE; + v_closed_p bm_in_closed_p.closed_p%TYPE; BEGIN -- We want to initialize all bookmarks to the closed state, except for -- the root folder. That means we need to have the following settings @@ -885,5 +885,5 @@ RETURN 0; END; -' LANGUAGE 'plpgsql'; +$$ LANGUAGE plpgsql; Index: openacs-4/packages/bookmarks/sql/postgresql/upgrade/upgrade-5.1-5.2.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/bookmarks/sql/postgresql/upgrade/upgrade-5.1-5.2.sql,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/bookmarks/sql/postgresql/upgrade/upgrade-5.1-5.2.sql 26 Jan 2016 08:43:56 -0000 1.1 @@ -0,0 +1,145 @@ +ALTER TABLE bm_in_closed_p ALTER COLUMN in_closed_p_id TYPE bigint; + +DROP FUNCTION IF EXISTS bookmark__toggle_open_close (integer, integer); +DROP FUNCTION IF EXISTS bookmark__update_in_closed_p_one_user (integer, integer); +DROP FUNCTION IF EXISTS bookmark__initialize_in_closed_p (integer, integer, integer); + +CREATE OR REPLACE FUNCTION bookmark__toggle_open_close (integer, bigint) +RETURNS integer AS $$ +DECLARE + p_bookmark_id ALIAS FOR $1; -- in bm_bookmarks.bookmark_id%TYPE, + p_browsing_user_id ALIAS FOR $2; -- in bm_bookmarks.owner_id%TYPE + +BEGIN + -- Toggle the closed_p flag + UPDATE bm_in_closed_p SET closed_p = + ( + SELECT CASE WHEN closed_p = TRUE THEN FALSE ELSE TRUE END + FROM bm_in_closed_p + WHERE bookmark_id = p_bookmark_id + AND in_closed_p_id = p_browsing_user_id + ) + WHERE bookmark_id = p_bookmark_id + AND in_closed_p_id = p_browsing_user_id; + + -- Now update the in_closed_p status for this user for all bookmarks under + -- the toggled folder + perform bookmark__update_in_closed_p_one_user (p_bookmark_id, p_browsing_user_id); + RETURN 0; +END; +$$ LANGUAGE plpgsql; + + +CREATE OR REPLACE FUNCTION bookmark__update_in_closed_p_one_user (integer, bigint) +RETURNS integer AS $$ +DECLARE + p_bookmark_id ALIAS FOR $1; -- in bm_bookmarks.bookmark_id%TYPE, + p_browsing_user_id ALIAS FOR $2; -- in bm_bookmarks.owner_id%TYPE + v_parent_ids RECORD; + +BEGIN + -- Update the in_closed_p flag of bookmarks and folders that lie under + -- the toggled folder in the tree for one particular user/session. + -- First set all in_closed_p flags to f ... + UPDATE bm_in_closed_p SET in_closed_p = FALSE + WHERE bookmark_id IN + ( + select bm.bookmark_id from bm_bookmarks bm, bm_bookmarks bm2 + where bm2.bookmark_id = p_bookmark_id + and bm.tree_sortkey between bm2.tree_sortkey and tree_right(bm2.tree_sortkey) + ) + AND in_closed_p_id = p_browsing_user_id; + + -- then set all in_closed_p flags to t that lie under a closed folder + FOR v_parent_ids IN + select bm.bookmark_id from + bm_bookmarks bm, bm_in_closed_p bip + where bm.bookmark_id = bip.bookmark_id + and bm.folder_p = 't' + and bip.closed_p = 't' + and bip.in_closed_p_id = p_browsing_user_id + LOOP + UPDATE bm_in_closed_p set in_closed_p = TRUE + WHERE bookmark_id IN + ( + select bm.bookmark_id from bm_bookmarks bm, bm_bookmarks bm2 + where bm2.bookmark_id = v_parent_ids.bookmark_id + and bm.tree_sortkey between bm2.tree_sortkey and tree_right(bm2.tree_sortkey) + INTERSECT + select bm.bookmark_id from bm_bookmarks bm, bm_bookmarks bm2 + where bm2.bookmark_id = p_bookmark_id + and bm.tree_sortkey between bm2.tree_sortkey and tree_right(bm2.tree_sortkey) + ) + AND in_closed_p_id = p_browsing_user_id + AND bookmark_id <> v_parent_ids.bookmark_id + AND bookmark_id <> p_bookmark_id; + END LOOP; + RETURN 0; +END; +$$ LANGUAGE plpgsql; + +CREATE OR REPLACE FUNCTION bookmark__initialize_in_closed_p (integer, bigint, integer) +RETURNS integer AS $$ +DECLARE + p_viewed_user_id ALIAS FOR $1; -- in users.user_id%TYPE + p_in_closed_p_id ALIAS FOR $2; -- in users.user_id%TYPE + p_package_id ALIAS FOR $3; -- in apm_packages.package_id%TYPE + v_root_id bm_bookmarks.bookmark_id%TYPE; + c_bookmark RECORD; + v_in_closed_p bm_in_closed_p.in_closed_p%TYPE; + v_closed_p bm_in_closed_p.closed_p%TYPE; +BEGIN + -- We want to initialize all bookmarks to the closed state, except for + -- the root folder. That means we need to have the following settings + -- based on the tree_level the bookmark/folder is at: + -- bookmark type in_closed_p closed_p tree_level + -- -------------- ----------- -------- ---------- + -- root f f 1 + -- top folders/bm f t 2 + -- all others t t 3+ + + -- The bookmarks package can be mounted a number of times, and the same + -- user can have bookmarks at more than one mount point, so we need to + -- pick the right root_folder: + v_root_id := bookmark__get_root_folder(p_package_id, p_viewed_user_id); + + FOR c_bookmark IN + SELECT bookmark_id, tree_level(tree_sortkey) AS t_level FROM bm_bookmarks + WHERE owner_id = p_viewed_user_id + AND bookmark_id IN + ( + -- Select bookmarks that belong to the root of this package_id only + SELECT bm.bookmark_id FROM bm_bookmarks bm, bm_bookmarks bm2 + WHERE bm2.bookmark_id = v_root_id + AND bm.tree_sortkey BETWEEN bm2.tree_sortkey AND tree_right(bm2.tree_sortkey) + ) + AND bookmark_id NOT IN + ( + SELECT bookmark_id FROM bm_in_closed_p + WHERE in_closed_p_id = p_in_closed_p_id + ) + LOOP + IF c_bookmark.t_level = 1 THEN + v_in_closed_p := FALSE; + v_closed_p := FALSE; + ELSIF c_bookmark.t_level = 2 THEN + v_in_closed_p := FALSE; + v_closed_p := TRUE; + ELSE + v_in_closed_p := TRUE; + v_closed_p := TRUE; + END IF; + + INSERT INTO bm_in_closed_p (bookmark_id, in_closed_p_id, in_closed_p, closed_p, creation_date) + VALUES (c_bookmark.bookmark_id, p_in_closed_p_id, v_in_closed_p, v_closed_p, now()); + -- This is not quite right in the case bm_in_closed_p already contains some entries for + -- this p_in_closed_p_id, but it is no worse than what we had before so it will do for now. + -- in_closed_p should really be based on the parent folder state -- and the parent folder + -- must be inserted first. + END LOOP; + + RETURN 0; +END; +$$ LANGUAGE plpgsql; + +