Revision: 3752
http://datanucleus.svn.sourceforge.net/datanucleus/?rev=3752&view=rev
Author: andy_jefferson
Date: 2008-11-04 20:15:38 +0000 (Tue, 04 Nov 2008)
Log Message:
-----------
[NUCRDBMS-79] More contrib refactoring splitting out some of ElementContainerStore methods into separate abstract class (maybe change this to interface in the future)
Modified Paths:
--------------
platform/store.rdbms/trunk/src/java/org/datanucleus/store/mapped/MappedStoreManager.java
platform/store.rdbms/trunk/src/java/org/datanucleus/store/rdbms/RDBMSManager.java
platform/store.rdbms/trunk/src/java/org/datanucleus/store/rdbms/scostore/AbstractArrayStore.java
platform/store.rdbms/trunk/src/java/org/datanucleus/store/rdbms/scostore/AbstractCollectionStore.java
platform/store.rdbms/trunk/src/java/org/datanucleus/store/rdbms/scostore/AbstractListStore.java
platform/store.rdbms/trunk/src/java/org/datanucleus/store/rdbms/scostore/AbstractMapStore.java
platform/store.rdbms/trunk/src/java/org/datanucleus/store/rdbms/scostore/AbstractSetStore.java
platform/store.rdbms/trunk/src/java/org/datanucleus/store/rdbms/scostore/BaseContainerStore.java
platform/store.rdbms/trunk/src/java/org/datanucleus/store/rdbms/scostore/ElementContainerStore.java
platform/store.rdbms/trunk/src/java/org/datanucleus/store/rdbms/scostore/FKArrayStore.java
platform/store.rdbms/trunk/src/java/org/datanucleus/store/rdbms/scostore/FKListStore.java
platform/store.rdbms/trunk/src/java/org/datanucleus/store/rdbms/scostore/FKMapStore.java
platform/store.rdbms/trunk/src/java/org/datanucleus/store/rdbms/scostore/FKSetStore.java
platform/store.rdbms/trunk/src/java/org/datanucleus/store/rdbms/scostore/JoinListStore.java
platform/store.rdbms/trunk/src/java/org/datanucleus/store/rdbms/scostore/JoinMapStore.java
platform/store.rdbms/trunk/src/java/org/datanucleus/store/rdbms/scostore/JoinSetStore.java
platform/store.rdbms/trunk/src/java/org/datanucleus/store/rdbms/scostore/MapEntrySetStore.java
platform/store.rdbms/trunk/src/java/org/datanucleus/store/rdbms/scostore/MapValueSetStore.java
Added Paths:
-----------
platform/store.rdbms/trunk/src/java/org/datanucleus/store/mapped/scostore/AssociationStrategy.java
platform/store.rdbms/trunk/src/java/org/datanucleus/store/rdbms/scostore/RDBMSAssociationStrategy.java
Modified: platform/store.rdbms/trunk/src/java/org/datanucleus/store/mapped/MappedStoreManager.java
===================================================================
--- platform/store.rdbms/trunk/src/java/org/datanucleus/store/mapped/MappedStoreManager.java 2008-11-04 20:07:16 UTC (rev 3751)
+++ platform/store.rdbms/trunk/src/java/org/datanucleus/store/mapped/MappedStoreManager.java 2008-11-04 20:15:38 UTC (rev 3752)
@@ -23,6 +23,7 @@
import java.util.Map;
import org.datanucleus.ClassLoaderResolver;
+import org.datanucleus.FetchPlan;
import org.datanucleus.OMFContext;
import org.datanucleus.PersistenceConfiguration;
import org.datanucleus.StateManager;
@@ -36,9 +37,12 @@
import org.datanucleus.store.StoreManagerFactory;
import org.datanucleus.store.exceptions.NoTableManagedException;
import org.datanucleus.store.fieldmanager.FieldManager;
+import org.datanucleus.store.mapped.mapping.DatastoreMapping;
import org.datanucleus.store.mapped.mapping.JavaTypeMapping;
import org.datanucleus.store.mapped.mapping.MappingManager;
-import org.datanucleus.store.mapped.mapping.DatastoreMapping;
+import org.datanucleus.store.query.ResultObjectFactory;
+import org.datanucleus.store.mapped.scostore.AssociationStrategy;
+import org.datanucleus.util.Localiser;
import org.datanucleus.util.NucleusLogger;
/**
@@ -652,6 +656,17 @@
StatementExpressionIndex[] stmtExprIndex);
/**
+ * Method to return a FieldManager for populating information in statements.
+ * @param sm The state manager for the object.
+ * @param stmt The input Statement to set values on.
+ * @param statementExpressionIndex the index of parameters/mappings
+ * @param checkNonNullable Whether to check for nullability
+ * @return The FieldManager to use
+ */
+ public abstract FieldManager getFieldManagerForStatementGeneration(StateManager elementSM, Object stmt,
+ StatementExpressionIndex[] statementExpressionIndex, boolean checkNonNullable);
+
+ /**
* Method to return the value from the results at the specified position.
* @param resultSet The results
* @param mapping The mapping
@@ -672,4 +687,34 @@
* @return If batching of statements is permissible
*/
public abstract boolean allowsBatching();
+
+ /**
+ * Factory method for allocating an {@link org.datanucleus.store.mapped.scostore.AssociationStrategy}
+ * of the appropriate concrete type.
+ * @param localiser The localiser
+ * @param clr The ClassLoader resolver
+ * @return A {@link AssociationStrategy} of the appropriate concrete type.
+ */
+ public abstract AssociationStrategy newAssociationStrategy(Localiser localiser, ClassLoaderResolver clr);
+
+ /**
+ * Factory method for allocating a {@link ResultObjectFactory} of the appropriate concrete type.
+ * @param table Table being selected from
+ * @param fieldNumbers Numbers of the fields in the select. May be null if no fields are retrieved
+ * @param acmd MetaData for the class
+ * @param statementExpressionIndex Index of columns to statement columns
+ * @param datastoreIdentityExpressionIndex index for datastore identity
+ * @param versionIndex Indices of the version column(s)
+ * @param ignoreCache Whether to ignore the cache
+ * @param discriminator Whether we use a discriminator column to distinguish object
+ * types, or whether we use a NUCMETADATA column
+ * @param hasMetaDataInResults whether we use NUCMETADATA column
+ * @param fetchPlan the Fetch Plan
+ * @param persistentClass Class that this factory will create instances of (or subclasses)
+ */
+ public abstract ResultObjectFactory newResultObjectFactory(
+ DatastoreClass table, int[] fieldNumbers, AbstractClassMetaData acmd,
+ StatementExpressionIndex[] statementExpressionIndex, int[] datastoreIdentityExpressionIndex,
+ int[] versionIndex, boolean ignoreCache, boolean discriminator, boolean hasMetaDataInResults,
+ FetchPlan fetchPlan, Class persistentClass);
}
\ No newline at end of file
Added: platform/store.rdbms/trunk/src/java/org/datanucleus/store/mapped/scostore/AssociationStrategy.java
===================================================================
--- platform/store.rdbms/trunk/src/java/org/datanucleus/store/mapped/scostore/AssociationStrategy.java (rev 0)
+++ platform/store.rdbms/trunk/src/java/org/datanucleus/store/mapped/scostore/AssociationStrategy.java 2008-11-04 20:15:38 UTC (rev 3752)
@@ -0,0 +1,45 @@
+/**********************************************************************
+Copyright (c) 2007 Andy Jefferson and others. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+Contributors:
+ ...
+**********************************************************************/
+package org.datanucleus.store.mapped.scostore;
+
+import org.datanucleus.ClassLoaderResolver;
+import org.datanucleus.StateManager;
+import org.datanucleus.store.rdbms.scostore.ElementContainerStore;
+import org.datanucleus.util.Localiser;
+
+/**
+ * An association strategy. Knows how to perform operations on an {@link ElementContainerStore}.
+ */
+public abstract class AssociationStrategy
+{
+ /** Localiser. */
+ protected final Localiser localiser;
+
+ /** ClassLoader resolver. */
+ protected final ClassLoaderResolver clr;
+
+ protected AssociationStrategy(Localiser localiser, ClassLoaderResolver clr)
+ {
+ this.localiser = localiser;
+ this.clr = clr;
+ }
+
+ public abstract void executeClear(StateManager ownerSM, ElementContainerStore elementContainerStore);
+
+ public abstract int getSize(StateManager sm, ElementContainerStore elementContainerStore);
+}
Modified: platform/store.rdbms/trunk/src/java/org/datanucleus/store/rdbms/RDBMSManager.java
===================================================================
--- platform/store.rdbms/trunk/src/java/org/datanucleus/store/rdbms/RDBMSManager.java 2008-11-04 20:07:16 UTC (rev 3751)
+++ platform/store.rdbms/trunk/src/java/org/datanucleus/store/rdbms/RDBMSManager.java 2008-11-04 20:15:38 UTC (rev 3752)
@@ -37,32 +37,10 @@
**********************************************************************/
package org.datanucleus.store.rdbms;
-import java.io.IOException;
-import java.io.PrintStream;
-import java.io.Writer;
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Timestamp;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.ListIterator;
-import java.util.Map;
-import java.util.Properties;
-import java.util.Set;
-import java.util.TreeSet;
-
import org.datanucleus.ClassLoaderResolver;
import org.datanucleus.ConnectionFactory;
import org.datanucleus.ConnectionFactoryRegistry;
+import org.datanucleus.FetchPlan;
import org.datanucleus.ManagedConnection;
import org.datanucleus.OMFContext;
import org.datanucleus.ObjectManager;
@@ -109,14 +87,18 @@
import org.datanucleus.store.mapped.expression.StatementText;
import org.datanucleus.store.mapped.mapping.ArrayMapping;
import org.datanucleus.store.mapped.mapping.CollectionMapping;
+import org.datanucleus.store.mapped.mapping.DatastoreMapping;
import org.datanucleus.store.mapped.mapping.JavaTypeMapping;
import org.datanucleus.store.mapped.mapping.MapMapping;
-import org.datanucleus.store.mapped.mapping.DatastoreMapping;
+import org.datanucleus.store.query.ResultObjectFactory;
import org.datanucleus.store.rdbms.adapter.RDBMSAdapter;
import org.datanucleus.store.rdbms.adapter.RDBMSAdapterFactory;
import org.datanucleus.store.rdbms.extent.ClassTableExtent;
import org.datanucleus.store.rdbms.extent.ClassViewExtent;
+import org.datanucleus.store.rdbms.fieldmanager.ParameterSetter;
import org.datanucleus.store.rdbms.fieldmanager.ResultSetGetter;
+import org.datanucleus.store.rdbms.mapping.RDBMSMapping;
+import org.datanucleus.store.rdbms.query.PersistentIDROF;
import org.datanucleus.store.rdbms.schema.JDBCTypeInfo;
import org.datanucleus.store.rdbms.schema.RDBMSColumnInfo;
import org.datanucleus.store.rdbms.schema.RDBMSSchemaHandler;
@@ -124,6 +106,7 @@
import org.datanucleus.store.rdbms.schema.RDBMSTableInfo;
import org.datanucleus.store.rdbms.schema.RDBMSTypesInfo;
import org.datanucleus.store.rdbms.schema.SQLTypeInfo;
+import org.datanucleus.store.mapped.scostore.AssociationStrategy;
import org.datanucleus.store.rdbms.scostore.FKArrayStore;
import org.datanucleus.store.rdbms.scostore.FKListStore;
import org.datanucleus.store.rdbms.scostore.FKMapStore;
@@ -132,6 +115,7 @@
import org.datanucleus.store.rdbms.scostore.JoinListStore;
import org.datanucleus.store.rdbms.scostore.JoinMapStore;
import org.datanucleus.store.rdbms.scostore.JoinSetStore;
+import org.datanucleus.store.rdbms.scostore.RDBMSAssociationStrategy;
import org.datanucleus.store.rdbms.sql.expression.SQLExpressionFactory;
import org.datanucleus.store.rdbms.sqlidentifier.SQLIdentifier;
import org.datanucleus.store.rdbms.table.AbstractTable;
@@ -146,7 +130,6 @@
import org.datanucleus.store.rdbms.table.Table;
import org.datanucleus.store.rdbms.table.TableImpl;
import org.datanucleus.store.rdbms.table.ViewImpl;
-import org.datanucleus.store.rdbms.mapping.RDBMSMapping;
import org.datanucleus.store.scostore.ArrayStore;
import org.datanucleus.store.scostore.CollectionStore;
import org.datanucleus.store.scostore.MapStore;
@@ -156,11 +139,34 @@
import org.datanucleus.store.valuegenerator.ValueGenerator;
import org.datanucleus.transaction.TransactionUtils;
import org.datanucleus.util.ClassUtils;
-import org.datanucleus.util.NucleusLogger;
import org.datanucleus.util.Localiser;
import org.datanucleus.util.MacroString;
+import org.datanucleus.util.NucleusLogger;
import org.datanucleus.util.StringUtils;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.io.Writer;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+import java.util.TreeSet;
+
/**
* StoreManager for RDBMS datastores.
* Provided by the "store-manager" extension key "rdbms" and accepts datastore URLs valid for JDBC.
@@ -1352,6 +1358,20 @@
}
/**
+ * Method to return a FieldManager for populating information in statements.
+ * @param sm The state manager for the object.
+ * @param stmt The Prepared Statement to set values on.
+ * @param statementExpressionIndex the index of parameters/mappings
+ * @param checkNonNullable Whether to check for nullability
+ * @return The FieldManager to use
+ */
+ public FieldManager getFieldManagerForStatementGeneration(StateManager sm, Object stmt,
+ StatementExpressionIndex[] statementExpressionIndex, boolean checkNonNullable)
+ {
+ return new ParameterSetter(sm, (PreparedStatement) stmt, statementExpressionIndex, true);
+ }
+
+ /**
* Method to return the value from the results for the mapping at the specified position.
* @param resultSet The results
* @param mapping The mapping
@@ -3236,4 +3256,19 @@
}
return false;
}
+
+ public ResultObjectFactory newResultObjectFactory(DatastoreClass table, int[] fieldNumbers,
+ AbstractClassMetaData acmd, StatementExpressionIndex[] statementExpressionIndex,
+ int[] datastoreIdentityExpressionIndex, int[] versionIndex, boolean ignoreCache,
+ boolean discriminator, boolean hasMetaDataInResults, FetchPlan fetchPlan,
+ Class persistentClass)
+ {
+ return new PersistentIDROF(table, fieldNumbers, acmd, statementExpressionIndex, datastoreIdentityExpressionIndex,
+ versionIndex, ignoreCache, discriminator, hasMetaDataInResults, fetchPlan, persistentClass);
+ }
+
+ public AssociationStrategy newAssociationStrategy(Localiser localiser, ClassLoaderResolver clr)
+ {
+ return new RDBMSAssociationStrategy(localiser, clr, this);
+ }
}
\ No newline at end of file
Modified: platform/store.rdbms/trunk/src/java/org/datanucleus/store/rdbms/scostore/AbstractArrayStore.java
===================================================================
--- platform/store.rdbms/trunk/src/java/org/datanucleus/store/rdbms/scostore/AbstractArrayStore.java 2008-11-04 20:07:16 UTC (rev 3751)
+++ platform/store.rdbms/trunk/src/java/org/datanucleus/store/rdbms/scostore/AbstractArrayStore.java 2008-11-04 20:15:38 UTC (rev 3752)
@@ -107,22 +107,22 @@
}
}
- String clearStmt = getClearStmt();
+ String clearStmt = getRDBMSAssociationStrategy().getClearStmt(this);
try
{
ObjectManager om = ownerSM.getObjectManager();
ManagedConnection mconn = storeMgr.getConnection(om);
- SQLController sqlControl = getSQLController();
+ SQLController sqlControl = getRDBMSAssociationStrategy().getSQLController();
try
{
PreparedStatement ps = sqlControl.getStatementForUpdate(mconn, clearStmt, false);
try
{
int jdbcPosition = 1;
- jdbcPosition = populateOwnerInStatement(ownerSM, om, ps, jdbcPosition);
+ jdbcPosition = getRDBMSAssociationStrategy().populateOwnerInStatement(ownerSM, om, ps, jdbcPosition, this);
if (relationDiscriminatorMapping != null)
{
- jdbcPosition = populateRelationDiscriminatorInStatement(om, ps, jdbcPosition);
+ jdbcPosition = getRDBMSAssociationStrategy().populateRelationDiscriminatorInStatement(om, ps, jdbcPosition, this);
}
sqlControl.executeStatementUpdate(mconn, clearStmt, ps, true);
@@ -177,7 +177,7 @@
{
ObjectManager om = ownerSM.getObjectManager();
ManagedConnection mconn = storeMgr.getConnection(om);
- SQLController sqlControl = getSQLController();
+ SQLController sqlControl = getRDBMSAssociationStrategy().getSQLController();
sqlControl.processStatementsForConnection(mconn); // Process all waiting batched statements before we start our work
try
@@ -227,7 +227,7 @@
if (!exceptions.isEmpty())
{
// Throw all exceptions received as the cause of a JPOXDataStoreException so the user can see which record(s) didn't persist
- String msg = LOCALISER.msg("056009", getAddStmt());
+ String msg = LOCALISER.msg("056009", getRDBMSAssociationStrategy().getAddStmt(this));
NucleusLogger.DATASTORE.error(msg);
throw new NucleusDataStoreException(msg, (Throwable[])exceptions.toArray(new Throwable[exceptions.size()]), ownerSM.getObject());
}
@@ -269,7 +269,7 @@
}
catch (SQLException e)
{
- throw new NucleusDataStoreException(LOCALISER.msg("056009", getAddStmt()), e);
+ throw new NucleusDataStoreException(LOCALISER.msg("056009", getRDBMSAssociationStrategy().getAddStmt(this)), e);
}
return modified;
@@ -291,20 +291,20 @@
throws SQLException
{
ObjectManager om = sm.getObjectManager();
- SQLController sqlControl = getSQLController();
- String addStmt = getAddStmt();
+ SQLController sqlControl = getRDBMSAssociationStrategy().getSQLController();
+ String addStmt = getRDBMSAssociationStrategy().getAddStmt(this);
PreparedStatement ps = sqlControl.getStatementForUpdate(conn, addStmt, false);
boolean notYetFlushedError = false;
try
{
// Insert the join table row
int jdbcPosition = 1;
- jdbcPosition = populateOwnerInStatement(sm, om, ps, jdbcPosition);
+ jdbcPosition = getRDBMSAssociationStrategy().populateOwnerInStatement(sm, om, ps, jdbcPosition, this);
jdbcPosition = populateElementInStatement(om, ps, element, jdbcPosition);
jdbcPosition = populateOrderInStatement(om, ps, orderId, jdbcPosition);
if (relationDiscriminatorMapping != null)
{
- jdbcPosition = populateRelationDiscriminatorInStatement(om, ps, jdbcPosition);
+ jdbcPosition = getRDBMSAssociationStrategy().populateRelationDiscriminatorInStatement(om, ps, jdbcPosition, this);
}
// Execute the statement
@@ -355,7 +355,7 @@
ObjectManager om = ownerSM.getObjectManager();
Transaction tx = om.getTransaction();
boolean useUpdateLock = ((Boolean)tx.getOptions().get(Transaction.LOCK_FOR_UPDATE_OPTION)).booleanValue();
- String statement = getStatementTextForQuery(stmt, useUpdateLock);
+ String statement = getRDBMSAssociationStrategy().getStatementTextForQuery(stmt, useUpdateLock);
if (statement == null)
{
// this happens when collection is null
@@ -366,10 +366,10 @@
try
{
ManagedConnection mconn = storeMgr.getConnection(om);
- SQLController sqlControl = getSQLController();
+ SQLController sqlControl = getRDBMSAssociationStrategy().getSQLController();
try
{
- PreparedStatement ps = getStatementForQuery(stmt, om, mconn, useUpdateLock, null, null);
+ PreparedStatement ps = getRDBMSAssociationStrategy().getStatementForQuery(stmt, om, mconn, useUpdateLock, null, null);
try
{
ResultSet rs = sqlControl.executeStatementQuery(mconn, statement, ps);
@@ -555,5 +555,10 @@
stmt.selectScalarExpression(lit);
return stmt;
- }
+ }
+
+ protected RDBMSAssociationStrategy getRDBMSAssociationStrategy()
+ {
+ return (RDBMSAssociationStrategy) associationStrategy;
+ }
}
\ No newline at end of file
Modified: platform/store.rdbms/trunk/src/java/org/datanucleus/store/rdbms/scostore/AbstractCollectionStore.java
===================================================================
--- platform/store.rdbms/trunk/src/java/org/datanucleus/store/rdbms/scostore/AbstractCollectionStore.java 2008-11-04 20:07:16 UTC (rev 3751)
+++ platform/store.rdbms/trunk/src/java/org/datanucleus/store/rdbms/scostore/AbstractCollectionStore.java 2008-11-04 20:15:38 UTC (rev 3752)
@@ -153,7 +153,7 @@
{
ObjectManager om = sm.getObjectManager();
ManagedConnection mconn = storeMgr.getConnection(om);
- SQLController sqlControl = getSQLController();
+ SQLController sqlControl = getRDBMSAssociationStrategy().getSQLController();
try
{
@@ -163,8 +163,8 @@
int jdbcPosition = 1;
fieldMapping.setObject(om, ps, Mappings.getParametersIndex(jdbcPosition, fieldMapping), value);
jdbcPosition += fieldMapping.getNumberOfDatastoreFields();
- jdbcPosition = populateOwnerInStatement(sm, om, ps, jdbcPosition);
- jdbcPosition = populateEmbeddedElementFieldsInStatement(sm, element, ps, jdbcPosition, (JoinTable)containerTable);
+ jdbcPosition = getRDBMSAssociationStrategy().populateOwnerInStatement(sm, om, ps, jdbcPosition, this);
+ jdbcPosition = populateEmbeddedElementFieldsInStatement(sm, element, ps, jdbcPosition, ((JoinTable)containerTable).getOwnerFieldMetaData());
sqlControl.executeStatementUpdate(mconn, stmt, ps, true);
modified = true;
@@ -363,24 +363,24 @@
{
ObjectManager om = sm.getObjectManager();
ManagedConnection mconn = storeMgr.getConnection(om);
- SQLController sqlControl = getSQLController();
+ SQLController sqlControl = getRDBMSAssociationStrategy().getSQLController();
try
{
PreparedStatement ps = sqlControl.getStatementForQuery(mconn, stmt);
try
{
int jdbcPosition = 1;
- jdbcPosition = populateOwnerInStatement(sm, om, ps, jdbcPosition);
+ jdbcPosition = getRDBMSAssociationStrategy().populateOwnerInStatement(sm, om, ps, jdbcPosition, this);
jdbcPosition = populateElementInStatement(om, ps, element, jdbcPosition);
// TODO Remove the containerTable == part of this so that the discrim restriction applies to JoinTable case too
// Needs to pass TCK M-M relation test
if (elementInfo != null && elementInfo[0].getDiscriminatorMapping() != null && elementInfo[0].getDatastoreClass() == containerTable)
{
- jdbcPosition = populateElementDiscriminatorInStatement(om, ps, jdbcPosition, true, elementInfo[0]);
+ jdbcPosition = getRDBMSAssociationStrategy().populateElementDiscriminatorInStatement(om, ps, jdbcPosition, true, elementInfo[0]);
}
if (relationDiscriminatorMapping != null)
{
- jdbcPosition = populateRelationDiscriminatorInStatement(om, ps, jdbcPosition);
+ jdbcPosition = getRDBMSAssociationStrategy().populateRelationDiscriminatorInStatement(om, ps, jdbcPosition, this);
}
ResultSet rs = sqlControl.executeStatementQuery(mconn, stmt, ps);
@@ -426,17 +426,17 @@
throws SQLException
{
ObjectManager om = ownerSM.getObjectManager();
- SQLController sqlControl = getSQLController();
+ SQLController sqlControl = getRDBMSAssociationStrategy().getSQLController();
String removeStmt = getRemoveStmt();
PreparedStatement ps = sqlControl.getStatementForUpdate(conn, removeStmt, batched);
try
{
int jdbcPosition = 1;
- jdbcPosition = populateOwnerInStatement(ownerSM, om, ps, jdbcPosition);
+ jdbcPosition = getRDBMSAssociationStrategy().populateOwnerInStatement(ownerSM, om, ps, jdbcPosition, this);
jdbcPosition = populateElementInStatement(om, ps, element, jdbcPosition);
if (relationDiscriminatorMapping != null)
{
- jdbcPosition = populateRelationDiscriminatorInStatement(om, ps, jdbcPosition);
+ jdbcPosition = getRDBMSAssociationStrategy().populateRelationDiscriminatorInStatement(om, ps, jdbcPosition, this);
}
// Execute the statement
@@ -600,4 +600,10 @@
return stmt;
}
+
+ protected RDBMSAssociationStrategy getRDBMSAssociationStrategy()
+ {
+ return (RDBMSAssociationStrategy) associationStrategy;
+ }
+
}
\ No newline at end of file
Modified: platform/store.rdbms/trunk/src/java/org/datanucleus/store/rdbms/scostore/AbstractListStore.java
===================================================================
--- platform/store.rdbms/trunk/src/java/org/datanucleus/store/rdbms/scostore/AbstractListStore.java 2008-11-04 20:07:16 UTC (rev 3751)
+++ platform/store.rdbms/trunk/src/java/org/datanucleus/store/rdbms/scostore/AbstractListStore.java 2008-11-04 20:15:38 UTC (rev 3752)
@@ -127,17 +127,17 @@
ObjectManager om = ownerSM.getObjectManager();
Transaction tx = om.getTransaction();
boolean useUpdateLock = ((Boolean)tx.getOptions().get(Transaction.LOCK_FOR_UPDATE_OPTION)).booleanValue();
- String statement = getStatementTextForQuery(stmt, useUpdateLock);
+ String statement = getRDBMSAssociationStrategy().getStatementTextForQuery(stmt, useUpdateLock);
ListIterator iter;
try
{
ManagedConnection mconn = storeMgr.getConnection(om);
- SQLController sqlControl = getSQLController();
+ SQLController sqlControl = getRDBMSAssociationStrategy().getSQLController();
try
{
- PreparedStatement ps = getStatementForQuery(stmt, om, mconn, useUpdateLock, null, null);
+ PreparedStatement ps = getRDBMSAssociationStrategy().getStatementForQuery(stmt, om, mconn, useUpdateLock, null, null);
try
{
ResultSet rs = sqlControl.executeStatementQuery(mconn, statement, ps);
@@ -926,11 +926,11 @@
{
Object element = iter.next();
- jdbcPosition = populateOwnerInStatement(sm, om, ps, jdbcPosition);
+ jdbcPosition = getRDBMSAssociationStrategy().populateOwnerInStatement(sm, om, ps, jdbcPosition, this);
jdbcPosition = populateElementInStatement(om, ps, element, jdbcPosition);
if (relationDiscriminatorMapping != null)
{
- jdbcPosition = populateRelationDiscriminatorInStatement(om, ps, jdbcPosition);
+ jdbcPosition = getRDBMSAssociationStrategy().populateRelationDiscriminatorInStatement(om, ps, jdbcPosition, this);
}
}
}
@@ -959,18 +959,18 @@
try
{
ManagedConnection mconn = storeMgr.getConnection(om);
- SQLController sqlControl = getSQLController();
+ SQLController sqlControl = getRDBMSAssociationStrategy().getSQLController();
try
{
PreparedStatement ps = sqlControl.getStatementForUpdate(mconn, stmt, false);
try
{
int jdbcPosition = 1;
- jdbcPosition = populateOwnerInStatement(sm, om, ps, jdbcPosition);
+ jdbcPosition = getRDBMSAssociationStrategy().populateOwnerInStatement(sm, om, ps, jdbcPosition, this);
jdbcPosition = populateOrderInStatement(om, ps, index, jdbcPosition);
if (relationDiscriminatorMapping != null)
{
- jdbcPosition = populateRelationDiscriminatorInStatement(om, ps, jdbcPosition);
+ jdbcPosition = getRDBMSAssociationStrategy().populateRelationDiscriminatorInStatement(om, ps, jdbcPosition, this);
}
int[] rowsDeleted = sqlControl.executeStatementUpdate(mconn, stmt, ps, true);
@@ -1020,18 +1020,18 @@
throws SQLException
{
ObjectManager om = ownerSM.getObjectManager();
- SQLController sqlControl = getSQLController();
+ SQLController sqlControl = getRDBMSAssociationStrategy().getSQLController();
String shiftStmt = getShiftStmt();
PreparedStatement ps = sqlControl.getStatementForUpdate(conn, shiftStmt, false);
try
{
int jdbcPosition = 1;
jdbcPosition = populateOrderInStatement(om, ps, amount, jdbcPosition);
- jdbcPosition = populateOwnerInStatement(ownerSM, om, ps, jdbcPosition);
+ jdbcPosition = getRDBMSAssociationStrategy().populateOwnerInStatement(ownerSM, om, ps, jdbcPosition, this);
jdbcPosition = populateOrderInStatement(om, ps, oldIndex, jdbcPosition);
if (relationDiscriminatorMapping != null)
{
- jdbcPosition = populateRelationDiscriminatorInStatement(om, ps, jdbcPosition);
+ jdbcPosition = getRDBMSAssociationStrategy().populateRelationDiscriminatorInStatement(om, ps, jdbcPosition, this);
}
// Execute the statement
@@ -1058,18 +1058,18 @@
{
ObjectManager om = sm.getObjectManager();
ManagedConnection mconn = storeMgr.getConnection(om);
- SQLController sqlControl = getSQLController();
+ SQLController sqlControl = getRDBMSAssociationStrategy().getSQLController();
try
{
PreparedStatement ps = sqlControl.getStatementForUpdate(mconn, stmt, false);
try
{
int jdbcPosition = 1;
- jdbcPosition = populateOwnerInStatement(sm, om, ps, jdbcPosition);
+ jdbcPosition = getRDBMSAssociationStrategy().populateOwnerInStatement(sm, om, ps, jdbcPosition, this);
jdbcPosition = populateElementInStatement(om, ps, element, jdbcPosition);
if (relationDiscriminatorMapping != null)
{
- jdbcPosition = populateRelationDiscriminatorInStatement(om, ps, jdbcPosition);
+ jdbcPosition = getRDBMSAssociationStrategy().populateRelationDiscriminatorInStatement(om, ps, jdbcPosition, this);
}
ResultSet rs = sqlControl.executeStatementQuery(mconn, stmt, ps);
@@ -1133,7 +1133,7 @@
{
ObjectManager om = sm.getObjectManager();
ManagedConnection mconn = storeMgr.getConnection(om);
- SQLController sqlControl = getSQLController();
+ SQLController sqlControl = getRDBMSAssociationStrategy().getSQLController();
try
{
PreparedStatement ps = sqlControl.getStatementForUpdate(mconn, stmt, false);
@@ -1212,15 +1212,15 @@
ResultObjectFactory getROF = newResultObjectFactory(sm,stmt,false,true);
Transaction tx = om.getTransaction();
boolean useUpdateLock = ((Boolean)tx.getOptions().get(Transaction.LOCK_FOR_UPDATE_OPTION)).booleanValue();
- String statement = getStatementTextForQuery(stmt, useUpdateLock);
+ String statement = getRDBMSAssociationStrategy().getStatementTextForQuery(stmt, useUpdateLock);
try
{
ManagedConnection mconn = storeMgr.getConnection(om);
- SQLController sqlControl = getSQLController();
+ SQLController sqlControl = getRDBMSAssociationStrategy().getSQLController();
try
{
- PreparedStatement ps = getStatementForQuery(stmt, om, mconn, useUpdateLock, null, null);
+ PreparedStatement ps = getRDBMSAssociationStrategy().getStatementForQuery(stmt, om, mconn, useUpdateLock, null, null);
try
{
ResultSet rs = sqlControl.executeStatementQuery(mconn, statement, ps);
Modified: platform/store.rdbms/trunk/src/java/org/datanucleus/store/rdbms/scostore/AbstractMapStore.java
===================================================================
--- platform/store.rdbms/trunk/src/java/org/datanucleus/store/rdbms/scostore/AbstractMapStore.java 2008-11-04 20:07:16 UTC (rev 3751)
+++ platform/store.rdbms/trunk/src/java/org/datanucleus/store/rdbms/scostore/AbstractMapStore.java 2008-11-04 20:15:38 UTC (rev 3752)
@@ -50,7 +50,6 @@
import org.datanucleus.store.mapped.IdentifierFactory;
import org.datanucleus.store.mapped.MappedStoreManager;
import org.datanucleus.store.mapped.StatementExpressionIndex;
-import org.datanucleus.store.rdbms.scostore.BaseContainerStore;
import org.datanucleus.store.mapped.expression.LogicSetExpression;
import org.datanucleus.store.mapped.expression.MapStoreQueryable;
import org.datanucleus.store.mapped.expression.QueryExpression;
@@ -116,6 +115,7 @@
/** Identifier for elements in JDOQL queries. */
protected final DatastoreIdentifier elmIdentifier;
+ protected final RDBMSAssociationStrategy associationStrategy;
/**
* Constructor.
* @param storeMgr Manager for the store
@@ -125,6 +125,8 @@
super(storeMgr);
elmIdentifier = ((MappedStoreManager)storeMgr).getIdentifierFactory().newIdentifier(IdentifierFactory.TABLE, "ELEMENT");
+
+ associationStrategy = (RDBMSAssociationStrategy) this.storeMgr.newAssociationStrategy(LOCALISER, null);
}
/**
@@ -273,7 +275,7 @@
try
{
int jdbcPosition = 1;
- jdbcPosition = populateOwnerInStatement(sm, om, ps, jdbcPosition);
+ jdbcPosition = associationStrategy.populateOwnerInStatement(sm, om, ps, jdbcPosition, this);
jdbcPosition = populateValueInStatement(om, ps, value, jdbcPosition);
ResultSet rs = sqlControl.executeStatementQuery(mconn, containsValueStmt, ps);
@@ -791,7 +793,7 @@
int jdbcPosition = 1;
fieldMapping.setObject(om, ps, Mappings.getParametersIndex(jdbcPosition, fieldMapping), key);
jdbcPosition += fieldMapping.getNumberOfDatastoreFields();
- jdbcPosition = populateOwnerInStatement(sm, om, ps, jdbcPosition);
+ jdbcPosition = associationStrategy.populateOwnerInStatement(sm, om, ps, jdbcPosition, this);
jdbcPosition = populateEmbeddedKeyFieldsInStatement(sm, key, ps, jdbcPosition, (JoinTable)mapTable);
sqlControl.executeStatementUpdate(mconn, stmt, ps, true);
@@ -857,7 +859,7 @@
int jdbcPosition = 1;
fieldMapping.setObject(om, ps, Mappings.getParametersIndex(jdbcPosition, fieldMapping), newValue);
jdbcPosition += fieldMapping.getNumberOfDatastoreFields();
- jdbcPosition = populateOwnerInStatement(sm, om, ps, jdbcPosition);
+ jdbcPosition = associationStrategy.populateOwnerInStatement(sm, om, ps, jdbcPosition, this);
jdbcPosition = populateEmbeddedValueFieldsInStatement(sm, value, ps, jdbcPosition, (JoinTable)mapTable);
sqlControl.executeStatementUpdate(mconn, stmt, ps, true);
Modified: platform/store.rdbms/trunk/src/java/org/datanucleus/store/rdbms/scostore/AbstractSetStore.java
===================================================================
--- platform/store.rdbms/trunk/src/java/org/datanucleus/store/rdbms/scostore/AbstractSetStore.java 2008-11-04 20:07:16 UTC (rev 3751)
+++ platform/store.rdbms/trunk/src/java/org/datanucleus/store/rdbms/scostore/AbstractSetStore.java 2008-11-04 20:15:38 UTC (rev 3752)
@@ -95,7 +95,7 @@
ObjectManager om = ownerSM.getObjectManager();
Transaction tx = om.getTransaction();
boolean useUpdateLock = ((Boolean)tx.getOptions().get(Transaction.LOCK_FOR_UPDATE_OPTION)).booleanValue();
- String statement = getStatementTextForQuery(stmt, useUpdateLock);
+ String statement = getRDBMSAssociationStrategy().getStatementTextForQuery(stmt, useUpdateLock);
if (statement == null)
{
@@ -107,10 +107,10 @@
try
{
ManagedConnection mconn = storeMgr.getConnection(om);
- SQLController sqlControl = getSQLController();
+ SQLController sqlControl = getRDBMSAssociationStrategy().getSQLController();
try
{
- PreparedStatement ps = getStatementForQuery(stmt, om, mconn, useUpdateLock, null, null);
+ PreparedStatement ps = getRDBMSAssociationStrategy().getStatementForQuery(stmt, om, mconn, useUpdateLock, null, null);
try
{
ResultSet rs = sqlControl.executeStatementQuery(mconn, statement, ps);
@@ -276,7 +276,7 @@
catch (SQLException e)
{
NucleusLogger.DATASTORE.error(e);
- String msg = LOCALISER.msg("056009", getAddStmt());
+ String msg = LOCALISER.msg("056009", getRDBMSAssociationStrategy().getAddStmt(this));
NucleusLogger.DATASTORE.error(msg);
throw new NucleusDataStoreException(msg, e);
}
@@ -358,7 +358,7 @@
if (!exceptions.isEmpty())
{
// Throw all exceptions received as the cause of a JPOXDataStoreException so the user can see which record(s) didn't persist
- String msg = LOCALISER.msg("056009", getAddStmt());
+ String msg = LOCALISER.msg("056009", getRDBMSAssociationStrategy().getAddStmt(this));
NucleusLogger.DATASTORE.error(msg);
throw new NucleusDataStoreException(msg, (Throwable[])exceptions.toArray(new Throwable[exceptions.size()]), sm.getObject());
}
@@ -379,17 +379,17 @@
throws SQLException
{
ObjectManager om = ownerSM.getObjectManager();
- SQLController sqlControl = getSQLController();
- String addStmt = getAddStmt();
+ SQLController sqlControl = getRDBMSAssociationStrategy().getSQLController();
+ String addStmt = getRDBMSAssociationStrategy().getAddStmt(this);
PreparedStatement ps = sqlControl.getStatementForUpdate(conn, addStmt, batched);
try
{
int jdbcPosition = 1;
- jdbcPosition = populateOwnerInStatement(ownerSM, om, ps, jdbcPosition);
+ jdbcPosition = getRDBMSAssociationStrategy().populateOwnerInStatement(ownerSM, om, ps, jdbcPosition, this);
jdbcPosition = populateElementInStatement(om, ps, element, jdbcPosition);
if (relationDiscriminatorMapping != null)
{
- jdbcPosition = populateRelationDiscriminatorInStatement(om, ps, jdbcPosition);
+ jdbcPosition = getRDBMSAssociationStrategy().populateRelationDiscriminatorInStatement(om, ps, jdbcPosition, this);
}
// Execute the statement
@@ -424,18 +424,18 @@
try
{
ManagedConnection mconn = storeMgr.getConnection(om);
- SQLController sqlControl = getSQLController();
+ SQLController sqlControl = getRDBMSAssociationStrategy().getSQLController();
try
{
PreparedStatement ps = sqlControl.getStatementForUpdate(mconn, removeStmt, false);
try
{
int jdbcPosition = 1;
- jdbcPosition = populateOwnerInStatement(sm, om, ps, jdbcPosition);
+ jdbcPosition = getRDBMSAssociationStrategy().populateOwnerInStatement(sm, om, ps, jdbcPosition, this);
jdbcPosition = populateElementInStatement(om, ps, element, jdbcPosition);
if (relationDiscriminatorMapping != null)
{
- jdbcPosition = populateRelationDiscriminatorInStatement(om, ps, jdbcPosition);
+ jdbcPosition = getRDBMSAssociationStrategy().populateRelationDiscriminatorInStatement(om, ps, jdbcPosition, this);
}
int[] rowsDeleted = sqlControl.executeStatementUpdate(mconn, removeStmt, ps, true);
@@ -511,7 +511,7 @@
{
Object element = null;
iter = elements.iterator();
- SQLController sqlControl = getSQLController();
+ SQLController sqlControl = getRDBMSAssociationStrategy().getSQLController();
sqlControl.processStatementsForConnection(mconn); // Process all waiting batched statements before we start our work
while (iter.hasNext())
@@ -579,17 +579,17 @@
throws SQLException
{
ObjectManager om = ownerSM.getObjectManager();
- SQLController sqlControl = getSQLController();
+ SQLController sqlControl = getRDBMSAssociationStrategy().getSQLController();
String removeStmt = getRemoveStmt();
PreparedStatement ps = sqlControl.getStatementForUpdate(conn, removeStmt, batched);
try
{
int jdbcPosition = 1;
- jdbcPosition = populateOwnerInStatement(ownerSM, om, ps, jdbcPosition);
+ jdbcPosition = getRDBMSAssociationStrategy().populateOwnerInStatement(ownerSM, om, ps, jdbcPosition, this);
jdbcPosition = populateElementInStatement(om, ps, element, jdbcPosition);
if (relationDiscriminatorMapping != null)
{
- jdbcPosition = populateRelationDiscriminatorInStatement(om, ps, jdbcPosition);
+ jdbcPosition = getRDBMSAssociationStrategy().populateRelationDiscriminatorInStatement(om, ps, jdbcPosition, this);
}
// Execute the statement
Modified: platform/store.rdbms/trunk/src/java/org/datanucleus/store/rdbms/scostore/BaseContainerStore.java
===================================================================
--- platform/store.rdbms/trunk/src/java/org/datanucleus/store/rdbms/scostore/BaseContainerStore.java 2008-11-04 20:07:16 UTC (rev 3751)
+++ platform/store.rdbms/trunk/src/java/org/datanucleus/store/rdbms/scostore/BaseContainerStore.java 2008-11-04 20:15:38 UTC (rev 3752)
@@ -24,7 +24,6 @@
import org.datanucleus.store.mapped.mapping.JavaTypeMapping;
import org.datanucleus.store.mapped.mapping.InterfaceMapping;
import org.datanucleus.store.mapped.mapping.OIDMapping;
-import org.datanucleus.store.mapped.mapping.Mappings;
import org.datanucleus.util.Localiser;
import org.datanucleus.metadata.AbstractMemberMetaData;
import org.datanucleus.StateManager;
@@ -111,36 +110,6 @@
}
/**
- * Convenience method to populate the passed PreparedStatement with the value from the owner.
- * @param sm State Manager
- * @param om Object Manager
- * @param ps The PreparedStatement
- * @param jdbcPosition Position in JDBC statement to populate
- * @return The next position in the JDBC statement
- */
- protected int populateOwnerInStatement(StateManager sm, ObjectManager om, Object ps, int jdbcPosition)
- {
- if (!storeMgr.insertValuesOnInsert(ownerMapping.getDataStoreMapping(0)))
- {
- // Dont try to insert any mappings with insert parameter that isnt ? (e.g Oracle)
- return jdbcPosition;
- }
- if (ownerMemberMetaData != null)
- {
- ownerMapping.setObject(om, ps,
- Mappings.getParametersIndex(jdbcPosition, ownerMapping),
- sm.getObject(), sm, ownerMemberMetaData.getAbsoluteFieldNumber());
- }
- else
- {
- ownerMapping.setObject(om, ps,
- Mappings.getParametersIndex(jdbcPosition, ownerMapping),
- sm.getObject());
- }
- return jdbcPosition + ownerMapping.getNumberOfDatastoreFields();
- }
-
- /**
* Method to return the StateManager for an embedded PC object (element, key, value).
* It creates one if the element is not currently managed.
* @param sm State Manager of the owner
Modified: platform/store.rdbms/trunk/src/java/org/datanucleus/store/rdbms/scostore/ElementContainerStore.java
===================================================================
--- platform/store.rdbms/trunk/src/java/org/datanucleus/store/rdbms/scostore/ElementContainerStore.java 2008-11-04 20:07:16 UTC (rev 3751)
+++ platform/store.rdbms/trunk/src/java/org/datanucleus/store/rdbms/scostore/ElementContainerStore.java 2008-11-04 20:15:38 UTC (rev 3752)
@@ -18,9 +18,6 @@
**********************************************************************/
package org.datanucleus.store.rdbms.scostore;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
@@ -28,12 +25,10 @@
import org.datanucleus.ClassLoaderResolver;
import org.datanucleus.FetchPlan;
-import org.datanucleus.ManagedConnection;
+import org.datanucleus.FetchPlan.FetchPlanForClass;
import org.datanucleus.ObjectManager;
import org.datanucleus.ObjectManagerHelper;
import org.datanucleus.StateManager;
-import org.datanucleus.FetchPlan.FetchPlanForClass;
-import org.datanucleus.exceptions.NucleusDataStoreException;
import org.datanucleus.exceptions.NucleusUserException;
import org.datanucleus.metadata.AbstractClassMetaData;
import org.datanucleus.metadata.AbstractMemberMetaData;
@@ -44,27 +39,20 @@
import org.datanucleus.sco.SCOUtils;
import org.datanucleus.store.FieldValues;
import org.datanucleus.store.StoreManager;
+import org.datanucleus.store.fieldmanager.FieldManager;
import org.datanucleus.store.mapped.DatastoreClass;
import org.datanucleus.store.mapped.DatastoreContainerObject;
import org.datanucleus.store.mapped.DatastoreIdentifier;
import org.datanucleus.store.mapped.IdentifierFactory;
-import org.datanucleus.store.mapped.MappedStoreManager;
import org.datanucleus.store.mapped.StatementExpressionIndex;
-import org.datanucleus.store.rdbms.scostore.BaseContainerStore;
import org.datanucleus.store.mapped.expression.QueryExpression;
import org.datanucleus.store.mapped.mapping.AbstractContainerMapping;
import org.datanucleus.store.mapped.mapping.EmbeddedElementPCMapping;
import org.datanucleus.store.mapped.mapping.JavaTypeMapping;
import org.datanucleus.store.mapped.mapping.Mappings;
import org.datanucleus.store.mapped.mapping.ReferenceMapping;
+import org.datanucleus.store.mapped.scostore.AssociationStrategy;
import org.datanucleus.store.query.ResultObjectFactory;
-import org.datanucleus.store.rdbms.SQLController;
-import org.datanucleus.store.rdbms.SQLWarnings;
-import org.datanucleus.store.rdbms.RDBMSManager;
-import org.datanucleus.store.rdbms.fieldmanager.ParameterSetter;
-import org.datanucleus.store.rdbms.mapping.RDBMSMapping;
-import org.datanucleus.store.rdbms.query.PersistentIDROF;
-import org.datanucleus.store.rdbms.table.JoinTable;
import org.datanucleus.util.ClassUtils;
/**
@@ -198,7 +186,7 @@
protected ClassLoaderResolver clr;
/** Statement for getting the size of the container. */
- private String sizeStmt;
+ protected String sizeStmt;
/** Statement for clearing the container. */
protected String clearStmt;
@@ -212,6 +200,9 @@
/** Whether we are using a discriminator in the "size" statement. */
protected boolean usingDiscriminatorInSizeStmt = false;
+ /** Association strategy. */
+ protected final AssociationStrategy associationStrategy;
+
/**
* Constructor.
* @param storeMgr Manager for the store
@@ -222,7 +213,9 @@
super(storeMgr);
this.clr = clr;
- elmIdentifier = ((MappedStoreManager)storeMgr).getIdentifierFactory().newIdentifier(IdentifierFactory.TABLE, "ELEMENT");
+ elmIdentifier = this.storeMgr.getIdentifierFactory().newIdentifier(IdentifierFactory.TABLE, "ELEMENT");
+
+ associationStrategy = this.storeMgr.newAssociationStrategy(LOCALISER, clr);
}
/**
@@ -279,27 +272,6 @@
}
/**
- * Helper method to get the SQLController
- * @return The sql controller
- */
- protected SQLController getSQLController()
- {
- return ((RDBMSManager) getStoreManager()).getSQLController();
- }
-
- protected String getStatementTextForQuery(QueryExpression stmt, boolean useUpdateLock)
- {
- return ((RDBMSManager) storeMgr).getStatementTextForQuery(stmt, useUpdateLock);
- }
-
- protected PreparedStatement getStatementForQuery(QueryExpression qs, ObjectManager om, ManagedConnection conn,
- boolean updateLock, String resultSetType, String resultSetConcurrency)
- throws SQLException
- {
- return ((RDBMSManager) storeMgr).getStatementForQuery(qs, om, conn, updateLock, resultSetType, resultSetConcurrency);
- }
-
- /**
* Accessor for the element type stored in this container.
* @return The element type.
**/
@@ -412,9 +384,9 @@
* @param jdbcPosition Position in JDBC statement to populate
* @return The next position in the JDBC statement
*/
- protected int populateElementInStatement(ObjectManager om, PreparedStatement ps, Object element, int jdbcPosition)
+ protected int populateElementInStatement(ObjectManager om, Object ps, Object element, int jdbcPosition)
{
- if (!((RDBMSMapping)elementMapping.getDataStoreMapping(0)).insertValuesOnInsert())
+ if (!storeMgr.insertValuesOnInsert(elementMapping.getDataStoreMapping(0)))
{
// Dont try to insert any mappings with insert parameter that isnt ? (e.g Oracle)
return jdbcPosition;
@@ -431,100 +403,28 @@
* @param jdbcPosition Position in JDBC statement to populate
* @return The next position in the JDBC statement
*/
- protected int populateOrderInStatement(ObjectManager om, PreparedStatement ps, int idx, int jdbcPosition)
+ protected int populateOrderInStatement(ObjectManager om, Object ps, int idx, int jdbcPosition)
{
orderMapping.setObject(om, ps, Mappings.getParametersIndex(jdbcPosition, orderMapping), new Integer(idx));
return jdbcPosition + orderMapping.getNumberOfDatastoreFields();
}
- /**
- * Convenience method to populate the passed PreparedStatement with the value for the distinguisher value.
- * @param om Object Manager
- * @param ps The PreparedStatement
- * @param jdbcPosition Position in JDBC statement to populate
- * @return The next position in the JDBC statement
- */
- protected int populateRelationDiscriminatorInStatement(ObjectManager om, PreparedStatement ps, int jdbcPosition)
- {
- relationDiscriminatorMapping.setObject(om, ps, Mappings.getParametersIndex(jdbcPosition, relationDiscriminatorMapping), relationDiscriminatorValue);
- return jdbcPosition + relationDiscriminatorMapping.getNumberOfDatastoreFields();
- }
/**
- * Convenience method to populate the passed PreparedStatement with the value from the
- * element discriminator, optionally including all subclasses of the element type.
- * @param om Persistence Manager
- * @param ps The PreparedStatement
- * @param jdbcPosition Position in JDBC statement to populate
- * @param includeSubclasses Whether to include subclasses
- * @param info The element information
- * @return The next position in the JDBC statement
- */
- protected int populateElementDiscriminatorInStatement(ObjectManager om,
- PreparedStatement ps,
- int jdbcPosition,
- boolean includeSubclasses,
- ElementInfo info)
- {
- DiscriminatorStrategy strategy = info.getDiscriminatorStrategy();
- JavaTypeMapping discrimMapping = info.getDiscriminatorMapping();
-
- // Include element type
- if (strategy == DiscriminatorStrategy.CLASS_NAME)
- {
- discrimMapping.setObject(om, ps, Mappings.getParametersIndex(jdbcPosition, discrimMapping), info.getClassName());
- jdbcPosition += discrimMapping.getNumberOfDatastoreFields();
- }
- else if (strategy == DiscriminatorStrategy.VALUE_MAP)
- {
- discrimMapping.setObject(om, ps, Mappings.getParametersIndex(jdbcPosition, discrimMapping),
- info.getAbstractClassMetaData().getInheritanceMetaData().getDiscriminatorMetaData().getValue());
- jdbcPosition += discrimMapping.getNumberOfDatastoreFields();
- }
-
- // Include all subclasses
- if (includeSubclasses)
- {
- HashSet subclasses = storeMgr.getSubClassesForClass(info.getClassName(), true, clr);
- if (subclasses != null && subclasses.size() > 0)
- {
- Iterator iter = subclasses.iterator();
- while (iter.hasNext())
- {
- String subclass = (String)iter.next();
- if (strategy == DiscriminatorStrategy.CLASS_NAME)
- {
- discrimMapping.setObject(om, ps, Mappings.getParametersIndex(jdbcPosition, discrimMapping), subclass);
- jdbcPosition += discrimMapping.getNumberOfDatastoreFields();
- }
- else if (strategy == DiscriminatorStrategy.VALUE_MAP)
- {
- AbstractClassMetaData subclassCmd = storeMgr.getOMFContext().getMetaDataManager().getMetaDataForClass(subclass, clr);
- discrimMapping.setObject(om, ps, Mappings.getParametersIndex(jdbcPosition, discrimMapping),
- subclassCmd.getInheritanceMetaData().getDiscriminatorMetaData().getValue());
- jdbcPosition += discrimMapping.getNumberOfDatastoreFields();
- }
- }
- }
- }
- return jdbcPosition;
- }
-
- /**
* Convenience method to populate the passed PreparedStatement with the field values from
* the embedded element starting at the specified jdbc position.
* @param sm State Manager of the owning container
* @param element The embedded element
* @param ps The PreparedStatement
* @param jdbcPosition JDBC position in the statement to start at
- * @param joinTable The Join table where the elements are embedded
+ * @param ownerFieldMetaData The meta data for the owner field
* @return The next JDBC position
*/
protected int populateEmbeddedElementFieldsInStatement(StateManager sm,
Object element,
- PreparedStatement ps,
+ Object ps,
int jdbcPosition,
- JoinTable joinTable)
+ AbstractMemberMetaData ownerFieldMetaData)
{
EmbeddedElementPCMapping embeddedMapping = (EmbeddedElementPCMapping)elementMapping;
StatementExpressionIndex[] statementExpressionIndex =
@@ -548,58 +448,16 @@
}
}
- StateManager elementSM = getStateManagerForEmbeddedPCObject(sm, element, joinTable.getOwnerFieldMetaData());
+ StateManager elementSM = getStateManagerForEmbeddedPCObject(sm, element, ownerFieldMetaData);
elementSM.setPcObjectType(StateManager.EMBEDDED_COLLECTION_ELEMENT_PC);
- elementSM.provideFields(elementFieldNumbers, new ParameterSetter(elementSM, ps, statementExpressionIndex, true));
+ FieldManager fm = storeMgr.getFieldManagerForStatementGeneration(elementSM, ps,
+ statementExpressionIndex, true);
+ elementSM.provideFields(elementFieldNumbers, fm);
return jdbcPosition;
}
/**
- * Generate statement for clearing the container.
- * <PRE>
- * DELETE FROM CONTAINERTABLE
- * WHERE OWNERCOL = ?
- * [AND RELATION_DISCRIM=?]
- * </PRE>
- * TODO Add a discriminator restriction on this statement so we only clear ones with a valid discriminator value
- * @return Statement for clearing the container.
- */
- protected String getClearStmt()
- {
- if (clearStmt == null)
- {
- StringBuffer stmt = new StringBuffer();
- stmt.append("DELETE FROM ");
- stmt.append(containerTable.toString());
- stmt.append(" WHERE ");
- for (int i=0; i<ownerMapping.getNumberOfDatastoreFields(); i++)
- {
- if (i > 0)
- {
- stmt.append(" AND ");
- }
- stmt.append(ownerMapping.getDataStoreMapping(i).getDatastoreField().getIdentifier().toString());
- stmt.append(" = ");
- stmt.append(((RDBMSMapping)ownerMapping.getDataStoreMapping(i)).getUpdateInputParameter());
- }
- if (relationDiscriminatorMapping != null)
- {
- for (int i=0; i<relationDiscriminatorMapping.getNumberOfDatastoreFields(); i++)
- {
- stmt.append(" AND ");
- stmt.append(relationDiscriminatorMapping.getDataStoreMapping(i).getDatastoreField().getIdentifier().toString());
- stmt.append(" = ");
- stmt.append(((RDBMSMapping)relationDiscriminatorMapping.getDataStoreMapping(i)).getUpdateInputParameter());
- }
- }
- clearStmt = stmt.toString();
- }
-
- return clearStmt;
- }
-
- /**
* Accessor for an iterator through the container elements.
* @param ownerSM State Manager for the container.
* @return The Iterator
@@ -625,42 +483,8 @@
dependentElements.add(iter.next());
}
}
+ associationStrategy.executeClear(ownerSM, this);
- String clearStmt = getClearStmt();
- try
- {
- ObjectManager om = ownerSM.getObjectManager();
- ManagedConnection mconn = storeMgr.getConnection(om);
- SQLController sqlControl = getSQLController();
- try
- {
- PreparedStatement ps = sqlControl.getStatementForUpdate(mconn, clearStmt, false);
- try
- {
- int jdbcPosition = 1;
- jdbcPosition = populateOwnerInStatement(ownerSM, om, ps, jdbcPosition);
- if (relationDiscriminatorMapping != null)
- {
- jdbcPosition = populateRelationDiscriminatorInStatement(om, ps, jdbcPosition);
- }
-
- sqlControl.executeStatementUpdate(mconn, clearStmt, ps, true);
- }
- finally
- {
- sqlControl.closeStatement(mconn, ps);
- }
- }
- finally
- {
- mconn.release();
- }
- }
- catch (SQLException e)
- {
- throw new NucleusDataStoreException(LOCALISER.msg("056013", clearStmt), e);
- }
-
// Cascade-delete
if (dependentElements != null && dependentElements.size() > 0)
{
@@ -680,188 +504,7 @@
}
}
- /**
- * Generate statement for getting the size of the container.
- * The order part is only present when an order mapping is used.
- * The discriminator part is only present when the element has a discriminator.
- * <PRE>
- * SELECT COUNT(*) FROM TBL THIS
- * [INNER JOIN ELEM_TBL ELEM ON TBL.COL = ELEM.ID] - when no null
- * [LEFT OUTER JOIN ELEM_TBL ELEM ON TBL.COL = ELEM.ID] - when allows null
- * WHERE THIS.OWNERCOL=?
- * [AND THIS.ORDERCOL IS NOT NULL]
- * [AND (DISCRIMINATOR=? OR DISCRMINATOR=? OR DISCRIMINATOR=? [OR DISCRIMINATOR IS NULL])]
- * [AND RELATION_DISCRIM=?]
- * </PRE>
- * The discriminator part includes all subclasses of the element type.
- * If the element is in a different table to the container then an INNER JOIN will
- * be present to link the two tables, and table aliases will be present also.
- * TODO Update this to allow for getting the size when more than 1 element table.
- * @return The Statement returning the size of the container.
- */
- protected String getSizeStmt()
- {
- if (sizeStmt != null && !usingDiscriminatorInSizeStmt)
- {
- // Statement exists and didnt need any discriminator when setting up the statement so just reuse it
- return sizeStmt;
- }
- boolean allowNulls = false;
- if (ownerMemberMetaData != null &&
- ownerMemberMetaData.hasExtension("allow-nulls") &&
- ownerMemberMetaData.getValueForExtension("allow-nulls").equalsIgnoreCase("true"))
- {
- allowNulls = true;
- }
-
- StringBuffer stmt = new StringBuffer();
- String containerAlias = "THIS";
- String joinedElementAlias = "ELEM";
- stmt.append("SELECT COUNT(*) FROM ");
- stmt.append(containerTable.toString()).append(" ").append(containerAlias);
-
- // Add join to element table if required (only allows for 1 element table currently)
- boolean joinedDiscrim = false;
- if (elementInfo != null && elementInfo.length == 1 &&
- elementInfo[0].getDatastoreClass() != containerTable &&
- elementInfo[0].getDiscriminatorMapping() != null)
- {
- // TODO Allow for more than 1 possible element table
- // Need join to the element table to restrict the discriminator
- joinedDiscrim = true;
- JavaTypeMapping elemIdMapping = elementInfo[0].getDatastoreClass().getIDMapping();
- if (allowNulls)
- {
- // User wants to allow for nulls so have to use left outer join
- stmt.append(" LEFT OUTER JOIN ");
- }
- else
- {
- // No nulls so use inner join
- stmt.append(" INNER JOIN ");
- }
- stmt.append(elementInfo[0].getDatastoreClass().toString()).append(" ").append(joinedElementAlias).append(" ON ");
- for (int i=0;i<elementMapping.getNumberOfDatastoreFields();i++)
- {
- if (i > 0)
- {
- stmt.append(" AND ");
- }
- stmt.append(containerAlias).append(".").append(elementMapping.getDataStoreMapping(i).getDatastoreField().getIdentifier());
- stmt.append("=");
- stmt.append(joinedElementAlias).append(".").append(elemIdMapping.getDataStoreMapping(i).getDatastoreField().getIdentifier());
- }
- }
-
- stmt.append(" WHERE ");
- for (int i=0; i<ownerMapping.getNumberOfDatastoreFields(); i++)
- {
- if (i > 0)
- {
- stmt.append(" AND ");
- }
- stmt.append(containerAlias).append(".").append(ownerMapping.getDataStoreMapping(i).getDatastoreField().getIdentifier().toString());
- stmt.append("=");
- stmt.append(((RDBMSMapping)ownerMapping.getDataStoreMapping(i)).getUpdateInputParameter());
- }
-
- if (orderMapping != null)
- {
- // If an ordering is present, restrict to items where the index is not null to
- // eliminate records that are added but may not be positioned yet.
- for (int i=0; i<orderMapping.getNumberOfDatastoreFields(); i++)
- {
- stmt.append(" AND ");
- stmt.append(containerAlias).append(".").append(orderMapping.getDataStoreMapping(i).getDatastoreField().getIdentifier().toString());
- stmt.append(">=0");
- }
- }
-
- if (elementInfo != null && elementInfo.length == 1)
- {
- // TODO Support more than one element table
- // Add a discriminator filter for collections with an element discriminator
- StringBuffer discrStmt = new StringBuffer();
- for (int i=0; i<elementInfo.length; i++)
- {
- if (elementInfo[i].getDiscriminatorMapping() != null)
- {
- usingDiscriminatorInSizeStmt = true;
- if (discrStmt.length() > 0)
- {
- discrStmt.append(" OR ");
- }
- JavaTypeMapping discrimMapping = elementInfo[i].getDiscriminatorMapping();
- for (int j=0;j<discrimMapping.getNumberOfDatastoreFields();j++)
- {
- if (joinedDiscrim)
- {
- discrStmt.append(joinedElementAlias);
- }
- else
- {
- discrStmt.append(containerAlias);
- }
- discrStmt.append(".");
- discrStmt.append(discrimMapping.getDataStoreMapping(j).getDatastoreField().getIdentifier().toString());
- discrStmt.append("=");
- discrStmt.append(((RDBMSMapping)discrimMapping.getDataStoreMapping(j)).getUpdateInputParameter());
- }
-
- HashSet subclasses = storeMgr.getSubClassesForClass(elementInfo[i].getClassName(), true, clr);
- if (subclasses != null && subclasses.size() > 0)
- {
- for (int j=0;j<subclasses.size();j++)
- {
- for (int k=0;k<discrimMapping.getNumberOfDatastoreFields();k++)
- {
- discrStmt.append(" OR ");
- if (joinedDiscrim)
- {
- discrStmt.append(joinedElementAlias);
- }
- else
- {
- discrStmt.append(containerAlias);
- }
- discrStmt.append(".");
- discrStmt.append(discrimMapping.getDataStoreMapping(k).getDatastoreField().getIdentifier().toString());
- discrStmt.append("=");
- discrStmt.append(((RDBMSMapping)discrimMapping.getDataStoreMapping(k)).getUpdateInputParameter());
- }
- }
- }
- }
- }
- if (discrStmt.length() > 0)
- {
- stmt.append(" AND (");
- stmt.append(discrStmt);
- if (allowNulls)
- {
- stmt.append(" OR ");
- stmt.append(elementInfo[0].getDiscriminatorMapping().getDataStoreMapping(0).getDatastoreField().getIdentifier().toString());
- stmt.append(" IS NULL");
- }
- stmt.append(")");
- }
- }
- if (relationDiscriminatorMapping != null)
- {
- for (int i=0; i<relationDiscriminatorMapping.getNumberOfDatastoreFields(); i++)
- {
- stmt.append(" AND ");
- stmt.append(containerAlias).append(".").append(relationDiscriminatorMapping.getDataStoreMapping(i).getDatastoreField().getIdentifier().toString());
- stmt.append("=");
- stmt.append(((RDBMSMapping)relationDiscriminatorMapping.getDataStoreMapping(i)).getUpdateInputParameter());
- }
- }
-
- sizeStmt = stmt.toString();
- return sizeStmt;
- }
-
/**
* Method to return the size of the container.
* @param sm The state manager.
@@ -869,161 +512,9 @@
**/
public int size(StateManager sm)
{
- int numRows;
-
- String sizeStmt = getSizeStmt();
- try
- {
- ObjectManager om = sm.getObjectManager();
- ManagedConnection mconn = storeMgr.getConnection(om);
- SQLController sqlControl = getSQLController();
- try
- {
- PreparedStatement ps = sqlControl.getStatementForQuery(mconn, sizeStmt);
- try
- {
- int jdbcPosition = 1;
- jdbcPosition = populateOwnerInStatement(sm, om, ps, jdbcPosition);
- if (elementInfo != null && elementInfo.length == 1)
- {
- // TODO Allow for multiple element types (e.g interface implementations)
- for (int i=0; i<elementInfo.length; i++)
- {
- if (elementInfo[i].getDiscriminatorMapping() != null)
- {
- jdbcPosition = populateElementDiscriminatorInStatement(om, ps, jdbcPosition, true, elementInfo[i]);
- }
- }
- }
- if (relationDiscriminatorMapping != null)
- {
- jdbcPosition = populateRelationDiscriminatorInStatement(om, ps, jdbcPosition);
- }
-
- ResultSet rs = sqlControl.executeStatementQuery(mconn, sizeStmt, ps);
- try
- {
- if (!rs.next())
- {
- throw new NucleusDataStoreException(LOCALISER.msg("056007",sizeStmt));
- }
-
- numRows = rs.getInt(1);
- SQLWarnings.log(rs);
- }
- finally
- {
- rs.close();
- }
- }
- finally
- {
- sqlControl.closeStatement(mconn, ps);
- }
- }
- finally
- {
- mconn.release();
- }
- }
- catch (SQLException e)
- {
- throw new NucleusDataStoreException(LOCALISER.msg("056007",sizeStmt),e);
- }
-
- return numRows;
+ return associationStrategy.getSize(sm, this);
}
- /**
- * Generates the statement for adding items.
- * The EMBEDDEDFIELDX columns are only added for embedded PC elements.
- * <PRE>
- * INSERT INTO COLLTABLE (OWNERCOL,[ELEMENTCOL],[EMBEDDEDFIELD1, EMBEDDEDFIELD2,...],[ORDERCOL])
- * VALUES (?,?,?)
- * </PRE>
- * @return The Statement for adding an item
- */
- protected String getAddStmt()
- {
- if (addStmt == null)
- {
- StringBuffer stmt = new StringBuffer();
- stmt.append("INSERT INTO ");
- stmt.append(containerTable.toString());
- stmt.append(" (");
- for (int i=0; i<ownerMapping.getNumberOfDatastoreFields(); i++)
- {
- if (i > 0)
- {
- stmt.append(",");
- }
- stmt.append(ownerMapping.getDataStoreMapping(i).getDatastoreField().getIdentifier().toString());
- }
-
- for (int i=0; i<elementMapping.getNumberOfDatastoreFields(); i++)
- {
- stmt.append(",");
- stmt.append(elementMapping.getDataStoreMapping(i).getDatastoreField().getIdentifier().toString());
- }
-
- if (orderMapping != null)
- {
- for (int i=0; i<orderMapping.getNumberOfDatastoreFields(); i++)
- {
- stmt.append(",");
- stmt.append(orderMapping.getDataStoreMapping(i).getDatastoreField().getIdentifier().toString());
- }
- }
- if (relationDiscriminatorMapping != null)
- {
- for (int i=0; i<relationDiscriminatorMapping.getNumberOfDatastoreFields(); i++)
- {
- stmt.append(",");
- stmt.append(relationDiscriminatorMapping.getDataStoreMapping(i).getDatastoreField().getIdentifier().toString());
- }
- }
-
- stmt.append(") VALUES (");
- for (int i=0; i<ownerMapping.getNumberOfDatastoreFields(); i++)
- {
- if (i > 0)
- {
- stmt.append(",");
- }
- stmt.append(((RDBMSMapping)ownerMapping.getDataStoreMapping(i)).getInsertionInputParameter());
- }
-
- for (int i=0; i<elementMapping.getNumberOfDatastoreFields(); i++)
- {
- stmt.append(",");
- stmt.append(((RDBMSMapping)elementMapping.getDataStoreMapping(0)).getInsertionInputParameter());
- }
-
- if (orderMapping != null)
- {
- for (int i=0; i<orderMapping.getNumberOfDatastoreFields(); i++)
- {
- stmt.append(",");
- stmt.append(((RDBMSMapping)orderMapping.getDataStoreMapping(0)).getInsertionInputParameter());
- }
- }
- if (relationDiscriminatorMapping != null)
- {
- for (int i=0; i<relationDiscriminatorMapping.getNumberOfDatastoreFields(); i++)
- {
- stmt.append(",");
- stmt.append(((RDBMSMapping)relationDiscriminatorMapping.getDataStoreMapping(0)).getInsertionInputParameter());
- }
- }
-
- stmt.append(") ");
-
- addStmt = stmt.toString();
- }
-
- return addStmt;
- }
-
// ----------------------------- Query Methods --------------------------------
/**
@@ -1041,7 +532,7 @@
// TODO Allow for more than just the first elementTable (currently take the columns to select from the first element table only)
if (elementsAreEmbedded || elementsAreSerialised)
{
- return new PersistentIDROF(null , null, emd, null, null, null, ignoreCache, false,
+ return storeMgr.newResultObjectFactory(null , null, emd, null, null, null, ignoreCache, false,
stmt.hasMetaDataExpression(), null, clr.classForName(elementType));
}
else if (elementMapping instanceof ReferenceMapping)
@@ -1055,8 +546,7 @@
{
stmt.select(implMappings[i]);
}
-
- return new PersistentIDROF(elementInfo != null ? elementInfo[0].getDatastoreClass() : null, null, emd,
+ return storeMgr.newResultObjectFactory(elementInfo != null ? elementInfo[0].getDatastoreClass() : null, null, emd,
null, null, null, ignoreCache, false,
stmt.hasMetaDataExpression(), null, clr.classForName(elementType));
}
@@ -1191,7 +681,7 @@
Mappings.selectMapping(stmt, statementExpressionIndex);
}
- return new PersistentIDROF(elementInfo != null ? elementInfo[0].getDatastoreClass() : null,
+ return storeMgr.newResultObjectFactory(elementInfo != null ? elementInfo[0].getDatastoreClass() : null,
fieldNumbers, emd, statementExpressionIndex, datastoreIndex, versionIndex,
ignoreCache, iterateUsingDiscriminator,
stmt.hasMetaDataExpression(), null, clr.classForName(elementType));
Modified: platform/store.rdbms/trunk/src/java/org/datanucleus/store/rdbms/scostore/FKArrayStore.java
===================================================================
--- platform/store.rdbms/trunk/src/java/org/datanucleus/store/rdbms/scostore/FKArrayStore.java 2008-11-04 20:07:16 UTC (rev 3751)
+++ platform/store.rdbms/trunk/src/java/org/datanucleus/store/rdbms/scostore/FKArrayStore.java 2008-11-04 20:15:38 UTC (rev 3752)
@@ -360,7 +360,7 @@
try
{
ManagedConnection mconn = storeMgr.getConnection(om);
- SQLController sqlControl = getSQLController();
+ SQLController sqlControl = getRDBMSAssociationStrategy().getSQLController();
try
{
PreparedStatement ps = sqlControl.getStatementForUpdate(mconn, updateFkStmt, false);
@@ -386,12 +386,12 @@
}
else
{
- jdbcPosition = populateOwnerInStatement(sm, om, ps, jdbcPosition);
+ jdbcPosition = getRDBMSAssociationStrategy().populateOwnerInStatement(sm, om, ps, jdbcPosition, this);
}
jdbcPosition = populateOrderInStatement(om, ps, index, jdbcPosition);
if (relationDiscriminatorMapping != null)
{
- jdbcPosition = populateRelationDiscriminatorInStatement(om, ps, jdbcPosition);
+ jdbcPosition = getRDBMSAssociationStrategy().populateRelationDiscriminatorInStatement(om, ps, jdbcPosition, this);
}
jdbcPosition = populateElementInStatement(om, ps, element, jdbcPosition);
@@ -463,17 +463,17 @@
{
ObjectManager om = ownerSM.getObjectManager();
ManagedConnection mconn = storeMgr.getConnection(om);
- SQLController sqlControl = getSQLController();
+ SQLController sqlControl = getRDBMSAssociationStrategy().getSQLController();
try
{
PreparedStatement ps = sqlControl.getStatementForUpdate(mconn, clearNullifyStmt, false);
try
{
int jdbcPosition = 1;
- jdbcPosition = populateOwnerInStatement(ownerSM, om, ps, jdbcPosition);
+ jdbcPosition = getRDBMSAssociationStrategy().populateOwnerInStatement(ownerSM, om, ps, jdbcPosition, this);
if (relationDiscriminatorMapping != null)
{
- jdbcPosition = populateRelationDiscriminatorInStatement(om, ps, jdbcPosition);
+ jdbcPosition = getRDBMSAssociationStrategy().populateRelationDiscriminatorInStatement(om, ps, jdbcPosition, this);
}
sqlControl.executeStatementUpdate(mconn, clearNullifyStmt, ps, true);
}
Modified: platform/store.rdbms/trunk/src/java/org/datanucleus/store/rdbms/scostore/FKListStore.java
===================================================================
--- platform/store.rdbms/trunk/src/java/org/datanucleus/store/rdbms/scostore/FKListStore.java 2008-11-04 20:07:16 UTC (rev 3751)
+++ platform/store.rdbms/trunk/src/java/org/datanucleus/store/rdbms/scostore/FKListStore.java 2008-11-04 20:15:38 UTC (rev 3752)
@@ -44,8 +44,8 @@
import org.datanucleus.metadata.AbstractMemberMetaData;
import org.datanucleus.metadata.CollectionMetaData;
import org.datanucleus.metadata.DiscriminatorStrategy;
+import org.datanucleus.metadata.OrderMetaData.FieldOrder;
import org.datanucleus.metadata.Relation;
-import org.datanucleus.metadata.OrderMetaData.FieldOrder;
import org.datanucleus.store.FieldValues;
import org.datanucleus.store.mapped.DatastoreClass;
import org.datanucleus.store.mapped.DatastoreContainerObject;
@@ -394,7 +394,7 @@
{
ObjectManager om = sm.getObjectManager();
ManagedConnection mconn = storeMgr.getConnection(om);
- SQLController sqlControl = getSQLController();
+ SQLController sqlControl = getRDBMSAssociationStrategy().getSQLController();
try
{
// Unset the existing object from this position
@@ -402,14 +402,14 @@
try
{
int jdbcPosition = 1;
- jdbcPosition = populateOwnerInStatement(sm, om, ps, jdbcPosition);
+ jdbcPosition = getRDBMSAssociationStrategy().populateOwnerInStatement(sm, om, ps, jdbcPosition, this);
if (orderMapping != null)
{
jdbcPosition = populateOrderInStatement(om, ps, index, jdbcPosition);
}
if (relationDiscriminatorMapping != null)
{
- jdbcPosition = populateRelationDiscriminatorInStatement(om, ps, jdbcPosition);
+ jdbcPosition = getRDBMSAssociationStrategy().populateRelationDiscriminatorInStatement(om, ps, jdbcPosition, this);
}
sqlControl.executeStatementUpdate(mconn, unsetStmt, ps, true);
@@ -424,14 +424,14 @@
try
{
int jdbcPosition = 1;
- jdbcPosition = populateOwnerInStatement(sm, om, ps2, jdbcPosition);
+ jdbcPosition = getRDBMSAssociationStrategy().populateOwnerInStatement(sm, om, ps2, jdbcPosition, this);
if (orderMapping != null)
{
jdbcPosition = populateOrderInStatement(om, ps2, index, jdbcPosition);
}
if (relationDiscriminatorMapping != null)
{
- jdbcPosition = populateRelationDiscriminatorInStatement(om, ps2, jdbcPosition);
+ jdbcPosition = getRDBMSAssociationStrategy().populateRelationDiscriminatorInStatement(om, ps2, jdbcPosition, this);
}
jdbcPosition = populateElementInStatement(om, ps2, element, jdbcPosition);
@@ -485,7 +485,7 @@
try
{
ManagedConnection mconn = storeMgr.getConnection(om);
- SQLController sqlControl = getSQLController();
+ SQLController sqlControl = getRDBMSAssociationStrategy().getSQLController();
try
{
PreparedStatement ps = sqlControl.getStatementForUpdate(mconn, updateFkStmt, false);
@@ -511,7 +511,7 @@
}
else
{
- jdbcPosition = populateOwnerInStatement(sm, om, ps, jdbcPosition);
+ jdbcPosition = getRDBMSAssociationStrategy().populateOwnerInStatement(sm, om, ps, jdbcPosition, this);
}
if (orderMapping != null)
{
@@ -519,7 +519,7 @@
}
if (relationDiscriminatorMapping != null)
{
- jdbcPosition = populateRelationDiscriminatorInStatement(om, ps, jdbcPosition);
+ jdbcPosition = getRDBMSAssociationStrategy().populateRelationDiscriminatorInStatement(om, ps, jdbcPosition, this);
}
jdbcPosition = populateElementInStatement(om, ps, element, jdbcPosition);
@@ -1236,7 +1236,7 @@
protected String getSizeStmt()
{
// TODO Allow for multiple element tables
- return super.getSizeStmt();
+ return getRDBMSAssociationStrategy().getSizeStmt(this);
}
/**
@@ -1268,7 +1268,7 @@
protected String getClearStmt()
{
// TODO Allow for multiple element tables
- return super.getClearStmt();
+ return getRDBMSAssociationStrategy().getClearStmt(this);
}
/**
@@ -1340,17 +1340,17 @@
try
{
ManagedConnection mconn = storeMgr.getConnection(om);
- SQLController sqlControl = getSQLController();
+ SQLController sqlControl = getRDBMSAssociationStrategy().getSQLController();
try
{
PreparedStatement ps = sqlControl.getStatementForUpdate(mconn, clearNullifyStmt, false);
try
{
int jdbcPosition = 1;
- jdbcPosition = populateOwnerInStatement(ownerSM, om, ps, jdbcPosition);
+ jdbcPosition = getRDBMSAssociationStrategy().populateOwnerInStatement(ownerSM, om, ps, jdbcPosition, this);
if (relationDiscriminatorMapping != null)
{
- jdbcPosition = populateRelationDiscriminatorInStatement(om, ps, jdbcPosition);
+ jdbcPosition = getRDBMSAssociationStrategy().populateRelationDiscriminatorInStatement(om, ps, jdbcPosition, this);
}
sqlControl.executeStatementUpdate(mconn, clearNullifyStmt, ps, true);
}
Modified: platform/store.rdbms/trunk/src/java/org/datanucleus/store/rdbms/scostore/FKMapStore.java
===================================================================
--- platform/store.rdbms/trunk/src/java/org/datanucleus/store/rdbms/scostore/FKMapStore.java 2008-11-04 20:07:16 UTC (rev 3751)
+++ platform/store.rdbms/trunk/src/java/org/datanucleus/store/rdbms/scostore/FKMapStore.java 2008-11-04 20:15:38 UTC (rev 3752)
@@ -484,7 +484,7 @@
}
else
{
- jdbcPosition = populateOwnerInStatement(sm, om, ps, jdbcPosition);
+ jdbcPosition = associationStrategy.populateOwnerInStatement(sm, om, ps, jdbcPosition, this);
}
jdbcPosition = populateValueInStatement(om, ps, value, jdbcPosition);
@@ -552,7 +552,7 @@
}
else
{
- jdbcPosition = populateOwnerInStatement(sm, om, ps, jdbcPosition);
+ jdbcPosition = associationStrategy.populateOwnerInStatement(sm, om, ps, jdbcPosition, this);
}
jdbcPosition = populateKeyInStatement(om, ps, key, jdbcPosition);
Modified: platform/store.rdbms/trunk/src/java/org/datanucleus/store/rdbms/scostore/FKSetStore.java
===================================================================
--- platform/store.rdbms/trunk/src/java/org/datanucleus/store/rdbms/scostore/FKSetStore.java 2008-11-04 20:07:16 UTC (rev 3751)
+++ platform/store.rdbms/trunk/src/java/org/datanucleus/store/rdbms/scostore/FKSetStore.java 2008-11-04 20:15:38 UTC (rev 3752)
@@ -245,7 +245,7 @@
protected String getSizeStmt()
{
// TODO Allow for multiple element tables
- return super.getSizeStmt();
+ return getRDBMSAssociationStrategy().getSizeStmt(this);
}
/**
@@ -424,7 +424,7 @@
try
{
ManagedConnection mconn = storeMgr.getConnection(om);
- SQLController sqlControl = getSQLController();
+ SQLController sqlControl = getRDBMSAssociationStrategy().getSQLController();
try
{
int jdbcPosition = 1;
@@ -473,7 +473,7 @@
if (relationDiscriminatorMapping != null)
{
- jdbcPosition = populateRelationDiscriminatorInStatement(om, ps, jdbcPosition);
+ jdbcPosition = getRDBMSAssociationStrategy().populateRelationDiscriminatorInStatement(om, ps, jdbcPosition, this);
}
elementMapping.setObject(om, ps, Mappings.getParametersIndex(jdbcPosition, elementMapping), element);
jdbcPosition += elementMapping.getNumberOfDatastoreFields();
@@ -980,14 +980,14 @@
}
ManagedConnection mconn = storeMgr.getConnection(om);
- SQLController sqlControl = getSQLController();
+ SQLController sqlControl = getRDBMSAssociationStrategy().getSQLController();
try
{
PreparedStatement ps = sqlControl.getStatementForUpdate(mconn, stmt, false);
try
{
int jdbcPosition = 1;
- jdbcPosition = populateOwnerInStatement(ownerSM, om, ps, jdbcPosition);
+ jdbcPosition = getRDBMSAssociationStrategy().populateOwnerInStatement(ownerSM, om, ps, jdbcPosition, this);
sqlControl.executeStatementUpdate(mconn, stmt, ps, true);
}
finally
Modified: platform/store.rdbms/trunk/src/java/org/datanucleus/store/rdbms/scostore/JoinListStore.java
===================================================================
--- platform/store.rdbms/trunk/src/java/org/datanucleus/store/rdbms/scostore/JoinListStore.java 2008-11-04 20:07:16 UTC (rev 3751)
+++ platform/store.rdbms/trunk/src/java/org/datanucleus/store/rdbms/scostore/JoinListStore.java 2008-11-04 20:15:38 UTC (rev 3752)
@@ -49,8 +49,8 @@
import org.datanucleus.metadata.DiscriminatorStrategy;
import org.datanucleus.metadata.FieldRole;
import org.datanucleus.metadata.MetaDataUtils;
+import org.datanucleus.metadata.OrderMetaData.FieldOrder;
import org.datanucleus.metadata.Relation;
-import org.datanucleus.metadata.OrderMetaData.FieldOrder;
import org.datanucleus.store.mapped.DatastoreClass;
import org.datanucleus.store.mapped.DatastoreIdentifier;
import org.datanucleus.store.mapped.IdentifierFactory;
@@ -239,12 +239,12 @@
currentListSize = size;
}
- String addStmt = getAddStmt();
+ String addStmt = getRDBMSAssociationStrategy().getAddStmt(this);
try
{
ObjectManager om = sm.getObjectManager();
ManagedConnection mconn = storeMgr.getConnection(om);
- SQLController sqlControl = getSQLController();
+ SQLController sqlControl = getRDBMSAssociationStrategy().getSQLController();
try
{
// Shift any existing elements so that we can insert the new element(s) at their position
@@ -275,7 +275,7 @@
try
{
jdbcPosition = 1;
- jdbcPosition = populateOwnerInStatement(sm, om, ps, jdbcPosition);
+ jdbcPosition = getRDBMSAssociationStrategy().populateOwnerInStatement(sm, om, ps, jdbcPosition, this);
jdbcPosition = populateElementInStatement(om, ps, element, jdbcPosition);
if (orderMapping != null)
{
@@ -283,7 +283,7 @@
}
if (relationDiscriminatorMapping != null)
{
- jdbcPosition = populateRelationDiscriminatorInStatement(om, ps, jdbcPosition);
+ jdbcPosition = getRDBMSAssociationStrategy().populateRelationDiscriminatorInStatement(om, ps, jdbcPosition, this);
}
start++;
@@ -326,7 +326,7 @@
{
ObjectManager om = sm.getObjectManager();
ManagedConnection mconn = storeMgr.getConnection(om);
- SQLController sqlControl = getSQLController();
+ SQLController sqlControl = getRDBMSAssociationStrategy().getSQLController();
try
{
PreparedStatement ps = sqlControl.getStatementForUpdate(mconn, setStmt, false);
@@ -334,11 +334,11 @@
{
int jdbcPosition = 1;
jdbcPosition = populateElementInStatement(om, ps, element, jdbcPosition);
- jdbcPosition = populateOwnerInStatement(sm, om, ps, jdbcPosition);
+ jdbcPosition = getRDBMSAssociationStrategy().populateOwnerInStatement(sm, om, ps, jdbcPosition, this);
jdbcPosition = populateOrderInStatement(om, ps, index, jdbcPosition);
if (relationDiscriminatorMapping != null)
{
- jdbcPosition = populateRelationDiscriminatorInStatement(om, ps, jdbcPosition);
+ jdbcPosition = getRDBMSAssociationStrategy().populateRelationDiscriminatorInStatement(om, ps, jdbcPosition, this);
}
sqlControl.executeStatementUpdate(mconn, setStmt, ps, true);
@@ -570,7 +570,7 @@
// Remove the specified elements from the join table
String removeAllStmt = getRemoveAllStmt(elements);
- SQLController sqlControl = getSQLController();
+ SQLController sqlControl = getRDBMSAssociationStrategy().getSQLController();
try
{
ObjectManager om = sm.getObjectManager();
@@ -585,11 +585,11 @@
while (iter.hasNext())
{
Object element = iter.next();
- jdbcPosition = populateOwnerInStatement(sm, om, ps, jdbcPosition);
+ jdbcPosition = getRDBMSAssociationStrategy().populateOwnerInStatement(sm, om, ps, jdbcPosition, this);
jdbcPosition = populateElementInStatement(om, ps, element, jdbcPosition);
if (relationDiscriminatorMapping != null)
{
- jdbcPosition = populateRelationDiscriminatorInStatement(om, ps, jdbcPosition);
+ jdbcPosition = getRDBMSAssociationStrategy().populateRelationDiscriminatorInStatement(om, ps, jdbcPosition, this);
}
}
Modified: platform/store.rdbms/trunk/src/java/org/datanucleus/store/rdbms/scostore/JoinMapStore.java
===================================================================
--- platform/store.rdbms/trunk/src/java/org/datanucleus/store/rdbms/scostore/JoinMapStore.java 2008-11-04 20:07:16 UTC (rev 3751)
+++ platform/store.rdbms/trunk/src/java/org/datanucleus/store/rdbms/scostore/JoinMapStore.java 2008-11-04 20:15:38 UTC (rev 3752)
@@ -367,7 +367,7 @@
try
{
int jdbcPosition = 1;
- jdbcPosition = populateOwnerInStatement(sm, om, ps, jdbcPosition);
+ jdbcPosition = associationStrategy.populateOwnerInStatement(sm, om, ps, jdbcPosition, this);
ResultSet rs = sqlControl.executeStatementQuery(mconn, stmt, ps);
try
{
@@ -605,7 +605,7 @@
{
jdbcPosition = populateEmbeddedValueFieldsInStatement(ownerSM, value, ps, jdbcPosition, (JoinTable)mapTable);
}
- jdbcPosition = populateOwnerInStatement(ownerSM, om, ps, jdbcPosition);
+ jdbcPosition = associationStrategy.populateOwnerInStatement(ownerSM, om, ps, jdbcPosition, this);
if (adapterMapping != null)
{
// Only set the adapter mapping if we have a new object
@@ -651,7 +651,7 @@
{
jdbcPosition = populateEmbeddedValueFieldsInStatement(ownerSM, value, ps, jdbcPosition, (JoinTable)mapTable);
}
- jdbcPosition = populateOwnerInStatement(ownerSM, om, ps, jdbcPosition);
+ jdbcPosition = associationStrategy.populateOwnerInStatement(ownerSM, om, ps, jdbcPosition, this);
jdbcPosition = populateKeyInStatement(om, ps, key, jdbcPosition);
if (batched)
@@ -708,7 +708,7 @@
try
{
int jdbcPosition = 1;
- jdbcPosition = populateOwnerInStatement(sm, om, ps, jdbcPosition);
+ jdbcPosition = associationStrategy.populateOwnerInStatement(sm, om, ps, jdbcPosition, this);
jdbcPosition = populateKeyInStatement(om, ps, key, jdbcPosition);
sqlControl.executeStatementUpdate(mconn, removeStmt, ps, true);
}
@@ -787,7 +787,7 @@
try
{
int jdbcPosition = 1;
- jdbcPosition = populateOwnerInStatement(ownerSM, om, ps, jdbcPosition);
+ jdbcPosition = associationStrategy.populateOwnerInStatement(ownerSM, om, ps, jdbcPosition, this);
sqlControl.executeStatementUpdate(mconn, clearStmt, ps, true);
}
finally
Modified: platform/store.rdbms/trunk/src/java/org/datanucleus/store/rdbms/scostore/JoinSetStore.java
===================================================================
--- platform/store.rdbms/trunk/src/java/org/datanucleus/store/rdbms/scostore/JoinSetStore.java 2008-11-04 20:07:16 UTC (rev 3751)
+++ platform/store.rdbms/trunk/src/java/org/datanucleus/store/rdbms/scostore/JoinSetStore.java 2008-11-04 20:15:38 UTC (rev 3752)
@@ -493,7 +493,7 @@
{
ObjectManager om = sm.getObjectManager();
ManagedConnection mconn = storeMgr.getConnection(om);
- SQLController sqlControl = getSQLController();
+ SQLController sqlControl = getRDBMSAssociationStrategy().getSQLController();
try
{
PreparedStatement ps = sqlControl.getStatementForUpdate(mconn, removeAllStmt, false);
@@ -504,11 +504,11 @@
while (iter.hasNext())
{
Object element = iter.next();
- jdbcPosition = populateOwnerInStatement(sm, om, ps, jdbcPosition);
+ jdbcPosition = getRDBMSAssociationStrategy().populateOwnerInStatement(sm, om, ps, jdbcPosition, this);
jdbcPosition = populateElementInStatement(om, ps, element, jdbcPosition);
if (relationDiscriminatorMapping != null)
{
- jdbcPosition = populateRelationDiscriminatorInStatement(om, ps, jdbcPosition);
+ jdbcPosition = getRDBMSAssociationStrategy().populateRelationDiscriminatorInStatement(om, ps, jdbcPosition, this);
}
}
@@ -595,18 +595,18 @@
{
ObjectManager om = sm.getObjectManager();
ManagedConnection mconn = storeMgr.getConnection(om);
- SQLController sqlControl = getSQLController();
+ SQLController sqlControl = getRDBMSAssociationStrategy().getSQLController();
try
{
PreparedStatement ps = sqlControl.getStatementForQuery(mconn, stmt);
try
{
int jdbcPosition = 1;
- jdbcPosition = populateOwnerInStatement(sm, om, ps, jdbcPosition);
+ jdbcPosition = getRDBMSAssociationStrategy().populateOwnerInStatement(sm, om, ps, jdbcPosition, this);
jdbcPosition = populateElementInStatement(om, ps, element, jdbcPosition);
if (relationDiscriminatorMapping != null)
{
- jdbcPosition = populateRelationDiscriminatorInStatement(om, ps, jdbcPosition);
+ jdbcPosition = getRDBMSAssociationStrategy().populateRelationDiscriminatorInStatement(om, ps, jdbcPosition, this);
}
ResultSet rs = sqlControl.executeStatementQuery(mconn, stmt, ps);
@@ -718,7 +718,7 @@
catch (SQLException e)
{
NucleusLogger.DATASTORE.error(e);
- String msg = LOCALISER.msg("056009", getAddStmt());
+ String msg = LOCALISER.msg("056009", getRDBMSAssociationStrategy().getAddStmt(this));
NucleusLogger.DATASTORE.error(msg);
throw new NucleusDataStoreException(msg, e);
}
@@ -785,7 +785,7 @@
{
ObjectManager om = sm.getObjectManager();
ManagedConnection mconn = storeMgr.getConnection(om);
- SQLController sqlControl = getSQLController();
+ SQLController sqlControl = getRDBMSAssociationStrategy().getSQLController();
sqlControl.processStatementsForConnection(mconn); // Process all waiting batched statements before we start our work
try
@@ -844,7 +844,7 @@
if (!exceptions.isEmpty())
{
// Throw all exceptions received as the cause of a JPOXDataStoreException so the user can see which record(s) didn't persist
- String msg = LOCALISER.msg("056009", getAddStmt());
+ String msg = LOCALISER.msg("056009", getRDBMSAssociationStrategy().getAddStmt(this));
NucleusLogger.DATASTORE.error(msg);
throw new NucleusDataStoreException(msg, (Throwable[])exceptions.toArray(new Throwable[exceptions.size()]), sm.getObject());
}
@@ -878,16 +878,16 @@
if (toBeInserted)
{
- String addStmt = getAddStmt();
+ String addStmt = getRDBMSAssociationStrategy().getAddStmt(this);
boolean notYetFlushedError = false;
ObjectManager om = sm.getObjectManager();
- SQLController sqlControl = getSQLController();
+ SQLController sqlControl = getRDBMSAssociationStrategy().getSQLController();
PreparedStatement ps = sqlControl.getStatementForUpdate(conn, addStmt, batched);
try
{
// Insert the join table row
int jdbcPosition = 1;
- jdbcPosition = populateOwnerInStatement(sm, om, ps, jdbcPosition);
+ jdbcPosition = getRDBMSAssociationStrategy().populateOwnerInStatement(sm, om, ps, jdbcPosition, this);
jdbcPosition = populateElementInStatement(om, ps, element, jdbcPosition);
if (orderMapping != null)
{
@@ -895,7 +895,7 @@
}
@@ Diff output truncated at 100000 characters. @@
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|