Forum OpenACS Q&A: Response to Breakthrough on bookmarks module
Posted by
Bob Fuller
on 01/09/01 09:33 PM
The revised edit-bookmark-2.tcl file
Here's the complete revised edit-bookmark-2.tcl file:
# edit-bookmark-2.tcl,v 3.0 2000/02/06 03:35:21 ron Exp
# edit-bookmark-2.tcl
#
# edit a bookmark in your bookmark list
#
# by aure@arsdigita.com and dh@arsdigita.com
set_the_usual_form_variables
# local_title, complete_url, bookmark_id, parent_id, return_url
validate_integer bookmark_id $bookmark_id
set user_id [ad_verify_and_get_user_id]
ad_maybe_redirect_for_registration
set db [ns_db gethandle]
# start error-checking
set exception_text ""
set exception_count 0
if {(![info exists bookmark_id])||([empty_string_p $bookmark_id])} {
incr exception_count
append exception_text "<li>No bookmark was specified"
}
# make sure that the user owns the bookmark
set ownership_query "
select count(*)
from bm_list
where owner_id=$user_id
and bookmark_id=$bookmark_id"
set ownership_test [database_to_tcl_string $db $ownership_query]
if {$ownership_test==0} {
incr exception_count
append exception_text "<li>You can not edit this bookmark"
}
# return errors
if { $exception_count> 0 } {
ad_return_complaint $exception_count $exception_text
return 0
}
if { ![info exists parent_id] || [empty_string_p $parent_id] } {
set parent_id "null"
}
ns_db dml $db "begin transaction"
# ### not sure why I had to change this section, but it didn't work ###
# if the bookmark to edit is a folder, complete_url won't be defined
# if { ![info exists complete_url] } {
# if { [empty_string_p $complete_url]||![info exists complete_url] } {
# this is a folder so edit its name
# set sql_update "
# update bm_list
# set local_title = '[DoubleApos $local_title]',
# private_p = '$private_p',
# parent_id = $parent_id
# where owner_id = $user_id
# and bookmark_id = $bookmark_id"
# set sql_update "
# update bm_list
# set local_title = '$local_title',
# private_p = '$private_p',
# parent_id = $parent_id
# where owner_id = $user_id
# and bookmark_id = $bookmark_id"
# ns_db dml $db $sql_update
# } else {
if { [info exists complete_url] } {
# entry is a bookmark - need to update both name and url
set host_url [bm_host_url $complete_url]
# check to see if we already have the url in our database
set url_query "select url_id
from bm_urls
where complete_url = '[DoubleApos $complete_url]'"
set url_id [database_to_tcl_string_or_null $db $url_query]
# if we don't have the url, then insert the url into the database
if {[empty_string_p $url_id]} {
set url_id [database_to_tcl_string $db "select bm_url_id_seq.nextval from dual"]
ns_db dml $db "
insert into bm_urls
(url_id, host_url, complete_url)
values
($url_id, '[DoubleApos $host_url]', '[DoubleApos $complete_url]')"
}
# have added the url if needed - now just update the name
set sql_update "
update bm_list
set local_title = '[DoubleApos $local_title]',
url_id = $url_id,
private_p = '$private_p',
parent_id = $parent_id
where bookmark_id = $bookmark_id"
ns_db dml $db $sql_update
} else {
# this is a folder so edit its name
set sql_update "
update bm_list
set local_title = '[DoubleApos $local_title]',
private_p = '$private_p',
parent_id = $parent_id
where owner_id = $user_id
and bookmark_id = $bookmark_id"
ns_db dml $db $sql_update
}
# the bookmark_id's are tagged by a "before update" trigger on bm_list
# -- and they end up as v_updated_ids in bm_list_pkg
# just checking to make sure we have some updates to do...
set id_count [database_to_tcl_string $db "
select count(*)
from bm_list_pkg
where v_num_entries > 0
and v_updated_ids is not null"]
set i 0
# ### for some reason, I had to do the other selects in a different loop ###
# ... so, in this loop, I collect everything into arrays
if {$id_count > 0} {
set selection [ns_db select $db "
select distinct v_updated_ids, coalesce(parent_id, -1) as parent_id,
case when parent_sort_key is null then local_sort_key
else parent_sort_key || cast(local_sort_key as varchar(3)) end
as parent_sort_key,
folder_p
from bm_list_pkg, bm_list
where v_num_entries > 0
and v_updated_ids = bookmark_id"]
while {[ns_db getrow $db $selection]} {
set_variables_after_query
set v_upd_ids($i) $v_updated_ids
set new_parent_id($i) $parent_id
set old_parent_sort_key($i) $parent_sort_key
set is_folder($i) $folder_p
incr i
}
while {$i > 0} {
incr i -1
if {$new_parent_id($i) > -1} {
set v_parent_sort_key [database_to_tcl_string $db "
select case when parent_sort_key is null
then local_sort_key
else parent_sort_key || cast(local_sort_key as varchar(3)) end
from bm_list where bookmark_id = $new_parent_id($i)"]
set v_last_sort_key [database_to_tcl_string $db "
select max(local_sort_key) from bm_list
where parent_id = $new_parent_id($i)
and bookmark_id != $v_upd_ids($i)"]
ns_db dml $db "update bm_list set parent_sort_key = '$v_parent_sort_key',
local_sort_key = new_sort_key('$v_last_sort_key')
where bookmark_id = $v_upd_ids($i)"
} else {
set v_last_sort_key [database_to_tcl_string $db "
select max(local_sort_key) from bm_list where parent_id is null
and bookmark_id != $v_upd_ids($i)"]
ns_db dml $db "update bm_list set parent_sort_key = null,
local_sort_key = new_sort_key('$v_last_sort_key')
where bookmark_id = $v_upd_ids($i) and parent_id is null"
}
set v_new_sort_key [database_to_tcl_string $db "
select case when parent_sort_key is null then local_sort_key
else parent_sort_key || cast(local_sort_key as varchar(3)) end
from bm_list where bookmark_id = $v_upd_ids($i)"]
set len_old_sort_key [string length $old_parent_sort_key($i)]
ns_db dml $db "update bm_list
set parent_sort_key = '$v_new_sort_key' ||
substr(parent_sort_key, $len_old_sort_key+1,
length(parent_sort_key)-$len_old_sort_key)
where parent_sort_key like '$old_parent_sort_key($i)%'"
}
}
# ### need to delete all the entries "tagged" by the update trigger
# ### now that we're done updating sort keys
ns_db dml $db "delete from bm_list_pkg where v_num_entries > 0"
# ### I tried to do this as a Tcl proc in tcl/bookmarks-defs.tcl, ###
# ### but no luck on that (so far)...
# bm_recalc_sort_keys $db $user_id
# ### this may need to be changed, at some point...
bm_set_hidden_p $db $user_id
# ### the first of these is my modification of bm_set_in_closed_p, ###
# ### which, as you can tell, does only ONE folder
# ### forget why I had to comment it out, but it's NOT relevant to
# ### this part of the bookmark module
# ### (bm_set_in_closed_p is commented out because it didn't work)
# bm_set_one_in_closed_p $db $user_id $bookmark_id
# bm_set_in_closed_p $db $user_id
ns_db dml $db "end transaction"
# send the user back to where they came from before editing began
ns_returnredirect $return_url