Added code to check whether a value is a string type and should be put in

quotes when building a query. Previously, also
number values were quoted in SQL queries since neither Oracle nor
MySQL seemed to care, but Sybase doesn't like quoted number vaules.

Also, some bits and pieces for version 1.2 type.properties reading.
(see http://helma.org/rfc/mapping12new/ )
This commit is contained in:
hns 2002-03-06 13:07:50 +00:00
parent 802d66ee80
commit 5cf87fab38

View file

@ -7,6 +7,7 @@ import helma.objectmodel.*;
import helma.framework.core.Application; import helma.framework.core.Application;
import java.util.Properties; import java.util.Properties;
import java.util.Vector; import java.util.Vector;
import java.sql.SQLException;
/** /**
* This describes how a property of a persistent Object is stored in a * This describes how a property of a persistent Object is stored in a
@ -89,7 +90,17 @@ public class Relation {
} }
public void update (String desc, Properties props, int version) { public void update (String desc, Properties props, int version) {
if (version == 0)
update_v0 (desc, props);
else if (version == 1)
update_v1 (desc, props);
}
////////////////////////////////////////////////////////////////////////////////////////////
// parse methods for file format v0
////////////////////////////////////////////////////////////////////////////////////////////
private void update_v0 (String desc, Properties props) {
boolean mountpoint = false; boolean mountpoint = false;
Vector cnst = null; Vector cnst = null;
@ -124,22 +135,22 @@ public class Relation {
readonly = false; readonly = false;
} }
} }
// parse the basic properties of this mapping // parse the basic properties of this mapping
parseMapping (desc, mountpoint); parseMapping (desc, mountpoint);
// the following options only apply to object relations // the following options only apply to object relations
if (reftype != PRIMITIVE && reftype != INVALID) { if (reftype != PRIMITIVE && reftype != INVALID) {
cnst = new Vector (); cnst = new Vector ();
Constraint c = parseConstraint (desc); Constraint c = parseConstraint (desc);
if (c != null) if (c != null)
cnst.add (c); cnst.add (c);
parseOptions (cnst, props); parseOptions (cnst, props);
constraints = new Constraint[cnst.size()]; constraints = new Constraint[cnst.size()];
cnst.copyInto (constraints); cnst.copyInto (constraints);
@ -154,9 +165,9 @@ public class Relation {
* object reference of a collection of objects, put any constraints in the Vector. * object reference of a collection of objects, put any constraints in the Vector.
*/ */
protected void parseMapping (String desc, boolean mountpoint) { protected void parseMapping (String desc, boolean mountpoint) {
Application app = ownType.getApplication (); Application app = ownType.getApplication ();
if (desc.indexOf ("<") > -1) { if (desc.indexOf ("<") > -1) {
reftype = COLLECTION; reftype = COLLECTION;
int lt = desc.indexOf ("<"); int lt = desc.indexOf ("<");
@ -284,6 +295,72 @@ public class Relation {
} }
} }
////////////////////////////////////////////////////////////////////////////////////////////
// parse methods for file format v0
////////////////////////////////////////////////////////////////////////////////////////////
private void update_v1 (String desc, Properties props) {
boolean mountpoint = false;
Vector cnst = null;
if (desc == null || "".equals (desc.trim ())) {
if (propName != null) {
reftype = PRIMITIVE;
columnName = propName;
} else {
reftype = INVALID;
columnName = propName;
}
} else {
desc = desc.trim ();
String descLower = desc.toLowerCase ();
if (descLower.startsWith ("[virtual]")) {
desc = desc.substring (9).trim ();
virtual = true;
} else if (descLower.startsWith ("[collection]")) {
desc = desc.substring (12).trim ();
virtual = true;
} else if (descLower.startsWith ("[mountpoint]")) {
desc = desc.substring (12).trim ();
virtual = true;
mountpoint = true;
} else {
virtual = false;
}
if (descLower.startsWith ("[readonly]")) {
desc = desc.substring (10).trim ();
readonly = true;
} else {
readonly = false;
}
}
// parse the basic properties of this mapping
parseMapping (desc, mountpoint);
// the following options only apply to object relations
if (reftype != PRIMITIVE && reftype != INVALID) {
cnst = new Vector ();
Constraint c = parseConstraint (desc);
if (c != null)
cnst.add (c);
parseOptions (cnst, props);
constraints = new Constraint[cnst.size()];
cnst.copyInto (constraints);
// System.err.println ("PARSED RELATION "+this);
// if (accessor != null)
// System.err.println ("SET ACCESSOR: "+accessor);
}
}
///////////////////////////////////////////////////////////////////////////////////////////
/** /**
* Does this relation describe a virtual (collection) node? * Does this relation describe a virtual (collection) node?
*/ */
@ -435,16 +512,21 @@ public class Relation {
* Build the second half of an SQL select statement according to this relation * Build the second half of an SQL select statement according to this relation
* and a local object. * and a local object.
*/ */
public String buildQuery (INode home, INode nonvirtual, String kstr, String pre, boolean useOrder) { public String buildQuery (INode home, INode nonvirtual, String kstr, String pre, boolean useOrder) throws SQLException {
StringBuffer q = new StringBuffer (); StringBuffer q = new StringBuffer ();
String prefix = pre; String prefix = pre;
if (kstr != null) { if (kstr != null) {
q.append (prefix); q.append (prefix);
String accessColumn = accessor == null ? otherType.getIDField () : accessor; String accessColumn = accessor == null ? otherType.getIDField () : accessor;
q.append (accessColumn); q.append (accessColumn);
q.append (" = '"); q.append (" = ");
q.append (escape (kstr)); // check if column is string type and value needs to be quoted
q.append ("'"); if (otherType.isStringColumn (accessColumn)) {
q.append ("'");
q.append (escape (kstr));
q.append ("'");
} else
q.append (escape (kstr));
prefix = " AND "; prefix = " AND ";
} }
for (int i=0; i<constraints.length; i++) { for (int i=0; i<constraints.length; i++) {
@ -601,7 +683,7 @@ public class Relation {
isGroupby = groupby; isGroupby = groupby;
} }
public void addToQuery (StringBuffer q, INode home, INode nonvirtual) { public void addToQuery (StringBuffer q, INode home, INode nonvirtual) throws SQLException {
String local = null; String local = null;
INode ref = isGroupby ? home : nonvirtual; INode ref = isGroupby ? home : nonvirtual;
if (localName == null) if (localName == null)
@ -611,9 +693,13 @@ public class Relation {
local = ref.getString (homeprop, false); local = ref.getString (homeprop, false);
} }
q.append (foreignName); q.append (foreignName);
q.append (" = '"); q.append (" = ");
q.append (escape (local)); if (otherType.isStringColumn (foreignName)) {
q.append ("'"); q.append ("'");
q.append (escape (local));
q.append ("'");
} else
q.append (escape (local));
} }
public boolean foreignKeyIsPrimary () { public boolean foreignKeyIsPrimary () {