Added Value
Here's the code for addTo.asp:
1 <% 2 Dim query, refer 3 refer = Request.ServerVariables("HTTP_REFERER") 4 check_op()
Starting simply, we define a couple of variables and call the function check_op().
5 '#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$# 6 function check_op 7 'Checks query string to see which command to run 8 9 dim resp 10 11 if Request.QueryString("command") = "add" then 12 if Request.QueryString("readd") = "yes" then 13 resp = readdContent() 14 if resp = -1 then 15 resp = "<p>The content could not be added</p>" 16 resp = resp & "<p align=center> <input type='button' name='close' value='Close' onClick='window.close()'></p>" 17 end if 18 else 19 resp = addContent() 20 if resp = -1 then 21 resp = "<p>The content could not be added</p>" 22 resp = resp & "<p align=center> <input type='button' name='close' value='Close' onClick='window.close()'></p>" 23 elseif resp = -2 then 24 resp = "<p align=""center""> The content could not be added</p> <p align=""center"">Please Log In to MyInformIT before saving any content</p>" 25 resp = resp & "<p align=center> <input type='button' name='close' value='Close' onClick='window.close()'></p>" 26 end if 27 end if
Let's break at this point. The function check_op() also checks for a command = delete argument and does some error handling, but we'll get to that functionality later on. Our query string did indeed have the command = add argument, so the initial if statement on line 11 is true.
The first thing it does is check whether another argument, readd = yes, exists. This argument gets applied by the JavaScript I singled out above. I'm not quite ready to discuss that yet, so we'll assume that readd is not in the query string. The next thing that happens is a call to addContent(). addContent() returns a numerical response value. From the error messages that are assigned to resp (a useful little variable), you can guess at what occurred in addContent(). Below, we'll find out for sure.
1 '#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$#$# 2 function addContent 3 'Adds the current page (if it has an associated productID) 4 ' to the user's MyInformIT entries 5 'Gets information from query string 6 7 dim elobj,addobj 8 dim prodID 9 dim elID 10 dim sessID,userRS,userID 11 dim prodInfo,prodset(3) 12 dim elDesc 13 dim elname 14 dim ret,resp 15 16 if Request.QueryString("product_id") = "" then 17 'No product ID? Something is screwy, send them back 18 ' the way they came 19 addContent = -1
Right off the bat, addContent() checks for the product_id. No product_id, no dice. On the other hand, if the product_id exists...
20 else 21 'A product ID has been passed to the page 22 prodID = Request.QueryString("product_id") 23 set elobj = Server.CreateObject("informit.Content") 24 elobj.getProductInfo(prodID) 25 set prodInfo=elobj.items
...we use it to grab all sorts of useful information about the product from the database.
We create an object from the Java class, informit.Content, and call the method getProductInfo, passing in our product_id. The curious next step is of some interest. On line 25 we set the variable prodInfo to the public method elobj.items. Rather than defining the getProductInfo method as type Recordset, and passing back the data directly, getProductInfo is defined as type void. A public variable named ritems is defined as type Recordset in the Content class. ritems is equated to the results returned from the stored procedure call invoked in getProductInfo. Then, for the ASP to access the Recordset, the public method items is called to fetch the data. The relevant lines look like this in Java code snippets:
public Recordset ritems; public void getProductInfo(String productID) ritems=cdb.getProductInfo(productID); public IDataSource items() { return (IDataSource)ritems.getDataSource(); }
This seemingly roundabout way of accessing the recordset data is actually much more favorable in terms of memory usage. Instead of returning a Recordset to the ASP, getDataSource() returns a pointer to the data. On a site performing as many database calls as InformIT, with as many users, every bit of memory performance is precious.