Well yes, but Duplicate() is a 4.5.1 undocumented function that they put
there for Spectra. I'm not even sure 4.5.1 pro has it, but enterprise does.
Otherwise yes you are correct Structcopy() only copies the first level and
creates pointers to the rest. However for just using it to create pointers
to Application variables, its good enough. After all we are only using them
to read not write.
Fred
----- Original Message -----
From: "Chris Bartley" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Monday, August 07, 2000 12:26 PM
Subject: RE: Locking & Request Scoped Variables (was RE: Global Variables)
Alas, even StructCopy() is not enough. Use Duplicate() instead (CF4.5
only). StructCopy() only does a shallow copy. Try the following code (3
files) and see what happens to critters.mammals.dogs:
----------------------------------------------------------------------------
--------------
- StructTest1.cfm
----------------------------------------------------------------------------
--------------
<html>
<head>
<title>Copying Structs with StructCopy()</title>
</head>
<body>
<cfscript>
critters = StructNew();
critters.description = "This struct holds all the critters.";
critters.mammals = StructNew();
critters.insects = StructNew();
critters.marsupials = StructNew();
critters.mammals.description = "This struct holds all the mammals.";
critters.mammals.cow = "I say mooo.";
critters.mammals.cat = "I say meow.";
critters.mammals.dogs = StructNew();
critters.mammals.dogs.description = "This struct holds all the dogs.";
critters.mammals.dogs.greyhound = "I'm fast.";
critters.mammals.dogs.droopy = "I'm slow.";
critters.insects.description = "This struct holds all the insects.";
critters.insects.spider = "I eat other bugs by catching them in my web.";
critters.insects.cockroach = "I gross people out.";
critters.insects.ant = "I'm cool.";
critters.marsupials.description = "This struct holds all the marsupials.";
critters.marsupials.kangaroo = "I can jump really freakin far.";
critters.marsupials.koala = "I like eucalyptus.";
</cfscript>
<cfset crittersCopy = StructCopy(critters)>
<table border="1" cellpadding="3" cellspacing="0">
<tr>
<td colspan="2" align="center"><b>Copying Structs with
<code>StructCopy()</code></b></td>
</tr>
<tr>
<td align="center"><b>Critters</b></td>
<td align="center"><b>Critters Copy</b></td>
</tr>
<tr valign="top">
<td><cfmodule template="printStructTree.cfm" theStruct="#critters#"
theStructName="Critters"></td>
<td><cfmodule template="printStructTree.cfm" theStruct="#crittersCopy#"
theStructName="Critters Copy"></td>
</tr>
<tr>
<td colspan="2" align="center">
<b>Modify critters.mammals.dogs...</code></b>
<cfset critters.mammals.dogs = "dogs is gone!">
</td>
</tr>
<tr valign="top">
<td><cfmodule template="printStructTree.cfm" theStruct="#critters#"
theStructName="Critters"></td>
<td><cfmodule template="printStructTree.cfm" theStruct="#crittersCopy#"
theStructName="Critters Copy"></td>
</tr>
</table>
</body>
</html>
----------------------------------------------------------------------------
--------------
- StructTest2.cfm
----------------------------------------------------------------------------
--------------
<html>
<head>
<title>Copying Structs with Duplicate()</title>
</head>
<body>
<cfscript>
critters = StructNew();
critters.description = "This struct holds all the critters.";
critters.mammals = StructNew();
critters.insects = StructNew();
critters.marsupials = StructNew();
critters.mammals.description = "This struct holds all the mammals.";
critters.mammals.cow = "I say mooo.";
critters.mammals.cat = "I say meow.";
critters.mammals.dogs = StructNew();
critters.mammals.dogs.description = "This struct holds all the dogs.";
critters.mammals.dogs.greyhound = "I'm fast.";
critters.mammals.dogs.droopy = "I'm slow.";
critters.insects.description = "This struct holds all the insects.";
critters.insects.spider = "I eat other bugs by catching them in my web.";
critters.insects.cockroach = "I gross people out.";
critters.insects.ant = "I'm cool.";
critters.marsupials.description = "This struct holds all the marsupials.";
critters.marsupials.kangaroo = "I can jump really freakin far.";
critters.marsupials.koala = "I like eucalyptus.";
</cfscript>
<cfset crittersCopy = Duplicate(critters)>
<table border="1" cellpadding="3" cellspacing="0">
<tr>
<td colspan="2" align="center"><b>Copying Structs with
<code>Duplicate()</code></b></td>
</tr>
<tr>
<td align="center"><b>Critters</b></td>
<td align="center"><b>Critters Copy</b></td>
</tr>
<tr valign="top">
<td><cfmodule template="printStructTree.cfm" theStruct="#critters#"
theStructName="Critters"></td>
<td><cfmodule template="printStructTree.cfm" theStruct="#crittersCopy#"
theStructName="Critters Copy"></td>
</tr>
<tr>
<td colspan="2" align="center">
<b>Modify critters.mammals.dogs...</code></b>
<cfset critters.mammals.dogs = "dogs is gone!">
</td>
</tr>
<tr valign="top">
<td><cfmodule template="printStructTree.cfm" theStruct="#critters#"
theStructName="Critters"></td>
<td><cfmodule template="printStructTree.cfm" theStruct="#crittersCopy#"
theStructName="Critters Copy"></td>
</tr>
</table>
</body>
</html>
----------------------------------------------------------------------------
--------------
- printStructTree.cfm
----------------------------------------------------------------------------
--------------
<cfparam name="attributes.theStruct" default="">
<cfparam name="attributes.theStructName" default="No Struct Given">
<cfoutput>#attributes.theStructName#</cfoutput>
<cfif (IsStruct(attributes.theStruct))>
<ul>
<cfloop collection="#attributes.theStruct#" item="key">
<li>
<cfif IsStruct(attributes.theStruct[key])>
<cfmodule template="printStructTree.cfm"
theStruct="#attributes.theStruct[key]#" theStructName="#key#">
<cfelse>
<cfoutput>#key# = #attributes.theStruct[key]#</cfoutput>
</cfif>
</li>
</cfloop>
</ul>
</cfif>
----------------------------------------------------------------------------
--------------
At 5:43 PM +0200 8/7/00, BOROVOY Noam wrote:
>Old Chinese saying: "If all else fails read the @#$% manual"
>
>' ... Use the StructCopy function when you want to create a physical copy
of
>a structure. You can also use assignment to create a copy by reference. '
>
>If you want thread safe variables, and you want to copy a complex variable
>query / structure. A simple assignment is NOT enough! You must use
>StructCopy.
>
>HTH,
>Noam
>
> ----------
> From: [EMAIL PROTECTED] [SMTP:[EMAIL PROTECTED]]
> Sent: Monday, 07 August 2000 17:08
> To: [EMAIL PROTECTED]
> Subject: Locking & Request Scoped Variables (was RE: Global
>Variables)
>
> Picking up on something Fred Sanders said in his reply:
>
> "...The request scope is a global thread safe variable scope.
> To get out of having to do locks I often make request. scoped
>pointers to
> whatever application scoped variables I've set. "
>
> I seem to remember Dave Watts mentioning on the CF-Talk list that
>pointers
> to shared memory variable scopes (ie. session, application, etc...)
>are no
> better from a locking perspective than the direct call to them. Did
>I
> misunderstand? Anyone care to clarify this request. pointer issue?
>
> Thanks,
>
> Chris
>
>
>
>---------------------------------------------------------------------------
-
>--
> To Unsubscribe visit
>http://www.houseoffusion.com/index.cfm?sidebar=lists&body=lists/fusebox or
>send a message to [EMAIL PROTECTED] with 'unsubscribe' in
>the body.
>---------------------------------------------------------------------------
---
>To Unsubscribe visit
http://www.houseoffusion.com/index.cfm?sidebar=lists&body=lists/fusebox or
send a message to [EMAIL PROTECTED] with 'unsubscribe' in
the body.
----------------------------------------------------------------------------
--
To Unsubscribe visit
http://www.houseoffusion.com/index.cfm?sidebar=sts&body=sts/fusebox or send
a message to [EMAIL PROTECTED] with 'unsubscribe' in the
body.
------------------------------------------------------------------------------
To Unsubscribe visit
http://www.houseoffusion.com/index.cfm?sidebar=lists&body=lists/fusebox or send a
message to [EMAIL PROTECTED] with 'unsubscribe' in the body.