Application.cfc saving old datasource?
I had a site on one server that I am moving to a new server. I copied the files and database and created a new DSN. I ran a simple query on a test page prior to moving the site, it was a one page site at that time. I was able to connect to the database.
Now I have a relatively simple application file. I changed the name of the data souce in the file, but prior to that I made the mistake of opening a page on the site. The old data souce is A, the new data source is B. The application.cfc clearly (now) says B, but I get an error on every page saying it can't find A. I did a search of the entire site and nowhere in any file does it list data source A.
Here is the application file.
<cfcomponent output="false">
<!--- Name the application. --->
<cfset this.name="SomeName">
<!--- Turn on session management. --->
<cfset this.sessionManagement=true>
<cffunction name="onApplicationStart" output="false" returnType="void">
<!--- Any variables set here can be used by all pages --->
<cfset APPLICATION.DSN = "B">
<!--- Define the mail server --->
<cfset APPLICATION.MailServer = "MailServer">
<cfset APPLICATION.AdminMail = "EMailAddress">
<cfset APPLICATION.AdminMailPass = "PassWord">
</cffunction>
</cfcomponent>
Any thought on what I've done wrong?
Thank you!
ctreeves wrote:
... The old data souce is A, the new data source is B. The application.cfc clearly (now) says B, but I get an error on every page saying it can't find A. I did a search of the entire site and nowhere in any file does it list data source A.
The answer to the puzzle is as follows. The original application was still running in memory, with datasource A, even after you had modified the Application.cfc file. That is because the original application has not yet timed out, which means onApplicationEnd() has not yet been triggered.
The easiest way I know to reset an application is to change the application name. To do so in your case, change the line
<cfset this.name="SomeName">
to, for example,
<cfset this.name="SomeName2">.
Oh, and I hope you have saved the application file as Application.cfc, with capital A.
Similar Messages
-
Multiple datasources on Application.cfc file
Is it possible to list multiple datasources on a
Application.cfc file? If not would I just have to create a sub
folder, create another Application.cfc and then that will control
the folders below it?quote:
For instance I set my datasource in the the application.cfc
<cfset REQUEST.dataSource = "mydata">
REquest.dataSource is just a variable name, you can have as
many
variable names as you like to define datasource strings.
Hard Coded Variable Names:
<cfset REQUEST.dataSourceOne = 'aDSN'>
<cfset REQUEST.dataSourceTwo = 'bDSN'>
Array Variable:
<cfset request.dataSource = arrayNew(1)>
<cfset request.dataSource[1] = 'aDSN'>
<cfset request.dataSource[2] = 'bDSN'>
Structure Variable:
<cfset request.dataSource = StructNew()>
<cfset request.dataSource.firstDSN = 'aDSN'>
<cfset request.dataSource['secondDSN'] = 'bDSN'>
A list:
This would really suck. I can not think of any good reason to
use this
horrible method.
<cfset request.dataSource = 'aDSN,bDSN'>
You would then access these values like this.
<cfquery
datasoruce="#listGetAt(request.dataSource,2)#"...>
Define as many Datasources as you need and use them in your
code. Its
just data.
Go whole hog and build a CFC that has methods that you can
pass a
parameter into and it will return the DSN.
<cfquery
datasource="#myCFCvariable.getDSN(aValue)#"...>
OK! This one is probably overkill. -
Tracking users in the Application.cfc, please help
Hello;
I wrote a small tracking system for my web site. I am trying
to upfrade it to work in CF 8. Here is what I am doing.
I had this code on the index.cfm page of my site. I am
attempting to move it to the Application.cfc file. When I do, it
registers in the DB every time the user hits a page or clicks a
link. I don't want it to do that. I do want it to tell me when they
hit the site, and if I can what page they came in on.
Here is my code:
<cfquery name="tracking" datasource="my-DB"
dbtype="ODBC">
INSERT INTO tracking (REMOTE_ADDR, HTTP_USER_AGENT,
TRACK_DATE, PageID)
VALUES('#REMOTE_ADDR#', '#HTTP_USER_AGENT#',
#CreateOdbcDateTime(now())#)
</cfquery>
My pageID is where I want the information on what page the
user came in on to go.
I placed teh query inside a session function code, but it
doesn't work at all right now, I need to limit the hits counted by
the Application.cfm, if I place it inside the area of the app that
is for global variables, it adds info to the DB everytime they
click a link and I don't want that. As for the entry page of the
user, I am trying to make it so if someone enters the site lets say
on the about.cfm page, that is added to the db and so on. Is this
possible? If so how would I do that?
Here is my application.cfc code so far:
<cfcomponent output="false">
<cfset THIS.name = "my-web">
<cfset this.sessionManagement="yes">
<cfset this.clientManagement=true>
<cffunction name="onApplicationStart" returntype="boolean"
output="false">
<cfset APPLICATION.appStarted = now()>
<cfreturn true>
</cffunction>
<cffunction name="onApplicationEnd" returntype="void"
output="false">
<cfargument name="appScope" required="True">
<cflog file="#THIS.name#" text="App ended after
#dateDiff('n' , ARGUMENTS.appscope.appStarted,now())# minutes.">
</cffunction>
<cffunction name="onSessionStart" returntype="query"
output="true">
<cfquery name="tracking" datasource="creative"
dbtype="ODBC">
INSERT INTO tracking (REMOTE_ADDR, HTTP_USER_AGENT,
TRACK_DATE)
VALUES('#REMOTE_ADDR#', '#HTTP_USER_AGENT#',
#CreateOdbcDateTime(now())#)
</cfquery>
</cffunction>
<cffunction name="onRequestStart" returntype="boolean"
output="true">
<cfset request.datasource = "my-db">
<cfset sitePath = "
http://www.myweb">
<!--- this is where I was putting the tracking code and it
added to the DB everytime someone clicked a link. not what I want
--->
<!--- Start True Url Variables --->
<cfloop
list="#removeChars(cgi.path_info,1,len(cgi.script_name))#"
delimiters="/" index="variableSet">
<cfscript>
variableName = "url." & listGetAt(variableSet,1,'.');
expression = listGetAt(variableSet,2,'.');
</cfscript>
<cfparam name="#variableName#" default="#expression#">
</cfloop>
<!--- Finish True Url Variables --->
<cfreturn true>
</cffunction>
</cfcomponent>
Thank you.
PhoenixI did a dump and got it to error out, so it is recognizing
the session, but it doesn't add any info to the DB. I also had to
change it, I had it like this:
<cffunction name="onSessionStart" returntype="query"
output="true">
<cfquery name="tracking" datasource="my-db"
dbtype="ODBC">
INSERT INTO tracking (REMOTE_ADDR, HTTP_USER_AGENT,
TRACK_DATE)
VALUES('#REMOTE_ADDR#', '#HTTP_USER_AGENT#',
#CreateOdbcDateTime(now())#)
</cfquery>
</cffunction>
Changed it to this:
<cffunction name="onSessionStart" returntype="any"
output="true">
<cfquery name="tracking" datasource="creative"
dbtype="ODBC">
INSERT INTO tracking (REMOTE_ADDR, HTTP_USER_AGENT,
TRACK_DATE)
VALUES('#REMOTE_ADDR#', '#HTTP_USER_AGENT#',
#CreateOdbcDateTime(now())#)
</cfquery>
</cffunction>
it was erroring on the query attribute before in the session
function. Even that change didn't get it to work properly. -
Moving to CF10, Need help with Application.cfc
I've been googling about how to work with Application.cfc since last week but I still have some questions and I can't find the answers.
My application is under the root (in unix) and there are many subfolders underneath it. Each sub-folder is hosting a different web application.
From what I read, I can create 1 root Application.cfc and then on subsequent sub-folder, when I need to have another Application.cfc on that level, I can create ProxyApplication (see below) and then create a sub-folder level Applicatin.cfc
So, when I set an application.DSN on my root Application.cfc, using proxyApplication I don't have to reset this dsn again in my sub folder level Application.cfc
Since my loginform.cfm and loginaction.cfm is right under root directory too, I also set OnsessionStart in the root Application.cfc to handle user login. Then this means, I don't have to reset session variable again anywhere because session.username, etc has been set on the highest level.
Is this correct?
In addition, Am I correct when I do the following:
1. Since I have root level and sub-folder level Application.cfc, I should set this.name with a different name, am I right?
On the root Application.cfc I set this.name = "StudentServices" because this represent the global application
On the sub-folder level's Application.cfc, I set this.name to "StudentServices_stdLoad" becaus this sub-folder only handle student load application.
2. On the root Application.cfc, I set the DSN to the application scope. So on the sub-folder level Application.cfc I can check if a particular db is working or not
because as awhole, in the global sense, this web application uses more than one Databases. Each sub-folder may use a database that is dfferent than the other sub folder.
Am I doing the right thing? Please advice
Below is example of what I have, Thank you!
I created a root Application.cfc under the root directory:
<CFCOMPONENT displayname="Application" output="true" hint="My Root Application component">
<!--- Set up the application ---> <cfset THIS.Name = "StudentServices" /> <cfset THIS.ApplicationTimeout = CreateTimeSpan(0,0,30,0) /> <cfset THIS.SessionManagement = true /> <cfset THIS.SetClientCookies = false />
<cffunction name="OnApplicationStart" access="public" returntype="boolean" output="false">
<cfset application.MainDSN = "DSN1">
<cfset application.ReportDSN = "DSN2">
<cfreturn true/>
</cffunction>
<cffunction name="onApplicationEnd" output="false">
<cfargument name="applicationScope" required="true"> </cffunction>
<cffunction name="onSessionEnd">
</CFCOMPONENT>
Then, in this root directory I also created a ProxyApplication:
<!--- it's empty and it Serves merely to create an alias for your root /Application.cfc --->
<cfcomponent name="ApplicationProxy" extends="AdvancementServices.Application">
</cfcomponent>
Then in the Sub-Directory, I can create a sub-folder level Application.cfc extending the root Application.cfc:
<CFCOMPONENT displayname="Application" extends="ApplicationProxy">
<!--- Set up the sub-folder application --->
<cfset THIS.Name = "StudentServices_stdLoad"/>
<cfset THIS.ApplicationTimeout = CreateTimeSpan(0,0,30,0) />
<cfset THIS.SessionManagement = true/>
<cfset THIS.SetClientCookies = false/>
<cffunction name="OnApplicationStart" access="public" returntype="boolean" output="false">
<!--- ****** Testing whether the ADVUPGRD is accessible by selecting some data.****** --->
<cftry>
<cfquery name="TestMain_DSN" datasource="#application.MainDSN#" maxrows="2">
SELECT Count(*) FROM MyTable
</cfquery>
<!--- If we get a database error, report an error to the user, log the error information, and do not start the application. --->
<cfcatch type="database">
<cflog file="#this.name#" type="error" text="Main DSN is not available. message: #cfcatch.message# Detail: #cfcatch.detail# Native Error: #cfcatch.NativeErrorCode#" >
<cfthrow message="This application encountered an error when connecting to the Main Database. Please contact support." />
<cfreturn false>
</cfcatch>
</cftry>
<cflog file="#this.name#" type="Information" text="Application #this.name# Started">
<cfreturn true/>
</cffunction>
</CFCOMPONENT>
<cfargument name = "SessionScope" required=true/> <cfargument name = "AppScope" required=true/>
</cffunction>
<cffunction name="OnSessionStart" access="public" returntype="void" output="false">
<CFSET session.UserGroup = ""/>
<CFSET session.UserName = ""/>
<CFSET session.currentPage = ""/>
<CFSET session.loggedin = "No"/>
<CFSET session.userrights = ""/>
<cfreturn/>
</cffunction>OK. It sounds to me like you really shouldn't be using a single root Application.cfc at all, if all you want to do is share some settings between your "sub-applications". I would look at storing the common settings in an external file that all of the applications can read in. The simplest way is to put the settings in a .CFM file somwhere outside of the web root (so it is not directly web accessible) and load it with <cfinclude> tag into the OnApplicationStart() method of each sub-application's App.cfc. That .CFM file can be as simple as:
<cfset application.myCustomSetting = "blahblah">
<cfset application.myOtherSetting = "foo">
Alternatively, you can look at using a config file like this Ray Camden blog post suggests, and use the GetProfileSection(), GetProfileString(), and SetProfileString() functions as needed within OnApplicationStart(). You could even put ALL of your settings in
A third option is to store your settings in an XML file or in JSON format in a text file. You could then write code to read in the XML file, and use something like xml2struct.cfc to convert the XML into a struct, then append the struct to your application scope. If you go the JSON route, then just read in the JSON file and use DeserializeJSON() to convert it into a struct, and append it to the application scope.
What I think is probably the best approach is to use a community-supported MVC framework like FW/1 or ColdBox (maybe you already are, I don't think you've said so though). One of the many advantages to doing so is that they have built-in "environment" support that can be used to configure common settings, depending on your environment (dev/qa/production). You would handle reading in your external settings through the "environment" mechanism.
One other thing to think about: your login mechanism. I think you want to use one set of login tools that is shared by all of the "sub-applications". You can do this also by putting the login/authentication-related code somewhere outside the webroot of your applications, and then either set up a mapping to that location in CF Admin, or set an application-specific mapping in your various App.cfc files. That way all the "sub-applications" share a common set of code for the login process. I don't know how your login process works (do all users go to the same login page then get redirected into their relevant "sub-application", or does each "sub-application" have a discrete login page that utilizes common back-end processes to authenticate and redirect), so you'll have to judge how that is best accomplished.
Hopefully this gives you some useful ideas.
-Carl V. -
What's wrong with my Application.cfc file
I've decided to convert an old app from using Application.cfm to Application.cfc, mainly because I want to use onRequestStart and the like, and I can't get them to initialize in Application.cfm.
But for some reason, this Application.cfc file causes my pages to come up blank. I can't for the life of me figure out why, since it's copied from an app that works perfectly fine.
<cfcomponent>
<cfset this.name = "myapp">
<cfset this.sessionManagement = true>
<cfset this.sessionTimeout = CreateTimeSpan(0,2,0,0)>
<cfset this.loginStorage="session">
<cfset this.scriptProtect = true>
<cfset this.setclientcookies = false>
<cffunction name="onApplicationStart">
<cfset application.dsource = "mydsn">
<cfset application.appid = "123456">
<cfset application.appname = "myappname">
</cffunction>
<cffunction name="onSessionStart">
<cfparam name="session.trackingno" default="0">
<cfparam name="session.emailaddr" default="">
<cfparam name="session.newitem" default="1">
<cfparam name="session.authserver" default="">
<cfparam name="session.id" default="">
<cfparam name="session.rights" default="">
<cfparam name="session.userid" default="">
<cfparam name="session.sauth" default="">
<cfparam name="session.creds" default="">
</cffunction>
<cffunction name="onRequest" output="true">
<cfinclude template="/planning/application.cfm">
<cfinclude template="/planning/tpea/2015/validate.cfm">
</cffunction>
</cfcomponent>
What have I done wrong?What is in the two templates you are including inside your onRequest() function? Do they actually output any content?
You don't have the actual requested page being included. You need to add an argument to the top of the function to receive the requested page:
<cfargument name="TargetPage" type="string" required="true">
Then you need to add another <cfinclude> to include that page:
<cfinclude template="#arguments.TargetPage#" />
You'll have to figure out if that include should come before or after your existing includes.
-Carl V. -
Work around for Application.cfc
I have an Application.cfc file that outputs a header and footer page for every request. That works wonderful but if I try to open a page that is doing a <cfgrid> using a CFC file than I get an error of "Error invoking CFC /GATS/CFC/purchaseOrder.cfc : Internal Server Error [Enable debugging by adding 'cfdebug' to your URL parameters to see more information]" when opening the page.
Commenting out the header/footer include in the Application.cfc file lets the <cfgrid> populate with the CFC file. Is there a fix or work around for this?
Application.cfc file
<cfcomponent output="false">
<cffunction name="onRequestStart" returnType="boolean" output="true">
<cfargument name="thePage" type="string" required="yes">
<cfset PageName = GetFileFromPath(thePage)>
<cfif not IsDefined("session.user.isAuthenticated") or
session.user.isAuthenticated equal session.no>
<cfif FindNoCase('index.cfm', PageName) is not 0>
<cfelse>
<cfset session.messages[1] = "Authentication required.">
<cflocation url="#application.WebAddress#" addtoken="no">
</cfif>
</cfif>
<cfif FindNoCase('index.cfm', PageName) is not 0>
<cfset request.PageNavigation = "">
<cfset request.Screen = "Login">
</cfif>
<cfif FindNoCase('mainMenu.cfm', PageName) is not 0>
<cfset request.PageNavigation = "Home">
<cfset request.Screen = "">
</cfif>
<cfif FindNoCase('purchaseOrder.cfm', PageName) is not 0>
<cfset request.PageNavigation = '<a href="mainMenu.cfm">Home</a> &##8226; New Purchase Order'>
<cfset request.Screen = "">
</cfif>
<cfif FindNoCase('logout.cfm', PageName) is not 0>
<cfelse>
<cfinclude template="includes/header.cfm">
</cfif>
<cfreturn true>
</cffunction>
<cffunction name="onRequestEnd" returnType="void" output="true">
<cfargument name="thePage" type="string" required="yes">
<cfset PageName = GetFileFromPath(thePage)>
<cfif FindNoCase('logout.cfm', PageName) is not 0>
<cfelse>
<cfinclude template="includes/footer.cfm">
</cfif>
</cffunction>
</cfcomponent>
purchaseOrder.cfm
<cfgrid name="AccountGrid" format="html" bind="cfc:GATS.CFC.purchaseOrder.GetQuantities({cfgridpage},{cfgridpagesize}, {cfgridsortcolumn}, {cfgridsortdirection})">
<cfgridcolumn name="ID" header="ID" display="yes">
<cfgridcolumn name="vendor_name" header="Name" display="yes">
</cfgrid>
I found this on the web:
That error is due to our application.cfm having a single HTML comment at the
start of the file. Apparently if your Application.cfm or Application.cfc file
outputs ANYTHING, binds to CFCs with AJAX (via HTML CFGRID or CFAJAXPROXY, for
example) do not work. The CFC will be called, but the data from it will never
"flow" into the CFGRID. Removing the comment from the Application.cfm file took
care of our CFGRID issue.
This there a way to have an Application.cfc file that displays a header and footer for every page and have and
have a page have a <cfgrid> in it?BKBK,
I created the examples you posted and commenting out the header/footer lines in my Application.cfc displayed the cfgrid results (updating the query to a table I had). Running the same example code with the header/footer included in the Application.cfc would not show the cfgrid results.
I attached the Application.cfc file for review.
Couldn't attach the file.
Application.cfc
<cfcomponent output="yes">
<cfset this.name = "GATS">
<cfset this.clientmanagement = "true">
<cfset this.applicationtimeout = CreateTimeSpan("0","0","20","0")>
<cfset this.sessionmanagement = "true">
<cfset this.sessiontimeout = CreateTimeSpan("0","0","20","0")>
<cfset this.scriptProtect = "true">
<cfparam name="session.yes" default="Yes">
<cfparam name="session.no" default="No">
<cffunction name="onApplicationStart" returnType="boolean" output="no">
<cfset application.Directory = "/GATS/">
<cfset application.Datasource = "IA-webapplications">
<cfset application.DatasourceGATS = "SBS-GATS">
<cfreturn true>
</cffunction>
<cffunction name="onApplicationEnd" returntype="void" output="no">
<cfargument name="ApplicationScope" required="yes" />
</cffunction>
<cffunction name="onSessionStart" returntype="void" output="no">
<cflock scope="session" timeout="5" type="exclusive">
<cfset session.no = "No">
<cfset session.yes = "Yes">
<cfset session.new = "New">
<cfset session.user = StructNew()>
<cfset session.user.isAuthenticated = session.no>
<cfset session.user.emplid = "">
<cfset session.user.userSSOId = "">
<cfset session.user.firstName = "">
<cfset session.user.lastName = "">
<cfset session.user.name = "">
<cfset session.messages = ArrayNew(1)>
<cfset session.savedInputValues = ArrayNew(1)>
<cfset session.filesTransferred = "">
</cflock>
</cffunction>
<cffunction name="onSessionEnd" returntype="void" output="no">
<cfargument name="SessionScope" required="yes">
<cflock scope="session" timeout="5" type="exclusive">
<cfset Arguments.SessionScope.user.isAuthenticated = session.no>
<cfset Arguments.SessionScope.users.emplid = "">
<cfset Arguments.SessionScope.user.userSSOId = "">
<cfset Arguments.SessionScope.user.firstName = "">
<cfset Arguments.SessionScope.user.lastName = "">
<cfset Arguments.SessionScope.user.name = "">
</cflock>
</cffunction>
<cffunction name="onRequestStart" returntype="void" output="yes">
<cfargument type="String" name="TargetPage" required="yes">
<cfset PageName = GetFileFromPath(TargetPage)>
<cfif not IsDefined("session.user.isAuthenticated") or
session.user.isAuthenticated equal session.no>
<cfif FindNoCase('index.cfm', PageName) is not 0>
<cfelse>
<cfset session.messages[1] = "Authentication required.">
<cflocation url="#application.WebAddress#" addtoken="no">
</cfif>
</cfif>
<cfif FindNoCase('index.cfm', PageName) is not 0>
<cfset request.PageNavigation = "">
<cfset request.Screen = "Login">
</cfif>
<cfif FindNoCase('mainMenu.cfm', PageName) is not 0>
<cfset request.PageNavigation = "Home">
<cfset request.Screen = "">
</cfif>
<cfif FindNoCase('purchaseOrder.cfm', PageName) is not 0>
<cfset request.PageNavigation = '<a href="mainMenu.cfm">Home</a> &##8226; New Purchase Order'>
<cfset request.Screen = "">
</cfif>
<cfif FindNoCase('logout.cfm', PageName) is not 0>
<cfelse>
<cfinclude template="includes/header.cfm">
</cfif>
</cffunction>
<cffunction name="onRequestEnd" returntype="void" output="yes">
<cfargument type="String" name="TargetPage" required="yes">
<cfset PageName = GetFileFromPath(TargetPage)>
<cfif FindNoCase('logout.cfm', PageName) is not 0>
<cfelse>
<cfinclude template="includes/footer.cfm">
</cfif>
<cfif FindNoCase('sessionTerminated.cfm', PageName) is not 0>
<cfinvoke method="onSessionEnd">
<cfinvokeargument name="SessionScope" value="#session#">
</cfinvoke>
</cfif>
</cffunction>
<cffunction name="onError" returnType="void" output="no">
<cfargument name="exception" required="true">
<cfargument name="eventName" type="string" required="true">
<cfthrow object="#arguments.exception#">
</cffunction>
</cfcomponent> -
Need help with application.cfc
Here is what I am trying to do. I have a login page, and when
a user logs in it verifies their credentials. If everything is good
it sets a session variable called #session.username#. What I want
to happen is at that point update a database field to set the user
logged on status to 1. Everything to that point is fine. I am
getting stuck at updating the databse when the users session ends.
Before the session ends I would like to update the db field for the
user and set the logged on status to 0.
I haven't used application.cfc before. I have been messing
around but nothing is working. Here is a copy of my application.cfc
file. If anyone has any idea on how to run a query onsessionend and
update a db I would appreciate it.
<cfcomponent output="false">
<cfset this.name = "test">
<cfset this.applicationTimeout =
createTimeSpan(0,2,0,0)>
<cfset this.clientManagement = true>
<cfset this.clientStorage = "registry">
<cfset this.loginStorage = "session">
<cfset this.sessionManagement = true>
<cfset this.sessionTimeout = createTimeSpan(0,0,0,30)>
<cfset this.setClientCookies = true>
<cfset this.setDomainCookies = false>
<cfset this.scriptProtect = false>
<cffunction name="onApplicationStart" returnType="boolean"
output="false">
<cfset application.dsn = "dsn">
</cffunction>
<cffunction name="onSessionStart" returnType="void"
output="false">
<cfargument name="sessionScope" type="struct"
required="true">
<cfargument name="appScope" type="struct"
required="false">
</cffunction>
<cffunction name="onSessionEnd" returnType="void"
output="false">
<cfargument name="sessionScope" type="struct"
required="true">
<cfargument name="appScope" type="struct"
required="false">
<!--- Update Logged On Status --->
<cfquery datasource="dsn">
UPDATE LoginNew
SET loggedin = '0'
WHERE username = '#session.loginname#'
</cfquery>
</cffunction>
</cfcomponent>siriiven wrote:
>
> Any ideas?
>
Take a peak at the documentation. It describes all the ins
and outs...
you have to do the same thing with application variables as
session
variables. The hint being that you are also defining an
appScope
argument as well as the sessionScope argument, there is a
reason for this.
<quote
src="
http://livedocs.adobe.com/coldfusion/7/htmldocs/wwhelp/wwhimpl/common/html/wwhelp.htm?cont ext=ColdFusion_Documentation&file=00000701.htm">
Usage
Use this method for any clean-up activities when the session
ends. A
session ends when the session is inactive for the session
time-out
period or, if using J2EE sessions, the user closes the
browser. You can,
for example, save session-related data, such as shopping cart
contents
or whether the user has not completed an order, in a
database, or do any
other required processing based on the users status.
You might also
want to log the end of the session, or other session related
information, to a file for diagnostic use.
If you call this method explicitly, ColdFusion does not end
the session;
it does execute the method code, but does not lock the
Session.
You cannot use this method to display data on a user page,
because it is
not associated with a request.
You can access shared scope variables as follows:
You must use the SessionScope parameter to access the Session
scope. You
cannot reference the Session scope directly; for example, use
Arguments.SessionScope.myVariable, not Session.myVariable.
You must use the ApplicationScope parameter to access the
Application
scope. You cannot reference the Application scope directly;
for example,
use Arguments.ApplicationScope.myVariable, not
Application.myVariable.
Use a named lock when you reference variables in the
Application scope,
as shown in the example.
You can access the Server scope directly; for example,
Server.myVariable.
You cannot access the Request scope.
Sessions do not end, and the onSessionEnd method is not
called when an
application ends. The onSessionEnd does not execute if there
is no
active application, however.
</quote> -
Multiples DSNs' application.cfc
Hi All,
Is it possible to set the multiple datasources on a Application.cfc using this.datasouce attribute?
CF 9, from application.cfc, you can set
<cfset this datasouce ="myDSN1" > and no need to specify the DSN in the query. My question is if I have multiples Datasouces, how can i set them up in application.cfc?
<cfquery name="qDoctype">
select * from type
</cfquery>
ThanksYou can't set up multiple datasources in Application.cfc to be used **implicitly** in your queries. The "this.datasource" can only be set to one datasource name. However, nothing is stopping you from storing a structure of datasource names in the application scope:
<cfset application.myDSNs = StructNew()>
<cfset application.myDSNs.DSN1 = "myDSN1">
<cfset application.myDSNs.DSN2 = "myDSN2">
Then in your query, you would do:
<cfquery name="qDoctype" datasource="#application.myDSNs.DSN1#">
HTH,
-Carl V. -
How to run setup for new datasources without breaking old datasources?
Hi,
I am wondering how to install some more data sources (2LIS_05_Q0NOTIF, 2LIS_17_10NOTIF and 2LIS_18_10NOTIF) without breaking the delta mechanism for other data sources when I start to use the new datasources.
I have installed some QM cubes (0QM_C04, -05, -08 and -11) and delta loads run every night. Now I want to add two more cubes (0QM_C02 and -03). The new cubes use datasources that are not yet available.
If I now activate the needed datasources, delete the content of the setup tables again and run 'Application-Specific Setup of Statistical Data' for 'Quality Management', 'Plant Maintenance' and 'Service Management', I am afraid that I will re-initialize the delta queue for the datasources that are already in use... In other words: I am afraid of breaking all datasources in application 05, 17 and 18...
I cannot find documentation addressing this problem. Any input, anyone?
Best regards,
Christian FrierHi all,
if I understand you all correctly, I can use the following plan:
0) Wait until no documents are posted on the R/3 side.
1) Run the delta loads and check that the queues are empty (RSA7 and LBWQ).
2) Delete the setup tables.
3) Run the 'Application-Specific Setup of Statistical Data'
4) Create and execute infopackages for initial dataload (for the new datasources).
5) Create and execute infopackages for delta loads (for the new datasources).
6) Run the infopackages for delta load from the 'old' datasources without running a new initial dataload.
So basically 6) is the step I worry about.
That is that I can start to use 2LIS_05_ITEM, 2LIS_17_ITEM and 2LIS_18_ITEM without breaking the delta sequence for 2LIS_05_TASK, 2LIS_17_TASK and 2LIS_18_TASK.
regards,
Christian -
Photo "...changed in external application" when saving metadata in LR2
I am getting occasional error dialogs saying that one or more photos have been changed in an external application when saving metadata. I'm quite certain the photos have not been touched since the catalog was built--two days ago.
I built an entirely new catalog after installing LR2. I changed some keywords as I not all images were keyworded in the same way. When I save metadata, either for an entire folder or for all files, I get occasional error dialogs about the image being changed externally. I'm quite certain that I changed nothing.
Running Win XP Pro SP2 + all updates except SP3, LR2, on Xeon 3070 with 3GGB RAM and lots of hard drive space.If I didn't think my humor and irony would be misinterpreted as being rude, I might say "Why are you such a troublemaker, by asking this question? Don't you know from reading the forum, that there are multiple opinions about how LR works with changes done outside itself?" Ooops, I actually said it.<G>
But, seriously, I've had many of the same questions, so I've been following the various threads, and still haven't got a clear and relatively simple answer to "how to work with LR images and catalogs using outside applications, and not mess stuff up?"
So, again, seriously, thanks for asking. Hoping, like you, to get clearer understanding.
Regards,
Peter
Peter Gold
KnowHow ProServices
Seeking Serenity wrote:
I was having an issue where each time I would modify a photo, LR would change the Capture Date to the Modified Date. Upon a quick search, I believe the correct way to stop this from happening is for me to uncheck the auto write to XMP which I did. After correcting the myriad of inadvertent date changes, I selected all the photos I was working with and attempted to save the metadata only to get this warning/question: "One or more of these photos has been changed in an external application. Should Lightroom overwrite the settings on disk?" I searched this and I'm confused because I'm not editing the photos in an external application; the only external app that is even remotely touching these photos is Dropbox, which is where my LR catalog is stored. Does Dropbox have something to do with this message or am I missing something? To overwrite or not to overwrite is the question now, I guess, but I'd like to figure out why this question is being posed so I can fix it from the start. -
I haven't backed up my computer in over a year. When I tried to back it up today, Time Machine says 'an error occurred while creating the backup folder.' When I check the side of the partition where I manually saved old photos and documents (including all the pictures from the year I studied abroad/traveled a bunch), the folders are there, but NONE of the files are.
Does anyone have any idea what the problem might be, or how I could fix it? I really don't want to lose all those photosSo you were doing a time machine backup to another partition on the same hard drive? Just trying to gather some information so i can provide a helpful response.
-
Which to use application.cfm or application.cfc?
Hi,
Just a general question, i have been using application.cfm
for my applications so far. I came across a tag that would be used
under application.cfc, but i tried putting both templates together
in one application and boom, an error showed up.
So, which is better to use with most of the applications
application.cfm or .cfc?
Thanks for any help!
SyedIt's actually a bit easier to use session and application
scope variables with Application.cfc, I think.
Application.cfc has methods for specific "events" or states:
onApplicationStart() -- where to load application variables,
security logic, etc.
onSessionStart() -- initialize session varialbes, etc.
onRequestStart() -- runs at the start of each page request
onRequestEnd()
onSessionEnd()
onApplicationEnd()
onError() -- very nice place to get some good
Application-wide error handling code in place
onRequest() -- be sure to read the notes on this
method...it's a bit different.
Check out the MX7 reference page for Application.cfc:
http://livedocs.adobe.com/coldfusion/7/htmldocs/wwhelp/wwhimpl/common/html/wwhelp.htm?cont ext=ColdFusion_Documentation&file=00000692.htm
CF* (if you're using that yet)
http://livedocs.adobe.com/coldfusion/8/htmldocs/help.html?content=Part_3_CFML_Ref_1.html -
SetEncoding() and application.cfc
Is this a bug, or I just didn't understand the way it is
supposed to work?
I just finished determining that if one puts a <cfset
setEncoding("form","encodingType")> in the
psudo-consructor (after the
<cfcomponent...> but before any <cffunction...)
tags) of Application.cfc
one will always receive empty form structures on an action
page.
When I tried moving said setEncoding() line to the
onRequestStart()
function. All was well? Is there a reason for this I do not
understand
with my very limited knowledge of page encoding?Application.cfc is event-driven, all its methods being
events. I think
you should expect to be in uncharted territory if you use any
method
different from the given list
First, you can augment the functions of Applicaiton.cfc if
you so
desire, it is just that these functions will never be called
by any
event. But there is nothing wrong with them being called by
functions
called as a result of one of the defined events.
Secondly, I was not doing this.
Relevant parts of my Application.cfc file:
<cfcomponent output="no">
<cfprocessingdirective pageencoding="windows-1252" />
<cfset variables.coding = "windows-1252">
<!--- placing these setEncoding() functions here, in the
psudo
constructor, failed. This cause the form structure to always
be empty. --->
<cfset setEncoding("form",variables.coding)>
<cfset setEncoding("url",variables.coding)>
<cffunction name="onRequestStart" output="false">
<cfargument name="requestname" required="yes">
<!--- placing these setEncoding() functions here, in the
onRequestStart, works fine. --->
<cfset setEncoding("form",variables.coding)>
<cfset setEncoding("url",variables.coding)>
</cffunction>
</cfcomponent> -
Where is the best place to set the path with Application.cfc?
Hi!
When I used Application.cfm, I set many path variables here so I don't have to keep writing a full path on many of the templates repeatedly.
So I did:
<CFSET FileArchives = "/space/users/www/FileArchives/#session.Groups#/">
<CFSET GoodFiles = "/space/users/www/GoodFiles/#session.usergroup#/">
etc...
Later on I only need to refer it as: #FileArchives# in the codes instead of a full path name.
Now that I'm using Application.cfc can I also do the same thing???? should I do it within OnApplicationStart function? am I doing it correctly? (see below)
<cffunction name="onApplicationStart" returnType="boolean" output="false">
<cfset application.dsn = "EMBB">
<CFSET application.FileArchives = "/space/users/www/FileArchives/#session.Groups#/">
<CFSET application.GoodFiles = "/space/users/www/GoodFiles/#session.usergroup#/">
<cfreturn true />
</cffunction>Dan Bracuk wrote:
Setting application variables in OnApplicationStart is a good idea. However, referring to session variables in the OnApplicationStart function is not.
Indeed. Wading through this lot - http://adamcameroncoldfusion.blogspot.co.uk/2012/08/more-on-applicationcfc-when-things-run .html - might be helpful for the OP to get a handle on when things run, and when things become available.
But the session scope is not available in onApplicationStart().
Adam -
Cfobject / cfinvoke problem in my application.cfc
Hello;
I am trying to use cfobject in my onsessionstart function in my application.cfc file. The cfobject is another application.cfc file I have in a sub directory in the web site, it runs the shopping cart. I am not firing this off properly and I was hoping someone could help me fix my code so it will operate properly.This is my invoke statement:
<cfobject name="SESSION.myShoppingCart" component="ShoppingCart">
<cfinvoke component="#SESSION.myShoppingCart#" method="getShoppingCart">
This is my whole argument statement for on session start:
<cffunction name="onSessionStart" returntype="any" output="true">
<cfset SESSION.created = now()> <!--- This sets off another session in the site --->
<cfobject name="SESSION.myShoppingCart" component="ShoppingCart">
<cfinvoke component="#SESSION.myShoppingCart#" method="getShoppingCart">
</cffunction>
this is my error:
Context validation error for tag cffunction.
The end tag </cffunction> encountered on line 80 at column 11 requires a matching start tag.
The error occurred in C:\website\Application.cfc: line 28
26 : <cffunction name="onSessionStart" returntype="any" output="true">
27 : <cfset SESSION.created = now()>
28 : <cfobject name="SESSION.myShoppingCart" component="ShoppingCart">
29 : <cfinvoke component="#SESSION.myShoppingCart#" method="getShoppingCart">
Can anyone help me? What do I need to do to set off my shopping cart functions on the cfc I am trying to invoke?
Thank You
CFmongerthis is what I am supposed to put in the on sessionstart function:
<cfobject name="SESSION.myShoppingCart" component="ShoppingCart">
But this throws the same error. I am reading this off of instructions from a book. Obviously the book is wrong. Is there a way to make that cfobject statement work? I don't want a return variable. I want the ShoppingCart.cfc that resides in the sub directory /donation/ShoppingCart.cfc to go into client memory, I don't need a return value, I need the shoppong cart application portion fired when they hit the web site, creating a "shopping cart" in session / client variables.
How would I do that using this tag? Thanks.
CFmonger
Maybe you are looking for
-
How can I set a DEFAULT zoom size at ctrl+++ that will hold while changing sites--even in Private Browsing? I'm just starting using Firefox but I won't be using it for long if I have to re-size the screen with every new location viewed.
-
PLEASE HELP!! Why do my file dates change on import?
I'm trying to drag and drop iPhotos into Aperture or export a collection of files and then import them into Aperture, but the image date changes to a random date in the future when I do so. What am I doing wrong? How do I solve the problem?
-
Unable to create Virtual Teams
Whenever I try to create any new Virtual Teams I get the following error: javax.naming.NameNotFoundException::[LDAP: error code 32 - NDS error: no such entry (-601)] After getting this error if I look in the Teams Organizational Unit it shows the cre
-
PSE 12 running slow in Windows 7?
I have just installed PSE 12 on a Windows 7 platform and it runs very slow and freezes when I try to selct files in organizer. Is there anyhting I can do in settings, etc.?
-
EEM- Email alert with IP SLA Based on Packet Loss
hi joseph, i need your advise, i want to get alert email based on IP SLA Packet loss the scenarion as below : 1. If the traffic hit threshold packet loss greater than 20% as long 15 minutes --> send email 2. If reset condition packet loss eq 0% as lo