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]