My First Steps With Transfer : Day 2
You can find the demo application here: http://amary.kisdigital.com
Well, instead of adding any additional tables to my transfer.xml, I decided to just finish adding the functions in the gateway object to make everything run as it should.
Everything seems to be running fine with the exception page loads are a little slow for my tastes. I will post the revised code for my gateway object and if anyone sees any obvious problems with it, any help would be appreciated. I decided to keep all the database interactions in Transfer as this was a learning experience.
Here is my revised whosongateway.cfc code:
<cfcomponent output="false" hint="WhosOn database gateway object">
<cffunction name="init" returntype="whosongateway" hint="I return an instance of whosoncfcgateway">
<cfargument name="transfer" type="any" required="true" hint="I am the transfer object" />
<cfset variables.transfer=arguments.transfer />
<cfreturn this />
</cffunction>
<cffunction name="getUserByID" returntype="query" access="public" hint="I return a user with a given ClientID">
<cfargument name="ClientID" type="string" required="true" />
<cfset var transfer=variables.transfer.getTransfer() />
<cfset var myQuery="" />
<cfset myQuery=transfer.listByProperty("whosoncfc.user","ClientID",arguments.ClientID) />
<cfreturn myQuery />
</cffunction>
<cffunction name="getUsers" returntype="query" hint="I return users stored in the database">
<cfset var transfer=variables.transfer.getTransfer() />
<cfreturn transfer.list("whosoncfc.user") />
</cffunction>
<cffunction name="isTracked" returntype="boolean" access="public" hint="I check to see if we are tracking a given client">
<cfargument name="ClientID" type="string" required="true" />
<cfset var transfer=variables.transfer.getTransfer() />
<cfset var myQuery="" />
<cfset myQuery=transfer.listByProperty("whosoncfc.user","ClientID",arguments.ClientID) />
<cfif myQuery.RecordCount>
<cfreturn true />
<cfelse>
<cfreturn false />
</cfif>
</cffunction>
<cffunction name="purgeUsers" returntype="boolean" access="public" hint="I get rid of expired data">
<cfargument name="trackTime" type="numeric" required="true" hint="How many hours to track usrs" />
<cfargument name="botTrackTime" type="numeric" required="true" hint="How many hours to track bots" />
<cfset var transfer=variables.transfer.getTransfer() />
<cfset var uQuery = "" />
<cfset var user = "" />
<cfset uQuery=transfer.list("whosoncfc.user") />
<cfloop query="uquery">
<cfif uQuery.HideClient is false>
<cfif dateDiff("n",uQuery.LastUpdated,Now()) gte (60*arguments.trackTime)>
<cfset user=transfer.get('whosoncfc.user',uQuery.ClientID) />
<cfset transfer.delete(user) />
</cfif>
<cfelse>
<cfif dateDiff("n",uQuery.LastUpdated,Now()) gte (60*arguments.botTrackTime)>
<cfset user=transfer.get('whosoncfc.user',uQuery.ClientID) />
<cfset transfer.delete(user) />
</cfif>
</cfif>
</cfloop>
<cfreturn true />
</cffunction>
<cffunction name="saveUser" returntype="boolean" access="public" hint="I write hits to the user database">
<cfargument name="userInfo" type="struct" required="true" />
<cfset var transfer=variables.transfer.getTransfer() />
<cfset var user = "" />
<cfset var myCount=1 />
<cfscript>
user=transfer.get('whosoncfc.user',userInfo.ClientID);
if(not user.getIsPersisted()){
// New User, insert all detals into database user.setClientID(userInfo.ClientID);
user.setUserID(userInfo.UserID);
user.setRoles(userInfo.Roles);
user.setCreated(Now());
user.setLastUpdated(Now());
user.setIP(userInfo.IP);
user.setHostName(userInfo.Hostname);
user.setCoords(userInfo.Coords);
user.setCountry(userInfo.Country);
user.setCity(userInfo.City);
user.setHideClient(userInfo.HideClient);
user.setEntryPage(userInfo.EntryPage);
user.setCurrentPage(userInfo.CurrentPage);
user.setHitCount(myCount);
user.setUserAgent(userInfo.UserAgent);
} else {
// Updating an existing client
myCount=user.getHitCount();
user.setUserID(userInfo.UserID);
user.setRoles(userInfo.Roles);
user.setLastUpdated(Now());
user.setIP(userInfo.IP);
user.setCurrentPage(userInfo.CurrentPage);
user.setHitCount(myCount+1);
}
transfer.save(user);
</cfscript>
<cfreturn true />
</cffunction>
</cfcomponent>
<cffunction name="init" returntype="whosongateway" hint="I return an instance of whosoncfcgateway">
<cfargument name="transfer" type="any" required="true" hint="I am the transfer object" />
<cfset variables.transfer=arguments.transfer />
<cfreturn this />
</cffunction>
<cffunction name="getUserByID" returntype="query" access="public" hint="I return a user with a given ClientID">
<cfargument name="ClientID" type="string" required="true" />
<cfset var transfer=variables.transfer.getTransfer() />
<cfset var myQuery="" />
<cfset myQuery=transfer.listByProperty("whosoncfc.user","ClientID",arguments.ClientID) />
<cfreturn myQuery />
</cffunction>
<cffunction name="getUsers" returntype="query" hint="I return users stored in the database">
<cfset var transfer=variables.transfer.getTransfer() />
<cfreturn transfer.list("whosoncfc.user") />
</cffunction>
<cffunction name="isTracked" returntype="boolean" access="public" hint="I check to see if we are tracking a given client">
<cfargument name="ClientID" type="string" required="true" />
<cfset var transfer=variables.transfer.getTransfer() />
<cfset var myQuery="" />
<cfset myQuery=transfer.listByProperty("whosoncfc.user","ClientID",arguments.ClientID) />
<cfif myQuery.RecordCount>
<cfreturn true />
<cfelse>
<cfreturn false />
</cfif>
</cffunction>
<cffunction name="purgeUsers" returntype="boolean" access="public" hint="I get rid of expired data">
<cfargument name="trackTime" type="numeric" required="true" hint="How many hours to track usrs" />
<cfargument name="botTrackTime" type="numeric" required="true" hint="How many hours to track bots" />
<cfset var transfer=variables.transfer.getTransfer() />
<cfset var uQuery = "" />
<cfset var user = "" />
<cfset uQuery=transfer.list("whosoncfc.user") />
<cfloop query="uquery">
<cfif uQuery.HideClient is false>
<cfif dateDiff("n",uQuery.LastUpdated,Now()) gte (60*arguments.trackTime)>
<cfset user=transfer.get('whosoncfc.user',uQuery.ClientID) />
<cfset transfer.delete(user) />
</cfif>
<cfelse>
<cfif dateDiff("n",uQuery.LastUpdated,Now()) gte (60*arguments.botTrackTime)>
<cfset user=transfer.get('whosoncfc.user',uQuery.ClientID) />
<cfset transfer.delete(user) />
</cfif>
</cfif>
</cfloop>
<cfreturn true />
</cffunction>
<cffunction name="saveUser" returntype="boolean" access="public" hint="I write hits to the user database">
<cfargument name="userInfo" type="struct" required="true" />
<cfset var transfer=variables.transfer.getTransfer() />
<cfset var user = "" />
<cfset var myCount=1 />
<cfscript>
user=transfer.get('whosoncfc.user',userInfo.ClientID);
if(not user.getIsPersisted()){
// New User, insert all detals into database user.setClientID(userInfo.ClientID);
user.setUserID(userInfo.UserID);
user.setRoles(userInfo.Roles);
user.setCreated(Now());
user.setLastUpdated(Now());
user.setIP(userInfo.IP);
user.setHostName(userInfo.Hostname);
user.setCoords(userInfo.Coords);
user.setCountry(userInfo.Country);
user.setCity(userInfo.City);
user.setHideClient(userInfo.HideClient);
user.setEntryPage(userInfo.EntryPage);
user.setCurrentPage(userInfo.CurrentPage);
user.setHitCount(myCount);
user.setUserAgent(userInfo.UserAgent);
} else {
// Updating an existing client
myCount=user.getHitCount();
user.setUserID(userInfo.UserID);
user.setRoles(userInfo.Roles);
user.setLastUpdated(Now());
user.setIP(userInfo.IP);
user.setCurrentPage(userInfo.CurrentPage);
user.setHitCount(myCount+1);
}
transfer.save(user);
</cfscript>
<cfreturn true />
</cffunction>
</cfcomponent>
Any comments or suggestions would be greatly appreciated!
There are no comments for this entry.
[Add Comment]