| |
88 |
88 |
# (and thus not triggering reference constraint errors) |
| |
89 |
89 |
set queue [list $node_id] |
| |
90 |
90 |
while {$queue ne ""} { |
| |
91 |
91 |
set parent_id [lindex $queue 0] |
| |
92 |
92 |
lappend nodes_to_delete $parent_id |
| |
93 |
93 |
set queue [lrange $queue 1 end] |
| |
94 |
94 |
lappend queue {*}[site_node::get_children \ |
| |
95 |
95 |
-element "node_id" \ |
| |
96 |
96 |
-node_id $parent_id] |
| |
97 |
97 |
} |
| |
98 |
98 |
|
| |
99 |
99 |
# delete nodes in reverse order, starting from leaves |
| |
100 |
100 |
foreach node_id [lreverse $nodes_to_delete] { |
| |
101 |
101 |
# first delete package_id under this node... |
| |
102 |
102 |
set package_id [site_node::get_object_id -node_id $node_id] |
| |
103 |
103 |
set url [site_node::get_url -node_id $node_id] |
| |
104 |
104 |
if {$delete_package_p} { |
| |
105 |
105 |
apm_package_instance_delete $package_id |
| |
106 |
106 |
} |
| |
107 |
107 |
# ...then the node itself |
| |
|
108 |
# |
| |
|
109 |
# TODO: The names of the function in the database should be |
| |
|
110 |
# aligned. |
| |
|
111 |
# |
| |
|
112 |
if {[db_driverkey ""] eq "oracle"} { |
| |
|
113 |
acs::dc call site_node del -node_id $node_id |
| |
|
114 |
} else { |
| |
108 |
115 |
acs::dc call site_node delete -node_id $node_id |
| |
|
116 |
} |
| |
|
117 |
acs::dc call site_node delete -node_id $node_id |
| |
109 |
118 |
update_cache -node_id $node_id -url $url -object_id $package_id |
| |
110 |
119 |
} |
| |
111 |
120 |
} |
| |
112 |
121 |
|
| |
113 |
122 |
ad_proc -public site_node::rename { |
| |
114 |
123 |
{-node_id:required} |
| |
115 |
124 |
{-name:required} |
| |
116 |
125 |
} { |
| |
117 |
126 |
Rename the site node. |
| |
118 |
127 |
} { |
| |
119 |
128 |
# We need to update the cache for all the child nodes as well |
| |
120 |
129 |
set node_url [get_url -node_id $node_id] |
| |
121 |
130 |
set child_node_ids [get_children -all -node_id $node_id -element node_id] |
| |
122 |
131 |
set node_object_id [dict get [site_node::get -node_id $node_id] object_id] |
| |
123 |
132 |
|
| |
124 |
133 |
db_dml rename_node {} |
| |
125 |
134 |
db_dml update_object_title {} |
| |
126 |
135 |
|
| |
127 |
136 |
update_cache -sync_children -node_id $node_id -url $node_url -object_id $node_object_id |
| |
128 |
137 |
} |
|
| |
592 |
601 |
{-package_type ""} |
| |
593 |
602 |
{-package_key ""} |
| |
594 |
603 |
{-filters ""} |
| |
595 |
604 |
{-element ""} |
| |
596 |
605 |
} { |
| |
597 |
606 |
# |
| |
598 |
607 |
# Filtering happens here exactly like in the nsv-based |
| |
599 |
608 |
# version. If should be possible to realize (at least |
| |
600 |
609 |
# some of the) filtering via the SQL query. |
| |
601 |
610 |
# |
| |
602 |
611 |
if {$all} { |
| |
603 |
612 |
# |
| |
604 |
613 |
# The following query is just for PG. Note that |
| |
605 |
614 |
# the query should not return the root of the |
| |
606 |
615 |
# tree. |
| |
607 |
616 |
# |
| |
608 |
617 |
set sql [subst { |
| |
609 |
618 |
WITH RECURSIVE site_node_tree(node_id, parent_id) AS ( |
| |
610 |
619 |
select node_id, parent_id from site_nodes where node_id = :node_id |
| |
611 |
620 |
UNION ALL |
| |
612 |
|
select child.node_id, child.parent_id from site_node_tree, site_nodes as child |
| |
|
621 |
select child.node_id, child.parent_id from site_node_tree, site_nodes child |
| |
613 |
622 |
where child.parent_id = site_node_tree.node_id |
| |
614 |
623 |
) select [acs::dc map_function_name site_node__url(node_id)] |
| |
615 |
624 |
from site_node_tree where node_id != :node_id |
| |
616 |
625 |
}] |
| |
617 |
626 |
if {[db_driverkey ""] eq "oracle"} { |
| |
618 |
627 |
set sql [string map [list "WITH RECURSIVE" "WITH"] $sql] |
| |
619 |
628 |
} |
| |
620 |
629 |
|
| |
621 |
630 |
set child_urls [::acs::dc list -prepare integer [current method]-all $sql] |
| |
622 |
631 |
} else { |
| |
623 |
632 |
if {$package_key ne ""} { |
| |
624 |
633 |
# |
| |
625 |
634 |
# Simple optimization for package_keys; seems to be frequently used. |
| |
626 |
635 |
# We leave the logic below unmodified, which could be optimized as well. |
| |
627 |
636 |
# |
| |
628 |
637 |
set package_key_clause "and package_id = object_id and package_key = :package_key" |
| |
629 |
638 |
set from "site_nodes, apm_packages" |
| |
630 |
639 |
} else { |
| |
631 |
640 |
set package_key_clause "" |
| |
632 |
641 |
set from "site_nodes" |
|
| |
986 |
995 |
|
| |
987 |
996 |
if {$node_id eq "" || $old_url eq "/"} { |
| |
988 |
997 |
# |
| |
989 |
998 |
# When no node_id is given or the URL is specified |
| |
990 |
999 |
# as top-url, flush all caches. This happens |
| |
991 |
1000 |
# e.g. in the regression test. |
| |
992 |
1001 |
# |
| |
993 |
1002 |
#ns_log notice "FLUSHALL" |
| |
994 |
1003 |
::acs::site_nodes_cache flush_all |
| |
995 |
1004 |
::acs::site_nodes_id_cache flush_all |
| |
996 |
1005 |
::acs::site_nodes_children_cache flush_all |
| |
997 |
1006 |
|
| |
998 |
1007 |
} else { |
| |
999 |
1008 |
# |
| |
1000 |
1009 |
# Get subtree from db |
| |
1001 |
1010 |
# |
| |
1002 |
1011 |
set sql [subst { |
| |
1003 |
1012 |
WITH RECURSIVE site_node_tree(node_id,parent_id,object_id) AS ( |
| |
1004 |
1013 |
select node_id, parent_id, object_id from site_nodes where node_id = :node_id |
| |
1005 |
1014 |
UNION ALL |
| |
1006 |
|
select child.node_id, child.parent_id, child.object_id from site_node_tree, site_nodes as child |
| |
|
1015 |
select child.node_id, child.parent_id, child.object_id from site_node_tree, site_nodes child |
| |
1007 |
1016 |
where child.parent_id = site_node_tree.node_id |
| |
1008 |
1017 |
and :with_subtree |
| |
1009 |
1018 |
) |
| |
1010 |
1019 |
select [acs::dc map_function_name site_node__url(node_id)], node_id, object_id |
| |
1011 |
1020 |
from site_node_tree |
| |
1012 |
1021 |
}] |
| |
1013 |
1022 |
if {[db_driverkey ""] eq "oracle"} { |
| |
1014 |
1023 |
set sql [string map [list "WITH RECURSIVE" "WITH"] $sql] |
| |
1015 |
1024 |
} |
| |
1016 |
1025 |
|
| |
1017 |
1026 |
set tree [::acs::dc list_of_lists -prepare {integer boolean} dbqd..get_subtree $sql] |
| |
1018 |
1027 |
|
| |
1019 |
1028 |
foreach entry $tree { |
| |
1020 |
1029 |
lassign $entry url node_id object_id |
| |
1021 |
1030 |
foreach key [list $node_id url-$node_id] { |
| |
1022 |
1031 |
::acs::site_nodes_cache flush -partition_key $node_id $key |
| |
1023 |
1032 |
} |
| |
1024 |
1033 |
if {$object_id ne ""} { |
| |
1025 |
1034 |
::acs::site_nodes_cache flush -partition_key $object_id urls-$object_id |
| |
1026 |
1035 |
} |