Add an intermediate step when fetching properties from result sets in createNode() so that

we can be sure to use the proper DbMapping for column-to-property mappings (which may change
according to the object's prototype column)
This should fix bug 310. http://helma.org/bugs/show_bug.cgi?id=310
This commit is contained in:
hns 2003-11-18 17:39:22 +00:00
parent c37d1670d5
commit 37436236df

View file

@ -1661,8 +1661,8 @@ public final class NodeManager {
* Create a new Node from a ResultSet. * Create a new Node from a ResultSet.
*/ */
public Node createNode(DbMapping dbm, ResultSet rs, DbColumn[] columns, int offset) public Node createNode(DbMapping dbm, ResultSet rs, DbColumn[] columns, int offset)
throws SQLException, IOException { throws SQLException, IOException, ClassNotFoundException {
Hashtable propMap = new Hashtable(); HashMap propBuffer = new HashMap();
String id = null; String id = null;
String name = null; String name = null;
String protoName = dbm.getTypeName(); String protoName = dbm.getTypeName();
@ -1702,15 +1702,15 @@ public final class NodeManager {
name = rs.getString(i+1+offset); name = rs.getString(i+1+offset);
} }
Relation rel = columns[i].getRelation(); // Relation rel = columns[i].getRelation();
if ((rel == null) || /* if ((rel == null) ||
((rel.reftype != Relation.PRIMITIVE) && ((rel.reftype != Relation.PRIMITIVE) &&
(rel.reftype != Relation.REFERENCE))) { (rel.reftype != Relation.REFERENCE))) {
continue; continue;
} } */
Property newprop = new Property(rel.propName, node); Property newprop = new Property(node);
switch (columns[i].getType()) { switch (columns[i].getType()) {
case Types.BIT: case Types.BIT:
@ -1822,13 +1822,13 @@ public final class NodeManager {
newprop.setStringValue(null); newprop.setStringValue(null);
} }
propMap.put(rel.propName.toLowerCase(), newprop); propBuffer.put(columns[i].getName(), newprop);
// if the property is a pointer to another node, change the property type to NODE // if the property is a pointer to another node, change the property type to NODE
if ((rel.reftype == Relation.REFERENCE) && rel.usesPrimaryKey()) { /* if ((rel.reftype == Relation.REFERENCE) && rel.usesPrimaryKey()) {
// FIXME: References to anything other than the primary key are not supported // FIXME: References to anything other than the primary key are not supported
newprop.convertToNodeReference(rel.otherType); newprop.convertToNodeReference(rel.otherType);
} } */
// mark property as clean, since it's fresh from the db // mark property as clean, since it's fresh from the db
newprop.dirty = false; newprop.dirty = false;
@ -1838,6 +1838,28 @@ public final class NodeManager {
return null; return null;
} }
Hashtable propMap = new Hashtable();
DbColumn[] columns2 = dbmap.getColumns();
for (int i=0; i<columns2.length; i++) {
Relation rel = columns2[i].getRelation();
if (rel != null) {
Property prop = (Property) propBuffer.get(columns2[i].getName());
if (prop == null) {
continue;
}
prop.setName(rel.propName);
// if the property is a pointer to another node, change the property type to NODE
if ((rel.reftype == Relation.REFERENCE) && rel.usesPrimaryKey()) {
// FIXME: References to anything other than the primary key are not supported
prop.convertToNodeReference(rel.otherType);
}
propMap.put(rel.propName.toLowerCase(), prop);
}
}
node.init(dbmap, id, name, protoName, propMap, safe); node.init(dbmap, id, name, protoName, propMap, safe);
return node; return node;