You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by ad...@apache.org on 2007/10/11 09:21:44 UTC

svn commit: r583710 - in /incubator/tuscany/cpp/das: VSExpress/tuscany_das/ VSExpress/tuscany_das/das_runtime/ runtime/core/include/apache/das/ runtime/core/include/apache/das/rdb/ runtime/core/src/apache/das/ runtime/core/src/apache/das/rdb/ runtime/t...

Author: adrianocrestani
Date: Thu Oct 11 00:21:41 2007
New Revision: 583710

URL: http://svn.apache.org/viewvc?rev=583710&view=rev
Log:
-added CUD operations to DAS

Added:
    incubator/tuscany/cpp/das/runtime/core/include/apache/das/rdb/RelationshipStatement.h
    incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/RelationshipStatement.cpp
Modified:
    incubator/tuscany/cpp/das/VSExpress/tuscany_das/das_runtime/das_runtime.vcproj
    incubator/tuscany/cpp/das/VSExpress/tuscany_das/tuscany_das.sln
    incubator/tuscany/cpp/das/VSExpress/tuscany_das/tuscany_das.suo
    incubator/tuscany/cpp/das/runtime/core/include/apache/das/StringWrapper.h
    incubator/tuscany/cpp/das/runtime/core/include/apache/das/rdb/ApplyChanges.h
    incubator/tuscany/cpp/das/runtime/core/include/apache/das/rdb/CreatedDataObject.h
    incubator/tuscany/cpp/das/runtime/core/include/apache/das/rdb/DASDataObject.h
    incubator/tuscany/cpp/das/runtime/core/include/apache/das/rdb/DeletedDataObject.h
    incubator/tuscany/cpp/das/runtime/core/include/apache/das/rdb/ModifiedDataObject.h
    incubator/tuscany/cpp/das/runtime/core/include/apache/das/rdb/PKObject.h
    incubator/tuscany/cpp/das/runtime/core/include/apache/das/rdb/das_constants.h
    incubator/tuscany/cpp/das/runtime/core/src/apache/das/StringWrapper.cpp
    incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/ApplyChanges.cpp
    incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/ColumnData.cpp
    incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/CreatedDataObject.cpp
    incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/DASDataObject.cpp
    incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/DASImpl.cpp
    incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/DeteledDataObject.cpp
    incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/ModifiedDataObject.cpp
    incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/PKObject.cpp
    incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/ResultSet.cpp
    incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/Statement.cpp
    incubator/tuscany/cpp/das/runtime/test/rsc/TestCases.fdb
    incubator/tuscany/cpp/das/runtime/test/src/main.cpp

Modified: incubator/tuscany/cpp/das/VSExpress/tuscany_das/das_runtime/das_runtime.vcproj
URL: http://svn.apache.org/viewvc/incubator/tuscany/cpp/das/VSExpress/tuscany_das/das_runtime/das_runtime.vcproj?rev=583710&r1=583709&r2=583710&view=diff
==============================================================================
--- incubator/tuscany/cpp/das/VSExpress/tuscany_das/das_runtime/das_runtime.vcproj (original)
+++ incubator/tuscany/cpp/das/VSExpress/tuscany_das/das_runtime/das_runtime.vcproj Thu Oct 11 00:21:41 2007
@@ -370,6 +370,10 @@
 					>
 				</File>
 				<File
+					RelativePath="..\..\..\runtime\core\src\apache\das\rdb\RelationshipStatement.cpp"
+					>
+				</File>
+				<File
 					RelativePath="..\..\..\runtime\core\src\apache\das\rdb\RelationshipWrapper.cpp"
 					>
 				</File>
@@ -572,6 +576,10 @@
 				</File>
 				<File
 					RelativePath="..\..\..\runtime\core\include\apache\das\rdb\Relationship.h"
+					>
+				</File>
+				<File
+					RelativePath="..\..\..\runtime\core\include\apache\das\rdb\RelationshipStatement.h"
 					>
 				</File>
 				<File

Modified: incubator/tuscany/cpp/das/VSExpress/tuscany_das/tuscany_das.sln
URL: http://svn.apache.org/viewvc/incubator/tuscany/cpp/das/VSExpress/tuscany_das/tuscany_das.sln?rev=583710&r1=583709&r2=583710&view=diff
==============================================================================
--- incubator/tuscany/cpp/das/VSExpress/tuscany_das/tuscany_das.sln (original)
+++ incubator/tuscany/cpp/das/VSExpress/tuscany_das/tuscany_das.sln Thu Oct 11 00:21:41 2007
@@ -4,6 +4,9 @@
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "das_runtime", "das_runtime\das_runtime.vcproj", "{964F3F93-8D1C-46BE-9724-2313CE7380AA}"
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "das_test", "das_test\das_test.vcproj", "{277D86C4-0113-49EE-A351-0D32FF2E1EF3}"
+	ProjectSection(ProjectDependencies) = postProject
+		{964F3F93-8D1C-46BE-9724-2313CE7380AA} = {964F3F93-8D1C-46BE-9724-2313CE7380AA}
+	EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Build", "Build\Build.vcproj", "{78511C3F-18E5-44FC-928D-BFAAA4A8BCBE}"
 	ProjectSection(ProjectDependencies) = postProject

Modified: incubator/tuscany/cpp/das/VSExpress/tuscany_das/tuscany_das.suo
URL: http://svn.apache.org/viewvc/incubator/tuscany/cpp/das/VSExpress/tuscany_das/tuscany_das.suo?rev=583710&r1=583709&r2=583710&view=diff
==============================================================================
Binary files - no diff available.

Modified: incubator/tuscany/cpp/das/runtime/core/include/apache/das/StringWrapper.h
URL: http://svn.apache.org/viewvc/incubator/tuscany/cpp/das/runtime/core/include/apache/das/StringWrapper.h?rev=583710&r1=583709&r2=583710&view=diff
==============================================================================
--- incubator/tuscany/cpp/das/runtime/core/include/apache/das/StringWrapper.h (original)
+++ incubator/tuscany/cpp/das/runtime/core/include/apache/das/StringWrapper.h Thu Oct 11 00:21:41 2007
@@ -23,6 +23,8 @@
 #include <ctype.h>
 #include <sstream>
 
+#include "commonj/sdo/DataObject.h"
+
 namespace apache {
 	namespace das {
 
@@ -41,10 +43,12 @@
 		static std::string toString(const unsigned int& t);
 
 		StringWrapper(std::string str);
+		StringWrapper(commonj::sdo::DataObjectPtr dataObject, std::string propertyName);
 
 		std::string toLower(void) const;
 		bool isValidRDBName(void) const;
 		std::string getString(void) const;
+		void defineOnDataObject(commonj::sdo::DataObjectPtr dataObject, std::string propertyName) const;
 		
 };
 

Modified: incubator/tuscany/cpp/das/runtime/core/include/apache/das/rdb/ApplyChanges.h
URL: http://svn.apache.org/viewvc/incubator/tuscany/cpp/das/runtime/core/include/apache/das/rdb/ApplyChanges.h?rev=583710&r1=583709&r2=583710&view=diff
==============================================================================
--- incubator/tuscany/cpp/das/runtime/core/include/apache/das/rdb/ApplyChanges.h (original)
+++ incubator/tuscany/cpp/das/runtime/core/include/apache/das/rdb/ApplyChanges.h Thu Oct 11 00:21:41 2007
@@ -23,12 +23,13 @@
 #include <list>
 #include <string>
 
+#include "apache/das/rdb/DASImpl.h"
 #include "apache/das/rdb/ConfigImpl.h"
 #include "apache/das/rdb/Relationship.h"
 #include "apache/das/rdb/KeyPair.h"
-#include "apache/das/rdb/CreatedDataObject.h"
-#include "apache/das/rdb/DeletedDataObject.h"
 #include "apache/das/rdb/ModifiedDataObject.h"
+#include "apache/das/rdb/DeletedDataObject.h"
+#include "apache/das/rdb/CreatedDataObject.h"
 #include "apache/das/rdb/DASPrimaryKeyNotFoundException.h"
 
 #include "commonj/sdo/DataObject.h"
@@ -42,6 +43,7 @@
 class CreatedDataObject;
 class DeletedDataObject;
 class ConfigImpl;
+class DASImpl;
 
 class ApplyChanges {
 
@@ -55,7 +57,8 @@
 		std::list<DASDataObject*> updateOrderList;
 		commonj::sdo::ChangeSummaryPtr summary;
 
-		void processDataObject(commonj::sdo::DataObjectPtr dataObject);
+		void processRootDataObject(commonj::sdo::DataObjectPtr dataObject);
+		DASDataObject& processDataObject(commonj::sdo::DataObjectPtr dataObject);
 		DeletedDataObject& processDeletedDataObject(commonj::sdo::DataObjectPtr dataObject);
 		CreatedDataObject& processCreatedDataObject(commonj::sdo::DataObjectPtr dataObject);
 		ModifiedDataObject& processModifiedDataObject(commonj::sdo::DataObjectPtr dataObject);
@@ -63,10 +66,11 @@
 		void addDataObject(DASDataObject& dataObject);
 		void processMetadata(commonj::sdo::DataObjectPtr dataObject);
 		bool isInStack(const DASDataObject& dasDataObject);
-		const Table& getTable(std::string typeName) const;
+		const Table& getTable(commonj::sdo::DataObjectPtr dataObject);
+		const Relationship& getRelationship(DASDataObject& parentDataObject, DASDataObject& dataObject) const;
 		
 	public:
-		ApplyChanges(const Config& config, commonj::sdo::DataObjectPtr root);
+		ApplyChanges(DASImpl& das, commonj::sdo::DataObjectPtr root);
 		~ApplyChanges(void);
 		
 };

Modified: incubator/tuscany/cpp/das/runtime/core/include/apache/das/rdb/CreatedDataObject.h
URL: http://svn.apache.org/viewvc/incubator/tuscany/cpp/das/runtime/core/include/apache/das/rdb/CreatedDataObject.h?rev=583710&r1=583709&r2=583710&view=diff
==============================================================================
--- incubator/tuscany/cpp/das/runtime/core/include/apache/das/rdb/CreatedDataObject.h (original)
+++ incubator/tuscany/cpp/das/runtime/core/include/apache/das/rdb/CreatedDataObject.h Thu Oct 11 00:21:41 2007
@@ -34,16 +34,14 @@
 
 class CreatedDataObject : public DASDataObject {
 
-	private:
-		std::string columns;
-		std::string values;
-		
 	public:
 		CreatedDataObject(const Table& table, commonj::sdo::DataObjectPtr dataObject, 
 			commonj::sdo::ChangeSummaryPtr changeSummary);
 
-		void addFK(const KeyDataList& fkDataList);
-		void executeStatements(StatementPtr stmt) const;
+		~CreatedDataObject(void);
+
+		/*void execute(StatementPtr stmt) const;*/
+		void printStmt(void);
 	
 };
 

Modified: incubator/tuscany/cpp/das/runtime/core/include/apache/das/rdb/DASDataObject.h
URL: http://svn.apache.org/viewvc/incubator/tuscany/cpp/das/runtime/core/include/apache/das/rdb/DASDataObject.h?rev=583710&r1=583709&r2=583710&view=diff
==============================================================================
--- incubator/tuscany/cpp/das/runtime/core/include/apache/das/rdb/DASDataObject.h (original)
+++ incubator/tuscany/cpp/das/runtime/core/include/apache/das/rdb/DASDataObject.h Thu Oct 11 00:21:41 2007
@@ -21,7 +21,8 @@
 #define DAS_DATA_OBJECT_H
 
 #include "apache/das/rdb/PKObject.h"
-#include "apache/das/rdb/Statement.h"
+//#include "apache/das/rdb/Statement.h"
+#include "apache/das/rdb/RelationshipStatement.h"
 
 #include "commonj/sdo/DataObject.h"
 #include "commonj/sdo/SettingList.h"
@@ -33,24 +34,36 @@
 
 class ColumnData;
 class Table;
+class RelationshipStatement;
 
 class DASDataObject : public PKObject {
 
 	private:
 		commonj::sdo::DataObjectPtr dataObject;
 		std::list<std::string> updateStatements;
+		std::map<std::string, RelationshipStatement*> fks;
+		std::list<RelationshipStatement*> dependencies;
+		
+	protected:
+		std::string statement;
 		
 	public:
 		DASDataObject(const Table& table, commonj::sdo::DataObjectPtr dataObject, 
 			commonj::sdo::ChangeSummaryPtr changeSummary);
 
+		~DASDataObject(void);
+
 		const commonj::sdo::DataObjectPtr getDataObject(void) const;
-		void printStmt();
+		std::string getWhereStmt(void) const;
+		RelationshipStatement& addFK(const Relationship& relationship, const KeyDataList* keyDataList);
+		
+		virtual void appendStatement(std::string statement);
+		virtual void pushStatement(std::string statement);
+	    virtual void addDependency(RelationshipStatement& relationshipStatement);
 
-		void appendStatement(std::string statement);
-		void pushStatement(std::string statement);
+		virtual void execute(StatementPtr stmt) const;
+		virtual void printStmt(void);
 
-		void DASDataObject::executeStatements(StatementPtr stmt) const;
 
 	
 };

Modified: incubator/tuscany/cpp/das/runtime/core/include/apache/das/rdb/DeletedDataObject.h
URL: http://svn.apache.org/viewvc/incubator/tuscany/cpp/das/runtime/core/include/apache/das/rdb/DeletedDataObject.h?rev=583710&r1=583709&r2=583710&view=diff
==============================================================================
--- incubator/tuscany/cpp/das/runtime/core/include/apache/das/rdb/DeletedDataObject.h (original)
+++ incubator/tuscany/cpp/das/runtime/core/include/apache/das/rdb/DeletedDataObject.h Thu Oct 11 00:21:41 2007
@@ -36,6 +36,7 @@
 
 	public:
 		DeletedDataObject(const Table& table, commonj::sdo::DataObjectPtr dataObject, commonj::sdo::ChangeSummaryPtr changeSummary);
+		~DeletedDataObject(void);
 	
 };
 

Modified: incubator/tuscany/cpp/das/runtime/core/include/apache/das/rdb/ModifiedDataObject.h
URL: http://svn.apache.org/viewvc/incubator/tuscany/cpp/das/runtime/core/include/apache/das/rdb/ModifiedDataObject.h?rev=583710&r1=583709&r2=583710&view=diff
==============================================================================
--- incubator/tuscany/cpp/das/runtime/core/include/apache/das/rdb/ModifiedDataObject.h (original)
+++ incubator/tuscany/cpp/das/runtime/core/include/apache/das/rdb/ModifiedDataObject.h Thu Oct 11 00:21:41 2007
@@ -21,6 +21,7 @@
 #define MODIFIED_DATA_OBJECT_H
 
 #include "apache/das/rdb/DASDataObject.h"
+//#include "apache/das/rdb/RelationshipStatement.h"
 
 #include "commonj/sdo/DataObject.h"
 #include "commonj/sdo/SettingList.h"
@@ -36,16 +37,15 @@
 class ModifiedDataObject : public DASDataObject {
 
 	private:
-		std::string sets;
-		std::string pkWhere;
-		std::map<std::string, const KeyDataList*> fks;
-		
+		//bool pkModified;
+
 	public:
 		ModifiedDataObject(const Table& table, commonj::sdo::DataObjectPtr dataObject, 
 			commonj::sdo::ChangeSummaryPtr changeSummary);
 
-		void setFK(std::string relationshipName, const KeyDataList* keyDataList);
-
+		~ModifiedDataObject(void);
+		//bool isPKModified(void) const;
+		
 	
 };
 

Modified: incubator/tuscany/cpp/das/runtime/core/include/apache/das/rdb/PKObject.h
URL: http://svn.apache.org/viewvc/incubator/tuscany/cpp/das/runtime/core/include/apache/das/rdb/PKObject.h?rev=583710&r1=583709&r2=583710&view=diff
==============================================================================
--- incubator/tuscany/cpp/das/runtime/core/include/apache/das/rdb/PKObject.h (original)
+++ incubator/tuscany/cpp/das/runtime/core/include/apache/das/rdb/PKObject.h Thu Oct 11 00:21:41 2007
@@ -24,8 +24,6 @@
 #include <string>
 #include <stdexcept>
 
-
-
 #include "commonj/sdo/DataObject.h"
 
 namespace apache {

Added: incubator/tuscany/cpp/das/runtime/core/include/apache/das/rdb/RelationshipStatement.h
URL: http://svn.apache.org/viewvc/incubator/tuscany/cpp/das/runtime/core/include/apache/das/rdb/RelationshipStatement.h?rev=583710&view=auto
==============================================================================
--- incubator/tuscany/cpp/das/runtime/core/include/apache/das/rdb/RelationshipStatement.h (added)
+++ incubator/tuscany/cpp/das/runtime/core/include/apache/das/rdb/RelationshipStatement.h Thu Oct 11 00:21:41 2007
@@ -0,0 +1,71 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+
+#ifndef RELATIONSHIP_STATEMENT_H
+#define RELATIONSHIP_STATEMENT_H
+
+#include <list>
+#include <string>
+
+//#include "apache/das/rdb/Table.h"
+//#include "apache/das/rdb/DASDataObject.h"
+//#include "apache/das/rdb/Relationship.h"
+#include "apache/das/rdb/StatementPtr.h"
+#include "apache/das/rdb/PKObject.h"
+#include "apache/das/rdb/KeyPair.h"
+
+#include "commonj/sdo/DataObject.h"
+#include "commonj/sdo/ChangeSummary.h"
+
+namespace apache {
+	namespace das {
+		namespace rdb {
+
+class DASDataObject;
+class Table;
+class Relationship;
+
+class RelationshipStatement {
+
+	private:
+		const Relationship* relationship;
+		DASDataObject* dataObject;
+		const KeyDataList* keyDataList;
+		bool executed;
+		
+	public:
+		RelationshipStatement(const Relationship& relationship, const KeyDataList* keyDataList = 0);
+		~RelationshipStatement(void);
+
+		void setFKList(const KeyDataList* keyDataList);
+		void setDASDataObject(DASDataObject& dataObject);
+
+		void execute(StatementPtr stmt);
+		bool isUnset(void) const;
+		DASDataObject& getDASDataObject(void) const;
+		
+};
+
+
+
+		};
+	};
+};
+
+#endif //RELATIONSHIP_STATEMENT_H

Modified: incubator/tuscany/cpp/das/runtime/core/include/apache/das/rdb/das_constants.h
URL: http://svn.apache.org/viewvc/incubator/tuscany/cpp/das/runtime/core/include/apache/das/rdb/das_constants.h?rev=583710&r1=583709&r2=583710&view=diff
==============================================================================
--- incubator/tuscany/cpp/das/runtime/core/include/apache/das/rdb/das_constants.h (original)
+++ incubator/tuscany/cpp/das/runtime/core/include/apache/das/rdb/das_constants.h Thu Oct 11 00:21:41 2007
@@ -1,3 +1,4 @@
 #define DAS_ROOT_NAME "DAS_ROOT"
 #define DAS_NAMESPACE "apache.das"
 #define SDO_NAMESPACE "commonj.sdo"
+#define SQL_NULL_VALUE "NULL"

Modified: incubator/tuscany/cpp/das/runtime/core/src/apache/das/StringWrapper.cpp
URL: http://svn.apache.org/viewvc/incubator/tuscany/cpp/das/runtime/core/src/apache/das/StringWrapper.cpp?rev=583710&r1=583709&r2=583710&view=diff
==============================================================================
--- incubator/tuscany/cpp/das/runtime/core/src/apache/das/StringWrapper.cpp (original)
+++ incubator/tuscany/cpp/das/runtime/core/src/apache/das/StringWrapper.cpp Thu Oct 11 00:21:41 2007
@@ -23,6 +23,17 @@
 
 StringWrapper::StringWrapper(std::string str) : str(str) {}
 
+StringWrapper::StringWrapper(commonj::sdo::DataObjectPtr dataObject, std::string propertyName) {
+	unsigned int length = dataObject->getLength(propertyName);
+	wchar_t* buffer = new wchar_t[length];
+	dataObject->getString(propertyName, buffer, length);
+
+	std::wstring wstr(buffer, 0, length);
+	this->str = std::string(wstr.begin(), wstr.end());
+	delete buffer;
+
+}
+
 std::string StringWrapper::toLower(void) const {
 	std::string str = this->str;
 	unsigned int length = str.length();
@@ -103,6 +114,12 @@
 	ss << t;
 
 	return ss.str();
+
+}
+
+void StringWrapper::defineOnDataObject(commonj::sdo::DataObjectPtr dataObject, std::string propertyName) const {
+		std::wstring wstr(str.begin(), str.end());
+		dataObject->setString(propertyName, wstr.c_str(), wstr.size());
 
 }
 

Modified: incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/ApplyChanges.cpp
URL: http://svn.apache.org/viewvc/incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/ApplyChanges.cpp?rev=583710&r1=583709&r2=583710&view=diff
==============================================================================
--- incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/ApplyChanges.cpp (original)
+++ incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/ApplyChanges.cpp Thu Oct 11 00:21:41 2007
@@ -22,16 +22,25 @@
 	namespace das {
 		namespace rdb {
 
-ApplyChanges::ApplyChanges(const Config& config, commonj::sdo::DataObjectPtr root) : summary(root->getChangeSummary()) {
-	this->config = &((const ConfigImpl&) config);
+ApplyChanges::ApplyChanges(DASImpl& das, commonj::sdo::DataObjectPtr root) : summary(root->getChangeSummary()) {
+	this->config = (const ConfigImpl*) &das.getConfig();
 	this->root = root;
-	processDataObject(root);
+	processRootDataObject(root);
+	StatementPtr stmt = *das.getConnection()->createStatement();
 
-	for (std::list<DASDataObject*>::iterator it = updateOrderList.begin() ;
-		it != updateOrderList.end() ; it++) {
+	try {
 
-			(*it)->printStmt();
-			
+		for (std::list<DASDataObject*>::iterator it = updateOrderList.begin() ;
+			it != updateOrderList.end() ; it++) {
+
+				(*it)->execute(stmt);
+				
+		}
+
+		stmt->executeQuery("commit");
+
+	} catch (std::exception&) {
+		stmt->executeQuery("rollback");	
 	}
 	
 }
@@ -70,7 +79,7 @@
 
 }
 
-void ApplyChanges::processDataObject(commonj::sdo::DataObjectPtr dataObject) {
+void ApplyChanges::processRootDataObject(commonj::sdo::DataObjectPtr dataObject) {
 	commonj::sdo::ChangedDataObjectList& changedObjects = summary->getChangedDataObjects();
 	std::list<commonj::sdo::DataObjectPtr> createdObjects;
 	std::list<commonj::sdo::DataObjectPtr> deletedObjects;
@@ -103,6 +112,28 @@
 		processDeletedDataObject(*deletedIterator);
 	}
 
+	std::list<commonj::sdo::DataObjectPtr>::iterator createdIterator;
+	for (createdIterator = createdObjects.begin() ; createdIterator != createdObjects.end() ; createdIterator++) {
+		processCreatedDataObject(*createdIterator);
+	}
+
+	std::list<commonj::sdo::DataObjectPtr>::iterator modifiedIterator;
+	for (modifiedIterator = modifiedObjects.begin() ; modifiedIterator != modifiedObjects.end() ; modifiedIterator++) {
+		processModifiedDataObject(*modifiedIterator);
+	}
+
+}
+
+DASDataObject& ApplyChanges::processDataObject(commonj::sdo::DataObjectPtr dataObject) {
+	
+	if (summary->isCreated(dataObject)) {
+		return processCreatedDataObject(dataObject);
+	} else if (summary->isDeleted(dataObject)) {
+		return processDeletedDataObject(dataObject);
+	} else {
+		return processModifiedDataObject(dataObject);
+	}
+
 }
 
 void ApplyChanges::processMetadata(commonj::sdo::DataObjectPtr dataObject) {
@@ -223,25 +254,31 @@
 	
 }
 
-const Table& ApplyChanges::getTable(std::string typeName) const {
-	return *((std::map<std::string, const Table*>::const_iterator) tables.find(typeName))->second;
+const Table& ApplyChanges::getTable(commonj::sdo::DataObjectPtr dataObject) {
+	std::string typeName = dataObject->getType().getName();
+	std::map<std::string, const Table*>::const_iterator it = tables.find(typeName);
+
+	if (it == tables.end()) {
+		processMetadata(dataObject);
+	}
+
+	it = tables.find(typeName);
+
+	return *it->second;
+
 }
 
 CreatedDataObject& ApplyChanges::processCreatedDataObject(commonj::sdo::DataObjectPtr dataObject) {
 	DASDataObject* dasDB = getDASDataObject(dataObject);
-
+	//dataObject->printSelf(std::cout);
+	
 	if (dasDB != 0) {
 		return (CreatedDataObject&) *dasDB;
 	}
 
 	CreatedDataObject* createdDataObject = new CreatedDataObject(
-		getTable((std::string) dataObject->getType().getName()), dataObject, summary);
-		
-	if (isInStack(*createdDataObject)) {
-		//throw 
-	}
-
-	stack.push_back(createdDataObject);
+		getTable(dataObject), dataObject, summary);
+	
 	updateOrderList.push_back(createdDataObject);
 	addDataObject(*createdDataObject);
 	commonj::sdo::PropertyList properties = dataObject->getInstanceProperties();
@@ -254,26 +291,18 @@
 				commonj::sdo::DataObjectList& dataObjectList = dataObject->getList(properties[i]);
 
 				for (unsigned int j = 0 ; j < dataObjectList.size() ; j++) {
-
-
-					if (summary->isCreated(dataObjectList[j])) {
-						processCreatedDataObject(dataObjectList[j]);
-					} else {
-						processModifiedDataObject(dataObjectList[j]);
-						//needs to continue
-					}
-
+					DASDataObject& dob = processDataObject(dataObjectList[j]);
+					RelationshipStatement& rs = dob.addFK(getRelationship(*createdDataObject, dob), &createdDataObject->getPrimaryKeys());
+					dob.addDependency(rs);
+					
 				}
 
 			} else {
-				commonj::sdo::DataObjectPtr db = dataObject->getDataObject(properties[i]);
-
-				if (summary->isCreated(db)) {
-					processCreatedDataObject(db);
-				} else {
-					processModifiedDataObject(db);
-					//needs to continue
-				}
+				commonj::sdo::DataObjectPtr dao = dataObject->getDataObject(properties[i]);
+				DASDataObject& dob = processDataObject(dao);
+				dob.addFK(getRelationship(*createdDataObject, dob), &createdDataObject->getPrimaryKeys());
+				RelationshipStatement& rs = dob.addFK(getRelationship(*createdDataObject, dob), &createdDataObject->getPrimaryKeys());
+				dob.addDependency(rs);
 
 			}
 
@@ -281,27 +310,28 @@
 
 	}
 
-	stack.pop_back();
-
 	return *createdDataObject;
 	
 }
 
+const Relationship& ApplyChanges::getRelationship(DASDataObject& parentDataObject, DASDataObject& dataObject) const {
+	std::map<std::string, const Relationship*>::const_iterator relatIt = relationships.
+		find(parentDataObject.getTable().getTableName() + "." + dataObject.getTable().getTableName());
+
+	return *relatIt->second;
+
+}
+
 DeletedDataObject& ApplyChanges::processDeletedDataObject(commonj::sdo::DataObjectPtr dataObject) {
 	DASDataObject* dasDB = getDASDataObject(dataObject);
-
+	//dataObject->printSelf(std::cout);
+	
 	if (dasDB != 0) {
 		return (DeletedDataObject&) *dasDB;
 	}
 
 	DeletedDataObject* deletedDataObject = new DeletedDataObject(
-		getTable((std::string) dataObject->getType().getName()), dataObject, summary);
-
-	if (isInStack(*deletedDataObject)) {
-		//throw 
-	}
-
-	stack.push_back(deletedDataObject);
+		getTable(dataObject), dataObject, summary);
 
 	const commonj::sdo::SettingList& setting = summary->getOldValues(dataObject);
 
@@ -310,56 +340,10 @@
 		if (setting[i].isSet() && setting[i].getProperty().getType().isDataObjectType()) {
 			commonj::sdo::DataObjectPtr containedDataObject = setting[i].getDataObjectValue();
 
-			if (summary->isDeleted(containedDataObject)) {
-				processDeletedDataObject(containedDataObject);
-			} else {
-				std::string pkTableName = deletedDataObject->getTable().getTableName();
-				std::string fkTableName;
-				std::list<std::string> fkColumnNames;
-				std::string updateStatement;
-				
-				const Table* fkTable = config->getTableByTypeName((std::string) containedDataObject->getType().getName());
-
-				if (fkTable == 0) {
-					fkTableName = containedDataObject->getType().getName();
-				} else {
-					fkTableName = fkTable->getTableName();
-				}
-
-				const Relationship* relationship = config->getRelationship(pkTableName, fkTableName);
-
-				if (relationship == 0) {
-					fkColumnNames.push_back(pkTableName.append("_id"));
-				} else {
-
-					const std::map<std::string, const KeyPair*>& keyPairs =  relationship->getKeyPairs();
-					
-					for (std::map<std::string, const KeyPair*>::const_iterator keyPairIterator = keyPairs.begin() ;
-						keyPairIterator != keyPairs.end() ; keyPairIterator++) {
-
-							fkColumnNames.push_back(keyPairIterator->second->getFKColumnName());
-
-					}
-
-				}
-
-				updateStatement.append("update ").append(pkTableName).append(" set ");
-				
-				std::list<std::string>::iterator fkColumnIterator = fkColumnNames.begin();
-				for (unsigned int fkColumnNamesCount = 0 ; fkColumnNames.size() > fkColumnNamesCount ; fkColumnIterator++) {
-
-					updateStatement.append(*fkColumnIterator).append("=NULL");
-
-					if (fkColumnNamesCount + 1 != fkColumnNames.size()) {
-						updateStatement.append(",");
-					}
-
-					fkColumnNamesCount++;
-
-				}
-
-				updateStatement.append(")");
-				deletedDataObject->pushStatement(updateStatement);
+			if (!summary->isDeleted(containedDataObject)) {
+				DASDataObject& modDO = processDataObject(containedDataObject);
+				RelationshipStatement& rs = modDO.addFK(getRelationship(*deletedDataObject, modDO), 0);
+				deletedDataObject->addDependency(rs);
 
 			}
 
@@ -367,7 +351,6 @@
 
 	}
 
-	stack.pop_back();
 	addDataObject(*deletedDataObject);
 	updateOrderList.push_back(deletedDataObject);
 
@@ -398,39 +381,163 @@
 
 ModifiedDataObject& ApplyChanges::processModifiedDataObject(commonj::sdo::DataObjectPtr dataObject) {
 	DASDataObject* dasDB = getDASDataObject(dataObject);
+	//dataObject->printSelf(std::cout);
 
 	if (dasDB != 0) {
 		return (ModifiedDataObject&) *dasDB;
 	}
 
 	ModifiedDataObject* modifiedDataObject = new ModifiedDataObject(
-		getTable((std::string) dataObject->getType().getName()), dataObject, summary);
+		getTable(dataObject), dataObject, summary);
 		
-	
 	updateOrderList.push_back(modifiedDataObject);
 	addDataObject(*modifiedDataObject);
-	const commonj::sdo::SettingList& setting = summary->getOldValues(dataObject);
 
-	for (int i = 0 ; i < setting.size() ; i++) {
-		const commonj::sdo::Property& prop = setting[i].getProperty();
+	if (summary->isModified(dataObject)) {
+		std::map<const commonj::sdo::Property*, std::list<commonj::sdo::DataObjectPtr>*> manyOldValuedProperties;
+		std::map<const commonj::sdo::Property*, commonj::sdo::DataObjectPtr> singleOldValuedProperties;
+		commonj::sdo::PropertyList props = dataObject->getInstanceProperties();
+		const commonj::sdo::SettingList& setting = summary->getOldValues(dataObject);
+
+		for (int i = 0 ; i < setting.size() ; i++) {
+			const commonj::sdo::Property& prop = setting[i].getProperty();
+
+			if (prop.getType().isDataObjectType()) {
+
+				if (!setting[i].isNull() && setting[i].isSet()) {
+					commonj::sdo::DataObjectPtr oldDO = setting[i].getDataObjectValue();
+					//oldDO->printSelf(std::cout);
+					//std::cout << std::endl;
+
+					if (prop.isMany()) {
+						std::map<const commonj::sdo::Property*, std::list<commonj::sdo::DataObjectPtr>*>::iterator manyIt =
+							manyOldValuedProperties.find(&prop);
+
+						std::list<commonj::sdo::DataObjectPtr>* list;
+
+						if (manyIt == manyOldValuedProperties.end()) {
+							list = new std::list<commonj::sdo::DataObjectPtr>();
+							manyOldValuedProperties.insert(std::make_pair(&prop, list));
+
+						} else {
+							list = manyIt->second;
+						}
 
-		if (setting[i].isSet() && prop.getType().isDataObjectType()) {
+						list->push_back(oldDO);
+
+					} else {
+						singleOldValuedProperties.insert(std::make_pair(&prop, oldDO));
+					}
+
+				}
 
-			if (setting[i].isNull()) {
-				//modifiedDataObject->setFK();
 			}
+		}
 
-			commonj::sdo::DataObjectPtr oldDB = setting[i].getDataObjectValue();
+		for (unsigned int i = 0 ; i < props.size() ; i++) {
 			
-			if (setting[i].isNull()) {
-				//summary->getOldContainer(
+			if (props[i].getType().isDataObjectType()) {
+
+				if (props[i].isMany()) {
+					
+					if (!dataObject->isSet(props[i]) || !dataObject->isNull(props[i])) {
+						commonj::sdo::DataObjectList& doList = dataObject->getList(props[i]);
+
+ 						for (unsigned int j = 0 ; j < doList.size() ; j++) {
+							commonj::sdo::DataObjectPtr dob = doList[j];
+							
+							if (summary->isCreated(dob)) {
+								CreatedDataObject& createdDO = processCreatedDataObject(dob);
+								RelationshipStatement& rs = createdDO.addFK(getRelationship(*modifiedDataObject, createdDO), &modifiedDataObject->getPrimaryKeys());
+								modifiedDataObject->addDependency(rs);
+
+							} else {
+								std::map<const commonj::sdo::Property*, std::list<commonj::sdo::DataObjectPtr>*>::iterator manyIt = 
+									manyOldValuedProperties.find(&props[i]);
+
+								bool existsOldDO = false;
+
+								if (manyIt != manyOldValuedProperties.end()) {
+									std::list<commonj::sdo::DataObjectPtr>& list = *manyIt->second;
+
+									for (std::list<commonj::sdo::DataObjectPtr>::iterator listIt = list.begin() ;
+										listIt != list.end() ; listIt++) {
+
+											if (*listIt == dob) {
+												existsOldDO = true;
+												list.erase(listIt);
+												break;
+
+											}
+
+									}
+
+								}
+
+								if (!existsOldDO) {
+									ModifiedDataObject& modDO = processModifiedDataObject(dob);
+									RelationshipStatement& rs = modDO.addFK(getRelationship(*modifiedDataObject, modDO), &modifiedDataObject->getPrimaryKeys());
+									modifiedDataObject->addDependency(rs);
+
+								}
+
+							}
+
+						}
+
+					}
+
+				} else {
+
+					if (!dataObject->isSet(props[i]) || !dataObject->isNull(props[i])) {
+						commonj::sdo::DataObjectPtr dob = dataObject->getDataObject(props[i]);
+
+						if (summary->isCreated(dob)) {
+							CreatedDataObject& createdDO = processCreatedDataObject(dob);
+							RelationshipStatement& rs = createdDO.addFK(getRelationship(*modifiedDataObject, createdDO), &modifiedDataObject->getPrimaryKeys());
+							modifiedDataObject->addDependency(rs);
+
+						} else {
+							std::map<const commonj::sdo::Property*, commonj::sdo::DataObjectPtr>::iterator singleIt = 
+								singleOldValuedProperties.find(&props[i]);
+
+							if (singleIt == singleOldValuedProperties.end() || singleIt->second != dob) {
+								ModifiedDataObject& modDO = processModifiedDataObject(dob);
+								RelationshipStatement& rs = modDO.addFK(getRelationship(*modifiedDataObject, modDO), &modifiedDataObject->getPrimaryKeys());
+								modifiedDataObject->addDependency(rs);
+
+
+							}
+
+						}
+
+					}
+
+				}
+
 			}
 
 		}
 
-	}
+		for (std::map<const commonj::sdo::Property*, std::list<commonj::sdo::DataObjectPtr>*>::iterator manyIt = manyOldValuedProperties.begin() ;
+			manyIt != manyOldValuedProperties.end() ; manyIt++) {
 
-	stack.pop_back();
+				std::list<commonj::sdo::DataObjectPtr>* list = manyIt->second;
+
+				for (std::list<commonj::sdo::DataObjectPtr>::const_iterator listIt = list->begin() ;
+					listIt != list->end() ; listIt++) {
+					
+						ModifiedDataObject& modDO = processModifiedDataObject(*listIt);
+						RelationshipStatement& rs = modDO.addFK(getRelationship(*modifiedDataObject, modDO), 0);
+						modDO.addDependency(rs);
+
+				}
+
+				delete list;
+
+		}
+
+	}
 
 	return *modifiedDataObject;
 

Modified: incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/ColumnData.cpp
URL: http://svn.apache.org/viewvc/incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/ColumnData.cpp?rev=583710&r1=583709&r2=583710&view=diff
==============================================================================
--- incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/ColumnData.cpp (original)
+++ incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/ColumnData.cpp Thu Oct 11 00:21:41 2007
@@ -268,7 +268,7 @@
 				wchar_t* buffer = new wchar_t[length];
 				dataObject->getString(column.getPropertyName().c_str(), buffer, length);
 
-				data = new std::wstring(buffer);
+				data = new std::wstring(buffer, 0, length);
 				delete buffer;
 
 			}

Modified: incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/CreatedDataObject.cpp
URL: http://svn.apache.org/viewvc/incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/CreatedDataObject.cpp?rev=583710&r1=583709&r2=583710&view=diff
==============================================================================
--- incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/CreatedDataObject.cpp (original)
+++ incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/CreatedDataObject.cpp Thu Oct 11 00:21:41 2007
@@ -28,46 +28,73 @@
 	
 	
 	commonj::sdo::PropertyList properties = dataObject->getInstanceProperties();
+	statement.append("insert into ").append(table.getTableName()).append("(");
+	bool containsDataType = false;
+	std::string columns;
+	std::string values;
 	
 	for (unsigned int i = 0 ; i < properties.size() ; i++) {
 	
 		if (properties[i].getType().isDataType()) {
+
+			if (containsDataType) {
+				columns.append(",");
+				values.append(",");
+
+			}
+
+			containsDataType = true;
 			const Column* column = table.getColumnByProperty(properties[i].getName());
 			ColumnData columnData(*column, dataObject);
 
-			columns.append(column->getName()).append(",");
-			values.append(columnData.toSQL()).append(",");
+			columns.append(column->getName());
+			values.append(columnData.toSQL());
 
 		}
 	
 	}
 	
-	columns.erase(columns.end()--);
-	values.erase(values.end()--);
+	statement.append(columns).append(") values(").append(values).append(");");
 	
 }
 
-void CreatedDataObject::addFK(const KeyDataList& fkDataList) {
+CreatedDataObject::~CreatedDataObject(void) {}
 
-	for (KeyDataList::const_iterator it = fkDataList.begin() ; it != fkDataList.end()  ; it++) {
-		columns.append(it->second->getColumn().getName()).append(",");
-		values.append(it->second->toSQL()).append(",");
-
-	}
+//void CreatedDataObject::execute(StatementPtr stmt) const {
+//	DASDataObject::execute(stmt);
+//
+//	std::string statement;
+//	statement = statement.append("insert into ").append(getDataObject()->getType().getName()).append("(");
+//
+//	stmt->executeQuery(statement);
+//
+//
+//}
+//
+//void CreatedDataObject::execute(StatementPtr stmt) const {
+//	
+//	for (std::list<RelationshipStatement*>::const_iterator it = dependencies.begin() ;
+//		it != dependencies.end() ; it++) {
+//
+//			(*it)->execute(stmt);
+//
+//	}
+//
+//	std::cout << statement << std::endl;
+//
+//	if (statement != "") {
+//		stmt->executeQuery(statement);
+//	}
+//
+//}
 
-	columns.erase(columns.end()--);
-	values.erase(values.end()--);
-
-}
-
-void CreatedDataObject::executeStatements(StatementPtr stmt) const {
-	DASDataObject::executeStatements(stmt);
+void CreatedDataObject::printStmt(void) {
+	/*DASDataObject::printStmt();
 
 	std::string statement;
-	statement = statement.append("insert into ").append(getDataObject()->getType().getName()).append("(");
-
-	stmt->executeQuery(statement);
+	statement = statement.append("insert into ").append(getDataObject()->getType().getName()).append("(").append(columns).append(") values(").append(values).append(");");
 
+	std::cout <<  statement << std::endl;*/
 
 }
 

Modified: incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/DASDataObject.cpp
URL: http://svn.apache.org/viewvc/incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/DASDataObject.cpp?rev=583710&r1=583709&r2=583710&view=diff
==============================================================================
--- incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/DASDataObject.cpp (original)
+++ incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/DASDataObject.cpp Thu Oct 11 00:21:41 2007
@@ -25,31 +25,60 @@
 DASDataObject::DASDataObject(const Table& table, commonj::sdo::DataObjectPtr dataObject, 
 			commonj::sdo::ChangeSummaryPtr changeSummary) : PKObject(table) {
 	
-	commonj::sdo::SettingList& settingList = changeSummary->getOldValues(dataObject);
+	commonj::sdo::SettingList* settingList = 0;
+	this->dataObject = dataObject;
+	bool modifiedOnGraph = changeSummary->isDeleted(dataObject) || changeSummary->isModified(dataObject);
+
+	if (modifiedOnGraph) {
+		settingList = &changeSummary->getOldValues(dataObject);
+	}
+
 	std::map<std::string, const commonj::sdo::Setting*> settingMap;
 	const std::map<std::string, const Column*> columns = table.getColumns();
 	std::string statement;
 	unsigned int pkColumnCount = table.getPKColumnCount();
 	unsigned int pkCount = 0;
 
-	for (int i = 0 ; i < settingList.size() ; i++) {
-		settingMap.insert(std::make_pair(settingList[i].getProperty().getName(), &settingList[i]));
+	if (modifiedOnGraph) {
+
+		for (int i = 0 ; i < settingList->size() ; i++) {
+			settingMap.insert(std::make_pair((*settingList)[i].getProperty().getName(), &(*settingList)[i]));
+		}
+
 	}
 
 	for (std::map<std::string, const Column*>::const_iterator columnsIterator = columns.begin() ;
 		columnsIterator != columns.end() && pkColumnCount > pkCount ; columnsIterator++) {
-
 			const Column& column = *columnsIterator->second;
-			std::map<std::string, const commonj::sdo::Setting*>::const_iterator settingIterator = 
-				settingMap.find(column.getPropertyName());
 
-			if (settingIterator != settingMap.end()) {
-				addPrimaryKey(column.getPropertyName(), 
-					*(new ColumnData(column, *settingIterator->second)));
-
-			} else {
-				addPrimaryKey(column.getPropertyName(), 
-					*(new ColumnData(column, dataObject)));
+			if (column.isPK()) {
+
+				if (modifiedOnGraph) {
+					
+					std::map<std::string, const commonj::sdo::Setting*>::const_iterator settingIterator = 
+						settingMap.find(column.getPropertyName());
+
+					if (settingIterator != settingMap.end()) {
+
+						if (settingIterator->second->isNull() || !settingIterator->second->isSet()) {
+							//throw exception
+						}
+
+						ColumnData* oldPKData = new ColumnData(column, *settingIterator->second);
+						addPrimaryKey(column.getPropertyName(), 
+							*(oldPKData));
+
+						continue;
+
+					} 
+
+				}
+
+				if (dataObject->isNull(column.getPropertyName()) || !dataObject->isSet(column.getPropertyName())) {
+					//throw exception
+				}
+
+				addPrimaryKey(column.getPropertyName(), *(new ColumnData(column, dataObject)));
 
 			}
 
@@ -68,20 +97,88 @@
 
 }
 
+DASDataObject::~DASDataObject(void) {
+	
+	for (std::map<std::string, RelationshipStatement*>::iterator it = fks.begin() ; it != fks.end() ; it++) {
+		delete it->second;
+	}
+
+}
+
 const commonj::sdo::DataObjectPtr DASDataObject::getDataObject(void) const {
 	return dataObject;
 }
 
-void DASDataObject::executeStatements(StatementPtr stmt) const {
+//void DASDataObject::execute(StatementPtr stmt) const {
+//	
+//	for (std::list<std::string>::const_iterator it = updateStatements.begin() ; it != updateStatements.end() ; it++) {
+//		stmt->executeQuery(*it);	
+//	}
+//
+//}
+
+void DASDataObject::appendStatement(std::string statement) {
+	updateStatements.push_back(statement);
+}
+
+std::string DASDataObject::getWhereStmt(void) const {
+	std::string stmt = "where ";
+	const KeyDataList& pks = getPrimaryKeys();
+	unsigned int i = 1;
+
+	for (KeyDataList::const_iterator it = pks.begin() ; it != pks.end() ; it++) {
+		stmt.append(getTable().getTableName() + "." + it->second->getColumn().getName()).append("=").append(/*"2"*/it->second->toSQL());
+
+		if (i != pks.size()) {
+			stmt.append(" and ");
+		}
+
+		i++;
+
+	}
+
+	return stmt;
+
+}
+
+RelationshipStatement& DASDataObject::addFK(const Relationship& relationship, const KeyDataList* keyDataList) {
+	std::map<std::string, RelationshipStatement*>::iterator it = fks.find(relationship.getName());
+	RelationshipStatement* relatStmt;
+
+	if (it == fks.end()) {
+		relatStmt = new RelationshipStatement(relationship, keyDataList);
+		relatStmt->setDASDataObject(*this);
+		fks.insert(std::make_pair(relationship.getName(), relatStmt));
+
+	} else if (keyDataList != 0) {
+		relatStmt = it->second;
+		relatStmt->setFKList(keyDataList);
+
+	}
+
+	return *relatStmt;
+
+}
+
+void DASDataObject::execute(StatementPtr stmt) const {
 	
-	for (std::list<std::string>::const_iterator it = updateStatements.begin() ; it != updateStatements.end() ; it++) {
-		stmt->executeQuery(*it);	
+	if (statement != "") {
+		//std::cout << statement << std::endl;
+		stmt->executeQuery(statement);
+		//stmt->executeQuery("commit");
+	}
+
+	for (std::list<RelationshipStatement*>::const_iterator it = dependencies.begin() ;
+		it != dependencies.end() ; it++) {
+
+			(*it)->execute(stmt);
+
 	}
 
 }
 
-void DASDataObject::appendStatement(std::string statement) {
-	updateStatements.push_back(statement);
+void DASDataObject::addDependency(RelationshipStatement& relationshipStatement) {
+	dependencies.push_back(&relationshipStatement);
 }
 
 void DASDataObject::pushStatement(std::string statement) {

Modified: incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/DASImpl.cpp
URL: http://svn.apache.org/viewvc/incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/DASImpl.cpp?rev=583710&r1=583709&r2=583710&view=diff
==============================================================================
--- incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/DASImpl.cpp (original)
+++ incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/DASImpl.cpp Thu Oct 11 00:21:41 2007
@@ -139,7 +139,7 @@
 }
 
 void DASImpl::applyChanges(commonj::sdo::DataObjectPtr root) {
-	ApplyChanges(*config, root);
+	ApplyChanges(*this, root);
 }
 
 		};

Modified: incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/DeteledDataObject.cpp
URL: http://svn.apache.org/viewvc/incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/DeteledDataObject.cpp?rev=583710&r1=583709&r2=583710&view=diff
==============================================================================
--- incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/DeteledDataObject.cpp (original)
+++ incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/DeteledDataObject.cpp Thu Oct 11 00:21:41 2007
@@ -26,7 +26,6 @@
 										commonj::sdo::ChangeSummaryPtr changeSummary)
 									: DASDataObject(table, dataObject, changeSummary) {
 	
-	std::string statement;
 	statement.append("delete from ").append(table.getTableName()).append(" where ");
 	const KeyDataList& columnDataList = getPrimaryKeys();
 	unsigned int pkCount = 0;
@@ -46,9 +45,11 @@
 	}
 
 	
-	appendStatement(statement.append(";"));
+	statement.append(";");
 	
 }
+
+DeletedDataObject::~DeletedDataObject(void) {}
 
 		};
 	};

Modified: incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/ModifiedDataObject.cpp
URL: http://svn.apache.org/viewvc/incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/ModifiedDataObject.cpp?rev=583710&r1=583709&r2=583710&view=diff
==============================================================================
--- incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/ModifiedDataObject.cpp (original)
+++ incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/ModifiedDataObject.cpp Thu Oct 11 00:21:41 2007
@@ -21,63 +21,98 @@
 namespace apache {
 	namespace das {
 		namespace rdb {
-
+			
 ModifiedDataObject::ModifiedDataObject(const Table& table, commonj::sdo::DataObjectPtr dataObject, 
 			commonj::sdo::ChangeSummaryPtr changeSummary) : DASDataObject(table, dataObject, changeSummary) {
 	
-	std::string statement;
-	statement.append("update ").append(table.getTableName()).append(" set");
+	bool modifiedOnGraph = changeSummary->isCreated(dataObject) || changeSummary->isDeleted(dataObject) || changeSummary->isModified(dataObject);
 	const KeyDataList& columnDataList = getPrimaryKeys();
 	unsigned int pkCount = 0;
 	unsigned int pkColumnCount = columnDataList.size();
-
-	commonj::sdo::SettingList& settings = changeSummary->getOldValues(dataObject);
-
-	for (int i = 0 ; i < settings.size() ; i++) {
-		std::string propName = settings[i].getProperty().getName();
-		const Column* column = table.getColumnByProperty(propName);
+	bool dataTypeModified = false;
+	//pkModified = false;
 		
-		KeyDataList::const_iterator it = columnDataList.find(column->getName());
+	if (modifiedOnGraph) {
+		statement.append("update ").append(table.getTableName()).append(" set");
+		commonj::sdo::SettingList& settings = changeSummary->getOldValues(dataObject);
+		/*const KeyDataList& keyDataList = getPrimaryKeys();
+
+		for (KeyDataList::const_iterator pkIt = keyDataList.begin() ; pkIt != keyDataList.end() ; pkIt++) {
+			ColumnData actualColumnData(pkIt->second->getColumn(), dataObject);
+
+			if (actualColumnData != *pkIt->second) {
+				pkModified = true;
+				break;
 
-		if (it == columnDataList.end()) {
-			sets.append(" ").append(column->getName()).append("=").append(ColumnData(*column, dataObject).toSQL()).append(",");
-		}
+			}
 
-	}
-	
-	pkWhere = " where ";
+		}*/
+
+		for (int i = 0 ; i < settings.size() ; i++) {
 
-	for (KeyDataList::const_iterator columnDataListIterator = columnDataList.begin() ;
-		columnDataListIterator != columnDataList.end() ; columnDataListIterator++) {
+			if (settings[i].getType().isDataType()) {
 
-			ColumnData& columnData = *columnDataListIterator->second;
-			pkWhere.append(columnData.getColumn().getName()).append("=").append(columnData.toSQL());
-			pkCount++;
+				if (dataTypeModified) {
+					statement.append(",");
+				}
 
-			if (pkCount != pkColumnCount) {
-				pkWhere.append(" and ");
+				std::string propName = settings[i].getProperty().getName();
+				const Column* column = table.getColumnByProperty(propName);
+				dataTypeModified = true;
+				statement.append(" ").append(column->getName()).append("=").append(ColumnData(*column, dataObject).toSQL());
+		
 			}
 
+		}
+
+		if (!dataTypeModified) {
+			statement = "";
+		} else {
+			statement.append(" ").append(getWhereStmt()).append(";");
+		}
+		
 	}
 
-	pkWhere.append(";");
-	
 }
 
-void ModifiedDataObject::setFK(std::string relationshipName, const KeyDataList* keyDataList) {
-
-	if (keyDataList == 0) {
-		std::map<std::string, const KeyDataList*>::const_iterator it = fks.find(relationshipName);
+ModifiedDataObject::~ModifiedDataObject(void) {}
+			
+//bool ModifiedDataObject::isPKModified(void) const {
+//	return pkModified;
+//}
+
+
+//
+//void ModifiedDataObject::printStmt() {
+//	DASDataObject::printStmt();
+//
+//	if (sets.size() != 0 || fks.size() != 0) {
+//		std::string statement;
+//		statement.append("update ").append(getTable().getTableName()).append(" set").append(sets);
+//
+//		for (std::map<std::string, const ColumnData*>::const_iterator it = fks.begin() ; it != fks.end() ; it++) {
+//
+//			statement.append(" ").append(it->first).append("=");
+//
+//			if (it->second == 0) {
+//				statement.append(SQL_NULL_VALUE);
+//			} else {
+//				statement.append(it->second->toSQL());
+//			}
+//
+//		}
+//
+//		statement.append(" ").append(whereStmt).append(";");
+//
+//		std::cout << statement << std::endl;
+//
+//	}
+//
+//}
 
-		if (it != fks.end() && it->second != 0) {
-			return;
-		}
-
-	}
 
-	fks.insert(std::make_pair(relationshipName, keyDataList));
 
-}
+		
 
 		};
 	};

Modified: incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/PKObject.cpp
URL: http://svn.apache.org/viewvc/incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/PKObject.cpp?rev=583710&r1=583709&r2=583710&view=diff
==============================================================================
--- incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/PKObject.cpp (original)
+++ incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/PKObject.cpp Thu Oct 11 00:21:41 2007
@@ -19,7 +19,6 @@
 #include "apache/das/rdb/PKObject.h"
 #include "apache/das/rdb/ColumnData.h"
 
-
 namespace apache {
 	namespace das {
 		namespace rdb {

Added: incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/RelationshipStatement.cpp
URL: http://svn.apache.org/viewvc/incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/RelationshipStatement.cpp?rev=583710&view=auto
==============================================================================
--- incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/RelationshipStatement.cpp (added)
+++ incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/RelationshipStatement.cpp Thu Oct 11 00:21:41 2007
@@ -0,0 +1,96 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.    
+ */
+#include "apache/das/rdb/RelationshipStatement.h"
+#include "apache/das/rdb/Relationship.h"
+
+namespace apache {
+	namespace das {
+		namespace rdb {
+
+RelationshipStatement::RelationshipStatement(const Relationship& relationship, const KeyDataList* keyDataList) {
+	this->relationship = &relationship;
+	this->keyDataList = keyDataList;
+	executed = false;
+
+}
+
+void RelationshipStatement::setDASDataObject(DASDataObject& dataObject) {
+	this->dataObject = &dataObject;
+}
+
+RelationshipStatement::~RelationshipStatement(void) {}
+
+bool RelationshipStatement::isUnset(void) const {
+	return keyDataList == 0;
+}
+
+DASDataObject& RelationshipStatement::getDASDataObject(void) const {
+	return *dataObject;
+}
+
+void RelationshipStatement::setFKList(const KeyDataList* keyDataList) {
+	this->keyDataList = keyDataList;
+}
+
+void RelationshipStatement::execute(StatementPtr statement) {
+
+	if (!executed) {
+		const std::map<std::string, const KeyPair*>& keyPairs = relationship->getKeyPairs();	
+		std::string stmt;
+		stmt.append("update ").append(relationship->getFKTableName()).append(" set");
+		unsigned int i = 1;
+		
+		for (std::map<std::string, const KeyPair*>::const_iterator it = keyPairs.begin() ; it != keyPairs.end() ; it++) {
+			stmt.append(" ").append(it->second->getFKColumnName()).append("=");
+
+			if (keyDataList == 0) {
+				stmt.append(SQL_NULL_VALUE);
+			} else {
+				KeyDataList::const_iterator pkIt = keyDataList->find(it->second->getPKColumnName());
+
+				if (pkIt == keyDataList->end()) {
+					//throw exception
+				}
+
+				stmt.append(pkIt->second->toSQL());
+
+			}
+
+			if (i != keyPairs.size()) {
+				stmt.append(",");
+			}
+
+			i++;
+
+		}
+
+		//statement->executeQuery("commit");
+		stmt.append(" ").append(dataObject->getWhereStmt()).append(";");
+		//std::cout << stmt << std::endl;
+		statement->executeQuery(stmt);
+		
+		executed = true;
+
+	}
+
+}
+
+		};
+	};
+};

Modified: incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/ResultSet.cpp
URL: http://svn.apache.org/viewvc/incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/ResultSet.cpp?rev=583710&r1=583709&r2=583710&view=diff
==============================================================================
--- incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/ResultSet.cpp (original)
+++ incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/ResultSet.cpp Thu Oct 11 00:21:41 2007
@@ -51,7 +51,7 @@
 		SQLRETURN result = SQLGetData(stmt->getODBCStatement(), columnIndex + 1, SQL_C_LONG, &sqlPtr, 0, &aux);
 
 		if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO))
-			throw SQLException("Error to get database data!");
+			throw SQLException("Error on getting database data!");
 
 	} else {
 		throw DASInvalidSQLTypeException("Column sql type on index " + columnIndex + (std::string) " is not integer!");
@@ -74,7 +74,7 @@
 		SQLRETURN result = SQLGetData(stmt->getODBCStatement(), columnIndex + 1, SQL_C_WCHAR, &strAux, 1, &length);
 		
 		if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO))
-			throw SQLException("Error to get database data!");
+			throw SQLException("Error on getting database data!");
 
 		ret = (wchar_t) strAux;
 		
@@ -99,7 +99,7 @@
 		SQLRETURN result = SQLGetData(stmt->getODBCStatement(), columnIndex + 1, SQL_C_FLOAT, &real, 1, &length);
 		
 		if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO))
-			throw SQLException("Error to get database data!");
+			throw SQLException("Error on getting database data!");
 
 		ret = (float) real;
 		
@@ -124,7 +124,7 @@
 		SQLRETURN result = SQLGetData(stmt->getODBCStatement(), columnIndex + 1, SQL_C_DOUBLE, &data, 1, &length);
 		
 		if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO))
-			throw SQLException("Error to get database data!");
+			throw SQLException("error on getting database data!");
 
 		ret = (double) data;
 		
@@ -149,7 +149,7 @@
 		SQLRETURN result = SQLGetData(stmt->getODBCStatement(), columnIndex + 1, SQL_C_DOUBLE, &data, 1, &length);
 		
 		if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO))
-			throw SQLException("Error to get database data!");
+			throw SQLException("error on getting database data!");
 
 		ret = (double) data;
 		
@@ -196,7 +196,7 @@
 	SQLRETURN result = SQLColAttribute(stmt->getODBCStatement(), NULL, SQL_DESC_COUNT, NULL, NULL, NULL, &columnCount);
 		
 	if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO))
-			throw SQLException("Error to get row count!");
+			throw SQLException("error on getting row count!");
 
 	return (unsigned int) columnCount;
 
@@ -209,7 +209,7 @@
 	SQLRETURN result = SQLGetData(stmt->getODBCStatement(), columnIndex + 1, SQL_C_CHAR, &strAux, 1, &length);
 
 	if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO))
-		throw SQLException("Error to get database data!");
+		throw SQLException("error on getting database data!");
 
 	length++;
 	sqlPtr = new SQLCHAR[length];
@@ -217,7 +217,7 @@
 	result = SQLGetData(stmt->getODBCStatement(), columnIndex + 1, SQL_C_CHAR, sqlPtr, length, &aux);
 
 	if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO))
-		throw SQLException("Error to get database data!");
+		throw SQLException("error on getting database data!");
 		
 	std::string ret = (char*) sqlPtr;
 	delete [] ((SQLCHAR*) sqlPtr);

Modified: incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/Statement.cpp
URL: http://svn.apache.org/viewvc/incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/Statement.cpp?rev=583710&r1=583709&r2=583710&view=diff
==============================================================================
--- incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/Statement.cpp (original)
+++ incubator/tuscany/cpp/das/runtime/core/src/apache/das/rdb/Statement.cpp Thu Oct 11 00:21:41 2007
@@ -70,6 +70,7 @@
 }
 
 ResultSetPtr Statement::executeQuery(std::string sql) {
+	SQLCloseCursor(statementHandle);
 	SQLRETURN result = SQLExecDirect(statementHandle, (SQLCHAR*) (char*) sql.c_str(), SQL_NTS);
 
 	if ((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO)) {

Modified: incubator/tuscany/cpp/das/runtime/test/rsc/TestCases.fdb
URL: http://svn.apache.org/viewvc/incubator/tuscany/cpp/das/runtime/test/rsc/TestCases.fdb?rev=583710&r1=583709&r2=583710&view=diff
==============================================================================
Binary files - no diff available.

Modified: incubator/tuscany/cpp/das/runtime/test/src/main.cpp
URL: http://svn.apache.org/viewvc/incubator/tuscany/cpp/das/runtime/test/src/main.cpp?rev=583710&r1=583709&r2=583710&view=diff
==============================================================================
--- incubator/tuscany/cpp/das/runtime/test/src/main.cpp (original)
+++ incubator/tuscany/cpp/das/runtime/test/src/main.cpp Thu Oct 11 00:21:41 2007
@@ -31,6 +31,7 @@
 #include <apache/das/DataGraphPrinter.h>
 #include <commonj/sdo/DataObject.h>
 #include <commonj/sdo/SDORuntimeException.h>
+#include <commonj/sdo/DataFactory.h>
 #include <libxml/xmlreader.h>
 
 #define TEST_RESOURCE_PATH "../../../../runtime/test/rsc/"
@@ -113,21 +114,11 @@
 	Connection* conn;
 
 	try {
-		// Connect to a database using a connect string
-		/*string user = "SYSDBA";
-		string password = "masterkey";
-		string driver = "Firebird/InterBase(r) driver";
-		string dataSourcePath = (string) tuscanyDASCPPPath + "/../runtime/test/rsc/TestCases.fdb";
-
-		conn = new Connection((string)
-				"DRIVER=" + driver +
-				"; UID=" + user + 
-				"; PWD=" + password + 
-				";DBNAME=localhost:" + dataSourcePath + ";"
-		);*/
-
-		conn = new Connection("driver={MySQL ODBC 3.51 Driver};server=localhost;database=testcases;user=root;PWD=masterkey");
+		std::string dsn = "PostgresTestcases";
+		std::string user = "postgres";
+		std::string password = "tuscany";
 
+		conn = new Connection(dsn, user, password);
 		
 	} catch (SQLException& ex) {
 		cout << "couldn't connect to the data source: " << ex.what() << endl;
@@ -142,22 +133,20 @@
 
 		try {
 			stmt->executeQuery(clearDBStatements[i]);
-		} catch (SQLException& ex) {/*cout << ex.what() << endl;*/}
+		} catch (SQLException& ex) {cout << ex.what() << endl;}
 
 	}
 
-	//stmt->executeQuery("commit");
-	//stmt = conn->createStatement();
-
 	for (unsigned int i = 0 ; i < 19 ; i++) {
-		stmt->executeQuery(resetDBStatements[i]);
-
-		//if (i == 2) stmt->executeQuery("commit");
 
+		try {
+			stmt->executeQuery(resetDBStatements[i]);
+		} catch (SQLException& ex) {cout << ex.what() << endl;}
+	
 	}
 
 	stmt->executeQuery("commit");
-
+	
 	return conn;
 	
 }
@@ -425,22 +414,426 @@
 	cout << "-------------testDeleteOperation--------------" << endl;
 
 	Connection* conn = getConnection();
+
+	ConfigImpl config((std::string) TEST_RESOURCE_PATH + "testDeleteOperation.xml");
+	DASImpl* das = (DASImpl*) DASImpl::getFACTORY().createDAS(config, *conn);
+	CommandPtr command = das->createCommand("SELECT * FROM company, department, employee;");
+	commonj::sdo::DataObjectPtr root = command->executeQuery();
+
+	root->getDataObject("company[1]")->getDataObject("department[1]")->detach();
+	commonj::sdo::DataObjectPtr company = root->getDataObject("company[1]");
+	company->detach();
+	long removedCompanyID = company->getInt("id");
+
+	cout << "Company with id " << removedCompanyID << " deleted on database: ";
+
+	das->applyChanges(root);
+
+	command = das->createCommand("SELECT * FROM company, department, employee;");
+	root = command->executeQuery();
+
+	commonj::sdo::DataObjectList& companies = root->getList("company");
+	bool failed = false;
+	for (unsigned int i = 0 ; i < companies.size() ; i++) {
+
+		if (companies[i]->getInt("id") == removedCompanyID) {
+			cout << "Failed" << endl;
+			failed = true;
+			break;
+
+		}
+
+	}
+
+	if (!failed) {
+		cout << "OK" << endl;
+	}
+
+	delete conn;
+	
+	cout << "---------------------------------" << endl << endl;
+
+}
+
+void testCreateOperation() {
+	cout << "-------------testCreateOperation--------------" << endl;
+
+	Connection* conn = getConnection();
+	ConfigImpl config((std::string) TEST_RESOURCE_PATH + "testDeleteOperation.xml");
+	DASImpl* das = (DASImpl*) DASImpl::getFACTORY().createDAS(config, *conn);
+	CommandPtr command = das->createCommand("SELECT * FROM company, department, employee;");
+	commonj::sdo::DataObjectPtr root = command->executeQuery();
+
+	commonj::sdo::DataObjectPtr company = root->createDataObject("company");
+	StringWrapper("hp").defineOnDataObject(company, "name");
+	company->setInt("id", 40);
+
+	commonj::sdo::DataObjectPtr department = root->createDataObject("department");
+	StringWrapper("department40").defineOnDataObject(department, "name");
+	department->setInt("id", 39);
+
+	company = root->getDataObject("company[1]");
+	long departmentCompanyID = company->getInt("id");
+	company->getList("department").append(department);
+
+	commonj::sdo::DataObjectPtr employee = root->createDataObject("employee");
+	StringWrapper("juan").defineOnDataObject(employee, "name");
+	employee->setInt("id", 38);
+	department->getList("employee").append(employee);
+
+	//cout << "Company with id " << removedCompanyID << " deleted on database: ";
+
+	das->applyChanges(root);
+
+	command = das->createCommand("SELECT * FROM company, department, employee;");
+	root = command->executeQuery();
+
+	commonj::sdo::DataObjectList& departments = root->getList("department");
+	bool failed = true;
+	for (unsigned int i = 0 ; i < departments.size() ; i++) {
+		
+		if (departments[i]->getInt("id") == 39 && StringWrapper(departments[i], "name").getString() == "department40"
+			&& departments[i]->getDataObject("employee[1]")->getInt("id") == 38
+			&& StringWrapper(departments[i]->getDataObject("employee[1]"), "name").getString() == "juan") {
+
+			failed = false;
+			break;
+
+		}
+
+	}
+
+	if (!failed) {
+		failed = true;
+		commonj::sdo::DataObjectList& companies = root->getList("company");
+		for (unsigned int i = 0 ; i < companies.size() ; i++) {
+			
+			if (companies[i]->getInt("id") == departmentCompanyID) {
+				commonj::sdo::DataObjectList& companyDepartments = root->getList("department");
+				
+				for (unsigned int i = 0 ; i < companyDepartments.size() ; i++) {
+
+					if (companyDepartments[i]->getInt("id") == 39) {
+						failed = false;
+						break;
+
+					}
+
+				}
+
+				break;
+
+			}
+
+		}
+
+	}
+
+	if (failed) {
+		cout << "Failed" << endl;
+	} else {
+		cout << "OK" << endl;
+	}
+
+
+	delete conn;
+	
+	cout << "---------------------------------" << endl << endl;
+
+}
+
+void testMofidyOperation2() {
+	cout << "-------------testMofidyOperation2--------------" << endl;
+
+	Connection* conn = getConnection();
+	ConfigImpl config((std::string) TEST_RESOURCE_PATH + "testDeleteOperation.xml");
+	DASImpl* das = (DASImpl*) DASImpl::getFACTORY().createDAS(config, *conn);
+	CommandPtr command = das->createCommand("SELECT * FROM company, department, employee;");
+	commonj::sdo::DataObjectPtr root = command->executeQuery();
+
+	/*DataGraphPrinter(root).printMetaData(cout);
+	DataGraphPrinter(root).print(cout);*/
+
+	commonj::sdo::DataObjectPtr company = root->getDataObject("company[1]");
+	StringWrapper("intel").defineOnDataObject(company, "name");
+	
+	commonj::sdo::DataObjectPtr department = root->createDataObject("department");
+	StringWrapper("department40").defineOnDataObject(department, "name");
+	department->setInt("id", 39);
+	company->getList("department").append(department);
+
+	department = company->getDataObject("department[1]");
+	
+	commonj::sdo::DataObjectPtr employee = root->createDataObject("employee");
+	StringWrapper("albert").defineOnDataObject(employee, "name");
+	employee->setInt("id", 37);
+	department->getList("employee").append(employee);
+
+	std::cout << "department modified:" << std::endl;
+	department->printSelf(std::cout);
+
+
+	das->applyChanges(root);
+
+	delete conn;
+	
+	cout << "---------------------------------" << endl << endl;
+
+}
+
+void test() {
+
+	/*Connection* conn = getConnection();
+	ConfigImpl config((std::string) TEST_RESOURCE_PATH + "testDeleteOperation.xml");
+	DASImpl* das = (DASImpl*) DASImpl::getFACTORY().createDAS(config, *conn);
+	CommandPtr command = das->createCommand("SELECT * FROM company, department, employee;");
+	commonj::sdo::DataObjectPtr root = command->executeQuery();
+
+	commonj::sdo::DataObjectPtr company1 = root->getDataObject("company[1]");
+	commonj::sdo::DataObjectPtr company2 = root->getDataObject("company[1]");
+	
+	department = company1->getList("department").remove(0);
+	company2->getList("department").append(department);
+
+	commonj::sdo::ChangeSummaryPtr csummary = root->getChangeSummary();
+	
+	commonj::sdo::SettingList& settings = csummary->getOldValues();
+
+	
+	das->applyChanges(root);
+
+	delete conn;*/
+
+	commonj::sdo::DataFactoryPtr mdg  = commonj::sdo::DataFactory::getDataFactory();
+
+    mdg->addType("apache.tuscany.das", "Root");
+	mdg->addType("apache.tuscany.das", "company");
+	mdg->addType("apache.tuscany.das", "department");
+	mdg->addType("apache.tuscany.das", "employee");
+
+	const commonj::sdo::Type& rootType = mdg->getType("apache.tuscany.das", "Root");
+	const commonj::sdo::Type& companyType = mdg->getType("apache.tuscany.das", "company");
+	const commonj::sdo::Type& departmentType = mdg->getType("apache.tuscany.das", "department");
+	const commonj::sdo::Type& employeeType = mdg->getType("apache.tuscany.das", "employee");
+	
+	mdg->addPropertyToType("apache.tuscany.das", "Root", "ChangeSummary", "commonj.sdo", "ChangeSummary", false, false, true);
+	mdg->addPropertyToType("apache.tuscany.das", "Root", "company", "apache.tuscany.das", "company", true, false, true);
+	mdg->addPropertyToType("apache.tuscany.das", "Root", "employee", "apache.tuscany.das", "employee", true, false, true);
+	mdg->addPropertyToType("apache.tuscany.das", "Root", "department", "apache.tuscany.das", "department", true, false, true);
+
+	mdg->addPropertyToType("apache.tuscany.das", "company", "id", "commonj.sdo", "Integer", false, false, true);
+	mdg->addPropertyToType("apache.tuscany.das", "company", "name", "commonj.sdo", "String", false, false, true);
+	mdg->addPropertyToType("apache.tuscany.das", "company", "department", "apache.tuscany.das", "department", true, false, false);
+
+	mdg->addPropertyToType("apache.tuscany.das", "department", "id", "commonj.sdo", "Integer", false, false, true);
+	mdg->addPropertyToType("apache.tuscany.das", "department", "name", "commonj.sdo", "String", false, false, true);
+	mdg->addPropertyToType("apache.tuscany.das", "department", "employee", "apache.tuscany.das", "employee", true, false, false);
+
+	mdg->addPropertyToType("apache.tuscany.das", "employee", "id", "commonj.sdo", "Integer", false, false, true);
+	mdg->addPropertyToType("apache.tuscany.das", "employee", "name", "commonj.sdo", "String", false, false, true);
+	
+	std::wstring waux;
+	commonj::sdo::DataObjectPtr root = mdg->create(rootType);
+
+	commonj::sdo::DataObjectPtr company1 = root->createDataObject("company");
+	company1->setInt("id", 1);
+	waux = L"apache";
+	company1->setString("name", waux.c_str(), waux.length());
+	
+	commonj::sdo::DataObjectPtr company2 = root->createDataObject("company");
+	company2->setInt("id", 2);
+	waux = L"acme";
+	company2->setString("name", waux.c_str(), waux.length());
+
+	commonj::sdo::DataObjectPtr company3 = root->createDataObject("company");
+	company3->setInt("id", 3);
+	waux = L"google";
+	company3->setString("name", waux.c_str(), waux.length());
+
+	commonj::sdo::DataObjectPtr company4 = root->createDataObject("company");
+	company1->setInt("id", 4);
+	waux = L"ibm";
+	company4->setString("name", waux.c_str(), waux.length());
+
+	commonj::sdo::DataObjectPtr company5 = root->createDataObject("company");
+	company5->setInt("id", 5);
+	waux = L"yahoo";
+	company5->setString("name", waux.c_str(), waux.length());
+
+	commonj::sdo::DataObjectPtr depart1 = root->createDataObject("department");
+	depart1->setInt("id", 1);
+	waux = L"department1";
+	depart1->setString("name", waux.c_str(), waux.length());
+
+	commonj::sdo::DataObjectPtr depart2 = root->createDataObject("department");
+	depart2->setInt("id", 2);
+	waux = L"department1";
+	depart2->setString("name", waux.c_str(), waux.length());
+
+	commonj::sdo::DataObjectPtr depart3 = root->createDataObject("department");
+	depart3->setInt("id", 3);
+	waux = L"department2";
+	depart3->setString("name", waux.c_str(), waux.length());
+
+	commonj::sdo::DataObjectPtr depart4 = root->createDataObject("department");
+	depart4->setInt("id", 4);
+	waux = L"department5";
+	depart4->setString("name", waux.c_str(), waux.length());
+
+	commonj::sdo::DataObjectPtr depart5 = root->createDataObject("department");
+	depart5->setInt("id", 5);
+	waux = L"department3";
+	depart5->setString("name", waux.c_str(), waux.length());
+
+	commonj::sdo::DataObjectPtr depart6 = root->createDataObject("department");
+	depart6->setInt("id", 6);
+	waux = L"department6";
+	depart6->setString("name", waux.c_str(), waux.length());
+
+	commonj::sdo::DataObjectPtr employee1 = root->createDataObject("employee");
+	employee1->setInt("id", 1);
+	waux = L"adriano";
+	employee1->setString("name", waux.c_str(), waux.length());
+
+	commonj::sdo::DataObjectPtr employee2 = root->createDataObject("employee");
+	employee2->setInt("id", 2);
+	waux = L"paul";
+	employee2->setString("name", waux.c_str(), waux.length());
+
+	commonj::sdo::DataObjectPtr employee3 = root->createDataObject("employee");
+	employee3->setInt("id", 3);
+	waux = L"richard";
+	employee3->setString("name", waux.c_str(), waux.length());
+
+	commonj::sdo::DataObjectPtr employee4 = root->createDataObject("employee");
+	employee4->setInt("id", 4);
+	waux = L"ema";
+	employee4->setString("name", waux.c_str(), waux.length());
+
+	commonj::sdo::DataObjectPtr employee5 = root->createDataObject("employee");
+	employee5->setInt("id", 5);
+	waux = L"james";
+	employee5->setString("name", waux.c_str(), waux.length());
+
+	company1->getList("department").append(depart1);
+	company1->getList("department").append(depart2);
+
+	company2->getList("department").append(depart3);
+	company2->getList("department").append(depart4);
+
+	company3->getList("department").append(depart5);
+	company3->getList("department").append(depart6);
+
+	depart1->getList("employee").append(employee1);
+	depart1->getList("employee").append(employee2);
+	depart1->getList("employee").append(employee3);
+
+	root->getChangeSummary()->beginLogging();
+
+	commonj::sdo::DataObjectPtr department = company1->getList("department").remove(0);
+
+	cout << "removed department:" << endl;
+	department->printSelf(cout);
+
+	company2->getList("department").append(department);
+
+	commonj::sdo::SettingList& settings = root->getChangeSummary()->getOldValues(company1);	
+
+	for (unsigned int i = 0 ; i < settings.size() ; i++) {
+
+		if ((std::string) settings[i].getProperty().getName() == "department") {
+			settings[i].getDataObjectValue()->printSelf(cout);
+		}
+
+	}
+
+}
+
+void printCompany(commonj::sdo::DataObjectPtr company) {
+	cout << "----------------------" << endl;
+	company->printSelf(cout);
+
+	commonj::sdo::DataObjectList& departments = company->getList("department");
+
+	for (unsigned int i = 0 ; i < departments.size() ; i++) {
+		departments[i]->printSelf(cout);
+	}
+
+	cout << "----------------------" << endl << endl;
+
+}
+
+void testMofidyOperation() {
+	cout << "-------------testMofidyOperation--------------" << endl;
+
+	Connection* conn = getConnection();
 	ConfigImpl config((std::string) TEST_RESOURCE_PATH + "testDeleteOperation.xml");
 	DASImpl* das = (DASImpl*) DASImpl::getFACTORY().createDAS(config, *conn);
 	CommandPtr command = das->createCommand("SELECT * FROM company, department, employee;");
 	commonj::sdo::DataObjectPtr root = command->executeQuery();
 
-	DataGraphPrinter(root).printMetaData(cout);
-	DataGraphPrinter(root).print(cout);
+	//DataGraphPrinter(root).print(cout);
+
+	commonj::sdo::DataObjectPtr company1 = root->getDataObject("company[1]");
+	commonj::sdo::DataObjectPtr company2 = root->getDataObject("company[2]");
+
+	StringWrapper("intel").defineOnDataObject(company1, "name");
 
+	commonj::sdo::DataObjectPtr department = root->createDataObject("department");
+	StringWrapper("department40").defineOnDataObject(department, "name");
+	department->setInt("id", 39);
+	company1->getList("department").append(department);
 
-	//root->getDataObject("company[1]")->getDataObject("department[1]")->detach();
-	root->getDataObject("company[1]")->detach();
+	department = company1->getList("department").remove(0);//company->getDataObject("department[1]");
+	company2->getList("department").append(department);
 
-	commonj::sdo::ChangeSummaryPtr summary = root->getChangeSummary();
+	commonj::sdo::DataObjectPtr employee = root->createDataObject("employee");
+	StringWrapper("albert").defineOnDataObject(employee, "name");
+	employee->setInt("id", 37);
+	department->getList("employee").append(employee);
 
 	das->applyChanges(root);
 
+	commonj::sdo::DataObjectPtr dob;
+	bool failed = false;
+	try {
+		dob = root->getDataObject("company[name='intel']");
+	} catch (commonj::sdo::SDOPathNotFoundException& ex) {
+		cout << ex.getMessageText() << endl;
+		failed = true;
+
+	}
+
+	try {
+		dob = root->getDataObject("company[name='intel']/department[name='department40' and id=39]");
+	} catch (commonj::sdo::SDOPathNotFoundException& ex) {
+		cout << ex.getMessageText() << endl;
+		failed = true;
+
+	}
+
+	try {
+		dob = root->getDataObject("company[id=2]/department[id=1]");
+	} catch (commonj::sdo::SDOPathNotFoundException& ex) {
+		cout << ex.getMessageText() << endl;
+		failed = true;
+
+	}
+
+	try {
+		dob = root->getDataObject("company[id=2]/department[id=1]/employee[id=37 and name='albert']");
+	} catch (commonj::sdo::SDOPathNotFoundException& ex) {
+		cout << ex.getMessageText() << endl;
+		failed = true;
+
+	}
+
+	if (failed) {
+		cout << "Failed" << endl;
+	} else {
+		cout << "OK" << endl;
+	}
+	
 	delete conn;
 	
 	cout << "---------------------------------" << endl << endl;
@@ -503,12 +896,24 @@
 }
 
 int main() {
+
+	try {
+		testMofidyOperation();
+	} catch (std::exception& exp) {
+		cout << "Exception occurred: " << exp.what() << endl;
+	}
 	
-	/*try {
+	try {
 		testDeleteOperation();
 	} catch (std::exception& exp) {
 		cout << "Exception occurred: " << exp.what() << endl;
-	}*/
+	}
+
+	try {
+		testCreateOperation();
+	} catch (std::exception& exp) {
+		cout << "Exception occurred: " << exp.what() << endl;
+	}
 	
 	try {
 		testPointers();



---------------------------------------------------------------------
To unsubscribe, e-mail: tuscany-commits-unsubscribe@ws.apache.org
For additional commands, e-mail: tuscany-commits-help@ws.apache.org