Forum OpenACS Q&A: Re: Problems defining procs

Collapse
Posted by Jeff Rogers on
Unless you're redefining commands for proc creation, it shouldn't matter which is defined first. Putting it in a different location in the same file makes it sound like something is erroring out in the middle of that file and preventing the rest of it from running. If you're not seeing any error messages in your log from startup, try adding a log message after each proc is defined in your source file, as well as at the beginning and end. If you only get some of the log messages then you can pinpoint where it stopped running (and hopefully why).

If you get all the log messages but still see only some of the procs defined, then you've got everyone baffled. If you could share your entire source file, maybe we could reproduce the issue.

Collapse
Posted by ultra newb on
Okay, I am indeed getting errors in the log. Here is the relevant portion of the log:

[11/Jun/2011:16:47:14][1032.1992][-thread1992-] Error: tcl: source c:/aolserver/servers/openacs/tcl/exchange-procs.tcl failed: no connection
NONE
no connection
while executing
"ns_conn headers"
(procedure "ad_host" line 2)
invoked from within
"ad_host"
(procedure "exch" line 2)
invoked from within
"exch MKT"
(procedure "mkt" line 1)
invoked from within
"mkt"
("eval" body line 1)
invoked from within
"eval $script"
invoked from within
"ns_cache eval util_memoize $script {
list $current_time [eval $script]
}"
(procedure "util_memoize" line 20)
invoked from within
"util_memoize mkt"
(file "c:/aolserver/servers/openacs/tcl/exchange-procs.tcl" line 36)
invoked from within
"source $file"

Don't know what "no connection means." If the other poster above is correct, I should put my code in a package... correct? I didn't want to have to create one, but I will try and report back.

Thanks to all for continuing to help - this is a great community.

Collapse
Posted by ultra newb on
Update: Created a package for everything. I still have the same problems with the package.

Here is the exchange-procs.tcl file:

proc ret x {return $x}

proc exch cmd {
set EXCH_HOST [ad_host]
set EXCH_PORT 9999

set socket [socket $EXCH_HOST $EXCH_PORT]
puts -nonewline $socket $cmd
flush $socket

set reply {}
while {[set line [string trim [gets $socket]]] != {}} {
lappend reply $line
}
close $socket
return $reply
}

proc libdir {} {return [get_server_root]/packages/acs-subsite/lib}
util_memoize libdir

proc mkt {} {return [lindex [list [lrange [lindex [exch MKT] 0] 1 end]] 0]}
util_memoize mkt

proc mktmin {} {
return [lindex [exch MKMIN,MKMAX] 0]
}

As stated previously, it depends on the postition of various procs as to whether this works or not. I had rearranged things and had everything working up until I added the last proc (mktmin), which caused it to blow up again.

Collapse
Posted by Jeff Rogers on
The "no connection" error is telling you that you are trying to perform an operation (in this case, getting the "host" header from the current request) in a context where there is no current request - at startup.

Once an error is raised in a tcl file, nothing further in that file will get executed, including commands to define procs. That would explain why the proc is available if you define it early in the file but not at the end.

To get the name of the server you are on when there is no request, use [ns_info hostname], or could you just use "localhost"?

Collapse
Posted by ultra newb on
This was indeed the problem! All problems have now been solved, including dynamically-defining a proc.

Also, apparently don't have to define a package.

Thanks to everyone, this was a big help.