In AOLserver 3.x, you can create an empty nsv with no
keys (e.g. with
"nsv_array set mynsvname [list]"), and the nsv would
exist. This also
matches the behavior of Tcl Arrays, which is good.
However in AOLserver 4 (I tested beta2 and beta4), it
seems that it is
impossible to create an empty nsv, and when you delete
the last key in
an nsv, the nsv itself is also deleted. This is BAD!
Logged In: YES
user_id=43168
This changed nsv behavior is easy to demonstrate like so:
# Page to test some AOLserver nsv stuff. Seems that
creating an empty
# nsv is different between AOLserver 3.x and 4.0.
set body "\nAOLserver version: [ns_info version]"
append body "\nTest creating empty nsv:\n"
set nsv {atp_test_empty_nsv}
append body "\nnsv should not yet exist:"
if { ![nsv_array exists $nsv] } {
append body "\nnsv does NOT exist."
append body "\nCreating empty nsv with:\n nsv_array set
$nsv \[list\]"
nsv_array set $nsv [list]
} else {
append body "\nnsv exists."
}
append body "\nnsv now SHOULD exist:"
if { ![nsv_array exists $nsv] } {
append body "\nnsv does NOT exist."
} else {
append body "\nnsv exists."
}
append body "\nUnsetting nsv now.\n"
nsv_unset $nsv
append body "\nnsv should not yet exist:"
if { ![nsv_array exists $nsv] } {
append body "\nnsv does NOT exist."
append body "\nCreating empty nsv with:\n nsv_set $nsv
foo bar ; nsv_unset $nsv foo"
nsv_set $nsv foo bar ; nsv_unset $nsv foo
} else {
append body "\nnsv exists."
}
append body "\nnsv now SHOULD exist:"
if { ![nsv_array exists $nsv] } {
append body "\nnsv does NOT exist."
} else {
append body "\nnsv exists."
}
append body "\nUnsetting nsv now.\n"
nsv_unset $nsv
append body "\n"
ns_return 200 text/plain $body
Logged In: YES
user_id=43168
Output of the above test case will be:
AOLserver version: 4.0
Test creating empty nsv:
nsv should not yet exist:
nsv does NOT exist.
Creating empty nsv with:
nsv_array set atp_test_empty_nsv [list]
nsv now SHOULD exist:
nsv does NOT exist.
Unsetting nsv now.
nsv should not yet exist:
nsv does NOT exist.
Creating empty nsv with:
nsv_set atp_test_empty_nsv foo bar ; nsv_unset
atp_test_empty_nsv foo
nsv now SHOULD exist:
nsv does NOT exist.
Unsetting nsv now.
AOLserver version: 3.3.1+ad13
Test creating empty nsv:
nsv should not yet exist:
nsv does NOT exist.
Creating empty nsv with:
nsv_array set atp_test_empty_nsv [list]
nsv now SHOULD exist:
nsv exists.
Unsetting nsv now.
nsv should not yet exist:
nsv does NOT exist.
Creating empty nsv with:
nsv_set atp_test_empty_nsv foo bar ; nsv_unset
atp_test_empty_nsv foo
nsv now SHOULD exist:
nsv exists.
Unsetting nsv now.
Logged In: YES
user_id=43168
Question: What is the behavior of the Tcl Threading
Extension with
respect to this bug? If we load it instead of AOLserver's
native nsv
support into AOLserver 4.0, do we get correct behavior?
Logged In: YES
user_id=605103
Problem seems to actually be in the implementation of
[nsv_array exists varname], which is returning false for
existing but empty nsvs. This is now fixed in the head
version of nsd/tclvar.c (and will be included into the next
tag).
Logged In: YES
user_id=620872
Fixed in Aolserver 4.0 (beta 6)