| #--------------------------------------------------------------------- |
| # Support for unknown command |
| #--------------------------------------------------------------------- |
| |
| proc unknown {proname args} { |
| upvar #0 __PLTcl_unknown_support_plan_modname p_mod |
| upvar #0 __PLTcl_unknown_support_plan_modsrc p_src |
| |
| #----------------------------------------------------------- |
| # On first call prepare the plans |
| #----------------------------------------------------------- |
| if {![info exists p_mod]} { |
| set p_mod [spi_prepare \ |
| "select modname from pltcl_modfuncs \ |
| where funcname = \$1" name] |
| set p_src [spi_prepare \ |
| "select modseq, modsrc from pltcl_modules \ |
| where modname = \$1 \ |
| order by modseq" name] |
| } |
| |
| #----------------------------------------------------------- |
| # Lookup the requested function in pltcl_modfuncs |
| #----------------------------------------------------------- |
| set n [spi_execp -count 1 $p_mod [list [quote $proname]]] |
| if {$n != 1} { |
| #----------------------------------------------------------- |
| # Not found there either - now it's really unknown |
| #----------------------------------------------------------- |
| return -code error "unknown command '$proname'" |
| } |
| |
| #----------------------------------------------------------- |
| # Collect the source pieces from pltcl_modules |
| #----------------------------------------------------------- |
| set src "" |
| spi_execp $p_src [list [quote $modname]] { |
| append src $modsrc |
| } |
| |
| #----------------------------------------------------------- |
| # Load the source into the interpreter |
| #----------------------------------------------------------- |
| if {[catch { |
| uplevel #0 "$src" |
| } msg]} { |
| elog NOTICE "pltcl unknown: error while loading module $modname" |
| elog WARN $msg |
| } |
| |
| #----------------------------------------------------------- |
| # This should never happen |
| #----------------------------------------------------------- |
| if {[catch {info args $proname}]} { |
| return -code error \ |
| "unknown command '$proname' (still after loading module $modname)" |
| } |
| |
| #----------------------------------------------------------- |
| # Finally simulate the initial procedure call |
| #----------------------------------------------------------- |
| return [uplevel 1 $proname $args] |
| } |
| |
| |