Index: openacs-4/packages/xotcl-core/xotcl-core.info =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xotcl-core/xotcl-core.info,v diff -u -r1.22 -r1.22.2.1 --- openacs-4/packages/xotcl-core/xotcl-core.info 29 Dec 2006 11:04:16 -0000 1.22 +++ openacs-4/packages/xotcl-core/xotcl-core.info 1 Aug 2007 21:39:31 -0000 1.22.2.1 @@ -8,10 +8,10 @@ t xotcl - + Gustaf Neumann XOTcl library functionality (e.g. thread handling, online documentation, Generic Form and List Classes) - 2006-12-29 + 2007-08-01 This component contains some core functionality for OACS applications using XOTcl. It includes XOTcl thread handling for OACS (supporting persistent and @@ -30,11 +30,16 @@ 0.41: supporting storage_type file, on_submit method and html for forms; 0.43: context and connection context; 0.44: use connection_context, sch regression test works; -0.45: xo:db require operations; +0.45: xo:db require operations; +0.48: policies +0.49: stored procedures object proxies (postgres and Oracle) +0.51: require package +0.52: distinguish between ImageField and ImageAnchorField, start using slots, multivalued form entries, bulk-actions, improved localization, improved sql layer (:.xo::db::sql) + BSD-Style 0 - + Index: openacs-4/packages/xotcl-core/catalog/xotcl-core.de_DE.ISO-8859-1.xml =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xotcl-core/catalog/xotcl-core.de_DE.ISO-8859-1.xml,v diff -u -r1.4.2.1 -r1.4.2.2 --- openacs-4/packages/xotcl-core/catalog/xotcl-core.de_DE.ISO-8859-1.xml 23 Apr 2007 05:55:08 -0000 1.4.2.1 +++ openacs-4/packages/xotcl-core/catalog/xotcl-core.de_DE.ISO-8859-1.xml 1 Aug 2007 21:39:31 -0000 1.4.2.2 @@ -1,5 +1,5 @@ - + Neu: %type% Neue Seite vom Type %type% erzeugen Index: openacs-4/packages/xotcl-core/catalog/xotcl-core.en_US.ISO-8859-1.xml =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xotcl-core/catalog/xotcl-core.en_US.ISO-8859-1.xml,v diff -u -r1.4.2.1 -r1.4.2.2 --- openacs-4/packages/xotcl-core/catalog/xotcl-core.en_US.ISO-8859-1.xml 23 Apr 2007 05:55:08 -0000 1.4.2.1 +++ openacs-4/packages/xotcl-core/catalog/xotcl-core.en_US.ISO-8859-1.xml 1 Aug 2007 21:39:31 -0000 1.4.2.2 @@ -1,5 +1,5 @@ - + Add %type% Add new item of type %type% @@ -8,6 +8,9 @@ Edit %type% has entered the room Live Revision + <blockquote> +You don't have sufficient permissions for performing method %method% on object %object%. +</blockquote> Revisions of Entry Revisions Index: openacs-4/packages/xotcl-core/catalog/xotcl-core.es_ES.ISO-8859-1.xml =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xotcl-core/catalog/xotcl-core.es_ES.ISO-8859-1.xml,v diff -u -r1.1.4.2 -r1.1.4.3 --- openacs-4/packages/xotcl-core/catalog/xotcl-core.es_ES.ISO-8859-1.xml 22 Mar 2007 10:14:02 -0000 1.1.4.2 +++ openacs-4/packages/xotcl-core/catalog/xotcl-core.es_ES.ISO-8859-1.xml 1 Aug 2007 21:39:31 -0000 1.1.4.3 @@ -1,13 +1,13 @@ - + A�adir %type% - A�adir un nuevo item del tipo %type% - Crear nuevo %type% - Editar item + A�adir un nuevo �tem del tipo %type% + Crear Nuevo %type% + Editar �tem Editar %type% ha entrado en la sala - Revisi�n Actual - Revisiones para la entrada + Revisi�n Viva + Revisiones de la Entrada Revisiones Fisheye: Tag 1.1.4.1 refers to a dead (removed) revision in file `openacs-4/packages/xotcl-core/catalog/xotcl-core.pt_BR.ISO-8859-1.xml'. Fisheye: No comparison available. Pass `N' to diff? Index: openacs-4/packages/xotcl-core/tcl/01-debug-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xotcl-core/tcl/01-debug-procs.tcl,v diff -u -r1.8 -r1.8.2.1 --- openacs-4/packages/xotcl-core/tcl/01-debug-procs.tcl 17 Nov 2006 21:29:17 -0000 1.8 +++ openacs-4/packages/xotcl-core/tcl/01-debug-procs.tcl 1 Aug 2007 21:39:31 -0000 1.8.2.1 @@ -1,10 +1,14 @@ ## tell serializer to export methods, although these are methods of # ::xotcl::Object +package require xotcl::serializer + ::Serializer exportMethods { ::xotcl::Object instproc log + ::xotcl::Object instproc msg + ::xotcl::Object instproc __timediff ::xotcl::Object instproc debug - ::xotcl::Object instproc contains + ::xotcl::Object instproc qn ::xotcl::Object instproc serialize ::xotcl::Object instforward db_1row ::xotcl::Object instproc destroy_on_cleanup @@ -23,6 +27,44 @@ my requireNamespace namespace eval [self] $cmds } + namespace eval ::xo { + Class create ::xo::Attribute \ + -parameter { + {name "[namespace tail [::xotcl::self]]"} + {domain "[lindex [regexp -inline {^(.*)::slot::[^:]+$} [::xotcl::self]] 1]"} + {multivalued false} + {required false} + default + type + spec + pretty_name + {pretty_plural ""} + {datatype "text"} + {sqltype "text"} + {min_n_values 1} + {max_n_values 1} + help_text + validator + } + + } +} else { + namespace eval ::xo { + Class create ::xo::Attribute \ + -superclass ::xotcl::Attribute \ + -parameter { + spec + {required false} + pretty_name + {pretty_plural ""} + {datatype "text"} + {sqltype "text"} + {min_n_values 1} + {max_n_values 1} + help_text + validator + } + } } ::xotcl::Object instforward db_1row -objscope @@ -31,25 +73,28 @@ ::Serializer deepSerialize [self] } +namespace eval ::xo { + ::xotcl::Class create ::xo::InstanceManager \ + -instproc alloc args { + set r [next] + set key blueprint($r) + if {![ns_conn isconnected]} { + [self class] set $key 1 + } elseif {![[self class] exists $key]} { + [self class] set connectionobject($r) 1 + } + return $r + } \ + -instproc destroy args { + next + ns_log notice "--unset -nocomplain [self class]::blueprint([self])" + [self class] unset -nocomplain blueprint([self]) + [self class] unset -nocomplain connectionobject([self]) + } -# Currently, xotcl's serializer does not export ::xotcl::* commands, -# except methods for ::xotcl::Object and ::xotcl::Core, so we use the -# mixin instead of te direct defintion... should be changed in the future -# namespace eval ::xo { -# Class create ::xo::NonPosArgs \ -# -instproc integer args { -# if {[llength $args] < 2} return -# foreach {name value} $args break -# if {![string is integer $value]} { -# error "value '$value' of $name not an integer" -# } -# } \ -# -instproc optional {name args} { -# ; -# } -# } -# ::xotcl::nonposArgs proc integer -# ::xotcl::nonposArgs proc optional + # deactivate for now + #::xotcl::Object instmixin add ::xo::InstanceManager +} ::xotcl::nonposArgs proc integer args { if {[llength $args] < 2} return @@ -60,7 +105,7 @@ ; } -::xotcl::Object instproc log msg { +::xotcl::Object instproc __timediff {} { set now [ns_time get] if {[ns_conn isconnected]} { set start_time [ns_conn start] @@ -77,14 +122,26 @@ } else { set diff "" } - ns_log notice "$msg, [self] [self callingclass]->[self callingproc] (${ms}ms$diff)" set ::__last_timestamp $now + return "${ms}ms$diff" } +::xotcl::Object instproc log msg { + ns_log notice "$msg, [self] [self callingclass]->[self callingproc] ([my __timediff])" +} + ::xotcl::Object instproc debug msg { ns_log debug "[self] [self callingclass]->[self callingproc]: $msg" } - +::xotcl::Object instproc msg msg { + if {[ns_conn isconnected]} { + util_user_message -message "$msg ([self] [self callingclass]->[self callingproc])" + } +} +::xotcl::Object instproc qn query_name { + set qn "dbqd.[my uplevel self class]-[my uplevel self proc].$query_name" + return $qn +} namespace eval ::xo { Class Timestamp Timestamp instproc init {} {my set time [clock clicks -milliseconds]} @@ -125,26 +182,9 @@ } } - # - # a simple calback for cleanup of per connection objects - # ns_atclose is a little to early for us... - # - ::xotcl::Object instproc destroy_on_cleanup {} { - set ::xotcl_cleanup([self]) 1 - #my log "--A cleanup for [lsort [array names ::xotcl_cleanup]]" - ::trace add variable ::xotcl_cleanup([self]) unset ::xo::cleanup_callback - } - proc ::xo::cleanup_callback {var object op} { - if {![::xotcl::Object isobject $object]} { - #ns_log notice "--D $object already destroyed, nothing to do" - $object destroy - } else { - #ns_log notice "--D $object destroy" - $object destroy - } - } } + # ::xotcl::Class instproc import {class pattern} { # namespace eval [self] [list \ # namespace import [list import [$class self]]::$pattern; @@ -168,3 +208,113 @@ # ns_log notice "--T [ns_ictl get]" #} +namespace eval ::xo { + # + # In earlier versions of xotcl-core, we used variable traces + # to trigger deletion of objects. This had two kind of problems: + # 1) there was no way to control the order of the deletions + # 2) the global variables used for managing db handles might + # be deleted already + # 3) the traces are executed at a time when the connection + # is already closed + # Aolserver 4.5 supports a trace for freeconn. We can register + # a callback to be executed before the connection is freed, + # therefore, we have still information from ns_conn available. + # For aolserver 4.5 we use oncleanup, which is at least before + # the cleanup of variables. + # + # In contrary, in 4.0.10, on cleanup is called after the global + # variables of a connection thread are deleted. Therefore + # the triggered calls should not use database handles, + # since these are as well managed via global variables, + # the will be deleted as well at this time,. + # + # To come up with an approach working for 4.5 and 4.0.10, we + # distinguish between a at_cleanup and at_close, so connection + # related info can still be obtained. + # + if {[catch {set registered [ns_ictl gettraces freeconn]}]} { + ns_log notice "*** you should really upgrade to Aolserver 4.5" + # "ns_ictl oncleanup" is called after variables are deleted + if {[ns_ictl epoch] == 0} { + ns_ictl oncleanup ::xo::at_cleanup + ns_ictl oninit [list ns_atclose ::xo::at_close] + } + +# proc trace_cleanup {args} { +# set name [lindex $args 1] +# #ns_log notice "*** cleanup <$args> '$name'" +# if {[::xotcl::Object isobject $name]} { +# ns_log notice "*** cleanup $name destroy" +# $name destroy +# } +# } + } else { + + # register only once + if {[lsearch $registered ::xo::cleanup] == -1} { + ns_ictl trace freeconn ::xo::freeconn + } + + proc ::xo::freeconn {} { + catch {::xo::at_close} + catch {::xo::at_cleanup} + } + } + + #proc ::xo::at_create {} { + # ns_log notice "--at_create *********" + # foreach i [::xo::InstanceManager array names blueprint] { + # if {![::xotcl::Object isobject $i]} { + # ::xo::InstanceManager unset blueprint($i) + # ns_log notice "--at_create no such object: $i" + # } + # } + #} + + ::xotcl::Object instproc destroy_on_cleanup {} { + #my log "--cleanup adding ::xo::cleanup([self]) [list [self] destroy]" + set ::xo::cleanup([self]) [list [self] destroy] + } + + proc at_close {args} { + } + + proc at_cleanup {args} { + #ns_log notice "*** start of cleanup <$args> ([array get ::xo::cleanup])" + set at_end "" + foreach {name cmd} [array get ::xo::cleanup] { + #::trace remove variable ::xotcl_cleanup($name) unset ::xo::cleanup + if {![::xotcl::Object isobject $name]} { + #ns_log notice "--D $name already destroyed, nothing to do" + continue + } + if {$name eq "::xo::cc"} { + append at_end $cmd\n + continue + } + #ns_log notice "*** cleanup $cmd" + if {[catch {eval $cmd} errorMsg]} { + set obj [lindex $cmd 0] + ns_log notice "Error during ::xo::cleanup: $errorMsg $::errorInfo" + catch { + ns_log notice "... analyze: cmd = $cmd" + ns_log notice "... analyze: $obj is_object? [::xotcl::Object isobject $obj]" + ns_log notice "... analyze: class [$obj info class]" + ns_log notice "... analyze: precedence [$obj info precedence]" + ns_log notice "... analyze: methods [lsort [$obj info methods]]" + } + } + } + #ns_log notice "*** at_end $at_end" + if {[catch {eval $at_end} errorMsg]} { + ns_log notice "Error during ::xo::cleanup: $errorMsg $::errorInfo" + } + array unset ::xo::cleanup + #ns_log notice "*** end of cleanup" + } +} + +#ns_log notice "*** FREECONN? [ns_ictl gettraces freeconn]" +#ns_ictl trace freeconn {ns_log notice "*** FREECONN isconnected=[ns_conn isconnected]"} +#ns_ictl oncleanup {ns_log notice "*** ONCLEANUP isconnected=[ns_conn isconnected]"} Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xotcl-core/tcl/03-doc-procs.tcl'. Fisheye: No comparison available. Pass `N' to diff? Index: openacs-4/packages/xotcl-core/tcl/05-db-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xotcl-core/tcl/05-db-procs.tcl,v diff -u -r1.2.2.1 -r1.2.2.2 --- openacs-4/packages/xotcl-core/tcl/05-db-procs.tcl 15 Jan 2007 08:49:58 -0000 1.2.2.1 +++ openacs-4/packages/xotcl-core/tcl/05-db-procs.tcl 1 Aug 2007 21:39:32 -0000 1.2.2.2 @@ -6,45 +6,392 @@ @cvs-id $Id$ } + namespace eval ::xo::db { + ::xotcl::Object create require - ::xotcl::Object require + require set postgresql_table_exists {select 1 from pg_tables where tablename = '$name'} + require set postgresql_view_exists {select 1 from pg_views where viewname = '$name'} + require set postgresql_index_exists {select 1 from pg_indexes where indexname = '$name'} + require set oracle_table_exists {select 1 from all_tables where table_name = '$name'} + require set oracle_view_exists {select 1 from all_views where view_name = '$name'} + require set oracle_index_exists {select 1 from all_indexes where index_name = '$name'} + require proc table {name definition} { - if {![db_0or1row check-$name \ - "select 1 from pg_tables where tablename = '$name'"]} { - db_dml create-$name "create table $name ($definition)" + if {[db_driverkey ""] eq "oracle"} {set name [string toupper $name]} + if {![db_0or1row [my qn ""] [subst [my set [db_driverkey ""]_table_exists]]]} { + #my log "--table $name does not exist, creating with $definition" + db_dml [my qn create-table-$name] "create table $name ($definition)" } } require proc view {name definition} { - if {![db_0or1row check-$name \ - "select 1 from pg_views where viewname = '$name'"]} { - db_dml create-$name "create view $name AS $definition" + if {[db_driverkey ""] eq "oracle"} {set name [string toupper $name]} + if {![db_0or1row [my qn ""] [subst [my set [db_driverkey ""]_view_exists]]]} { + db_dml [my qn create-view-$name] "create view $name AS $definition" } } + if {[db_driverkey ""] eq "oracle"} { + proc mk_sql_constraint_name {table att suffix} { + set name ${table}_${att}_$suffix + if {[string length $name]>30} { + set sl [string length $suffix] + set name [string range ${table}_${att} 0 [expr {28 - $sl}]]_$suffix + } + return [string toupper $name] + } + } else { + proc mk_sql_constraint_name {table att suffix} { + set name ${table}_${att}_$suffix + return $name + } + } + require proc index {-table -col {-using ""} {-unique false}} { set colpart $col regsub -all ", *" $colpart _ colpart set suffix [expr {$unique ? "un_idx" : "idx"}] set uniquepart [expr {$unique ? "UNIQUE" : ""}] - set name ${table}_${colpart}_$suffix - if {![db_0or1row check_${name} \ - "select 1 from pg_indexes where indexname = '$name'"]} { + set name [::xo::db::mk_sql_constraint_name $table $colpart $suffix] + if {![db_0or1row [my qn ""] [subst [my set [db_driverkey ""]_index_exists]]]} { set using [expr {$using ne "" ? "using $using" : ""}] - db_dml create-$name \ + db_dml [my qn create-index-$name] \ "create $uniquepart index $name ON $table $using ($col)" } } - proc has_ltree {} { + require proc package name { + if {[info command ::${name}::*] eq ""} { + set dir [ns_info tcllib]/../packages/$name + foreach file [glob $dir/tcl/*-procs.tcl] { + uplevel #1 source $file + } + } + } + + proc function_name {sql} { + if {[db_driverkey ""] eq "oracle"} {return [string map [list "__" .] $sql]} + return $sql + } + + ad_proc has_ltree {} { + Check, whether ltree is available (postgres only) + } { ns_cache eval xotcl_object_cache ::xo::has_ltree { - if {[db_string check_ltree "select count(*) from pg_proc where proname = 'ltree_in'"] == 0} { - return 0 + if {[db_driverkey ""] eq "postgresql" && + [db_string check_ltree "select count(*) from pg_proc where proname = 'ltree_in'"]} { + return 1 } - return 1 + return 0 } } + # we create the sql object + ::xotcl::Object create sql + + + if {[db_driverkey ""] eq "postgresql"} { + + # during load, we do not have "package_plsql_args" available yet, so we do it by hand + sql set all_package_functions { + select distinct + substring(function from 0 for position('__' in function)) as package_name, + substring(function from position('__' in function)+2) as object_name + from acs_function_args + } + + sql proc map_datatype {type} { + switch -- $type { + long_text { set type text } + } + return $type + } + sql proc datatype_constraint {type table att} {return ""} + + sql proc select { + -vars:required + -from:required + -where:required + {-groupby ""} + {-limit ""} + {-offset ""} + {-start ""} + {-orderby ""} + {-map_function_names false} + } { + set offset_clause [expr {$offset ne "" ? "OFFSET $offset" : ""}] + set limit_clause [expr {$limit ne "" ? "LIMIT $limit" : ""}] + set order_clause [expr {$orderby ne "" ? "ORDER BY $orderby" : ""}] + set group_clause [expr {$groupby ne "" ? "GROUP BY $groupby" : ""}] + return "SELECT $vars FROM $from WHERE $where $group_clause $order_clause $limit_clause" + } + + sql proc date_trunc {field date} { + return "date_trunc('$field',$date)" + } + sql proc date_trunc_expression {field date date_string} { + return "date_trunc('$field',$date) = '$date_string'" + } + + } else { ;# Oracle + + sql set all_package_functions { + select distinct package_name, object_name + from user_arguments args + where args.position > 0 and package_name is not null + } + + sql proc map_datatype {type} { + switch -- $type { + text { set type varchar2(4000) } + long_text { set type clob } + boolean { set type char(1) } + } + return $type + } + sql proc datatype_constraint {type table att} { + set constraint "" + switch $type { + boolean { + set cname [::xo::db::mk_sql_constraint_name $table $att _ck] + set constraint "constraint $cname check ($att in ('t','f'))"} + } + return $constraint + } + + sql proc select { + -vars:required + -from:required + -where:required + {-groupby ""} + {-limit ""} + {-offset ""} + {-start ""} + {-orderby ""} + {-map_function_names false} + } { + # "-start" not used so far + set order_clause [expr {$orderby ne "" ? "ORDER BY $orderby" : ""}] + set group_clause [expr {$groupby ne "" ? "GROUP BY $groupby" : ""}] + if {$map_function_names} {set vars [::xo::db::function_name $vars]} + set sql "SELECT $vars FROM $from WHERE $where $group_clause" + if {$limit ne "" || $offset ne ""} { + if {$offset eq ""} { + set limit_clause "ROWNUM <= $limit" + } elseif {$limit eq ""} { + set limit_clause "ROWNUM >= $offset" + } else { + set limit_clause "ROWNUM BETWEEN $offset and [expr {$offset+$limit}]" + } + # for pagination, we will need an "inner" sort, such as + # SELECT * FROM (SELECT ...., ROW_NUMBER() OVER (ORDER BY ...) R FROM table) WHERE R BETWEEN 0 and 100 + set sql "SELECT * FROM ($sql $order_clause) WHERE $limit_clause" + } else { + append sql " " $order_clause + } + my log "--returned sql = $sql" + return $sql + } + sql proc date_trunc {field date} { + return "to_char(trunc($date,'$field'), 'YYYY-MM-DD HH24:MI:SS')" + } + sql proc date_trunc_expression {field date date_string} { + return "trunc($date,'$field') = trunc(to_date('$date_string','YYYY-MM-DD'),'$field')" + } + } + sql proc since_interval_condition {var interval} { + set since [clock format [clock scan "-$interval"] -format "%Y-%m-%d %T"] + return "$var > TO_TIMESTAMP('$since','YYYY-MM-DD HH24:MI:SS')" + } } +namespace eval ::xo::db { + Class create DbPackage + + # Some stored procs like content_item__new do currently not define null default values. + # Therefore, we need - temporary - this ugly redundancy to keep + # :required passing and to allow the xowiki regression test to run. + # The correct fix is to define the correct default values in the + # database with define_function_args() + DbPackage array set defaults { + "content_item__new" {RELATION_TAG null DESCRIPTION null TEXT null + CREATION_IP null NLS_LANGUAGE null LOCALE null CONTEXT_ID null + DATA null TITLE null ITEM_ID null + } + "content_type__create_attribute" { + DEFAULT_VALUE null SORT_ORDER null PRETTY_PLURAL null + } + "content_type__drop_type" { + DROP_CHILDREN_P f DROP_TABLE_P f DROP_OBJECTS_P f + } + } + + DbPackage instproc sql-arguments {sql package_name object_name} { + my array unset defined + my set function_args [db_list_of_lists [my qn get_function_params] $sql] + set psql_args [list] + my set arg_order [list] + foreach arg [my set function_args] { + foreach {arg_name default_value} $arg break + lappend psql_args \$_$arg_name + my lappend arg_order $arg_name + my set defined($arg_name) $default_value + } + if {[[self class] exists defaults(${package_name}__$object_name)]} { + set prototype_args [[self class] set defaults(${package_name}__$object_name)] + foreach {arg_name default_value} $prototype_args { + if {![my exists defined($arg_name)]} { + lappend psql_args \$_$arg_name + my lappend arg_order $arg_name + } + } + my array set defined $prototype_args + } + return [join $psql_args ", "] + } + + DbPackage instproc psql-postgresql {package_name object_name full_statement_name} { + set psql_args [my sql-arguments { + select args.arg_name, args.arg_default + from acs_function_args args + where args.function = upper(:package_name) || '__' || upper(:object_name) + order by function, arg_seq + } $package_name $object_name] + my set sql [subst { + select ${package_name}__${object_name}($psql_args) + }] + #return {ns_pg_bind 0or1row $db $sql} + return {ns_set value [ns_pg_bind 0or1row $db $sql] 0} + } + + DbPackage instproc psql-oracle {package_name object_name full_statement_name} { + # + # in Oracle, we have to distinguish between functions and procs + # + set is_function [db_0or1row [my qn is_function] { + select 1 from dual + where exists (select 1 from user_arguments where + package_name = upper(:package_name) + and object_name = upper(:object_name) + and position = 0) + }] + # In Oracle, args.default_value appears to be defunct and useless. + # for now, we simply return "null" as a constant, otherwise the + # argument would be required + set psql_args [my sql-arguments { + select args.argument_name, 'unknown' + from user_arguments args + where args.position > 0 + and args.object_name = upper(:object_name) + and args.package_name = upper(:package_name) + order by args.position + } $package_name $object_name] + if {$is_function} { + my set sql [subst {BEGIN :1 := ${package_name}.${object_name}(\$sql_args); END;}] + return {ns_ora exec_plsql_bind $db $sql 1 ""} + } else { + my set sql [subst {BEGIN ${package_name}.${object_name}(\$sql_args); END;}] + #return {ns_set value [ns_ora select $db $sql] 0} + return {ns_ora dml $db $sql} + } + } + + DbPackage instproc proc_body-postgresql {} { + return { + #defined: [my array get defined] + foreach var \[list [my set arg_order]\] { + set varname \[string tolower $var\] + if {\[info exists $varname\]} { + set $var \[set $varname\] + set _$var :$var + } else { + set _$var null + } + } + set sql "[my set sql]" + db_with_handle -dbn $dbn db { + #my log "sql=$sql, sql_command=[set sql_command]" + return \[ [set sql_command] \] + } + } + } + + DbPackage instproc proc_body-oracle {} { + return { + #defined: [my array get defined] + set sql_args \[list\] + foreach var \[list [my set arg_order]\] { + set varname \[string tolower $var\] + if {\[info exists $varname\]} { + lappend sql_args "$varname => :$varname" + } + } + set sql_args \[join $sql_args ,\] + set sql "[my set sql]" + db_with_handle -dbn $dbn db { + #my log "sql=$sql, sql_command=[set sql_command]" + return \[ [set sql_command] \] + } + } + } + + DbPackage instproc dbproc_nonposargs {object_name} { + # + # This method compiles a stored procedure into a xotcl method + # using a classic nonpositional argument style interface. + # + # The current implementation should work on postgres and oracle (not tested) + # but will not work, when a single openacs instance want to talk to + # postgres and oracle simultaneously. Not sure, how important this is... + # + if {$object_name eq "set"} { + my log "We cannot handle object_name = '$object_name' in this version" + return + } + set package_name [namespace tail [self]] + set statement_name [my qn $package_name-$object_name] + set sql_command [my psql-[db_driverkey ""] $package_name $object_name $statement_name] + set proc_body [my proc_body-[db_driverkey ""]] + + set nonposarg_list [list [list -dbn ""]] + foreach arg_name [my set arg_order] { + set default_value [my set defined($arg_name)] + set required [expr {$default_value eq "" ? ":required" : ""}] + # special rule for DBN ... todo: proc has to handle this as well + set nonposarg_name [expr {$arg_name eq "DBN" ? "DBN" : [string tolower $arg_name]}] + lappend nonposarg_list -$nonposarg_name$required + } + #my log "-- define $object_name $nonposarg_list" + + my ad_proc $object_name $nonposarg_list {} [subst -novariables $proc_body] + } + + DbPackage instproc unknown {m args} { + error "Error: unknown database method $m for dbpackage [self]" + } + + DbPackage proc create_all_functions {} { + db_foreach [my qn ""] [::xo::db::sql set all_package_functions] { + #if {![my isobject $package_name]} { DbPackage create $package_name } + #$package_name dbproc_exportvars $object_name + set class_name ::xo::db::sql::[string tolower $package_name] + if {![my isobject $class_name]} { DbPackage create $class_name } + $class_name dbproc_nonposargs [string tolower $object_name] + } + } + + DbPackage create_all_functions + + ad_proc tcl_date {timestamp tz_var} { + Convert the time stamp (coming from the database) into a format, which + can be passed to Tcl's "clock scan". + } { + upvar $tz_var tz + set tz 00 + regexp {^([^.]+)[.][0-9]+(.*)$} $timestamp _ timestamp tz + return $timestamp + } +} + + Fisheye: Tag 1.10.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xotcl-core/tcl/05-doc-procs.tcl'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.4.6.1 refers to a dead (removed) revision in file `openacs-4/packages/xotcl-core/tcl/10-recreation-procs.tcl-old'. Fisheye: No comparison available. Pass `N' to diff? Index: openacs-4/packages/xotcl-core/tcl/20-Ordered-Composite-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xotcl-core/tcl/20-Ordered-Composite-procs.tcl,v diff -u -r1.7.2.1 -r1.7.2.2 --- openacs-4/packages/xotcl-core/tcl/20-Ordered-Composite-procs.tcl 15 Jan 2007 08:49:58 -0000 1.7.2.1 +++ openacs-4/packages/xotcl-core/tcl/20-Ordered-Composite-procs.tcl 1 Aug 2007 21:39:32 -0000 1.7.2.2 @@ -61,7 +61,9 @@ # destroy all children of the ordered composite if {[my exists __children]} { #my log "--W destroying children [my set __children]" - foreach c [my set __children] { $c destroy } + foreach c [my set __children] { + if {[my isobject $c]} {$c destroy} + } } #show_stack;my log "--W children murdered, now next, chlds=[my info children]" namespace eval [self] {namespace forget *} ;# for pre 1.4.0 versions @@ -135,5 +137,19 @@ } } } + + Class OrderedComposite::MethodCompare + OrderedComposite::MethodCompare instproc __compare {a b} { + set by [my set __orderby] + set x [$a $by] + set y [$b $by] + if {$x < $y} { + return -1 + } elseif {$x > $y} { + return 1 + } else { + return 0 + } + } } Index: openacs-4/packages/xotcl-core/tcl/30-widget-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xotcl-core/tcl/30-widget-procs.tcl,v diff -u -r1.10 -r1.10.2.1 --- openacs-4/packages/xotcl-core/tcl/30-widget-procs.tcl 15 Sep 2006 16:33:06 -0000 1.10 +++ openacs-4/packages/xotcl-core/tcl/30-widget-procs.tcl 1 Aug 2007 21:39:32 -0000 1.10.2.1 @@ -39,16 +39,27 @@ set ::xo::acs_lang_url [apm_package_url_from_key acs-lang]admin - proc localize text { + proc localize {text {inline 0}} { + #ns_log notice "--local $text $inline" if {![my exists __localizer]} { my set __localizer [list] } if {[string first \x002 $text] == -1} { return $text } else { set return_text "" + if {$inline} { + # Attempt to move all message keys outside of tags + while { [regsub -all {(<[^>]*)(\x002\(\x001[^\x001]*\x001\)\x002)([^>]*>)} $text {\2\1\3} text] } {} + + # Attempt to move all message keys outside of statements + regsub -all -nocase {(]*>[^<]*)(\x002\(\x001[^\x001]*\x001\)\x002)([^<]*]*>)} $text {\2\1\3} text + + while { [regsub -all -nocase {(]*>[^<]*)(\x002\(\x001[^\x001]*\x001\)\x002)} $text {\2\1} text] } {} + } + while {[regexp {^([^\x002]*)\x002\(\x001([^\x001]*)\x001\)\x002(.*)$} $text _ \ - before key text]} { + before key text]} { append return_text $before foreach {package_key message_key} [split $key .] break set url [export_vars -base $::xo::acs_lang_url/edit-localized-message { @@ -67,7 +78,12 @@ }] set type missing } - my lappend __localizer [::xo::Localizer new -type $type -key $key -url $url] + if {!$inline} { + my lappend __localizer [::xo::Localizer new -type $type -key $key -url $url] + } else { + set l [::xo::Localizer new -type $type -key $key -url $url] + append return_text [$l asHTML] + } } append return_text $text return $return_text @@ -134,7 +150,11 @@ # proc get_user_name {uid} { if {$uid ne "" && $uid != 0} { - acs_user::get -user_id $uid -array user + if {[catch {acs_user::get -user_id $uid -array user}]} { + # we saw some strange cases, where after a regression, + # a user_id was present, which was already deleted... + return nobody + } return "$user(first_names) $user(last_name)" } else { return nobody @@ -144,13 +164,15 @@ # # define an abstract table # - Class Table -superclass OrderedComposite \ - -parameter {{no_data "No Data"} {renderer TABLE2}} + -parameter [expr {[apm_version_names_compare [ad_acs_version] 5.3.0] == 1 ? + {{no_data "No Data"} {renderer TABLE3}} : + {{no_data "No Data"} {renderer TABLE2}} + }] Table instproc destroy {} { #my log "-- " - foreach c {__actions __columns} { + foreach c {:__bulkactions __actions __columns} { #my log "-- namespace eval [self]::$c {namespace forget *}" namespace eval [self]::$c {namespace forget *} } @@ -161,6 +183,11 @@ namespace eval $M {namespace import -force [self class]::*} $M contains $cmd } + Table instproc __bulkactions {cmd} { + set M [OrderedComposite create [self]::__bulkactions] + namespace eval $M {namespace import -force [self class]::*} + $M contains $cmd + } Table instproc columns {cmd} { set M [OrderedComposite create [self]::__columns] namespace eval $M {namespace import -force [self class]::*} @@ -177,7 +204,7 @@ } Table instproc render_with {renderer trn_mixin} { - #my log "--" + #my log "-- renderer=$renderer" set cl [self class] [self] mixin ${cl}::$renderer foreach child [$cl info classchildren] { @@ -199,19 +226,25 @@ Table instproc write_csv {} { set output "" set line [list] + my msg columns=[[self]::__columns children] foreach column [[self]::__columns children] { - set value [string map {\" \\\"} [$column name]] + set label [$column label] + if {[regexp {^#(.*)#$} $label _ message_key]} { + set label [_ $message_key] + } + set value [string map {\" \\\"} $label] lappend line \"$value\" } append output [join $line ,] \n foreach row [my children] { set line [list] foreach column [[self]::__columns children] { - set value [string map {\" \\\"} [$row set [$column name]]] + set value [string map {\" \\\"} [$row set [$column set name]]] lappend line \"$value\" } append output [join $line ,] \n } + #ns_return 200 text/plain $output ns_return 200 text/csv $output } @@ -253,6 +286,23 @@ return -[my name] } + Class BulkAction \ + -superclass ::xo::OrderedComposite::Child \ + -parameter {name id {html {}}} \ + -instproc actions {cmd} { + my init + set grandParent [[my info parent] info parent] + if {![my exists name]} {my set name [namespace tail [self]]} + set M [::xo::OrderedComposite create ${grandParent}::__bulkactions] + namespace eval $M {namespace import -force ::xo::Table::*} + $M contains $cmd + $M set __belongs_to [self] + $M set __identifier [my set name] + } \ + -instproc get-slots {} { + ; + } + Class AnchorField \ -superclass ::xo::Table::Field \ -instproc get-slots {} { @@ -269,7 +319,6 @@ -instproc get-slots {} { set slots [list -[my name]] lappend slots [list -[my name].src [my src]] - lappend slots [list -[my name].href ""] foreach att {width height border title alt} { if {[my exists $att]} { lappend slots [list -[my name].$att [my $att]] @@ -280,33 +329,40 @@ return $slots } + Class ImageAnchorField \ + -superclass ::xo::Table::ImageField \ + -instproc get-slots {} { + return [concat [next] -[my name].href ""] + } + Class ImageField_EditIcon \ - -superclass ImageField -parameter { + -superclass ImageAnchorField -parameter { {src /resources/acs-subsite/Edit16.gif} {width 16} {height 16} {border 0} {title "[_ xotcl-core.edit_item]"} {alt "edit"} } # for xotcl 1.4.0: {title [_ xotcl-core.edit_item]} {alt "edit"} Class ImageField_AddIcon \ - -superclass ImageField -parameter { + -superclass ImageAnchorField -parameter { {src /resources/acs-subsite/Add16.gif} {width 16} {height 16} {border 0} {title "Add Item"} {alt "add"} } Class ImageField_ViewIcon \ - -superclass ImageField -parameter { + -superclass ImageAnchorField -parameter { {src /resources/acs-subsite/Zoom16.gif} {width 16} {height 16} {border 0} {title "View Item"} {alt "view"} } Class ImageField_DeleteIcon \ - -superclass ImageField -parameter { + -superclass ImageAnchorField -parameter { {src /resources/acs-subsite/Delete16.gif} {width 16} {height 16} {border 0} {title "Delete Item"} {alt "delete"} } # export table elements - namespace export Field AnchorField Action ImageField \ - ImageField_EditIcon ImageField_ViewIcon ImageField_DeleteIcon ImageField_AddIcon + namespace export Field AnchorField Action ImageField ImageAnchorField \ + ImageField_EditIcon ImageField_ViewIcon ImageField_DeleteIcon ImageField_AddIcon \ + BulkAction } } @@ -321,6 +377,9 @@ -instproc init_renderer {} { #my log "--" my set __rowcount 0 + my set css.table-class list + my set css.tr.even-class list-even + my set css.tr.odd-class list-odd } TABLE instproc render-actions {} { @@ -339,6 +398,27 @@ } } + TABLE instproc render-bulkactions {} { + set bulkactions [[self]::__bulkactions children] + html::div -class "list-button-bar-bottom" { + html::t "Bulk-Actions:" + set bulkaction_container [[lindex $bulkactions 0] set __parent] + set name [$bulkaction_container set __identifier] + + html::ul -class compact { + foreach ba $bulkactions { + html::li { + html::a -title [$ba tooltip] -class button -href # \ + -onclick "acs_ListBulkActionClick('$name','[$ba url]'); return false;" \ + { + html::t [$ba label] + } + } + } + } + } + } + TABLE instproc render-body {} { html::tr -class list-header { foreach o [[self]::__columns children] { @@ -350,7 +430,10 @@ html::tr {html::td { html::t [my set no_data]}} } else { foreach line [my children] { - html::tr -class [expr {[my incr __rowcount]%2 ? "list-odd" : "list-even" }] { + #my log "--LINE vars=[my info vars] cL: [[self class] info vars] r=[my renderer]" + html::tr -class [expr {[my incr __rowcount]%2 ? + [my set css.tr.odd-class] : + [my set css.tr.even-class] }] { foreach field [[self]::__columns children] { html::td [concat [list class list] [$field html]] { $field render-data $line @@ -363,9 +446,22 @@ TABLE instproc render {} { if {![my isobject [self]::__actions]} {my actions {}} - html::table -class list { - my render-actions - my render-body + if {![my isobject [self]::__bulkactions]} {my bulkactions {}} + set bulkactions [[self]::__bulkactions children] + if {$bulkactions eq ""} { + html::table -class [my set css.table-class] { + my render-actions + my render-body + } + } else { + set name [[self]::__bulkactions set __identifier] + html::form -name $name { + html::table -class [my set css.table-class] { + my render-actions + my render-body + } + my render-bulkactions + } } } @@ -391,7 +487,11 @@ Class create TABLE::Field -superclass ::xo::Drawable TABLE::Field instproc render-data {line} { - html::t [$line set [my name]] + if {[$line exists [my name].richtext]} { + html::t -disableOutputEscaping [$line set [my name]] + } else { + html::t [$line set [my name]] + } } TABLE::Field instproc render {} { @@ -432,7 +532,7 @@ set href [export_vars -base [ad_conn url] $query] html::a -href $href -title $title { html::t [my _ label] - html::img -src $img -alt "" + html::img -src $img -alt "" -border 0 } } @@ -453,12 +553,43 @@ Class create TABLE::ImageField \ -superclass TABLE::Field \ -instproc render-data {line} { - html::a -href [$line set [my name].href] -style "border-bottom: none;" { - html::img [$line attlist [my name] {src width height border title alt}] {} - } - $line render_localizer + html::a -style "border-bottom: none;" { + html::img [$line attlist [my name] {src width height border title alt}] {} + } + $line render_localizer } + Class create TABLE::ImageAnchorField \ + -superclass TABLE::Field \ + -instproc render-data {line} { + set href [$line set [my name].href] + if {$href ne ""} { + html::a -href $href -style "border-bottom: none;" { + html::img [$line attlist [my name] {src width height border title alt}] {} + } + $line render_localizer + } + } + + Class create TABLE::BulkAction -superclass ::xo::Drawable + TABLE::BulkAction instproc render {} { + set name [my name] + #my msg [my serialize] + html::th -class list { + html::input -type checkbox -name __bulkaction \ + -onclick "acs_ListCheckAll('$name', this.checked)" \ + -title "Mark/Unmark all rows" + } + } + TABLE::BulkAction instproc render-data {line} { + #my msg [my serialize] + set name [my name] + set value [$line set [my id]] + html::input -type checkbox -name $name -value $value \ + -id "$name,$value" \ + -title "Mark/Unmark this row" + } + Class TABLE2 \ -superclass TABLE \ -instproc render-actions {} { @@ -472,19 +603,49 @@ } \ -instproc render {} { if {![my isobject [self]::__actions]} {my actions {}} + if {![my isobject [self]::__bulkactions]} {my __bulkactions {}} + set bulkactions [[self]::__bulkactions children] html::div { my render-actions - html::div -class table { - html::table -class list {my render-body} - } + if {$bulkactions eq ""} { + html::div -class table { + html::table -class [my set css.table-class] {my render-body} + } + } else { + set name [[self]::__bulkactions set __identifier] + html::form -name $name { + html::div -class table { + html::table -class [my set css.table-class] {my render-body} + my render-bulkactions + } + } + } } } + Class create TABLE2::Action -superclass TABLE::Action Class create TABLE2::Field -superclass TABLE::Field Class create TABLE2::AnchorField -superclass TABLE::AnchorField Class create TABLE2::ImageField -superclass TABLE::ImageField - + Class create TABLE2::ImageAnchorField -superclass TABLE::ImageAnchorField + Class create TABLE2::BulkAction -superclass TABLE::BulkAction + + Class TABLE3 \ + -superclass TABLE2 \ + -instproc init_renderer {} { + next + my set css.table-class list-table + my set css.tr.even-class even + my set css.tr.odd-class odd + } + + Class create TABLE3::Action -superclass TABLE::Action + Class create TABLE3::Field -superclass TABLE::Field + Class create TABLE3::AnchorField -superclass TABLE::AnchorField + Class create TABLE3::ImageField -superclass TABLE::ImageField + Class create TABLE3::ImageAnchorField -superclass TABLE::ImageAnchorField + Class create TABLE3::BulkAction -superclass TABLE::BulkAction } Class TableWidget \ Index: openacs-4/packages/xotcl-core/tcl/40-thread-mod-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xotcl-core/tcl/40-thread-mod-procs.tcl,v diff -u -r1.3 -r1.3.2.1 --- openacs-4/packages/xotcl-core/tcl/40-thread-mod-procs.tcl 14 Jul 2006 01:22:11 -0000 1.3 +++ openacs-4/packages/xotcl-core/tcl/40-thread-mod-procs.tcl 1 Aug 2007 21:39:32 -0000 1.3.2.1 @@ -12,7 +12,7 @@ When an instance of THREAD is created (e.g. t1), an init-command is provided. e.g.:
-    THREAD create t1 {
+    ::xotcl::THREAD create t1 {
       Class Counter -parameter {{value 1}}
       Counter instproc ++ {} {my incr value}
       Counter c1
@@ -52,7 +52,7 @@
    creates a Proxy for an object c1 in thread t1.
    After this, c1 can be used like an local object.
   
-    THREAD::Proxy c1 -attach t1
+    ::xotcl::THREAD::Proxy c1 -attach t1
     set x [c1 ++]
   
The Proxy forwards all commands to the @@ -85,9 +85,9 @@ ::xotcl::Object setExitHandler { #my log "EXITHANDLER of request thread [pid]" - if {[catch {Proxy detachAll} m]} { - #my log "EXITHANDLER error in detachAll $m" - } + #if {[catch {::xotcl::THREAD::Proxy detachAll} m]} { + # #my log "EXITHANDLER error in detachAll $m" + #} } ::Serializer exportObjects { @@ -102,7 +102,7 @@ # -parameter {{persistent 0}} Class create ::xotcl::THREAD \ - -parameter {{persistent 0}} + -parameter {{persistent 0} {lightweight 0}} #Class create ::xotcl::THREAD \ # -parameter {{persistent 0}} @@ -117,8 +117,20 @@ } ::xotcl::THREAD instproc init cmd { - my instvar initcmd - set initcmd { + my instvar initcmd + if {![ns_ictl epoch]} { + #ns_log notice "--THREAD init [self] no epoch" + + # We are during initialization. For some unknown reasons, XOTcl + # is not available in newly created threads, so we have to care for it. + # We need only a partial initialization, to allow the exit handler + # to be defined. + set initcmd { + package req XOTcl + namespace import -force ::xotcl::* + } + } + append initcmd { ::xotcl::Object setExitHandler { #my log "EXITHANDLER of slave thread SELF [pid]" } @@ -161,7 +173,7 @@ my log "thread terminated" nsv_unset [self class] [self] thread::mutex destroy [my set mutex] - ns_log notice "mutex [my set mutex] destroyed" + my log "+++ mutex [my set mutex] destroyed" } } next @@ -186,14 +198,31 @@ #my check_blueprint #my log "after lock" if {![nsv_exists [self class] [self]]} { - set tid [::thread::create] + if {[my lightweight]} { + my log "CREATE lightweight thread" + set tid [::thread::create -thin] + } else { + set tid [::thread::create] + } nsv_set [self class] [self] $tid if {[my persistent]} { - my log "created new persistent [self class] as $tid pid=[pid]" + my log "--created new persistent [self class] as $tid pid=[pid]" } else { - my log "created new [self class] as $tid pid=[pid]" + my log "--created new [self class] as $tid pid=[pid]" } - ::thread::send $tid [my set initcmd] + #my log "--THREAD DO send [self] epoch = [ns_ictl epoch]" + if {[my lightweight]} { + } elseif {![ns_ictl epoch]} { + #ns_log notice "--THREAD send [self] no epoch" + # We are during initialization. For some unknown reasons, XOTcl + # is not available in newly created threads, so we have to care + # for full initialization, including xotcl blueprint. + _ns_savenamespaces + set initcmd [ns_ictl get] + } + append initcmd [my set initcmd] + #ns_log notice "INIT $initcmd" + ::thread::send $tid $initcmd } else { set tid [nsv_get [self class] [self]] } @@ -223,7 +252,7 @@ # create a sample persistent thread that can be acessed # via request threads -#THREAD create t0 { +#::xotcl::THREAD create t0 { # Class Counter -parameter {{value 1}} # Counter instproc ++ {} {my incr value} # Index: openacs-4/packages/xotcl-core/tcl/bgdelivery-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xotcl-core/tcl/bgdelivery-procs.tcl,v diff -u -r1.7 -r1.7.2.1 --- openacs-4/packages/xotcl-core/tcl/bgdelivery-procs.tcl 12 Dec 2006 19:09:26 -0000 1.7 +++ openacs-4/packages/xotcl-core/tcl/bgdelivery-procs.tcl 1 Aug 2007 21:39:32 -0000 1.7.2.1 @@ -11,6 +11,7 @@ ns_log notice "libthread does not appear to be available, NOT loading bgdelivery" return } +#return ;# DONT COMMIT # catch {ns_conn contentsentlength} alone does not work, since we do not have # a connection yet, and the bgdelivery won't be activated @@ -108,7 +109,79 @@ fconfigure [my channel] -translation binary incr ::subscription_count } -} -persistent 1 + + Class ::HttpSpooler -parameter {channel {timeout 10000} {counter 0}} + ::HttpSpooler instproc init {} { + my set running 0 + my set release 0 + my set spooling 0 + my set queue [list] + } + ::HttpSpooler instproc all_done {} { + catch {close [my channel]} + my log "" + my destroy + } + ::HttpSpooler instproc release {} { + # release indicates the when running becomes 0, the spooler is finished + my set release 1 + if {[my set running] == 0} {my all_done} + } + ::HttpSpooler instproc done {reason request} { + my instvar running release + incr running -1 + my log "--running $running" + $request destroy + if {$running == 0 && $release} {my all_done} + } + ::HttpSpooler instproc deliver {data request} { + my instvar spooling + my log "-- spooling $spooling" + if {$spooling} { + my log "--enqueue" + my lappend queue $data $request + } else { + #my log "--send" + set spooling 1 + # puts -nonewline [my channel] $data + # my done + set filename [ns_tmpnam] + set fd [open $filename w] + fconfigure $fd -translation binary + puts -nonewline $fd $data + close $fd + set fd [open $filename] + fconfigure $fd -translation binary + fconfigure [my channel] -translation binary + fcopy $fd [my channel] -command \ + [list [self] end-delivery $filename $fd [my channel] $request] + } + } + ::HttpSpooler instproc end-delivery {filename fd ch request bytes args} { + my instvar queue + my log "--- end of delivery of $filename, $bytes bytes written $args" + if {[catch {close $fd} e]} {ns_log notice "httpspool, closing file $filename, error: $e"} + my set spooling 0 + if {[llength $queue]>0} { + my log "--dequeue" + set data [lindex $queue 0] + set req [lindex $queue 1] + set queue [lreplace $queue 0 1] + my deliver $data $req + } + my done delivered $request + } + ::HttpSpooler instproc add {-request {-post_data ""}} { + if {[regexp {http://([^/]*)(/.*)} $request _ host path]} { + set port 80 + regexp {^([^:]+):(.*)$} $host _ host port + my incr running + xo::AsyncHttpRequest [self]::[my incr counter] \ + -host $host -port $port -path $path \ + -timeout [my timeout] -post_data $post_data -request_manager [self] + } + } +} -persistent 1 ;# -lightweight 1 bgdelivery ad_forward running { Interface to the background delivery thread to query the currently running deliveries. @@ -170,4 +243,19 @@ bgdelivery proc send_to_subscriber {key msg} { my do -async ::Subscriber broadcast $key $msg -} \ No newline at end of file +} +##################################### +bgdelivery proc create_spooler {{-content_type text/plain} {-timeout 10000}} { + ns_write "HTTP/1.0 200 OK\r\nContent-type: $content_type\r\n\r\n" + set ch [ns_conn channel] + thread::transfer [my get_tid] $ch + my do ::HttpSpooler new -channel $ch -timeout $timeout +} + +bgdelivery proc spooler_add_request {spooler request {post_data ""}} { + my log "-- do -async $spooler add -request $request" + my do -async $spooler add -request $request -post_data $post_data +} +bgdelivery proc spooler_release {spooler} { + my do -async $spooler release +} Index: openacs-4/packages/xotcl-core/tcl/chat-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xotcl-core/tcl/Attic/chat-procs.tcl,v diff -u -r1.11 -r1.11.2.1 --- openacs-4/packages/xotcl-core/tcl/chat-procs.tcl 2 Dec 2006 19:07:01 -0000 1.11 +++ openacs-4/packages/xotcl-core/tcl/chat-procs.tcl 1 Aug 2007 21:39:32 -0000 1.11.2.1 @@ -39,7 +39,9 @@ set msg [ad_quotehtml $msg] my log "-- msg=$msg" - if {$get_new && [info command ::thread::mutex] ne ""} { + if {$get_new + && [info command ::thread::mutex] ne "" + && [info command ::bgdelivery] ne ""} { # we could use the streaming interface my broadcast_msg [Message new -volatile -time [clock seconds] \ -user_id $user_id -msg $msg -color $color] Index: openacs-4/packages/xotcl-core/tcl/context-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xotcl-core/tcl/context-procs.tcl,v diff -u -r1.6.2.1 -r1.6.2.2 --- openacs-4/packages/xotcl-core/tcl/context-procs.tcl 15 Jan 2007 08:49:58 -0000 1.6.2.1 +++ openacs-4/packages/xotcl-core/tcl/context-procs.tcl 1 Aug 2007 21:39:32 -0000 1.6.2.2 @@ -50,13 +50,17 @@ } # get the query parameters (from the url) + #my log "--P processing actual query $actual_query" foreach querypart [split $actual_query &] { set name_value_pair [split $querypart =] set att_name [ns_urldecode [lindex $name_value_pair 0]] - set att_value [expr {[llength $name_value_pair] == 1 ? 1 : - [ns_urldecode [lindex $name_value_pair 1]] }] + if {[llength $name_value_pair] == 1} { + set att_value 1 + } else { + set att_value [ns_urldecode [lindex $name_value_pair 1]] + } if {[info exists (-$att_name)]} { - set passed_args(-$att_name) $att_value + lappend passed_args(-$att_name) $att_value } elseif {$all_from_query} { set queryparm($att_name) $att_value } @@ -99,6 +103,17 @@ #my log "--cc qp [array names queryparm] // $actual_query" } + Context instproc query_parameter {name {default ""}} { + my instvar queryparm + return [expr {[info exists queryparm($name)] ? $queryparm($name) : $default}] + } + Context instproc exists_query_parameter {name} { + #my log "--qp my exists $name => [my exists queryparm($name)]" + my exists queryparm($name) + } + Context instproc get_all_query_parameter {} { + return [my array get queryparm] + } Context ad_instproc export_vars {{-level 1}} { Export the query variables @@ -150,7 +165,6 @@ url } - # TODO code (in xinha, + css) # TODO edit revision loop ConnectionContext proc require { @@ -161,7 +175,7 @@ {-actual_query " "} } { if {![info exists url]} { - my log "--CONN ns_conn url" + #my log "--CONN ns_conn url" set url [ns_conn url] } #my log "--i [self args]" @@ -174,19 +188,19 @@ if {![my isobject ::xo::cc]} { my create ::xo::cc \ -package_id $package_id \ - -parameter_declaration $parameter \ + [list -parameter_declaration $parameter] \ -user_id $user_id \ -actual_query $actual_query \ -url $url - #my log "--cc ::xo::cc created $url" - ::xo::cc destroy_on_cleanup + #my msg "--cc ::xo::cc created $url [::xo::cc serialize]" + ::xo::cc destroy_on_cleanup } else { #my log "--cc ::xo::cc reused $url" ::xo::cc configure \ -package_id $package_id \ -url $url \ -actual_query $actual_query \ - -parameter_declaration $parameter + [list -parameter_declaration $parameter] ::xo::cc set_user_id $user_id ::xo::cc process_query_parameter } @@ -200,7 +214,7 @@ } ConnectionContext instproc returnredirect {url} { - my log "--rp" + #my log "--rp" my set __continuation [list ad_returnredirect $url] return "" } @@ -246,12 +260,21 @@ call ::permission::permission_p but avoid multiple calls in the same session through caching in the connection context } { - #my log "--p [self args] [info exists party_id] " if {![info exists party_id]} { set party_id [my user_id] #my log "--p party_id $party_id" - #::xo::show_stack if {$party_id == 0} { + set key permission($object_id,$privilege,$party_id) + if {[my exists $key]} {return [my set $key]} + set granted [permission::permission_p -party_id $party_id \ + -object_id $object_id \ + -privilege $privilege] + if {$granted} { + my set $key $granted + return $granted + } + # The permission is not granted for the public. + # We force the user to login auth::require_login return 0 } @@ -270,27 +293,36 @@ # next # } - ConnectionContext instproc query_parameter {name {default ""}} { - my instvar queryparm - return [expr {[info exists queryparm($name)] ? $queryparm($name) : $default}] - } - ConnectionContext instproc exists_query_parameter {name} { - #my log "--qp my exists $name => [my exists queryparm($name)]" - my exists queryparm($name) - } - ConnectionContext instproc form_parameter {name {default ""}} { + ConnectionContext instproc get_all_form_parameter {} { my instvar form_parameter + #array set form_parameter [ns_set array [ns_getform]] + foreach {att value} [ns_set array [ns_getform]] { + if {[info exists form_parameter($att)]} { + my set form_parameter_multiple($att) 1 + } + lappend form_parameter($att) $value + } + } + ConnectionContext instproc form_parameter {name {default ""}} { + my instvar form_parameter form_parameter_multiple if {![info exists form_parameter]} { - array set form_parameter [ns_set array [ns_getform]] + my get_all_form_parameter } - return [expr {[info exists form_parameter($name)] ? - $form_parameter($name) : $default}] + if {[info exists form_parameter($name)]} { + if {[info exists form_parameter_multiple($name)]} { + return $form_parameter($name) + } else { + return [lindex $form_parameter($name) 0] + } + } else { + return $default + } } ConnectionContext instproc exists_form_parameter {name} { my instvar form_parameter if {![info exists form_parameter]} { - array set form_parameter [ns_set array [ns_getform]] + my get_all_form_parameter } my exists form_parameter($name) } @@ -335,8 +367,8 @@ init_url false requires the package_id to be specified and a call to Package instproc set_url to complete initialization } { + #my log "--i [self args], URL=$url, init_url=$init_url" - #my log "--i [self args]" if {$url eq "" && $init_url} { #set url [ns_conn url] #my log "--CONN ns_conn url" @@ -363,7 +395,7 @@ } { #my log "--R $package_id exists? [my isobject ::$package_id]" if {![my isobject ::$package_id]} { - #my log "--R we have to create ::$package_id" + #my log "--R we have to create ::$package_id //url='$url'" if {$url ne ""} { my create ::$package_id -url $url } else { @@ -384,14 +416,16 @@ PackageMgr create Package -parameter { id url + {context ::xo::cc} package_url + package_key instance_name } - Package instforward query_parameter ::xo::cc %proc - Package instforward exists_query_parameter ::xo::cc %proc - Package instforward form_parameter ::xo::cc %proc - Package instforward exists_form_parameter ::xo::cc %proc - Package instforward returnredirect ::xo::cc %proc + Package instforward query_parameter {%my set context} %proc + Package instforward exists_query_parameter {%my set context} %proc + Package instforward form_parameter {%my set context} %proc + Package instforward exists_form_parameter {%my set context} %proc + Package instforward returnredirect {%my set context} %proc Package instproc get_parameter {attribute {default ""}} { @@ -404,18 +438,31 @@ my instvar id url set id [namespace tail [self]] array set info [site_node::get_from_object_id -object_id $id] - my package_url $info(url) + set package_url $info(url) + if {[ns_conn isconnected]} { + # in case of of host-node map, simplify the url to avoid redirects + # .... but ad_host works only, when we are connected.... TODO: solution for syndication + set root [root_of_host [ad_host]] + regexp "^${root}(.*)$" $package_url _ package_url + } + #my log "--R package_url= $package_url (was $info(url))" + my package_url $package_url + my package_key $info(package_key) my instance_name $info(instance_name) - if {![my exists url]} { + if {[my exists url] && [info exists root]} { + regexp "^${root}(.*)$" $url _ url + } else { + my log "--R we have no url, use package_url" # if we have no more information, we use the package_url as actual url - set url [my package_url] - } + set url $package_url + } my set_url -url $url } Package instproc set_url {-url} { my url $url my set object [string range [my url] [string length [my package_url]] end] + #my log "--R object set to [my set object], [my serialize]" } # Package instproc destroy {} { Index: openacs-4/packages/xotcl-core/tcl/generic-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xotcl-core/tcl/generic-procs.tcl,v diff -u -r1.40.2.1 -r1.40.2.2 --- openacs-4/packages/xotcl-core/tcl/generic-procs.tcl 15 Jan 2007 08:49:58 -0000 1.40.2.1 +++ openacs-4/packages/xotcl-core/tcl/generic-procs.tcl 1 Aug 2007 21:39:32 -0000 1.40.2.2 @@ -53,69 +53,221 @@ } proc package_id_from_package_key { key } { - set id [apm_version_id_from_package_key $key] - set mount_url [site_node::get_children -all -package_key $key -node_id $id] - array set site_node [site_node::get -url $mount_url] - return $site_node(package_id) + return [db_string dbqd.null.get_package_id_from_key \ + {select package_id from apm_packages where package_key = :key}] } CrClass instproc unknown { obj args } { my log "unknown called with $obj $args" } + # + # The following methods are used oracle, postgres specific code (locking, + # for the type hierarchies, ... + # + CrClass instproc lock {tablename mode} { + # no locking by default + } + if {[db_driverkey ""] eq "postgresql"} { + # + # Postgres + # + CrClass instproc object_types_query { + {-subtypes_first:boolean false} + } { + my instvar object_type_key + set order_clause [expr {$subtypes_first ? "order by tree_sortkey desc":""}] + return "select object_type from acs_object_types where + tree_sortkey between '$object_type_key' and tree_right('$object_type_key') + $order_clause" + } + CrClass instproc init_type_hierarchy {} { + my instvar object_type + my set object_type_key [db_list [my qn get_tree_sortkey] { + select tree_sortkey from acs_object_types + where object_type = :object_type + }] + } + CrClass instproc type_selection {-with_subtypes:boolean} { + my instvar object_type_key object_type + if {$with_subtypes} { + #return "acs_object_types.tree_sortkey between '$object_type_key' and tree_right('$object_type_key')" + #return "ci.content_type in ('[join [my object_types] ',']')" + return "ci.content_type in ([my object_types_query])" + } else { + return "ci.content_type = '$object_type'" + #return "acs_object_types.tree_sortkey = '$object_type_key'" + } + } + set pg_version [db_string dbqd.null.get_version { + select substring(version() from 'PostgreSQL #"[0-9]+.[0-9+]#".%' for '#') }] + ns_log notice "--Postgres Version $pg_version" + if {$pg_version < 8.2} { + ns_log notice "--Postgres Version $pg_version older than 8.2, use locks" + CrClass instproc lock {tablename mode} { + db_dml [my qn lock_objects] "LOCK TABLE $tablename IN $mode MODE" + } + } + } else { + # + # Oracle + # + CrClass instproc object_types_query { + {-subtypes_first:boolean false} + } { + my instvar object_type + set order_clause [expr {$subtypes_first ? "order by LEVEL desc":""}] + return "select object_type from acs_object_types + start with object_type = '$object_type' + connect by prior object_type = supertype $order_clause" + } + CrClass instproc init_type_hierarchy {} { + my set object_type_key {} + } + CrClass instproc type_selection {-with_subtypes:boolean} { + my instvar object_type + if {$with_subtypes} { + return "acs_objects.object_type in ([my object_types_query])" + } else { + return "acs_objects.object_type = '$object_type'" + } + } + } + CrClass set common_query_atts { - item_id revision_id creation_user creation_date last_modified object_type - creation_user last_modified publish_status + object_type item_id revision_id + creation_user creation_date creation_user + publish_status last_modified } if {[apm_version_names_compare [ad_acs_version] 5.2] > -1} { CrClass lappend common_query_atts package_id } CrClass set common_insert_atts {name title description mime_type nls_language text} - CrClass instproc object_types { - {-subtypes_first:boolean false} - } { - my instvar object_type_key - set order_clause [expr {$subtypes_first ? "order by tree_sortkey desc":""}] - return [db_list get_object_types " - select object_type from acs_object_types where - tree_sortkey between :object_type_key and tree_right(:object_type_key) - $order_clause - "] - } - - CrClass instproc edit_atts {} { + CrClass instproc edit_atts {} { concat [[self class] set common_insert_atts] [my sql_attribute_names] } CrClass instproc object_type_exists {} { my instvar object_type - expr {$object_type eq [db_list select_type { + expr {$object_type eq [db_list [my qn select_type] { select object_type from acs_object_types where object_type = :object_type }]} } + CrClass ad_instproc folder_type_unregister_all { + {-include_subtypes t} + } { + Unregister the object type from all folders on the system + + @param include_subtypes Boolean value (t/f) to flag whether the + operation should be applied on subtypes as well + } { + my instvar object_type + db_foreach [my qn all_folders] { + select folder_id from cr_folder_type_map + where content_type = :object_type + } { + ::xo::db::sql::content_folder unregister_content_type \ + -folder_id $folder_id \ + -content_type $object_type \ + -include_subtypes $include_subtypes + } + } + CrClass ad_instproc folder_type { + {-include_subtypes t} -folder_id operation } { register the current object type for folder_id. If folder_id is not specified, use the instvar of the class instead. + + @param include_subtypes Boolean value (t/f) to flag whether the + operation should be applied on subtypes as well } { if {$operation ne "register" && $operation ne "unregister"} { - error "[self] operation for folder_type must be '\ - register' or 'unregister'" + error "[self] operation for folder_type must be 'register' or 'unregister'" } my instvar object_type if {![info exists folder_id]} { my instvar folder_id } - db_1row register_type "select content_folder__${operation}_content_type(\ - $folder_id,:object_type,'t')" + ::xo::db::sql::content_folder ${operation}_content_type \ + -folder_id $folder_id \ + -content_type $object_type \ + -include_subtypes $include_subtypes } + CrClass instproc create_attributes {} { + if {[my cr_attributes] ne ""} { + my instvar object_type + set slot [self]::slot + if {[info command $slot] eq ""} { + ::xotcl::Object create $slot + } + set o [::xo::OrderedComposite new -contains [my cr_attributes]] + $o destroy_on_cleanup + + foreach att [$o children] { + $att instvar attribute_name datatype pretty_name sqltype references default + # provide a default pretty name for the attribute based on message keys + if {![info exists pretty_name]} { + set pretty_name "#xowiki.[namespace tail [self]]-$attribute_name#" + } + + set column_spec [::xo::db::sql map_datatype $sqltype] + #my log "--SQL $attribute_name datatype=$datatype, sqltype=$sqltype, column_spec=$column_spec" + if {[info exists references]} {append column_spec " references $references" } + if {[info exists default]} {append column_spec " default '$default'" } + append column_spec " " \ + [::xo::db::sql datatype_constraint $sqltype [my table_name] $attribute_name] + + if {![attribute::exists_p $object_type $attribute_name]} { + ::xo::db::sql::content_type create_attribute \ + -content_type $object_type \ + -attribute_name $attribute_name \ + -datatype $datatype \ + -pretty_name $pretty_name \ + -column_spec [string trim $column_spec] + } + #if {![info exists default]} { + # set default "" + #} + #lappend parameters [list $attribute_name $default] + #unset default + } + #my log "--parameter [self] parameter [list $parameters]" + #my parameter $parameters + + # TODO the following will not be needed, when we enforce xotcl 1.5.0+ + set parameters [list] + foreach att [$o children] { + $att instvar attribute_name datatype pretty_name sqltype default help_text spec validator + set slot_obj [self]::slot::$attribute_name + #my log "--cr ::xo::Attribute create $slot_obj" + ::xo::Attribute create $slot_obj + if {![info exists default]} { + set default "" + } + if {[info exists help_text]} {$slot_obj help_text $help_text} + if {[info exists validator]} {$slot_obj validator $validator} + if {[info exists spec]} {$slot_obj spec $spec} + $slot_obj datatype $datatype + $slot_obj pretty_name $pretty_name + $slot_obj default $default + $slot_obj sqltype $sqltype + lappend parameters [list $attribute_name $default] + unset default + } + if {$::xotcl::version < 1.5} { + my parameter [concat [my info parameter] $parameters] + } + } + } + CrClass ad_instproc create_object_type {} { Create an oacs object_type and a table for keeping the additional attributes. @@ -130,29 +282,22 @@ } db_transaction { - db_1row create_type { - select content_type__create_type( - :object_type,:supertype,:pretty_name, :pretty_plural, - :table_name, :id_column, :name_method - ) - } - if {[my cr_attributes] ne ""} { - set o [::xo::OrderedComposite new -contains [my cr_attributes]] - $o destroy_on_cleanup - foreach att [$o children] { - $att instvar attribute_name datatype pretty_name sqltype - db_1row create_att { - select content_type__create_attribute( - :object_type,:attribute_name,:datatype, - :pretty_name,null,null,null,:sqltype - ) - } - } - } + ::xo::db::sql::content_type create_type \ + -content_type $object_type \ + -supertype $supertype \ + -pretty_name $pretty_name \ + -pretty_plural $pretty_plural \ + -table_name $table_name \ + -id_column $id_column \ + -name_method $name_method + + my create_attributes my folder_type register } } + + CrClass ad_instproc drop_object_type {} { Delete the object type and remove the table for the attributes. This method should be called when all instances are deleted. It @@ -161,14 +306,16 @@ my instvar object_type table_name db_transaction { my folder_type unregister - db_1row drop_type { - select content_type__drop_type(:object_type,'t','t') - } + ::xo::db::sql::content_type drop_type \ + -content_type $object_type \ + -drop_children_p t \ + -drop_table_p t } } CrClass ad_instproc require_folder { {-parent_id -100} + {-content_types content_revision} -package_id -name } { @@ -201,12 +348,12 @@ error "Could not determine package id or community id" } } - set folder_id [ns_cache eval xotcl_object_type_cache cid-$cid { + set folder_id [ns_cache eval xotcl_object_type_cache root_folder-$cid { set folder_name "$name: $cid" if {[info command content::item::get_id_by_name] eq ""} { set folder_id "" - db_0or1row get_id_by_name "select item_id as folder_id from cr_items \ + db_0or1row [my qn get_id_by_name] "select item_id as folder_id from cr_items \ where name = :folder_name and parent_id = :parent_id" } else { set folder_id [content::item::get_id_by_name \ @@ -218,6 +365,15 @@ -parent_id $parent_id \ -package_id $package_id -context_id $cid] } + # register all specified content types + foreach content_type $content_types { + # if a content_type ends with a *, include subtypes + set with_subtypes [expr {[regexp {^(.*)[*]$} $content_type _ content_type] ? "t" : "f"}] + ::xo::db::sql::content_folder register_content_type \ + -folder_id $folder_id \ + -content_type $content_type \ + -include_subtypes $with_subtypes + } return $folder_id }] @@ -232,32 +388,21 @@ } { } - CrClass instproc getFormClass {-data} { - if {[info exists data]} { - # new style. does not depend on form variables - if {[$data exists item_id] && [$data set item_id] != 0 && [my exists edit_form]} { - return [my edit_form] - } else { - return [my form] - } + CrClass instproc getFormClass {-data:required} { + if {[$data exists item_id] && [$data set item_id] != 0 && [my exists edit_form]} { + return [my edit_form] } else { - set item_id [::xo::cc form_parameter item_id ""] ;# item_id should be be hardcoded - set new_p [::xo::cc form_parameter __new_p ""] - #my log "--F item_id '$item_id', confirmed_p new_p '$new_p' [my set item_id]" - if {$item_id ne "" && $new_p ne "1" && [my exists edit_form]} { - #my log "--F use edit_form [my edit_form]" - return [my edit_form] - } else { - return [my form] - } + return [my form] } } + CrClass instproc init {} { my instvar object_type sql_attribute_names if {[my info superclass] ne "::Generic::CrItem"} { my set superclass [[my info superclass] set object_type] } + my init_type_hierarchy set sql_attribute_names [list] set o [::xo::OrderedComposite new -contains [my cr_attributes]] $o destroy_on_cleanup @@ -273,11 +418,12 @@ if {![my object_type_exists]} { my create_object_type + } else { + db_transaction { + my create_attributes + } } - my set object_type_key [db_list get_tree_sortkey { - select tree_sortkey from acs_object_types - where object_type = :object_type - }] + next } @@ -290,7 +436,7 @@ @return item_id } { - if {[db_0or1row entry_exists_select "\ + if {[db_0or1row [my qn entry_exists_select] "\ select item_id from cr_items where name = :name and parent_id = :parent_id"]} { return $item_id } @@ -309,7 +455,7 @@ @return cr item object } { - my log "-- [self args]" + #my log "-- [self args]" if {![::xotcl::Object isobject $object]} { # if the object does not yet exist, we have to create it my create $object @@ -328,14 +474,19 @@ lappend atts $fq } if {$revision_id} { - $object db_1row fetch_from_view_revision_id "\ + $object db_1row [my qn fetch_from_view_revision_id] "\ select [join $atts ,], i.parent_id \ from [my set table_name]i n, cr_items i,acs_objects o \ where n.revision_id = $revision_id \ and i.item_id = n.item_id \ and o.object_id = $revision_id" } else { - $object db_1row fetch_from_view_item_id "\ +my log "select [join $atts ,], i.parent_id \ + from [my set table_name]i n, cr_items i, acs_objects o \ + where i.item_id = $item_id \ + and n.[my id_column] = coalesce(i.live_revision, i.latest_revision) \ + and o.object_id = i.item_id" + $object db_1row [my qn fetch_from_view_item_id] "\ select [join $atts ,], i.parent_id \ from [my set table_name]i n, cr_items i, acs_objects o \ where i.item_id = $item_id \ @@ -344,7 +495,8 @@ } if {[apm_version_names_compare [ad_acs_version] 5.2] <= -1} { - $object set package_id [db_string get_pid "select package_id from cr_folders where folder_id = [$object set parent_id]"] + $object set package_id [db_string [my qn get_pid] \ + "select package_id from cr_folders where folder_id = [$object set parent_id]"] } #my log "--AFTER FETCH\n[$object serialize]" @@ -365,8 +517,12 @@ @param item_id id of the item to be retrieved. @param revision_id revision-id of the item to be retrieved. } { - my fetch_object -object ::[expr {$revision_id ? $revision_id : $item_id}] \ - -item_id $item_id -revision_id $revision_id + set object ::[expr {$revision_id ? $revision_id : $item_id}] + if {![my isobject $object]} { + my fetch_object -object $object \ + -item_id $item_id -revision_id $revision_id + } + return $object } CrClass ad_instproc delete { @@ -375,14 +531,19 @@ Delete a content item from the content repository. @param item_id id of the item to be deleted } { - db_exec_plsql content_item_delete { - select content_item__delete(:item_id) - } + ::xo::db::sql::content_item del -item_id $item_id } + CrClass instproc object_types { + {-subtypes_first:boolean false} + } { + return [db_list [my qn get_object_types] \ + [my object_types_query -subtypes_first $subtypes_first]] + } + CrClass ad_instproc instance_select_query { {-select_attributes ""} - {-order_clause ""} + {-orderby ""} {-where_clause ""} {-from_clause ""} {-with_subtypes:boolean true} @@ -395,56 +556,60 @@ returns the SQL-query to select the CrItems of the specified object_type @select_attributes attributes for the sql query to be retrieved, in addion to ci.item_id acs_objects.object_type, which are always returned - @param order_clause clause for ordering the solution set + @param orderby for ordering the solution set @param where_clause clause for restricting the answer set @param with_subtypes return subtypes as well @param count return the query for counting the solutions @param folder_id parent_id @param publish_status one of 'live', 'ready' or 'production' @return sql query } { - my instvar object_type_key if {![info exists folder_id]} {my instvar folder_id} set attributes [list ci.item_id ci.name ci.publish_status acs_objects.object_type] foreach a $select_attributes { if {$a eq "title"} {set a cr.title} lappend attributes $a } - set type_selection [expr {$with_subtypes ? - "acs_object_types.tree_sortkey between \ - '$object_type_key' and tree_right('$object_type_key')" : - "acs_object_types.tree_sortkey = '$object_type_key'"}] + set type_selection [my type_selection -with_subtypes $with_subtypes] + #my log "type_selection -with_subtypes $with_subtypes returns $type_selection" if {$count} { set attribute_selection "count(*)" - set order_clause "" ;# no need to order when we count + set orderby "" ;# no need to order when we count set page_number "" ;# no pagination when count is used } else { set attribute_selection [join $attributes ,] } + + set cond [list] + if {$type_selection ne ""} {lappend cond $type_selection} + if {$where_clause ne ""} {lappend cond $where_clause} + if {[info exists publish_status]} {lappend cond "ci.publish_status eq '$publish_status'"} + lappend cond "coalesce(ci.live_revision,ci.latest_revision) = cr.revision_id + and ci.parent_id = $folder_id and acs_objects.object_id = cr.revision_id" - if {$where_clause ne ""} { - set where_clause "and $where_clause" - } if {$page_number ne ""} { - set pagination "offset [expr {$page_size*($page_number-1)}] limit $page_size" + set limit $page_size + set offset [expr {$page_size*($page_number-1)}] } else { - set pagination "" + set limit "" + set offset "" } - set publish_clause \ - [expr {[info exists publish_status] ? " and ci.publish_status eq '$publish_status'" : ""}] - return "select $attribute_selection - from acs_object_types, acs_objects, cr_items ci, cr_revisions cr $from_clause - where $type_selection - and acs_object_types.object_type = ci.content_type - and coalesce(ci.live_revision,ci.latest_revision) = cr.revision_id - and parent_id = $folder_id and acs_objects.object_id = cr.revision_id \ - $where_clause $order_clause $publish_clause $pagination" + + set sql [::xo::db::sql select \ + -vars $attribute_selection \ + -from "acs_objects, cr_items ci, cr_revisions cr $from_clause" \ + -where [join $cond " and "] \ + -orderby $orderby \ + -limit $limit -offset $offset] + my log "--sql=$sql" + return $sql } CrClass ad_instproc instantiate_all { {-select_attributes ""} - {-order_clause ""} + {-orderby ""} + {-from_clause ""} {-where_clause ""} {-with_subtypes:boolean true} {-folder_id} @@ -469,8 +634,9 @@ -folder_id $folder_id \ -select_attributes $select_attributes \ -with_subtypes $with_subtypes \ + -from_clause $from_clause \ -where_clause $where_clause \ - -order_clause $order_clause \ + -orderby $orderby \ -page_size $page_size -page_number $page_number] { set __o [$object_type create ${__result}::$item_id] $__result add $__o @@ -485,7 +651,10 @@ {-sql ""} {-full_statement_name ""} } { - Return a set of instances of folder objects. + Return a set of instances of objects. It creates plain objects + of type ::xotcl::Object just containing the variables that + the sql query returns. + The container and contained objects are automatically destroyed on cleanup of the connection thread } { @@ -497,7 +666,7 @@ while {1} { set continue [ns_db getrow $db $selection] if {!$continue} break - set o [Object new] + set o [::xotcl::Object new] foreach {att val} [ns_set array $selection] {$o set $att $val} if {[$o exists object_type]} { @@ -513,7 +682,10 @@ return $__result } - Class create Attribute -parameter {attribute_name datatype pretty_name {sqltype "text"}} + Class create Attribute -parameter { + attribute_name datatype pretty_name {sqltype "text"} references + default help_text spec validator + } Class create CrItem -parameter { package_id @@ -522,27 +694,39 @@ {nls_language en_US} {publish_status ready} } + CrItem instproc initialize_loaded_object {} { # dummy action, to be refined } - CrItem ad_proc instantiate { + CrItem ad_proc get_object_type { -item_id {-revision_id 0} } { - Instantiate the live revision or the specified revision of an - CrItem. - @return object containing the attributes of the CrItem - } { + Return the object type for an item_id or revision_id. + + @retun object_type typically an XOTcl class + } { set object_type [ns_cache eval xotcl_object_type_cache \ [expr {$item_id ? $item_id : $revision_id}] { if {$item_id} { - db_1row get_class "select content_type as object_type from cr_items where item_id=$item_id" + db_1row [my qn get_class] "select content_type as object_type from cr_items where item_id=$item_id" } else { - db_1row get_class "select object_type from acs_objects where object_id=$revision_id" + db_1row [my qn get_class] "select object_type from acs_objects where object_id=$revision_id" } return $object_type }] + } + + CrItem ad_proc instantiate { + -item_id + {-revision_id 0} + } { + Instantiate the live revision or the specified revision of an + CrItem. + @return object containing the attributes of the CrItem + } { + set object_type [my get_object_type -item_id $item_id -revision_id $revision_id] #if {![string match "::*" $object_type]} {set object_type ::$object_type} return [$object_type instantiate -item_id $item_id -revision_id $revision_id] } @@ -553,8 +737,7 @@ } { Delete a CrItem in the database } { - db_1row get_class_and_folder \ - "select content_type as object_type from cr_items where item_id = $item_id" + set object_type [my get_object_type -item_id $item_id] $object_type delete -item_id $item_id } @@ -565,7 +748,7 @@ Lookup CR item from title and folder (parent_id) @return item_id or 0 if not successful } { - if {[db_0or1row entry_exists_select "\ + if {[db_0or1row [my qn entry_exists_select] "\ select item_id from cr_items where name = :name and parent_id = :parent_id" ]} { #my log "-- found $item_id for $name in folder '$parent_id'" return $item_id @@ -574,17 +757,22 @@ return 0 } - # provide the appropriate db_* call for the view update. Earlier - # versions up to 5.3.0d1 used db_dml, newer versions (around july - # 2006) have to use db_0or1row, when the patch for deadlocks and - # duplicate items is applied... + if {[db_driverkey ""] eq "postgresql"} { - apm_version_get -package_key acs-content-repository -array info - array get info - CrItem set insert_view_operation \ - [expr {[apm_version_names_compare $info(version_name) 5.3.0d1] < 1 ? "db_dml" : "db_0or1row"}] - array unset info - + # provide the appropriate db_* call for the view update. Earlier + # versions up to 5.3.0d1 used db_dml, newer versions (around july + # 2006) have to use db_0or1row, when the patch for deadlocks and + # duplicate items is applied... + + apm_version_get -package_key acs-content-repository -array info + array get info + CrItem set insert_view_operation \ + [expr {[apm_version_names_compare $info(version_name) 5.3.0d1] < 1 ? "db_dml" : "db_0or1row"}] + array unset info + } else { ;# Oracle + CrItem set insert_view_operation db_dml + } + # uncomment the following line, if you want to force db_0or1row for # update operations (e.g. when using the provided patch for the # content repository in a 5.2 installation) @@ -593,11 +781,20 @@ CrItem instproc update_content_length {storage_type revision_id} { if {$storage_type eq "file"} { - db_dml update_content_length "update cr_revisions \ + db_dml [my qn update_content_length] "update cr_revisions \ set content_length = [file size [my set import_file]] \ where revision_id = $revision_id" } } + CrItem instproc update_content {revision_id content} { + [my info class] instvar storage_type + if {$storage_type eq "file"} { + my log "--update_content not implemented for type file" + } else { + db_dml [my qn update_content] "update cr_revisions \ + set content = :content where revision_id = $revision_id" + } + } CrItem instproc current_user_id {} { if {[my isobject ::xo::cc]} {return [::xo::cc user_id]} @@ -632,14 +829,14 @@ my instvar import_file set text [cr_create_content_file $item_id $revision_id $import_file] } - $insert_view_operation revision_add \ + $insert_view_operation [my qn revision_add] \ "insert into [[my info class] set table_name]i ([join $__atts ,]) \ values (:[join $__atts ,:])" my update_content_length $storage_type $revision_id if {$live_p} { - set publish_status [my set publish_status] - db_0or1row make_live \ - {select content_item__set_live_revision(:revision_id, :publish_status)} + ::xo::db::sql::content_item set_live_revision \ + -revision_id $revision_id \ + -publish_status [my set publish_status] } else { # if we do not make the revision live, use the old revision_id, # and let CrCache save it @@ -650,29 +847,38 @@ } if {[apm_version_names_compare [ad_acs_version] 5.2] > -1} { - ns_log notice "--Version 5.2 or newer [ad_acs_version]" - CrItem set content_item__new { - select content_item__new(:name,$parent_id,null,null,null,\ - :creation_user,null,null,\ - 'content_item',:object_type,null,:description,:mime_type,\ - :nls_language,null,null,null,'f',:storage_type, :package_id) + ns_log notice "--OpenACS Version 5.2 or newer [ad_acs_version]" +# CrItem set content_item__new_args { +# name parent_id creation_user {item_subtype "content_item"} {content_type $object_type} +# description mime_type nls_language {is_live f} storage_type package_id +# } + CrItem set content_item__new_args { + -name $name -parent_id $parent_id -creation_user $creation_user \ + -item_subtype "content_item" -content_type $object_type \ + -description $description -mime_type $mime_type -nls_language $nls_language \ + -is_live f -storage_type $storage_type -package_id $package_id } } else { - ns_log notice "--Version 5.1 or older [ad_acs_version]" - CrItem set content_item__new { - select content_item__new(:name,$parent_id,null,null,null,\ - :creation_user,null,null,\ - 'content_item',:object_type,null,\ - :description,:mime_type,\ - :nls_language,null,:storage_type) + ns_log notice "--OpenACS Version 5.1 or older [ad_acs_version]" +# CrItem set content_item__new_args { +# name parent_id creation_user {item_subtype "content_item"} {content_type $object_type} +# description mime_type nls_language {is_live f} storage_type +# } + CrItem set content_item__new_args { + -name $name -parent_id $parent_id -creation_user $creation_user \ + -item_subtype "content_item" -content_type $object_type \ + -description $description -mime_type $mime_type -nls_language $nls_language \ + -is_live f -storage_type $storage_type } } CrItem ad_instproc set_live_revision {-revision_id:required {-publish_status "ready"}} { @param revision_id @param publish_status one of 'live', 'ready' or 'production' } { - db_0or1row set_live_revision {select content_item__set_live_revision(:revision_id,:publish_status)} + ::xo::db::sql::content_item set_live_revision \ + -revision_id $revision_id \ + -publish_status $publish_status } CrItem ad_instproc save_new {-package_id -creation_user_id {-live_p:boolean true}} { @@ -707,29 +913,39 @@ db_transaction { $__class instvar storage_type object_type - $__class folder_type -folder_id $parent_id register - db_dml lock_objects "LOCK TABLE acs_objects IN SHARE ROW EXCLUSIVE MODE" - - set item_id [db_string insert_item \ - [subst [[self class] set content_item__new]]] + #$__class folder_type -folder_id $parent_id register + [self class] lock acs_objects "SHARE ROW EXCLUSIVE" set revision_id [db_nextval acs_object_id_seq] + + if {$name eq ""} { + # we have an autonamed item, use a unique value for the name + set name [expr {[my exists __autoname_prefix] ? + "[my set __autoname_prefix]$revision_id" : $revision_id}] + if {$title eq ""} { + set title [expr {[my exists __title_prefix] ? + "[my set __title_prefix] ($name)" : $name}] + } + } + set item_id [eval ::xo::db::sql::content_item new [[self class] set content_item__new_args]] if {$storage_type eq "file"} { set text [cr_create_content_file $item_id $revision_id $import_file] } #my log "--V atts=([join $__atts ,])\nvalues=(:[join $__atts ,:])" - $insert_view_operation revision_add \ + $insert_view_operation [my qn revision_add] \ "insert into [$__class set table_name]i ([join $__atts ,]) \ values (:[join $__atts ,:])" my update_content_length $storage_type $revision_id if {$live_p} { - set publish_status [my set publish_status] - db_0or1row make_live \ - "select content_item__set_live_revision(:revision_id,:publish_status)" + ::xo::db::sql::content_item set_live_revision \ + -revision_id $revision_id \ + -publish_status [my set publish_status] } } my set revision_id $revision_id - my db_1row get_dates {select creation_date, last_modified \ - from acs_objects where object_id = :revision_id} + my db_1row [my qn get_dates] { + select creation_date, last_modified + from acs_objects where object_id = :revision_id + } return $item_id } @@ -738,89 +954,90 @@ instance variable. } { # delegate deletion to the class - [my info class] delete [my set item_id] + [my info class] delete -item_id [my set item_id] } ::Generic::CrItem instproc revisions {} { TableWidget t1 -volatile \ -columns { Field version_number -label "" -html {align right} - ImageField edit -label "" -src /resources/acs-subsite/Zoom16.gif \ + ImageAnchorField edit -label "" -src /resources/acs-subsite/Zoom16.gif \ -title "View Item" -alt "view" \ -width 16 -height 16 -border 0 AnchorField diff -label "" AnchorField author -label [_ file-storage.Author] Field content_size -label [_ file-storage.Size] -html {align right} Field last_modified_ansi -label [_ file-storage.Last_Modified] Field description -label [_ file-storage.Version_Notes] - ImageField live_revision -label [_ xotcl-core.live_revision] \ + ImageAnchorField live_revision -label [_ xotcl-core.live_revision] \ -src /resources/acs-subsite/radio.gif \ -width 16 -height 16 -border 0 -html {align center} ImageField_DeleteIcon version_delete -label "" -html {align center} } set user_id [my current_user_id] set page_id [my set item_id] - set live_revision_id [content::item::get_live_revision -item_id $page_id] + set live_revision_id [::xo::db::sql::content_item get_live_revision -item_id $page_id] my instvar package_id set base [$package_id url] - - db_foreach revisions_select \ - "select ci.name, n.revision_id as version_id, - person__name(n.creation_user) as author, - n.creation_user as author_id, - to_char(n.last_modified,'YYYY-MM-DD HH24:MI:SS') as last_modified_ansi, - n.description, - acs_permission__permission_p(n.revision_id,:user_id,'admin') as admin_p, - acs_permission__permission_p(n.revision_id,:user_id,'delete') as delete_p, - r.content_length, - content_revision__get_number(n.revision_id) as version_number - from cr_revisionsi n, cr_items ci, cr_revisions r - where ci.item_id = n.item_id and ci.item_id = :page_id + set sql [::xo::db::sql select \ + -map_function_names true \ + -vars "ci.name, n.revision_id as version_id,\ + person__name(n.creation_user) as author, \ + n.creation_user as author_id, \ + to_char(n.last_modified,'YYYY-MM-DD HH24:MI:SS') as last_modified_ansi,\ + n.description,\ + acs_permission__permission_p(n.revision_id,:user_id,'admin') as admin_p,\ + acs_permission__permission_p(n.revision_id,:user_id,'delete') as delete_p,\ + r.content_length,\ + content_revision__get_number(n.revision_id) as version_number " \ + -from "cr_revisionsi n, cr_items ci, cr_revisions r" \ + -where "ci.item_id = n.item_id and ci.item_id = :page_id and r.revision_id = n.revision_id and exists (select 1 from acs_object_party_privilege_map m where m.object_id = n.revision_id and m.party_id = :user_id - and m.privilege = 'read') - order by n.revision_id desc" { - - if {$content_length < 1024} { - if {$content_length eq ""} {set content_length 0} - set content_size_pretty "[lc_numeric $content_length] [_ file-storage.bytes]" - } else { - set content_size_pretty "[lc_numeric [format %.2f [expr {$content_length/1024.0}]]] [_ file-storage.kb]" - } - - set last_modified_ansi [lc_time_system_to_conn $last_modified_ansi] - - if {$version_id != $live_revision_id} { - set live_revision "Make this Revision Current" - set live_revision_icon /resources/acs-subsite/radio.gif - } else { - set live_revision "Current Live Revision" - set live_revision_icon /resources/acs-subsite/radiochecked.gif - } - - set live_revision_link [export_vars -base $base \ - {{m make-live-revision} {revision_id $version_id}}] - t1 add \ - -version_number $version_number: \ - -edit.href [export_vars -base $base {{revision_id $version_id}}] \ - -author $author \ - -content_size $content_size_pretty \ - -last_modified_ansi [lc_time_fmt $last_modified_ansi "%x %X"] \ - -description $description \ - -live_revision.src $live_revision_icon \ - -live_revision.title $live_revision \ - -live_revision.href $live_revision_link \ - -version_delete.href [export_vars -base $base \ - {{m delete-revision} {revision_id $version_id}}] \ - -version_delete.title [_ file-storage.Delete_Version] - - [t1 last_child] set payload(revision_id) $version_id - } - + and m.privilege = 'read')" \ + -orderby "n.revision_id desc"] + + db_foreach [my qn revisions_select] $sql { + if {$content_length < 1024} { + if {$content_length eq ""} {set content_length 0} + set content_size_pretty "[lc_numeric $content_length] [_ file-storage.bytes]" + } else { + set content_size_pretty "[lc_numeric [format %.2f [expr {$content_length/1024.0}]]] [_ file-storage.kb]" + } + + set last_modified_ansi [lc_time_system_to_conn $last_modified_ansi] + + if {$version_id != $live_revision_id} { + set live_revision "Make this Revision Current" + set live_revision_icon /resources/acs-subsite/radio.gif + } else { + set live_revision "Current Live Revision" + set live_revision_icon /resources/acs-subsite/radiochecked.gif + } + + set live_revision_link [export_vars -base $base \ + {{m make-live-revision} {revision_id $version_id}}] + t1 add \ + -version_number $version_number: \ + -edit.href [export_vars -base $base {{revision_id $version_id}}] \ + -author $author \ + -content_size $content_size_pretty \ + -last_modified_ansi [lc_time_fmt $last_modified_ansi "%x %X"] \ + -description $description \ + -live_revision.src $live_revision_icon \ + -live_revision.title $live_revision \ + -live_revision.href $live_revision_link \ + -version_delete.href [export_vars -base $base \ + {{m delete-revision} {revision_id $version_id}}] \ + -version_delete.title [_ file-storage.Delete_Version] + + [t1 last_child] set payload(revision_id) $version_id + } + # providing diff links to the prevision versions. This can't be done in # the first loop, since we have not yet the revision id of entry in the next line. set lines [t1 children] @@ -841,7 +1058,39 @@ return [t1 asHTML] } + # + # Object specific privilege to be used with policies + # + + CrItem ad_instproc privilege=creator { + {-login true} user_id package_id method + } { + + Define an object specific privilege to be used in the policies. + Grant access to a content item for the creator (creation_user) + of the item, and for the package admin. + + } { + set allowed 0 + #my log "--checking privilege [self args]" + if {[my exists creation_user]} { + if {$user_id == 0 && $login} { + auth::require_login + } elseif {[my set creation_user] == $user_id} { + set allowed 1 + } else { + # allow the package admin always access + set allowed [::xo::cc permission \ + -object_id $package_id \ + -party_id $user_id \ + -privilege admin] + } + } + return $allowed + } + + # # Form template class # @@ -870,6 +1119,7 @@ CrCache instproc delete {-item_id} { next ns_cache flush xotcl_object_cache ::$item_id + # we should probably flush as well cached revisions } Class CrCache::Item @@ -969,7 +1219,7 @@ } Form instproc new_data {} { my instvar data - my log "--- new_data ---" + #my log "--- new_data ---" foreach __var [my form_vars] { $data set $__var [my var $__var] } @@ -978,7 +1228,7 @@ return [$data set item_id] } Form instproc edit_data {} { - my log "--- edit_data ---" + #my log "--- edit_data --- setting form vars=[my form_vars]" my instvar data foreach __var [my form_vars] { $data set $__var [my var $__var] @@ -989,7 +1239,7 @@ set old_name [::xo::cc form_parameter __object_name ""] set new_name [$data set name] if {$old_name ne $new_name} { - db_dml update_rename "update cr_items set name = :new_name \ + db_dml [my qn update_rename] "update cr_items set name = :new_name \ where item_id = [$data set item_id]" } } @@ -1014,9 +1264,10 @@ } Form instproc new_request {} { - my log "--- new_request ---" + #my log "--- new_request ---" my request create my instvar data + #my log "--VAR [my var item_id]" foreach var [[$data info class] edit_atts] { if {[$data exists $var]} { my var $var [list [$data set $var]] @@ -1025,7 +1276,7 @@ } Form instproc edit_request {item_id} { my instvar data - my log "--- edit_request ---" + #my log "--- edit_request ---" my request write foreach var [[$data info class] edit_atts] { if {[$data exists $var]} { @@ -1035,12 +1286,15 @@ } Form instproc on_submit {item_id} { - # dummy proc + # The content of this proc is strictly speaking not necessary. + # However, on redirects after a submit to the same page, it + # ensures the setting of edit_form_page_title and context + my request write } Form instproc on_validation_error {} { my instvar edit_form_page_title context - my log "-- " + #my log "-- " set edit_form_page_title [my edit_page_title] set context [list $edit_form_page_title] } @@ -1097,14 +1351,14 @@ append new_data { category::map_object -remove_old -object_id $item_id $category_ids #ns_log notice "-- new data category::map_object -remove_old -object_id $item_id $category_ids" - db_dml insert_asc_named_object \ - "insert into acs_named_objects (object_id,object_name,package_id) \ - values (:item_id, :name, :package_id)" + #db_dml [my qn insert_asc_named_object] \ + # "insert into acs_named_objects (object_id,object_name,package_id) \ + # values (:item_id, :name, :package_id)" } append edit_data { - db_dml update_asc_named_object \ - "update acs_named_objects set object_name = :name, \ - package_id = :package_id where object_id = :item_id" + #db_dml [my qn update_asc_named_object] \ + # "update acs_named_objects set object_name = :name, \ + # package_id = :package_id where object_id = :item_id" #ns_log notice "-- edit data category::map_object -remove_old -object_id $item_id $category_ids" category::map_object -remove_old -object_id $item_id $category_ids } @@ -1230,7 +1484,7 @@ List ad_instproc generate { - -order_by + {-orderby ""} -template } { the method generate is used to actually generate the list template @@ -1241,7 +1495,6 @@ } { my instvar object_type with_subtypes - set order_clause [expr {[info exists order_by] ? "order by $order_by":""}] if {![info exists template]} { set template [my name] } @@ -1268,7 +1521,7 @@ -folder_id [my folder_id] \ -select_attributes $select_attributes \ -with_subtypes $with_subtypes \ - -order_clause $order_clause] { + -orderby $orderby] { set view_url [export_vars -base [my view_link] {item_id}] set edit_url [export_vars -base [my edit_link] {item_id}] set delete_url [export_vars -base [my delete_link] {item_id}] Fisheye: Tag 1.2.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xotcl-core/tcl/http-client-procs.tcl'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.10.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xotcl-core/tcl/policy-procs.tcl'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xotcl-core/tcl/test/xotcl-avail-procs.tcl'. Fisheye: No comparison available. Pass `N' to diff? Index: openacs-4/packages/xotcl-core/www/index.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xotcl-core/www/index.tcl,v diff -u -r1.3.2.1 -r1.3.2.2 --- openacs-4/packages/xotcl-core/www/index.tcl 15 Jan 2007 08:49:59 -0000 1.3.2.1 +++ openacs-4/packages/xotcl-core/www/index.tcl 1 Aug 2007 21:39:32 -0000 1.3.2.2 @@ -64,7 +64,7 @@ append output "
  • [::xotcl::api object_link {} $cl]
      " - foreach kind {class superclass mixin instmixin} { + foreach kind {class superclass subclass mixin instmixin} { append output [info_classes $cl $kind] } Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/COPYRIGHT'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.60.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/xowiki.info'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.21.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/catalog/xowiki.de_DE.ISO-8859-1.xml'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.29.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/catalog/xowiki.en_US.ISO-8859-1.xml'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.7.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/catalog/xowiki.es_ES.ISO-8859-1.xml'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.2.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/lib/view.adp'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.8.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/lib/view.tcl'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.9.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/tcl/adp-generator-procs.tcl'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.12.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/tcl/category-procs.tcl'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.9.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/tcl/chat-procs.tcl'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.32.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/tcl/form-field-procs.tcl'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.2.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/tcl/lcs-procs.tcl'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.30.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/tcl/link-procs.tcl'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.8.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/tcl/notification-procs.tcl'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.77.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/tcl/package-procs.tcl'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.19.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/tcl/syndicate-procs.tcl'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/tcl/template-procs.tcl'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.19.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/tcl/weblog-procs.tcl'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/tcl/xowiki-cache-init.tcl'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.30.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/tcl/xowiki-callback-procs.tcl'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.84.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/tcl/xowiki-form-procs.tcl'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.83.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/tcl/xowiki-portlet-procs.tcl'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.162.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/tcl/xowiki-procs.tcl'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.21.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/tcl/xowiki-sc-procs.tcl'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.95.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/tcl/xowiki-www-procs.tcl'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.2.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/diff.adp'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.3.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/edit.adp'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.2.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/error-template.adp'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.5.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/index.vuh'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.39.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/oacs-view.adp'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.18.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/oacs-view2.adp'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.13.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/oacs-view3.adp'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/portlet-ajax.adp'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/portlet-ajax.tcl'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/portlet.adp'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.2.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/portlet.tcl'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.2.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/revisions.adp'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.10.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/view-book.adp'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.5.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/view-book.tcl'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.35.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/view-default.adp'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.25.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/view-links.adp'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.3.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/view-page.adp'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/view-page.tcl'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.21.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/view-plain.adp'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.9.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/admin/delete-type.tcl'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.5.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/admin/export.tcl'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.3.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/admin/import.adp'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.10.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/admin/import.tcl'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.3.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/admin/importmsg.adp'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.5.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/admin/index.adp'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.18.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/admin/index.tcl'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/admin/list.adp'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.15.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/admin/list.tcl'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.2.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/admin/permissions.adp'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.2.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/admin/permissions.tcl'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.5.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/admin/portal-element-add.tcl'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/admin/portal-element-remove.tcl'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.7.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/admin/set-publish-state.tcl'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.9.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/admin/test.tcl'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.4.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/admin/samples/ajax-chat.tcl'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.4.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/ajax/chat.js'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.4.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/ajax/chat.tcl'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/ajax/scripted-streaming-chat.js'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.4.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/ajax/streaming-chat.js'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/doc/index.html'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/portlets/calendar-portlet.adp'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.2.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/portlets/calendar-portlet.tcl'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/portlets/forums-portlet.adp'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/portlets/forums-portlet.tcl'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.3.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/portlets/include.tcl'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/portlets/plain-include.adp'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/portlets/portlet-skin.adp'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/portlets/weblog-mini-calendar.adp'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.8.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/portlets/weblog-mini-calendar.tcl'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/prototypes/CGI.page'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.2.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/prototypes/CGI2.page'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.2.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/prototypes/CGI3.page'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/prototypes/ajax-chat.page'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.3.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/prototypes/announcements.page'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.2.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/prototypes/bib.page'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.2.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/prototypes/book.page'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.2.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/prototypes/categories-portlet.page'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.3.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/prototypes/contributors.page'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.2.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/prototypes/index.page'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/prototypes/news-item.page'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/prototypes/news.page'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.4.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/prototypes/podcast.page'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/prototypes/sitemap.xml.page'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/prototypes/sitemapindex.xml.page'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.9.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/prototypes/weblog-portlet.page'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.4.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/prototypes/weblog.page'. Fisheye: No comparison available. Pass `N' to diff? Index: openacs-4/packages/xowiki/www/resources/active.png =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/www/resources/Attic/active.png,v diff -u -r1.1.2.1 -r1.1.2.2 Binary files differ Index: openacs-4/packages/xowiki/www/resources/aqua.png =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/www/resources/aqua.png,v diff -u -r1.1.2.1 -r1.1.2.2 Binary files differ Index: openacs-4/packages/xowiki/www/resources/bracket.gif =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/www/resources/bracket.gif,v diff -u -r1.1.2.1 -r1.1.2.2 Binary files differ Index: openacs-4/packages/xowiki/www/resources/bw-shadow.png =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/www/resources/bw-shadow.png,v diff -u -r1.1.2.1 -r1.1.2.2 Binary files differ Fisheye: Tag 1.3.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/resources/cattree.css'. Fisheye: No comparison available. Pass `N' to diff? Index: openacs-4/packages/xowiki/www/resources/collab-graph.js =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/www/resources/collab-graph.js,v diff -u -r1.1.2.1 -r1.1.2.2 --- openacs-4/packages/xowiki/www/resources/collab-graph.js 20 Mar 2007 10:09:38 -0000 1.1.2.1 +++ openacs-4/packages/xowiki/www/resources/collab-graph.js 1 Aug 2007 21:39:27 -0000 1.1.2.2 @@ -7,6 +7,13 @@ * The algorithm is based on a spring-style layouter of a Java-based social * network tracker PieSpy written by Paul Mutton Epaul@jibble.orgE. * + * Several add-ons by Gustaf Neumann (March 20, 2007) + * - fixed positioning of item labels when graph is not on top corner + * - new parameter width + * - new parameter arrow (0/1) + * - new parameter weight + * - several positioning fixes + * * Graph is freely distributable under the terms of an MIT-style license. * For details, see the Graph web site: http://dev.buildpatternd.com/trac * @@ -104,9 +111,17 @@ var point = this.translate([node.layoutPosX, node.layoutPosY]); node.value.style.position = 'absolute'; - node.value.style.top = document.getElementById("collab").offsetTop - 10 + point[1] + 'px'; - node.value.style.left = document.getElementById("collab").offsetLeft + point[0] + 'px'; - + var collab = document.getElementById("collab") + var top, left; + if (/MSIE/.test(navigator.userAgent) && !window.opera) { + top = collab.offsetParent.offsetTop; + left = collab.offsetParent.offsetLeft; + } else { + top = collab.offsetTop; + left = collab.offsetLeft; + } + node.value.style.top = top - 10 + point[1] + 'px'; + node.value.style.left = left + point[0] + 'px'; this.ctx.strokeStyle = 'black' this.ctx.beginPath(); this.ctx.arc(point[0], point[1], this.radius, 0, Math.PI*2, true); Index: openacs-4/packages/xowiki/www/resources/email.png =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/www/resources/email.png,v diff -u -r1.1.2.1 -r1.1.2.2 Binary files differ Fisheye: Tag 1.2.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/resources/excanvas.js'. Fisheye: No comparison available. Pass `N' to diff? Index: openacs-4/packages/xowiki/www/resources/external.png =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/www/resources/external.png,v diff -u -r1.1.2.1 -r1.1.2.2 Binary files differ Index: openacs-4/packages/xowiki/www/resources/file.jpg =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/www/resources/file.jpg,v diff -u -r1.1.2.1 -r1.1.2.2 Binary files differ Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/resources/get-http-object.js'. Fisheye: No comparison available. Pass `N' to diff? Index: openacs-4/packages/xowiki/www/resources/glossary.gif =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/www/resources/glossary.gif,v diff -u -r1.1.2.1 -r1.1.2.2 Binary files differ Index: openacs-4/packages/xowiki/www/resources/inactive.png =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/www/resources/Attic/inactive.png,v diff -u -r1.1.2.1 -r1.1.2.2 Binary files differ Index: openacs-4/packages/xowiki/www/resources/next-end.png =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/www/resources/next-end.png,v diff -u -r1.1.2.1 -r1.1.2.2 Binary files differ Index: openacs-4/packages/xowiki/www/resources/next.png =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/www/resources/next.png,v diff -u -r1.1.2.1 -r1.1.2.2 Binary files differ Index: openacs-4/packages/xowiki/www/resources/permissions.png =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/www/resources/permissions.png,v diff -u -r1.1.2.1 -r1.1.2.2 Binary files differ Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/resources/popup-handler.js'. Fisheye: No comparison available. Pass `N' to diff? Index: openacs-4/packages/xowiki/www/resources/previous-end.png =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/www/resources/previous-end.png,v diff -u -r1.1.2.1 -r1.1.2.2 Binary files differ Index: openacs-4/packages/xowiki/www/resources/previous.png =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/www/resources/previous.png,v diff -u -r1.1.2.1 -r1.1.2.2 Binary files differ Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/resources/swfobject.js'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.19.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/resources/xowiki.css'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/resources/zen-forms-backward-compatibility.css'. Fisheye: No comparison available. Pass `N' to diff? Index: openacs-4/packages/xowiki/www/resources/examples/check_falsch.png =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/www/resources/examples/check_falsch.png,v diff -u -r1.1.2.1 -r1.1.2.2 Binary files differ Index: openacs-4/packages/xowiki/www/resources/examples/check_richtig.png =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/www/resources/examples/check_richtig.png,v diff -u -r1.1.2.1 -r1.1.2.2 Binary files differ Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/resources/examples/xinha-mc-styles.css'. Fisheye: No comparison available. Pass `N' to diff? Index: openacs-4/packages/xowiki/www/resources/flags/cy.png =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/www/resources/flags/cy.png,v diff -u -r1.1.2.1 -r1.1.2.2 Binary files differ Index: openacs-4/packages/xowiki/www/resources/flags/cz.png =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/www/resources/flags/cz.png,v diff -u -r1.1.2.1 -r1.1.2.2 Binary files differ Index: openacs-4/packages/xowiki/www/resources/flags/de.png =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/www/resources/flags/de.png,v diff -u -r1.1.2.1 -r1.1.2.2 Binary files differ Index: openacs-4/packages/xowiki/www/resources/flags/en.png =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/www/resources/flags/en.png,v diff -u -r1.1.2.1 -r1.1.2.2 Binary files differ Index: openacs-4/packages/xowiki/www/resources/flags/es.png =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/www/resources/flags/es.png,v diff -u -r1.1.2.1 -r1.1.2.2 Binary files differ Index: openacs-4/packages/xowiki/www/resources/flags/it.png =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/www/resources/flags/it.png,v diff -u -r1.1.2.1 -r1.1.2.2 Binary files differ Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/resources/overlib/makemini.pl'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/resources/overlib/overlib.js'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/resources/overlib/overlib_anchor.js'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/resources/overlib/overlib_centerpopup.js'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/resources/overlib/overlib_crossframe.js'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/resources/overlib/overlib_cssstyle.js'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/resources/overlib/overlib_debug.js'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/resources/overlib/overlib_exclusive.js'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/resources/overlib/overlib_followscroll.js'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/resources/overlib/overlib_hideform.js'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/resources/overlib/overlib_setonoff.js'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/resources/overlib/overlib_shadow.js'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/resources/overlib/Mini/overlib_anchor_mini.js'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/resources/overlib/Mini/overlib_centerpopup_mini.js'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/resources/overlib/Mini/overlib_crossframe_mini.js'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/resources/overlib/Mini/overlib_csstyle_mini.js'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/resources/overlib/Mini/overlib_debug_mini.js'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/resources/overlib/Mini/overlib_exclusive_mini.js'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/resources/overlib/Mini/overlib_followscroll_mini.js'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/resources/overlib/Mini/overlib_hideform_mini.js'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/resources/overlib/Mini/overlib_mini.js'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/resources/overlib/Mini/overlib_setonoff_mini.js'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/resources/overlib/Mini/overlib_shadow_mini.js'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/resources/wymeditor/GPL-license.txt'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/resources/wymeditor/MIT-license.txt'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/resources/wymeditor/README'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/resources/wymeditor/jquery.js'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.2.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/resources/wymeditor/jquery.wymeditor.js'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.2.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/resources/wymeditor/jquery.wymeditor.pack.js'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/resources/wymeditor/wym_css_parser.js'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.2.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/resources/wymeditor/xhtml_parser.js'. Fisheye: No comparison available. Pass `N' to diff? Index: openacs-4/packages/xowiki/www/resources/wymeditor/iframe/default/lbl-blockquote.png =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/www/resources/wymeditor/iframe/default/lbl-blockquote.png,v diff -u -r1.1.2.1 -r1.1.2.2 Binary files differ Index: openacs-4/packages/xowiki/www/resources/wymeditor/iframe/default/lbl-h1.png =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/www/resources/wymeditor/iframe/default/lbl-h1.png,v diff -u -r1.1.2.1 -r1.1.2.2 Binary files differ Index: openacs-4/packages/xowiki/www/resources/wymeditor/iframe/default/lbl-h2.png =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/www/resources/wymeditor/iframe/default/lbl-h2.png,v diff -u -r1.1.2.1 -r1.1.2.2 Binary files differ Index: openacs-4/packages/xowiki/www/resources/wymeditor/iframe/default/lbl-h3.png =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/www/resources/wymeditor/iframe/default/lbl-h3.png,v diff -u -r1.1.2.1 -r1.1.2.2 Binary files differ Index: openacs-4/packages/xowiki/www/resources/wymeditor/iframe/default/lbl-h4.png =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/www/resources/wymeditor/iframe/default/lbl-h4.png,v diff -u -r1.1.2.1 -r1.1.2.2 Binary files differ Index: openacs-4/packages/xowiki/www/resources/wymeditor/iframe/default/lbl-h5.png =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/www/resources/wymeditor/iframe/default/lbl-h5.png,v diff -u -r1.1.2.1 -r1.1.2.2 Binary files differ Index: openacs-4/packages/xowiki/www/resources/wymeditor/iframe/default/lbl-h6.png =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/www/resources/wymeditor/iframe/default/lbl-h6.png,v diff -u -r1.1.2.1 -r1.1.2.2 Binary files differ Index: openacs-4/packages/xowiki/www/resources/wymeditor/iframe/default/lbl-p.png =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/www/resources/wymeditor/iframe/default/lbl-p.png,v diff -u -r1.1.2.1 -r1.1.2.2 Binary files differ Index: openacs-4/packages/xowiki/www/resources/wymeditor/iframe/default/lbl-pre.png =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/www/resources/wymeditor/iframe/default/lbl-pre.png,v diff -u -r1.1.2.1 -r1.1.2.2 Binary files differ Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/resources/wymeditor/iframe/default/wymiframe.css'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.2.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/resources/wymeditor/iframe/default/wymiframe.html'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/resources/wymeditor/lang/ca.js'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/resources/wymeditor/lang/de.js'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/resources/wymeditor/lang/en.js'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/resources/wymeditor/lang/es.js'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/resources/wymeditor/lang/fr.js'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/resources/wymeditor/lang/hu.js'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/resources/wymeditor/lang/it.js'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/resources/wymeditor/lang/nl.js'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/resources/wymeditor/lang/pl.js'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/resources/wymeditor/lang/sv.js'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.2.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/resources/wymeditor/plugins/hovertools/jquery.wymeditor.hovertools.js'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/resources/wymeditor/plugins/tidy/README'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.2.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/resources/wymeditor/plugins/tidy/jquery.wymeditor.tidy.js'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/resources/wymeditor/plugins/tidy/tidy.php'. Fisheye: No comparison available. Pass `N' to diff? Index: openacs-4/packages/xowiki/www/resources/wymeditor/plugins/tidy/wand.png =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/www/resources/wymeditor/plugins/tidy/wand.png,v diff -u -r1.1.2.1 -r1.1.2.2 Binary files differ Index: openacs-4/packages/xowiki/www/resources/wymeditor/skins/default/icons.png =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/www/resources/wymeditor/skins/default/icons.png,v diff -u -r1.1.2.1 -r1.1.2.2 Binary files differ Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/resources/wymeditor/skins/default/screen.css'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/xinha/Makefile'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/xinha/attach-file.adp'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/xinha/attach-file.tcl'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/xinha/blank.html'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.3.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/xinha/file-selector.adp'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.9.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/xinha/file-selector.tcl'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/xinha/insert-file.adp'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/xinha/insert-file.tcl'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/xinha/insert-ilink.adp'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.4.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/xinha/insert-ilink.tcl'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.2.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/xinha/insert-image.adp'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.4.2.1 refers to a dead (removed) revision in file `openacs-4/packages/xowiki/www/xinha/insert-image.tcl'. Fisheye: No comparison available. Pass `N' to diff?