I am looking for help getting a simple DB app up-and-running
using flowscript.  I have based my approach on the PetStore example, 
but there is a *lot* of complexity in there I am trying to avoid.  
I have created two "stripped down" flowscript files, along with 
the required forms.  
 
The sitemap calls, and so on, are as per the PetStore example.
 
I have also created an "indicators" database, with a simple table 
called "foo", with "fooid" "foodesc" and "webpage" as text fields.
 
What I have is:
 
dbtest.js
 
//=================================
cocoon.load("resource://org/apache/cocoon/components/flow/javascript/Database.js");
cocoon.load("resource://org/apache/cocoon/forms/flow/javascript/Form.js");
cocoon.load("context://projects/inddb/script/foo.js");  
 
//const
var MAX_RESULTS = 5;
var VIEW = "jexl";
var EXT = ".jexl";
 
//vars
var indDatabase = null;
var fooForm = null;
 
//startup
function main(funName) {
  var fun = this[funName];
  var args = new Array(arguments.length -1);
  for (var i = 1; i < arguments.length; i++) {
    args[i-1] = arguments[i];
  }
  getIndDB();
  fun.apply(args);
 
}
 
// Index page
function index() {
  EXT = ".jexl"; 
  getIndDB();
  cocoon.sendPage("view/index" + EXT, {
      fooForm: fooForm
  });
}
 
//IndDB
function getIndDB() {
  if (indDatabase == null) {
    this.indDatabase = new IndDB("hsql");
    this.fooForm = new FooForm();
  }
  return indDatabase;
}
 
//why here? gives errors if in foo.js ???
function FooForm() {
  this.fooid = "";
  this.foodesc = "";
  this.webpage = "";
}
 

function IndDB(poolId) {
  this.poolId = poolId;
  this.hsql = null;
  //this.populate(); adds data to virtual db
}
 
IndDB.prototype.getConnection = function(id) {
  if (true) {
    // temporary hack to avoid requiring datasource config in cocoon.xconf
    java.lang.Class.forName("com.mysql.jdbc.Driver");
    var jdbc = 
java.sql.DriverManager.getConnection("jdbc:mysql://localhost:3306/indicators", 
"me", "mypassword")
    var conn = new Database(jdbc);
    if (this.hsql == null) {
      // keep hsql in-memory database alive
      this.hsql = 
java.sql.DriverManager.getConnection("jdbc:mysql://localhost:3306/indicators", 
"me", "mypassword");
    }
    return conn;
  } else {
    // lookup datasource in cocoon.xconf
    return Database.getConnection(id);
  }
}
 
IndDB.prototype.testDuplicateFoo = function(fooid) {
  var conn = this.getConnection(this.poolId);
  var rs = conn.query("select count(*) as ROWCOUNT from foo where fooid = ?", 
[fooid]);
  var result = rs.rows[0].ROWCOUNT;
  conn.close();
  return new Number(result);
}
 
//=================================
 
and then in foo.js
 
//=================================
 
IndDB.prototype.getFoo = function(fooid) {
  var conn = this.getConnection(this.poolId);
  var result = conn.query("select * from foo where fooid = ?", [fooid]);  
  var record = result.rows[0];
  conn.close();
  return record;
}
 
IndDB.prototype.insertFoo = function(model) {
  var conn = this.getConnection(this.poolId);
  conn.update("INSERT INTO foo (fooid, foodesc, webpage) VALUES (?, ?, ?)", 
[model.fooid, model.foodesc, model.webpage]);
  conn.close();
}
 
IndDB.prototype.updateFoo = function(model) {
  var conn = this.getConnection(this.poolId);
  conn.update("UPDATE foo SET fooid = ? , foodesc = ? , webpage = ? ", 
[model.fooid, model.foodesc, model.webpage]);
  conn.close();
}
 
function Foo() {
  this.fooid = "";
  this.foodesc = "";
  this.webpage = "";
}
 
function editFoo() {
  editFooData();
  cocoon.sendPage("db/foos");
}
 
function newFoo() {
  newFooData();
  cocoon.sendPage("db/foos");
}
 
function editFooData() {
  var editFooDataForm = new Form("view/forms/editFooForm_d.xml");
  var model = editFooDataForm.getModel();
  model.message = "";
  model.fooid = fooForm.fooid;
 model.foodesc = fooForm.foodesc;
 model.webpage = fooForm.webpage;
  editFooDataForm.showForm("view/editFooForm.cforms");
 fooForm.foo = getindDB().getFoo(fooForm.fooid);
}
 
function newFooData() {
  var newFooDataForm = new Form("view/forms/editFooForm_d.xml");
  var model = newFooDataForm.getModel();
  model.message = "";
  newFooDataForm.showForm("view/editFooForm.cforms");
  while (getIndDB().testDuplicateFoo(model.fooid) > 0) {
    model.message = "ID is already in use. Please choose another Foo ID.";
    newFootDataForm.showForm("view/newFooForm.cforms");
  } 
  fooForm = new FooForm(model.fooid);
  fooForm.foo = new Foo();
  editFooData(); 
 
}
 
//=================================
 
When I call editFoo?fooid=xyz I get
 
An Error Occurred
The undefined value has no properties.
org.apache.avalon.framework.CascadingRuntimeException: 
The undefined value has no properties.
cause: ConversionError: The undefined value has no properties. 
(file:/D:/tomcat/webapps/cocoon/projects/inddb/script/dbtest.js; line 28)
 
(N.B. Line 28 is the "fun.apply(args);" call in the dbtest..js)
 
Any help with how to go about debugging this is appreciated,
along with some critical comment on perhaps streamlining the
above approach - I also need to add a "deleteFoo()" function
and some tips on how to write this would be appreciated.
 
Thanks
Derek


-- 
This message is subject to the CSIR's copyright, terms and conditions and
e-mail legal notice. Views expressed herein do not necessarily represent the
views of the CSIR.
 
CSIR E-mail Legal Notice
http://mail.csir.co.za/CSIR_eMail_Legal_Notice.html 
 
CSIR Copyright, Terms and Conditions
http://mail.csir.co.za/CSIR_Copyright.html 
 
For electronic copies of the CSIR Copyright, Terms and Conditions and the CSIR
Legal Notice send a blank message with REQUEST LEGAL in the subject line to
[EMAIL PROTECTED]


This message has been scanned for viruses and dangerous content by MailScanner, 
and is believed to be clean.  MailScanner thanks Transtec Computers for their 
support.


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]