Forum OpenACS Q&A: Broke ETP with multiple installs, how do I dig myself back out?

Hi all,

The first application I installed into my OpenACS installation was ETP. I couldn't figure out how to use it (maybe it was broken already, I didn't know enough to know what was happening), so I forgot all about it and moved on to other things.

Somewhere along the way I tried to use it again, and installed it again. And this is where the trouble started, though I'm not even sure where to begin to fix it. So I'll just describe what I have:

Five unmounted Edit-This-Page instances under various names and locations (but mostly the default name and location). All of them, when mounted, generate the scary error message copied below when I browse to /edit-this-page, which redirects to etp-setup2. I now understand, from reading the forums and the bug-tracker that ETP has a known, and apparently insurmountable, problem with uninstallation...so my uninstallation attempts have probably broken things further. But, I'd like to make it work, and I have no clue how to go about that. Is there a safe way for me to remove all but one of the instances of ETP and get to a working state? I don't mind poking at the database directly, as long as I have some clue of what I'm supposed to be doing there. Anyone have some pointers for me?

Thanks!

The scariest error message I've yet seen from OACS:

There was a server error processing your request. We apologize.

Here is a detailed dump of what took place at the time of the error, which may assist a programmer in tracking down the problem:

Database operation "0or1row" failed (exception NSDB, "Query was not a statement returning rows.")

ERROR: duplicate key violates unique constraint "cr_items_unique_name"
CONTEXT: PL/pgSQL function "content_item__new" line 85 at SQL statement
PL/pgSQL function "content_folder__new" line 31 at assignment
PL/pgSQL function "content_folder__new" line 7 at return

SQL:
select content_folder__new('edit-this-page', 'Edit This Page', '', coalesce(etp__get_folder_id('410'), NULL));

while executing
"ns_pg_bind 0or1row nsdb0 {
select content_folder__new(:name, :title, '', coalesce(etp__get_folder_id(:parent_package_id), NULL));
}"
("uplevel" body line 1)
invoked from within
"uplevel $ulevel [list ns_pg_bind $type $db $sql]"
("postgresql" arm line 2)
invoked from within
"switch $driverkey {
oracle {
return [uplevel $ulevel [list ns_ora $type $db $sql] $args]
}
..."
invoked from within
"db_exec 0or1row $db $full_statement_name $sql"
invoked from within
"if {[regexp -nocase -- {^\s*select} $test_sql match]} {
ns_log Debug "PLPGSQL: bypassed anon function"
set selection [..."
("uplevel" body line 6)
invoked from within
"uplevel 1 $code_block "
invoked from within
"db_with_handle -dbn $dbn db {
# plsql calls that are simple selects bypass the plpgsql
# mechanism for creating anonymous fun..."
(procedure "db_exec_plsql" line 57)
invoked from within
"db_exec_plsql create_folder """
invoked from within
"set folder_id [db_exec_plsql create_folder ""]"
("uplevel" body line 2)
invoked from within
"uplevel 1 $transaction_code "
(procedure "db_transaction" line 1)
invoked from within
"db_transaction {
set folder_id [db_exec_plsql create_folder ""]
db_exec_plsql register_types ""
db_exec_plsql register_folders ""
db_dml set_folde..."
invoked from within
"if { $site_node_url == "/" } {
# -100 is the magic number for the "root folder".
set folder_id -100
db_transaction {
db_dml set_folder_pa..."
("uplevel" body line 22)
invoked from within
"uplevel {
# /packages/edit-this-page/www/etp-setup-2.tcl

ad_page_contract {
@author Luke Pond (mailto:dlpond@pobox.com)
@creation-date 2001-0..."
(procedure "code::tcl::/home/virtualmin/openacs/virtualmin/packages/edit..." line 2)
invoked from within
"code::tcl::$__adp_stub"
invoked from within
"if { [file exists $__adp_stub.tcl] } {

# ensure that data source preparation procedure exists and is up-to-date
adp_init tcl $__adp_stub
..."
("uplevel" body line 3)
invoked from within
"uplevel {

if { [file exists $__adp_stub.tcl] } {

# ensure that data source preparation procedure exists and is up-to-date
adp_init t..."
(procedure "adp_prepare" line 2)
invoked from within
"adp_prepare "
(procedure "template::adp_parse" line 30)
invoked from within
"template::adp_parse [file root [ad_conn file]] {}"
(procedure "adp_parse_ad_conn_file" line 5)
invoked from within
"$handler"
("uplevel" body line 2)
invoked from within
"uplevel $code"
invoked from within
"ad_try {
$handler
} ad_script_abort val {
# do nothing
}"
invoked from within
"rp_serve_concrete_file [ad_conn file]"
(procedure "rp_serve_abstract_file" line 60)
invoked from within
"rp_serve_abstract_file "$root/$path""
("uplevel" body line 2)
invoked from within
"uplevel $code"
invoked from within
"ad_try {
rp_serve_abstract_file "$root/$path"
set tcl_url2file([ad_conn url]) [ad_conn file]
set tcl_url2path_info..."