Quick Data Scripter

Posting this just in case I lose my file but I created a CFM page that scripts data for quick insert statements. I know there are good SQL Server Management tools that does this but I wanted something that didn't require trial versions or paid versions.

This assumes your primary key is called "id" but you can change it to be whatever and will output a txt file to a location of your desire.

view plain print about
1<cfset tables = "Table_Name" />
2<cfparam name="key" default="" />
3
4<cfsavecontent variable="script">
5    <cfloop list="#tables#" index="table_name">
6        <cfquery name="getColumns" datasource="dsn">
7            select '[' + c.name + ']' as column_name, c.name, t.name as column_type
8            from sys.columns c
9            left join sys.types t on t.system_type_id = c.system_type_id
10            left join sys.objects o on o.object_Id = c.object_Id
11            where o.name = '#table_name#'
12        </cfquery>
13
14        <cfquery name="getData" datasource="dsn">
15            select #valueList(getColumns.column_name)#
16            from #table_name#
17            <cfif listFindNoCase(valueList(getColumns.column_name), 'active')>
18                where active = 1
19            </cfif>
20            <cfif key neq "">
21                and id = '#key#'
22            </cfif>
23        </cfquery>
24<cfoutput>
25------------------
26<cfloop query="getData">
27    <cfset current_Row = currentRow />
28IF NOT EXISTS (SELECT * FROM #table_name# WHERE id = '#getData.id#')
29BEGIN
30    INSERT INTO #table_name# (#valueList(getColumns.column_name)#)
31    VALUES (<cfloop query="getColumns"><cfif currentRow gt 1>,</cfif><cfif getData[getColumns.name][current_row] neq ''>'#getData[getColumns.name][current_row]#'<cfelse>NULL</cfif></cfloop>)
32END
33</cfloop>
34</cfoutput>
35<cfif listFind(tables, table_name) eq listLen(tables)>------------------</cfif>
36</cfloop>
37</cfsavecontent>
38
39<cffile action="write" file="c:\workspace\script.txt" output="#script#" />

Need Your Help!

I know I haven't blogged in awhile and this isn't tech related BUT my wife (Cassondra Bellows) managed to be a finalist for the Zoo Photo Contest! Please go to this page http://a.pgtb.me/rk1Bck and vote for her! Her picture is in the Just Keep swimming section. It's the 7th picture and it's of the Leafy Sea Dragon. (It also says her name) Just click the little box to vote for her! This is important to her, so please vote!

Updating Adobe Coldfusion Builder Error

So I was updating from Adobe Coldfusion Builder 2.0 to 2.0.1 and the installation said that it completed with errors. (I didn't uninstall first because the internet told me I didn't have to) After this error and the installation completed I couldn't open up Coldfusion Builder. I would get this error:

"The CFbuilder executable launcher was unable to locate its companion shared library"

So I decided that I was going to uninstall it and reinstall it. After I go to Uninstall Programs and try to uninstall it I was receiving this error:

"You do not have sufficient access to uninstall Adobe Coldfusion Builder 2. Please contact your system administrator."

Which is weird because I should have admin permissions. After looking online it seems that others have seen this error but there was no solution. Just for fun I decided to rename my Adobe directory (c:\Adobe\) which is where eclipse and what not is installed. After I did that I re-ran the installation for CFB 2.0.1 and wala it worked. Kind of hacky but seemed to work for me.

Quick Review - Adobe Brackets

So I finally got around to playing around with Adobe's open source IDE, Brackets used to edit HTML/JS/CSS, built with HTML/JS/CSS! So far I really like it. It's really light weight, opens up really fast and remembers the last files you were working on. My favorite feature is it has JSLint built into it so as you are working on a JS file it parses your file and gives you errors as you save. This is great I spent some time the other day just working through the JSLint errors. Found a lot of unnecessary code from it. For example I had this (don't know why it was left in there but JSLint found it)

view plain print about
1if (variable) {
2    doSomething();
3} else {
4    //doSomethingElse();
5}

JSLint complains about unnecessary brackets because of code being commented out. This is slick because if I don't need the function call then I don't need the call. (don't need commented out code if you are using some sort of version control).

Another slick thing about Adobe Brackets is that since it's built using HTML/JS/CSS you can tweak any of the settings by jumping into the source code. I do warn you tweaking this can cause issues with rendering the IDE mainly because it's not fully stable yet. I should warn you that it's in what I call pre-alpha stage.

If you want to check it out you can d/l it at The GitHub

Returning Dynamic Content In A PhoneGap App

This is probably known to many but I was looking into this for fellow co-workers and I figured I would blog it so I don't forget it in the future. PhoneGap is great at making an HTML page into an mobile application. The thing with HTML is, it's static. You can't do direct database calls on load. Here is a quick solution I have found that seems to work. If other's have found a better solution, please post it.

index.html

view plain print about
1<!doctype html>
2<html>
3    <head>
4        <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width" />
5        <title>My App</title>
6        <script src="phonegap.js" type="text/javascript" charset="utf-8"></script>
7        <script src="jquery.js" type="text/javascript" charset="utf-8"></script>
8        
9        <script type="text/javascript">
10            jQuery(document).ready(function() {
11                $.ajax({
12                    url:"http://www.ryanvikander.com/test.cfc?method=getdata",
13                    success: function(data){
14                        var content = $("#content");
15                        
16                        content.html(data);
17                    },
18                    error: function(e){
19                        console.log(e);
20                    }
21                });
22            });
23        </script>
24
25    </head>
26    <body>
27         <div id="title_bar">Test</div>
28        This is a test
29        <div id="content"></div>
30    </body>
31</html>

So really all I am doing is making a call to a cfc on load that returns some content and then adds that content to a div. Pretty simple.

A Little JavaScript Formatting

So I am a stickler when it comes to code formatting. If I see this:

view plain print about
1<script type="text/javascript">
2    function demo(){
3        var hello = "world";
4        var someNumber = 132;
5        var anotherString = "some string value";
6 }
7</script>

I cringe and tell you to clean up your code. Instead of doing that you can do this:

view plain print about
1<script type="text/javascript">
2    function demo(){
3        var hello = "world",
4            someNumber = 132,
5            anotherString = "some string value";
6    }
7</script>

Also, in development putting them on new lines is great for readability. Coldfusion Builder by default wants to format them to one line.

Want To Speak At cf.Objective()?

Want To Speak At cf.Objective? Well now you can! Sign up today for lightning talks and Bird of a Feather session and you too can speak!

Call for Lightning Talk Speakers and BoF Survey for 2012 Now Open

Using Twitter Authentication in an Application

I will begin with a little back story. So I manage an internal User Group inside the company I work for (ImageTrend, INC). I proposed a challenge to the attendees to come up with a cool implementation of an app using the Twitter API.

Myself being the proposer I feel I am not eligible for the prize but wanted to take on the challenge just for fun. I found a good blog post by Mr. Ray Camden Adding support for automated tweets with OAuth that was very helpful getting started. I won't go into detail on setting up the Twitter Application on Twitter it's in his blog post. But it's kind of an older post and Twitter4j was released newer versions that do not work with his implementation in the blog. Scanning through the comments on the post, Sean Ryan had posted a blog entry with the updated details using the latest version of Twitter4j. Here is the post

Now to some code examples. Setting up the application cfc I added this code snippet to my onApplicationStart method:

view plain print about
1var paths = [this.siteroot & "twitter4j/twitter4j-core-2.2.6-SNAPSHOT.jar"];
2        application.javaloader = createObject("component", "javaloader.JavaLoader").init(paths);
3        
4        application.RequestAccessToken = "Consumer Key From Twitter";
5        application.RequestAccessSecret = "Consumer Secret From Twitter";
6        
7        application.Twitter = application.javaloader.create("twitter4j.TwitterFactory").init().getInstance();
8        application.Twitter.setOAuthConsumer(application.RequestAccessToken,application.RequestAccessSecret);

My callback URL on Twitter is setup to call http://www.ryanvikander.com/twitter/twitterlogin.cfm?mode=1 I created a CFM page to handle the twitter login. This file looks like this:

view plain print about
1<cfset userInfo = application.userController.getTwitterCredentials(session.userid) />
2
3<cfif userInfo.recordCount EQ 0 AND NOT structKeyExists(url,'mode')>
4    <cfif NOT structKeyExists(session, "RequestToken")>
5        <cfset Session.RequestToken = application.Twitter.getOAuthRequestToken(application.twitterlogin)>
6    </cfif>
7    
8 <cfset Session.oAuthRequestToken = Session.RequestToken.getToken()>
9 <cfset Session.oAuthRequestTokenSecret = Session.RequestToken.getTokenSecret()>
10     
11 <cflocation url="#Session.RequestToken.getAuthorizationURL()#" addtoken="No">
12<cfelseif userInfo.recordCount GT 0>
13 <cfset session.StoredAccessToken = userinfo.token>
14 <cfset session.StoredAccessSecret = userinfo.secret>
15     
16 <cflocation url="index.cfm" addtoken="false" />
17<cfelse>
18 <cfset AccessToken = application.Twitter.getOAuthAccessToken(Session.RequestToken,url.oauth_verifier)>
19 <cfset session.StoredAccessToken = AccessToken.getToken()>
20 <cfset session.StoredAccessSecret = AccessToken.getTokenSecret()>
21
22    <cfset application.userController.saveTwitterCredentials(session.userID,AccessToken.getTokenSecret(), AccessToken.getToken()) />
23
24 <cflocation url="index.cfm" addtoken="false"/>
25</cfif>

Very similar to Ray's code for the one time authentication but I wanted to database the tokens that Twitter returned so in the else if I check to see if the user exists and I have stored their token if they do not exist I database the token and secret so they don't have to authorize the app every time.

Once this is complete you can do pretty much whatever is available from the Twitter4J class library.

I apoligize if this is a scattered post wanted to do a quick write up. If you have any questions/concerns I am more than willing to try and answer.

cf.Objective 2011!

I was blessed to be able to attend cf.Objective() again this year. I will be posting my notes as I did last year. I hope to meet any of the people that read this blog. I will be the guy with the big beard.

Using Local SQL Server Express 2008 Server with Coldfusion

So I know there are a few articles out there on this subject but I seem to have to reinstall sql server on my laptops often and I always have to hunt down how to do it so I thought I would post a blog so it would be a bit more recent.

I won't go over installing SQL Server Express, it takes a while seems like a good 30 minutes. Anyways, once you install it you can connect to your local database by connecting to the server (depending on what you named your server) [PC_Name]\SQLEXPRESS and depending on if you are using windows authentication you would enter your user name and password.

Ok so once you've gotten that installed there are some more tricky stuff you need to do within SQL Server. First you will need to turn on TCP/IP which is located under Start > Microsoft SQL Server 2008 > Configuration Tools > SQL Server Configuration Manager. Once you open up the manager go under: SQL Server Network Configuration and click on Protocols for SQLExpress (I assume this the name of the server). By default TCP/IP is disabled. So enable it by right clicking and enabling it. You will be prompted to restart your server service but I would wait until finished to do so. Now double-click TCP/IP or right click and go to Properties. Go into the IP Addresses tab and for each IPs enter in under TCP Port 1433. This allows for Coldfusion to connect to your database. Now you can apply and restart your server service.

A tip if you skip that last step you will get this annoying error message and this is why I needed to post this:

Connection verification failed for data source: rvikander java.sql.SQLNonTransientConnectionException: [Macromedia][SQLServer JDBC Driver]Error establishing socket to host and port: localhost:1433. Reason: Connection refused: connect The root cause was that: java.sql.SQLNonTransientConnectionException: [Macromedia][SQLServer JDBC Driver]Error establishing socket to host and port: localhost:1433. Reason: Connection refused: connect

If anyone has any thoughts or questions I would love the comments. Otherwise I hope this helps someone.

More Entries

BlogCFC was created by Raymond Camden. This blog is running version 5.9.6.004. Contact Blog Owner