<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -571,6 +571,14 @@ module Rhom
                   end
                 end
               end #class methods
+	          
+	          # if app server does not support oo in inserts. 
+	          # app client should check this method before update or delete
+	          # overwise all modifications of unconfirmed created item will be lost
+	          def can_modify
+                result = ::Rhom::RhomDbAdapter.execute_sql(&quot;SELECT object FROM changed_values WHERE sent&gt;1 LIMIT 1 OFFSET 0&quot;)
+                return !(result &amp;&amp; result.length &gt; 0) 
+	          end
 	            
               # deletes the record from the viewable list as well as
               # adding a delete record to the list of sync operations
@@ -590,7 +598,7 @@ module Rhom
                         update_type = nil                              
                       end
                       
-                      ::Rhom::RhomDbAdapter.delete_from_table('changed_values', {&quot;object&quot;=&gt;obj})
+                      ::Rhom::RhomDbAdapter.delete_from_table('changed_values', {&quot;object&quot;=&gt;obj, &quot;sent&quot;=&gt;0})
                       
                       if update_type
                         # now add delete operation</diff>
      <filename>lib/framework/rhom/rhom_object_factory.rb</filename>
    </modified>
    <modified>
      <diff>@@ -72,6 +72,11 @@ public class DBAdapter extends RubyBasic {
 		Object[] values = {arg1,arg2,arg3};
 		return executeSQL(strStatement,values);
 	}
+	public IDBResult executeSQL(String strStatement, Object arg1, Object arg2, Object arg3, Object arg4)throws DBException{
+		Object[] values = {arg1,arg2,arg3,arg4};
+		return executeSQL(strStatement,values);
+	}
+	
 	public IDBResult executeSQL(String strStatement, Object arg1, Object arg2, Object arg3, Object arg4, Object arg5)throws DBException{
 		Object[] values = {arg1,arg2,arg3,arg4,arg5};
 		return executeSQL(strStatement,values);</diff>
      <filename>platform/shared/rubyJVM/src/com/rho/db/DBAdapter.java</filename>
    </modified>
    <modified>
      <diff>@@ -41,7 +41,7 @@ class SyncSource
 	private static final RhoProfiler PROF = RhoProfiler.RHO_STRIP_PROFILER ? new RhoEmptyProfiler() : 
 		new RhoProfiler();
 
-	public static final int edpNone = 0, /*edpCreateObjects = 1,*/ edpDeleteObjects = 2;
+	public static final int edpNone = 0, edpDeleteObjects = 2;
 	
 	static class SyncBlob
 	{
@@ -105,7 +105,6 @@ class SyncSource
     int  getProgressStep(){ return m_nProgressStep; }
 
     void setSyncServerDataPass(int ePass){m_eSyncServerDataPass = ePass;}
-    //boolean isCreateObjectsPass(){ return m_eSyncServerDataPass == edpCreateObjects; }
     boolean isDeleteObjectsPass(){ return m_eSyncServerDataPass == edpDeleteObjects; }
     
     SyncEngine getSync(){ return m_syncEngine; }
@@ -152,10 +151,10 @@ class SyncSource
 	        if ( isEmptyToken() )
 	            processToken(&quot;1&quot;);
 	    	
-	        //boolean bSyncedServer = false;
+	        boolean bSyncedServer = false;
 	        if ( m_strParams.length() == 0 || m_bSearchSyncChanges )
 	        {
-	            /*if ( isPendingClientChanges() )
+	            if ( isPendingClientChanges() )
 	            {
 	                syncServerChanges();
 	                bSyncedServer = true;
@@ -164,7 +163,7 @@ class SyncSource
 	            if ( bSyncedServer &amp;&amp; isPendingClientChanges() )
 	                getSync().setState(SyncEngine.esStop);
 	            else
-	            {*/
+	            {
 	                boolean bSyncClient = false;
 	                {
 	                    IDBResult res = getDB().executeSQL(&quot;SELECT object FROM changed_values WHERE source_id=? and sent&lt;=1 LIMIT 1 OFFSET 0&quot;, getID());
@@ -174,13 +173,13 @@ class SyncSource
 	                {
 	                    syncClientChanges();
 	                    getAndremoveAsk();
-	                    //bSyncedServer = false;
+	                    bSyncedServer = false;
 	                }
-	            //}
+	            }
 	        }
 	        PROF.STOP(&quot;Pull&quot;);
 
-	        //if ( !bSyncedServer )
+	        if ( !bSyncedServer )
 	        	syncServerChanges();
 	        
 	    }catch(Exception exc)
@@ -193,22 +192,14 @@ class SyncSource
 								 &quot;last_sync_duration=?,last_sync_success=? WHERE source_id=?&quot;, 
 		                         new Long(endTime.toULong()), new Integer(getInsertedCount()), new Integer(getDeletedCount()), new Long((endTime.minus(startTime)).toULong()), 
 		                         new Integer(m_bGetAtLeastOnePage?1:0), getID() );
-		    
-		    //String profName = &quot;File operations: &quot; + getName();
-		    //PROF.FLUSH_COUNTER(RhoProfiler.FILE_SYNC, profName);
-		    //PROF.FLUSH_COUNTER(RhoProfiler.FILE_READ, profName);
-		    //PROF.FLUSH_COUNTER(RhoProfiler.FILE_WRITE, profName);
-		    //PROF.FLUSH_COUNTER(RhoProfiler.FILE_SET_SIZE, profName);
-		    //PROF.FLUSH_COUNTER(RhoProfiler.FILE_DELETE, profName);
-		    //PROF.FLUSH_COUNTER(RhoProfiler.FILE_RENAME, profName);
 	    }
 	}
 
-	/*boolean isPendingClientChanges()throws DBException
+	boolean isPendingClientChanges()throws DBException
 	{
 	    IDBResult res = getDB().executeSQL(&quot;SELECT object FROM changed_values WHERE source_id=? and update_type='create' and sent&gt;1  LIMIT 1 OFFSET 0&quot;, getID());
 	    return !res.isEnd();
-	}*/
+	}
 	
 	void syncClientBlobs(String strBaseQuery)throws Exception
 	{
@@ -270,55 +261,23 @@ class SyncSource
 	        if ( m_arSyncBlobs.size()&gt;0 )
 	        {
 			    LOG.INFO( &quot;Push blobs to server. Source id: &quot; + getID() + &quot;Count :&quot; + m_arSyncBlobs.size() );
-/*
-	            if ( getSync().SYNC_VERSION() &lt; 2 &amp;&amp; i &lt;= 1 ) //create, update
-	            {
-	                IDBResult res = getDB().executeSQL(&quot;SELECT object, attrib &quot; +
-						     &quot;FROM changed_values WHERE source_id=? and update_type=? and (attrib_type IS NULL or attrib_type!=?) and sent=1&quot;, 
-	                    getID(), arUpdateTypes[i], &quot;blob.file&quot; );
-	                if ( !res.isEnd() )
-	                {
-	                    getDB().startTransaction();
-
-		                for( ; !res.isEnd(); res.next() )
-		                {
-		                    getDB().executeSQL(&quot;DELETE FROM object_values WHERE object=? and attrib=? and source_id=?&quot;, 
-		                        res.getStringByIdx(0), res.getStringByIdx(1), getID() );
-		                }
-		                    
-	                    getDB().endTransaction();
-	                }
-	            }
-
-	            if ( getSync().SYNC_VERSION() &gt;= 2 &amp;&amp; i &lt;= 1 )// update
+	            //oo conflicts
+	            if ( i &lt; 1 ) //create
 	                getDB().executeSQL(&quot;UPDATE changed_values SET sent=2 WHERE source_id=? and update_type=? and (attrib_type IS NULL or attrib_type!=?) and sent=1&quot;, 
 	                    getID(), arUpdateTypes[i], &quot;blob.file&quot; );
-	            else*/
+	            else
+	            //
 	            	getDB().executeSQL(&quot;DELETE FROM changed_values WHERE source_id=? and update_type=? and (attrib_type IS NULL or attrib_type!=?) and sent=1&quot;, 
 	            		getID(), arUpdateTypes[i], &quot;blob.file&quot; );
 	            
 	            syncClientBlobs(strUrl+strQuery);
 	        }else if ( strBody.length() &gt; 0 )
 	        {
-	        	/*if ( getSync().SYNC_VERSION() &lt; 2 &amp;&amp; i &lt;= 1 ) //create, update
-	            {
-	                IDBResult res = getDB().executeSQL(&quot;SELECT object, attrib &quot;+
-						     &quot;FROM changed_values where source_id=? and update_type =? and sent=1&quot;, getID(), arUpdateTypes[i] );
-	                if ( !res.isEnd() )
-	                {
-	                    getDB().startTransaction();
-
-		                for( ; !res.isEnd(); res.next() )
-		                {
-		                    getDB().executeSQL(&quot;DELETE FROM object_values WHERE object=? and attrib=? and source_id=?&quot;, 
-		                        res.getStringByIdx(0), res.getStringByIdx(1), getID() );
-		                }
-	                    getDB().endTransaction();
-	                }
-	            }
-	            if ( getSync().SYNC_VERSION() &gt;= 2 &amp;&amp; i &lt;= 1 )// update
+	            //oo conflicts
+	            if ( i &lt; 1 ) //create
 	                getDB().executeSQL(&quot;UPDATE changed_values SET sent=2 WHERE source_id=? and update_type=? and sent=1&quot;, getID(), arUpdateTypes[i] );
-	            else*/
+	            else
+	            //
 	            	getDB().executeSQL(&quot;DELETE FROM changed_values WHERE source_id=? and update_type=? and sent=1&quot;, getID(), arUpdateTypes[i] );
 	        }
 	    }
@@ -432,9 +391,7 @@ class SyncSource
 	            strQuery += &quot;&amp;question=&quot; + getAskParams();
 	        }
 	
-	        /*if ( isEmptyToken() )
-	            processToken(&quot;1&quot;);
-	        else*/ if ( !m_bTokenFromDB &amp;&amp; isTokenMoreThanOne() )
+	        if ( !m_bTokenFromDB &amp;&amp; isTokenMoreThanOne() )
 	            strQuery += &quot;&amp;ack_token=&quot; + getToken();
 	
 			LOG.INFO( &quot;Pull changes from server. Url: &quot; + (strUrl+strQuery) );
@@ -500,7 +457,6 @@ class SyncSource
 	    {
 	        m_strError = oJsonArr.getCurItem().getString(&quot;error&quot;);
 	        m_nErrCode = RhoRuby.ERR_CUSTOMSYNCSERVER;
-	        //processToken(&quot;0&quot;);
 	        getSync().stopSync();
 	        return;
 	    }
@@ -532,7 +488,9 @@ class SyncSource
 	        oJsonArr.next();
 	    }else if ( getCurPageCount() == 0 )
 	    {
-	    	//getDB().executeSQL(&quot;DELETE FROM changed_values where source_id=? and sent&gt;=3&quot;, getID() );
+	    	//oo conflicts
+	    	getDB().executeSQL(&quot;DELETE FROM changed_values where source_id=? and sent&gt;=3&quot;, getID() );
+	    	//
 	        processToken(&quot;0&quot;);
 	    }
 	    
@@ -542,27 +500,17 @@ class SyncSource
 		PROF.STOP(&quot;Data1&quot;);
 		if ( !oJsonArr.isEnd() &amp;&amp; getSync().isContinueSync() )
 		{
-		    //TODO: support DBExceptions
 			PROF.START(&quot;Data&quot;);
 		    getDB().startTransaction();
 
 		    try{
-		        /*if ( nVersion == 0 )
-		            processServerData_Ver0(oJsonArr);
-		        else
-	            {*/
-		            int nSavedPos = oJsonArr.getCurPos();
-		            setSyncServerDataPass(edpNone);
-		            processServerData_Ver1(oJsonArr);
-
-		            setSyncServerDataPass(edpDeleteObjects);
-		            oJsonArr.reset(nSavedPos);
-		            processServerData_Ver1(oJsonArr);
-
-		            //setSyncServerDataPass(edpNone);
-		            //oJsonArr.reset(nSavedPos);
-		            //processServerData_Ver1(oJsonArr);
-	            //}
+	            int nSavedPos = oJsonArr.getCurPos();
+	            setSyncServerDataPass(edpNone);
+	            processServerData_Ver1(oJsonArr);
+
+	            setSyncServerDataPass(edpDeleteObjects);
+	            oJsonArr.reset(nSavedPos);
+	            processServerData_Ver1(oJsonArr);
 		        
 			    PROF.STOP(&quot;Data&quot;);		    
 		    	
@@ -584,29 +532,103 @@ class SyncSource
 	    	getNotify().fireSyncNotification(this, false, RhoRuby.ERR_NONE, &quot;&quot;);
 		PROF.STOP(&quot;Data1&quot;);
 	}
-/*
-	void processServerData_Ver0(JSONArrayIterator oJsonArr)throws Exception
+
+	boolean processSyncObject_ver1(JSONEntry oJsonObject, Integer nSrcID)throws Exception
 	{
-	    for( ; !oJsonArr.isEnd() &amp;&amp; getSync().isContinueSync(); oJsonArr.next() )
+		String strOldObject = oJsonObject.getString(&quot;oo&quot;);
+	    if ( isDeleteObjectsPass() != (nSrcID.intValue() &lt; 0) )
+	    	return true;
+	    
+	    if ( oJsonObject.hasName(&quot;e&quot;) )
 	    {
-	        if ( getDB().isUnlockDB() )
-	        {
-				LOG.INFO( &quot;Commit transaction because of UI request.&quot; );
-	            getDB().endTransaction();
-	            getDB().startTransaction();
-	        }
-	
-	        JSONEntry oJsonObject = oJsonArr.getCurItem();
-	        if( !processSyncObject(oJsonObject))
-            {
-	            getSync().stopSync();
-	            break;
-            }
-	        
-	        m_bGetAtLeastOnePage = true;
+	    	String strError = oJsonObject.getString(&quot;e&quot;);
+	        getNotify().addCreateObjectError(nSrcID,strOldObject,strError);
+	        return true;
 	    }
-	}*/
 
+		String strObject = oJsonObject.getString(&quot;o&quot;);
+		JSONArrayIterator oJsonArr = new JSONArrayIterator(oJsonObject, &quot;av&quot;);
+	    //oo conflicts
+	    boolean bUpdatedOO = false;
+	    //
+	    for( ; !oJsonArr.isEnd() &amp;&amp; getSync().isContinueSync(); m_nAttribCounter++, oJsonArr.next() )
+		{
+			JSONEntry oJsonEntry = oJsonArr.getCurItem();
+	        if ( oJsonEntry.isEmpty() )
+	        	continue;
+	        
+		    if ( nSrcID.intValue() &gt;= 0 ) //insert
+		    {
+		    	CValue value = new CValue(oJsonEntry,1);
+		    	if ( !downloadBlob(value) )
+		    		return false;
+		    	
+		    	String strAttrib = oJsonEntry.getString(&quot;a&quot;);
+	            //oo conflicts
+	            if ( strOldObject != null )
+	            {
+	                if ( !bUpdatedOO )
+	                {
+	                    getDB().executeSQL(&quot;UPDATE object_values SET object=? where object=? and source_id=?&quot;, strObject, strOldObject, nSrcID );
+	                    getDB().executeSQL(&quot;UPDATE changed_values SET object=? where object=? and source_id=?&quot;, strObject, strOldObject, nSrcID );
+
+	                    getNotify().onObjectChanged(nSrcID,strOldObject, SyncNotify.enCreate);
+
+	                    bUpdatedOO = true;
+	                }
+
+	                getDB().executeSQL(&quot;UPDATE changed_values SET main_id=? where object=? and attrib=? and source_id=? and sent&lt;=1&quot;, value.m_nID, strObject, strAttrib, nSrcID );
+	                getDB().executeSQL(&quot;UPDATE changed_values SET sent=4 where object=? and attrib=? and source_id=? and sent&gt;1&quot;, strObject, strAttrib, nSrcID );
+
+	                getDB().executeSQL(&quot;UPDATE object_values SET id=? WHERE object=? and attrib=? and source_id=?&quot;, 
+	                    value.m_nID, strObject, strAttrib, nSrcID );
+	            }else//
+	            {
+	                IDBResult resInsert = getDB().executeSQLReportNonUnique(&quot;INSERT INTO object_values &quot;+
+	                    &quot;(id, attrib, source_id, object, value, attrib_type) VALUES(?,?,?,?,?,?)&quot;, 
+	                    value.m_nID, strAttrib, nSrcID, strObject,
+	                    value.m_strValue, value.m_strAttrType );
+	                if ( resInsert.isNonUnique() )
+	                {
+	                    getDB().executeSQL(&quot;UPDATE object_values &quot;+
+	                        &quot;SET id=?, value=?, attrib_type=? WHERE object=? and attrib=? and source_id=?&quot;, 
+	                        value.m_nID, value.m_strValue, value.m_strAttrType,
+	                        strObject, strAttrib, nSrcID );
+
+	                    // oo conflicts
+	                    getDB().executeSQL(&quot;UPDATE changed_values SET sent=4 where object=? and attrib=? and source_id=? and sent&gt;1&quot;, strObject, strAttrib, nSrcID );
+	                    getDB().executeSQL(&quot;UPDATE changed_values SET main_id=? where object=? and attrib=? and source_id=? and sent&lt;=1&quot;, value.m_nID, strObject, strAttrib, nSrcID );
+	                    //
+	                }
+
+	                getNotify().onObjectChanged(nSrcID,strObject, SyncNotify.enUpdate);
+	            }
+		    	
+		        m_nInserted++;
+		    }else
+		    {
+		    	long id = oJsonEntry.getLong(&quot;i&quot;);
+		    	
+	            IDBResult res = getDB().executeSQL(&quot;SELECT source_id, object FROM object_values where id=?&quot;, id );
+	            if ( !res.isEnd() )
+	            {
+	            	LOG.TRACE(&quot;Delete: &quot; + id);
+	                Integer nDelSrcID = new Integer(res.getIntByIdx(0));
+	                String strDelObject = res.getStringByIdx(1);
+	                getDB().executeSQL(&quot;DELETE FROM object_values where id=?&quot;, id );
+	                getNotify().onObjectChanged(nDelSrcID, strDelObject, SyncNotify.enDelete);
+	            }
+                // oo conflicts
+                getDB().executeSQL(&quot;UPDATE changed_values SET sent=3 where main_id=?&quot;, id );
+                //
+	            
+		        m_nDeleted++;
+		    }
+		}
+		
+		return true;
+	}
+	
 	void processServerData_Ver1(JSONArrayIterator oJsonArr)throws Exception
 	{
 	    for( ; !oJsonArr.isEnd() &amp;&amp; getSync().isContinueSync(); oJsonArr.next() )
@@ -750,181 +772,6 @@ class SyncSource
         return true;
 	}
 	
-	boolean processSyncObject_ver1(JSONEntry oJsonObject, Integer nSrcID)throws Exception
-	{
-		String strOldObject = oJsonObject.getString(&quot;oo&quot;);
-	    //if ( isCreateObjectsPass() != (strOldObject != null) )
-	    //    return true;
-	    if ( isDeleteObjectsPass() != (nSrcID.intValue() &lt; 0) )
-	    	return true;
-	    
-	    if ( oJsonObject.hasName(&quot;e&quot;) )
-	    {
-	    	String strError = oJsonObject.getString(&quot;e&quot;);
-	        getNotify().addCreateObjectError(nSrcID,strOldObject,strError);
-	        return true;
-	    }
-
-	    int nDoNotDelete = -1;
-		String strObject = oJsonObject.getString(&quot;o&quot;);
-		JSONArrayIterator oJsonArr = new JSONArrayIterator(oJsonObject, &quot;av&quot;);
-		
-	    for( ; !oJsonArr.isEnd() &amp;&amp; getSync().isContinueSync(); m_nAttribCounter++, oJsonArr.next() )
-		{
-			JSONEntry oJsonEntry = oJsonArr.getCurItem();
-	        if ( oJsonEntry.isEmpty() )
-	        	continue;
-	        
-		    //int nDbOp = oJsonEntry.getInt(&quot;d&quot;);
-		    if ( nSrcID.intValue() &gt;= 0 ) //insert
-		    {
-		    	CValue value = new CValue(oJsonEntry,1);
-		    	if ( !downloadBlob(value) )
-		    		return false;
-		    	
-		    	String strAttrib = oJsonEntry.getString(&quot;a&quot;);
-		    	//String strUpdateType = &quot;query&quot;;
-		    	//if( oJsonEntry.hasName(&quot;u&quot;) )
-		    	//	strUpdateType = oJsonEntry.getString(&quot;u&quot;);
-		    	
-	            //boolean bUpdated = false;
-	            if ( strOldObject != null )
-	            {
-	                /*IDBResult res = getDB().executeSQL(&quot;SELECT object FROM changed_values where object=? and attrib=? and source_id=? and (sent=2 OR sent=3) LIMIT 1 OFFSET 0&quot;, strOldObject, strAttrib, nSrcID );
-	                if ( !res.isEnd() )
-	                {*/
-	                    getDB().executeSQL(&quot;UPDATE object_values SET id=?, object=? where object=? and attrib=? and source_id=?&quot;, value.m_nID, strObject, strOldObject, strAttrib, nSrcID );
-	                    //getDB().executeSQL(&quot;UPDATE changed_values SET sent=4 where object=? and attrib=? and source_id=?&quot;, strOldObject, strAttrib, nSrcID );
-	                    
-	                    getNotify().onObjectChanged(nSrcID,strOldObject, SyncNotify.enCreate);
-
-	                    /*bUpdated = true;
-	                }*/
-	            }else
-
-	            //if ( !bUpdated )
-	            {
-	                /*IDBResult res = getDB().executeSQL(&quot;SELECT value, attrib_type &quot; +
-						     &quot;FROM changed_values where object=? and attrib=? and source_id=? and (sent=2 OR sent=3) LIMIT 1 OFFSET 0&quot;, strObject, strAttrib, nSrcID );
-	                if ( !res.isEnd() )
-	                {
-	                    boolean bModified = false;
-	                    String strValue = value.m_strValue;
-	                    String strAttrType = value.m_strAttrType;
-	                    if ( strValue == null )
-	                    	strValue = &quot;&quot;;
-	                    if ( strAttrType == null )
-	                    	strAttrType = &quot;&quot;;
-	                    
-	                    if ( res.getStringByIdx(0).compareTo(strValue) != 0 || res.getStringByIdx(1).compareTo(strAttrType) != 0 )
-	                        bModified = true;*/
-
-	    		        IDBResult resInsert = getDB().executeSQLReportNonUnique(&quot;INSERT INTO object_values &quot; +
-	    			            &quot;(id, attrib, source_id, object, value, attrib_type) VALUES(?,?,?,?,?,?)&quot;, 
-	    			            value.m_nID, strAttrib, nSrcID, strObject,
-	    			            value.m_strValue, value.m_strAttrType );
-	                    if ( resInsert.isNonUnique() )
-	                        getDB().executeSQL(&quot;UPDATE object_values &quot;+
-	                            &quot;SET id=?, value=?, attrib_type=? WHERE object=? and attrib=? and source_id=?&quot;, 
-	                            value.m_nID, value.m_strValue, value.m_strAttrType,
-	                            strObject, strAttrib, nSrcID );
-
-	                    //getDB().executeSQL(&quot;UPDATE changed_values SET sent=4 where object=? and attrib=? and source_id=?&quot;, strObject, strAttrib, nSrcID );
-	    		        
-	                    //if ( bModified )
-	                        getNotify().onObjectChanged(nSrcID,strObject, SyncNotify.enUpdate);
-	                /*}
-	                else
-	                {
-	                	IDBResult resInsert = getDB().executeSQLReportNonUnique(&quot;INSERT INTO object_values &quot; +
-	    			            &quot;(id, attrib, source_id, object, value, attrib_type) VALUES(?,?,?,?,?,?)&quot;, 
-	    			            value.m_nID, strAttrib, nSrcID, strObject,
-	    			            value.m_strValue, value.m_strAttrType );
-	                    if ( resInsert.isNonUnique() )
-	                    {
-	                        getDB().executeSQL(&quot;UPDATE object_values &quot;+
-	                            &quot;SET id=?, value=?, attrib_type=? WHERE object=? and attrib=? and source_id=?&quot;, 
-	                            value.m_nID, value.m_strValue, value.m_strAttrType,
-	                            strObject, strAttrib, nSrcID );
-
-	                        getNotify().onObjectChanged(nSrcID,strObject, SyncNotify.enUpdate);
-	                    }
-	    		        
-	                }*/
-	            }
-		    	
-		        m_nInserted++;
-		    }else// if ( nDbOp == 1 ) //delete
-		    {
-	            /*if ( strOldObject != null &amp;&amp; nDoNotDelete &lt; 0 )
-	            {
-	                IDBResult res = getDB().executeSQL(&quot;SELECT object FROM object_values where object=? and source_id=? LIMIT 1 OFFSET 0&quot;, strOldObject, getID() );
-	                nDoNotDelete = !res.isEnd() ? 1 : 0;
-	            }*/
-		    	
-	            if ( nDoNotDelete != 1 )
-	            {
-			    	long id = oJsonEntry.getLong(&quot;i&quot;);
-			    	
-		            IDBResult res = getDB().executeSQL(&quot;SELECT source_id, object FROM object_values where id=?&quot;, id );
-		            if ( !res.isEnd() )
-		            {
-		            	LOG.TRACE(&quot;Delete: &quot; + id);
-		                Integer nDelSrcID = new Integer(res.getIntByIdx(0));
-		                String strDelObject = res.getStringByIdx(1);
-		                getDB().executeSQL(&quot;DELETE FROM object_values where id=?&quot;, id );
-		                //getDB().executeSQL(&quot;UPDATE changed_values SET sent=3 where main_id=?&quot;, new Long(id) );
-		                getNotify().onObjectChanged(nDelSrcID, strDelObject, SyncNotify.enDelete);
-		            }
-	            }
-	            
-		        m_nDeleted++;
-		    }//else{
-		     //   LOG.ERROR(&quot;Unknown DB operation: &quot; + nDbOp );
-		    //}
-		}
-		
-		return true;
-	}
-/*
-	boolean processSyncObject(JSONEntry oJsonObject)throws Exception
-	{
-    	JSONEntry oJsonEntry = oJsonObject.getEntry(&quot;object_value&quot;);
-        
-        if ( oJsonEntry.isEmpty() )
-        	return true;
-        
-	    String szDbOp = oJsonEntry.getString(&quot;db_operation&quot;);
-	    if ( szDbOp != null &amp;&amp; szDbOp.equals(&quot;insert&quot;) )
-	    {
-	    	CValue value = new CValue(oJsonEntry);
-	    	//
-	    	//value.m_strAttrType = &quot;blob.url&quot;;
-	    	//value.m_strValue = &quot;http://img.gazeta.ru/files3/661/3219661/ld.jpg&quot;;
-	    	//
-	    	if ( !downloadBlob(value) )
-	    		return false;
-	    	
-	    	String strAttrib = oJsonEntry.getString(&quot;attrib&quot;);
-	        getDB().executeSQL(&quot;INSERT INTO object_values &quot; +
-	            &quot;(id, attrib, source_id, object, value, attrib_type) VALUES(?,?,?,?,?,?)&quot;, 
-	            value.m_nID, strAttrib, getID(), oJsonEntry.getString(&quot;object&quot;),
-	            value.m_strValue, value.m_strAttrType );
-	        
-	        m_nInserted++;
-	    }else if ( szDbOp != null &amp;&amp; szDbOp.equals(&quot;delete&quot;) )
-	    {
-	    	long id = oJsonEntry.getLong(&quot;id&quot;);
-	        getDB().executeSQL(&quot;DELETE FROM object_values where id=?&quot;, id );
-	
-	        m_nDeleted++;
-	    }else{
-	        LOG.ERROR(&quot;Unknown DB operation: &quot; + (szDbOp != null ? szDbOp : &quot;&quot;) );
-	    }
-	    
-	    return true;
-	}*/
-
 	void processToken(String token)throws DBException
 	{
 	    if ( this.isTokenMoreThanOne() &amp;&amp; getToken().equals(token) ){</diff>
      <filename>platform/shared/rubyJVM/src/com/rho/sync/SyncSource.java</filename>
    </modified>
    <modified>
      <diff>@@ -83,10 +83,10 @@ void CSyncSource::sync()
     if ( isEmptyToken() )
         processToken(1);
 
-    //boolean bSyncedServer = false;
+    boolean bSyncedServer = false;
     if ( m_strParams.length() == 0 || m_bSearchSyncChanges )
     {
-        /*if ( isPendingClientChanges() )
+        if ( isPendingClientChanges() )
         {
             syncServerChanges();
             bSyncedServer = true;
@@ -95,7 +95,7 @@ void CSyncSource::sync()
         if ( bSyncedServer &amp;&amp; isPendingClientChanges() )
             getSync().setState(CSyncEngine::esStop);
         else
-        {   */
+        {   
             boolean bSyncClient = false;
             {
                 DBResult( res, getDB().executeSQL(&quot;SELECT object FROM changed_values WHERE source_id=? LIMIT 1 OFFSET 0&quot;, getID()) );
@@ -105,12 +105,12 @@ void CSyncSource::sync()
             {
                 syncClientChanges();
                 getAndremoveAsk();
-                //bSyncedServer = false;
+                bSyncedServer = false;
             }
-        //}
+        }
     }
 
-    //if ( !bSyncedServer )
+    if ( !bSyncedServer )
         syncServerChanges();
 
     CTimeInterval endTime = CTimeInterval::getCurrentTime();
@@ -119,11 +119,11 @@ void CSyncSource::sync()
                          endTime.toULong(), getInsertedCount(), getDeletedCount(), (endTime-startTime).toULong(), m_bGetAtLeastOnePage, getID() );
 }
 
-/*boolean CSyncSource::isPendingClientChanges()
+boolean CSyncSource::isPendingClientChanges()
 {
     DBResult( res, getDB().executeSQL(&quot;SELECT object FROM changed_values WHERE source_id=? and update_type='create' and sent&gt;1  LIMIT 1 OFFSET 0&quot;, getID()) );
     return !res.isEnd();
-}*/
+}
 
 void CSyncSource::syncClientBlobs(const String&amp; strBaseQuery)
 {
@@ -132,10 +132,6 @@ void CSyncSource::syncClientBlobs(const String&amp; strBaseQuery)
     {
         CSyncBlob&amp; blob = *m_arSyncBlobs.elementAt(i);
 
-        //CRhoFile oFile;
-        //if ( !oFile.open(blob.getFilePath().c_str(),CRhoFile::OpenReadOnly) ) 
-        //    continue;
-
         String strFilePath = RhoGetRootPath();
         strFilePath += &quot;apps&quot; + blob.getFilePath() ;
 
@@ -148,9 +144,6 @@ void CSyncSource::syncClientBlobs(const String&amp; strBaseQuery)
 				m_nErrCode = RhoRuby.ERR_REMOTESERVER;
 			else
 				m_nErrCode = RhoRuby.ERR_NETWORK;
-			
-            //m_nErrCode = resp.isResponseRecieved() ? RhoRuby.ERR_REMOTESERVER : RhoRuby.ERR_NETWORK;
-            //m_strError = resp.getCharData();
             return;
         }
 
@@ -189,54 +182,23 @@ void CSyncSource::syncClientChanges()
         if ( m_arSyncBlobs.size() &gt; 0 )
         {
 		    LOG(INFO) + &quot;Push blobs to server. Source id: &quot; + getID() + &quot;Count :&quot; + m_arSyncBlobs.size();
-/*
-            if ( getSync().SYNC_VERSION() &lt; 2 &amp;&amp; i &lt;= 1 ) //create, update
-            {
-                DBResult( res , getDB().executeSQL(&quot;SELECT object, attrib &quot;
-					     &quot;FROM changed_values WHERE source_id=? and update_type=? and (attrib_type IS NULL or attrib_type!=?) and sent=1&quot;, 
-                    getID(), arUpdateTypes[i], &quot;blob.file&quot; ) );
-                if ( !res.isEnd() )
-                {
-                    getDB().startTransaction();
-
-                    for( ; !res.isEnd(); res.next() )
-                    {
-                        getDB().executeSQL(&quot;DELETE FROM object_values WHERE object=? and attrib=? and source_id=?&quot;, 
-                            res.getStringByIdx(0), res.getStringByIdx(1), getID() );
-                    }
-                    getDB().endTransaction();
-                }
-            }
-
-            if ( getSync().SYNC_VERSION() &gt;= 2 &amp;&amp; i &lt;= 1 )// update
+            //oo conflicts
+            if ( i &lt; 1 ) //create
                 getDB().executeSQL(&quot;UPDATE changed_values SET sent=2 WHERE source_id=? and update_type=? and (attrib_type IS NULL or attrib_type!=?) and sent=1&quot;, 
                     getID(), arUpdateTypes[i], &quot;blob.file&quot; );
-            else*/
+            else
+            //
                 getDB().executeSQL(&quot;DELETE FROM changed_values WHERE source_id=? and update_type=? and (attrib_type IS NULL or attrib_type!=? and sent=1)&quot;, 
                     getID(), arUpdateTypes[i], &quot;blob.file&quot; );
 
             syncClientBlobs(strUrl+strQuery);
         }else if ( strBody.length() &gt; 0 )
         {
-            /*if ( getSync().SYNC_VERSION() &lt; 2 &amp;&amp; i &lt;= 1 ) //create, update
-            {
-                DBResult( res , getDB().executeSQL(&quot;SELECT object, attrib &quot;
-					     &quot;FROM changed_values where source_id=? and update_type =? and sent=1&quot;, getID(), arUpdateTypes[i] ) );
-                if ( !res.isEnd() )
-                {
-                    getDB().startTransaction();
-                    for( ; !res.isEnd(); res.next() )
-                    {
-                        getDB().executeSQL(&quot;DELETE FROM object_values WHERE object=? and attrib=? and source_id=?&quot;, 
-                            res.getStringByIdx(0), res.getStringByIdx(1), getID() );
-                    }
-                    getDB().endTransaction();
-                }
-            }
-
-            if ( getSync().SYNC_VERSION() &gt;= 2 &amp;&amp; i &lt;= 1 )// update
+            //oo conflicts
+            if ( i &lt; 1 ) //create
                 getDB().executeSQL(&quot;UPDATE changed_values SET sent=2 WHERE source_id=? and update_type=? and sent=1&quot;, getID(), arUpdateTypes[i] );
-            else*/
+            else
+            //
                 getDB().executeSQL(&quot;DELETE FROM changed_values WHERE source_id=? and update_type=? and sent=1&quot;, getID(), arUpdateTypes[i] );
         }
     }
@@ -344,9 +306,7 @@ void CSyncSource::syncServerChanges()
             strQuery += &quot;&amp;question=&quot; + getAskParams();
         }
 
-        /*if ( isEmptyToken() )
-            processToken(1);
-        else*/ if ( !m_bTokenFromDB &amp;&amp; getToken() &gt; 1 )
+        if ( !m_bTokenFromDB &amp;&amp; getToken() &gt; 1 )
             strQuery += &quot;&amp;ack_token=&quot; + convertToStringA(getToken());
 
 		LOG(INFO) + &quot;Pull changes from server. Url: &quot; + (strUrl+strQuery);
@@ -398,7 +358,6 @@ void CSyncSource::processServerData(const char* szData)
     {
         m_strError = oJsonArr.getCurItem().getString(&quot;error&quot;);
         m_nErrCode = RhoRuby.ERR_CUSTOMSYNCSERVER;
-        //processToken(0);
         getSync().stopSync();
         return;
     }
@@ -429,7 +388,9 @@ void CSyncSource::processServerData(const char* szData)
         oJsonArr.next();
     }else if ( getCurPageCount() == 0 )
     {
-        //getDB().executeSQL(&quot;DELETE FROM changed_values where source_id=? and sent&gt;=3&quot;, getID() );
+        //oo conflicts
+        getDB().executeSQL(&quot;DELETE FROM changed_values where source_id=? and sent&gt;=3&quot;, getID() );
+        //
         processToken(0);
     }
 
@@ -441,23 +402,13 @@ void CSyncSource::processServerData(const char* szData)
         //TODO: support DBExceptions
         getDB().startTransaction();
 
-        /*if ( nVersion == 0 )
-            processServerData_Ver0(oJsonArr);
-        else
-        {*/
-            int nSavedPos = oJsonArr.getCurPos();
-            setSyncServerDataPass(edpNone);
-            processServerData_Ver1(oJsonArr);
-
-            setSyncServerDataPass(edpDeleteObjects);
-            oJsonArr.reset(nSavedPos);
-            processServerData_Ver1(oJsonArr);
+        int nSavedPos = oJsonArr.getCurPos();
+        setSyncServerDataPass(edpNone);
+        processServerData_Ver1(oJsonArr);
 
-            //setSyncServerDataPass(edpNone);
-            //oJsonArr.reset(nSavedPos);
-            //processServerData_Ver1(oJsonArr);
-
-        //}
+        setSyncServerDataPass(edpDeleteObjects);
+        oJsonArr.reset(nSavedPos);
+        processServerData_Ver1(oJsonArr);
 
         getDB().endTransaction();
 
@@ -467,28 +418,100 @@ void CSyncSource::processServerData(const char* szData)
     if ( getCurPageCount() &gt; 0 )
         getNotify().fireSyncNotification(this, false, RhoRuby.ERR_NONE, &quot;&quot;);
 }
-/*
-void CSyncSource::processServerData_Ver0(CJSONArrayIterator&amp; oJsonArr)
+
+boolean CSyncSource::processSyncObject_ver1(CJSONEntry oJsonObject, int nSrcID)//throws Exception
 {
-    for( ; !oJsonArr.isEnd() &amp;&amp; getSync().isContinueSync(); oJsonArr.next() )
+    const char* strOldObject = oJsonObject.getString(&quot;oo&quot;);
+    if ( isDeleteObjectsPass() != (nSrcID &lt; 0) )
+        return true;
+
+    if ( oJsonObject.hasName(&quot;e&quot;) )
     {
-        if ( getDB().isUnlockDB() )
+        const char* strError = oJsonObject.getString(&quot;e&quot;);
+        getNotify().addCreateObjectError(nSrcID,strOldObject,strError);
+        return true;
+    }
+
+	const char* strObject = oJsonObject.getString(&quot;o&quot;);
+	CJSONArrayIterator oJsonArr(oJsonObject, &quot;av&quot;);
+    //oo conflicts
+    boolean bUpdatedOO = false;
+    //
+    for( ; !oJsonArr.isEnd() &amp;&amp; getSync().isContinueSync(); oJsonArr.next() )
+	{
+		CJSONEntry oJsonEntry = oJsonArr.getCurItem();
+        if ( oJsonEntry.isEmpty() )
+        	continue;
+
+        if ( nSrcID &gt;= 0 ) //insert
         {
-		    LOG(INFO) + &quot;Commit transaction because of UI request.&quot;;
-            getDB().endTransaction();
-            getDB().startTransaction();
-        }
+    	    CValue value(oJsonEntry,1);
+    	    if ( !downloadBlob(value) )
+    		    return false;
 
-        CJSONEntry oJsonObject = oJsonArr.getCurItem();
-        if( !processSyncObject(oJsonObject))
+            String strAttrib = oJsonEntry.getString(&quot;a&quot;);
+            //oo conflicts
+            if ( strOldObject != null )
+            {
+                if ( !bUpdatedOO )
+                {
+                    getDB().executeSQL(&quot;UPDATE object_values SET object=? where object=? and source_id=?&quot;, strObject, strOldObject, nSrcID );
+                    getDB().executeSQL(&quot;UPDATE changed_values SET object=? where object=? and source_id=?&quot;, strObject, strOldObject, nSrcID );
+
+                    getNotify().onObjectChanged(nSrcID,strOldObject, CSyncNotify::enCreate);
+
+                    bUpdatedOO = true;
+                }
+
+                getDB().executeSQL(&quot;UPDATE changed_values SET main_id=? where object=? and attrib=? and source_id=? and sent&lt;=1&quot;, value.m_nID, strObject, strAttrib, nSrcID );
+                getDB().executeSQL(&quot;UPDATE changed_values SET sent=4 where object=? and attrib=? and source_id=? and sent&gt;1&quot;, strObject, strAttrib, nSrcID );
+
+                getDB().executeSQL(&quot;UPDATE object_values SET id=? WHERE object=? and attrib=? and source_id=?&quot;, 
+                    value.m_nID, strObject, strAttrib, nSrcID );
+            }else//
+            {
+                DBResult(resInsert, getDB().executeSQLReportNonUnique(&quot;INSERT INTO object_values \
+                    (id, attrib, source_id, object, value, attrib_type) VALUES(?,?,?,?,?,?)&quot;, 
+                    value.m_nID, strAttrib, nSrcID, strObject,
+                    value.m_strValue, value.m_strAttrType ) );
+                if ( resInsert.isNonUnique() )
+                {
+                    getDB().executeSQL(&quot;UPDATE object_values \
+                        SET id=?, value=?, attrib_type=? WHERE object=? and attrib=? and source_id=?&quot;, 
+                        value.m_nID, value.m_strValue, value.m_strAttrType,
+                        strObject, strAttrib, nSrcID );
+
+                    // oo conflicts
+                    getDB().executeSQL(&quot;UPDATE changed_values SET sent=4 where object=? and attrib=? and source_id=? and sent&gt;1&quot;, strObject, strAttrib, nSrcID );
+                    getDB().executeSQL(&quot;UPDATE changed_values SET main_id=? where object=? and attrib=? and source_id=? and sent&lt;=1&quot;, value.m_nID, strObject, strAttrib, nSrcID );
+                    //
+                }
+
+                getNotify().onObjectChanged(nSrcID,strObject, CSyncNotify::enUpdate);
+            }
+
+            m_nInserted++;
+        }else
         {
-            getSync().stopSync();
-            break;
-        }
+            uint64 id = oJsonEntry.getUInt64(&quot;i&quot;);
+            DBResult( res , getDB().executeSQL(&quot;SELECT source_id, object FROM object_values where id=?&quot;, id ));
+            if ( !res.isEnd() )
+            {
+                int nDelSrcID = res.getIntByIdx(0);
+                String strDelObject = res.getStringByIdx(1);
+                getDB().executeSQL(&quot;DELETE FROM object_values where id=?&quot;, id );
+                getNotify().onObjectChanged(nDelSrcID, strDelObject, CSyncNotify::enDelete);
+            }
+            // oo conflicts
+            getDB().executeSQL(&quot;UPDATE changed_values SET sent=3 where main_id=?&quot;, id );
+            //
 
-        m_bGetAtLeastOnePage = true;
-    }
-}*/
+            m_nDeleted++;
+        }
+	}
+	
+	return true;
+}
 
 void CSyncSource::processServerData_Ver1(CJSONArrayIterator&amp; oJsonArr)
 {
@@ -643,171 +666,6 @@ boolean CSyncSource::downloadBlob(CValue&amp; value)//throws Exception
     return true;
 }
 
-boolean CSyncSource::processSyncObject_ver1(CJSONEntry oJsonObject, int nSrcID)//throws Exception
-{
-    const char* strOldObject = oJsonObject.getString(&quot;oo&quot;);
-    //if ( isCreateObjectsPass() != (strOldObject != null) )
-    //    return true;
-    if ( isDeleteObjectsPass() != (nSrcID &lt; 0) )
-        return true;
-
-    if ( oJsonObject.hasName(&quot;e&quot;) )
-    {
-        const char* strError = oJsonObject.getString(&quot;e&quot;);
-        getNotify().addCreateObjectError(nSrcID,strOldObject,strError);
-        return true;
-    }
-
-    int nDoNotDelete = -1;
-	const char* strObject = oJsonObject.getString(&quot;o&quot;);
-	CJSONArrayIterator oJsonArr(oJsonObject, &quot;av&quot;);
-
-    for( ; !oJsonArr.isEnd() &amp;&amp; getSync().isContinueSync(); oJsonArr.next() )
-	{
-		CJSONEntry oJsonEntry = oJsonArr.getCurItem();
-        if ( oJsonEntry.isEmpty() )
-        	continue;
-
-        //int nDbOp = oJsonEntry.getInt(&quot;d&quot;);
-        if ( nSrcID &gt;= 0 ) //insert
-        {
-    	    CValue value(oJsonEntry,1);
-    	    if ( !downloadBlob(value) )
-    		    return false;
-
-            String strAttrib = oJsonEntry.getString(&quot;a&quot;);
-	    	//String strUpdateType = &quot;query&quot;;
-	    	//if( oJsonEntry.hasName(&quot;u&quot;) )
-	    	//	strUpdateType = oJsonEntry.getString(&quot;u&quot;);
-            //boolean bUpdated = false;
-            if ( strOldObject != null )
-            {
-                /*DBResult( res , getDB().executeSQL(&quot;SELECT object FROM changed_values where object=? and attrib=? and source_id=? and (sent=2 OR sent=3) LIMIT 1 OFFSET 0&quot;, strOldObject, strAttrib, nSrcID ));
-                if ( !res.isEnd() )
-                {  */
-                    getDB().executeSQL(&quot;UPDATE object_values SET id=?, object=? where object=? and attrib=? and source_id=?&quot;, value.m_nID, strObject, strOldObject, strAttrib, nSrcID );
-                    //getDB().executeSQL(&quot;UPDATE changed_values SET sent=4 where object=? and attrib=? and source_id=?&quot;, strOldObject, strAttrib, nSrcID );
-
-                    getNotify().onObjectChanged(nSrcID,strOldObject, CSyncNotify::enCreate);
-
-                    /*bUpdated = true;
-                } */
-            }else
-
-            //if ( !bUpdated )
-            {
-                /*DBResult( res , getDB().executeSQL(&quot;SELECT value, attrib_type &quot;
-					     &quot;FROM changed_values where object=? and attrib=? and source_id=? and (sent=2 OR sent=3) LIMIT 1 OFFSET 0&quot;, strObject, strAttrib, nSrcID ) );
-                if ( !res.isEnd() )
-                {
-                    boolean bModified = false;
-                    if ( res.getStringByIdx(0).compare(value.m_strValue) != 0 || res.getStringByIdx(1).compare(value.m_strAttrType) != 0 )
-                        bModified = true;*/
-
-                    DBResult(resInsert, getDB().executeSQLReportNonUnique(&quot;INSERT INTO object_values \
-                        (id, attrib, source_id, object, value, attrib_type) VALUES(?,?,?,?,?,?)&quot;, 
-                        value.m_nID, strAttrib, nSrcID, strObject,
-                        value.m_strValue, value.m_strAttrType ) );
-                    if ( resInsert.isNonUnique() )
-                        getDB().executeSQL(&quot;UPDATE object_values \
-                            SET id=?, value=?, attrib_type=? WHERE object=? and attrib=? and source_id=?&quot;, 
-                            value.m_nID, value.m_strValue, value.m_strAttrType,
-                            strObject, strAttrib, nSrcID );
-
-                    //getDB().executeSQL(&quot;UPDATE changed_values SET sent=4 where object=? and attrib=? and source_id=?&quot;, strObject, strAttrib, nSrcID );
-
-                    //if ( bModified )
-                        getNotify().onObjectChanged(nSrcID,strObject, CSyncNotify::enUpdate);
-                /*}
-                else
-                {
-                    DBResult(resInsert, getDB().executeSQLReportNonUnique(&quot;INSERT INTO object_values \
-                        (id, attrib, source_id, object, value, attrib_type) VALUES(?,?,?,?,?,?)&quot;, 
-                        value.m_nID, strAttrib, nSrcID, strObject,
-                        value.m_strValue, value.m_strAttrType ) );
-                    if ( resInsert.isNonUnique() )
-                    {
-                        //TODO: check changed_values for sent &lt; 2: do not overwrite local changes
-                        getDB().executeSQL(&quot;UPDATE object_values \
-                            SET id=?, value=?, attrib_type=? WHERE object=? and attrib=? and source_id=?&quot;, 
-                            value.m_nID, value.m_strValue, value.m_strAttrType,
-                            strObject, strAttrib, nSrcID );
-
-                        getNotify().onObjectChanged(nSrcID,strObject, CSyncNotify::enUpdate);
-                    }
-                }*/
-            }
-
-            m_nInserted++;
-        }else// if ( nDbOp == 1 ) //delete
-        {
-            /*if ( strOldObject != null &amp;&amp; nDoNotDelete &lt; 0 )
-            {
-                DBResult( res,getDB().executeSQL(&quot;SELECT object FROM object_values where object=? and source_id=? LIMIT 1 OFFSET 0&quot;, strOldObject, getID() ) );
-                nDoNotDelete = !res.isEnd() ? 1 : 0;
-            }*/
-
-            if ( nDoNotDelete != 1 )
-            {
-                uint64 id = oJsonEntry.getUInt64(&quot;i&quot;);
-                DBResult( res , getDB().executeSQL(&quot;SELECT source_id, object FROM object_values where id=?&quot;, id ));
-                if ( !res.isEnd() )
-                {
-                    int nDelSrcID = res.getIntByIdx(0);
-                    String strDelObject = res.getStringByIdx(1);
-                    getDB().executeSQL(&quot;DELETE FROM object_values where id=?&quot;, id );
-                    //getDB().executeSQL(&quot;UPDATE changed_values SET sent=3 where main_id=?&quot;, id );
-
-                    getNotify().onObjectChanged(nDelSrcID, strDelObject, CSyncNotify::enDelete);
-                }
-            }
-
-            m_nDeleted++;
-        }//else{
-         //   LOG(ERROR) + &quot;Unknown DB operation: &quot; + nDbOp;
-        //}
-	}
-	
-	return true;
-}
-/*
-boolean CSyncSource::processSyncObject(CJSONEntry&amp; oJsonObject)
-{
-	CJSONEntry oJsonEntry = oJsonObject.getEntry(&quot;object_value&quot;);
-    if ( oJsonEntry.isEmpty() )
-    	return true;
-
-    const char* szDbOp = oJsonEntry.getString(&quot;db_operation&quot;);
-    if ( szDbOp &amp;&amp; strcmp(szDbOp,&quot;insert&quot;)==0 )
-    {
-    	CValue value(oJsonEntry);
-    	//
-    	//value.m_strAttrType = &quot;blob.url&quot;;
-    	//value.m_strValue = &quot;http://img.gazeta.ru/files3/661/3219661/ld.jpg&quot;;
-    	//
-    	if ( !downloadBlob(value) )
-    		return false;
-
-        String strAttrib = oJsonEntry.getString(&quot;attrib&quot;);
-        getDB().executeSQL(&quot;INSERT INTO object_values \
-            (id, attrib, source_id, object, value, attrib_type) VALUES(?,?,?,?,?,?)&quot;, 
-            value.m_nID, strAttrib, getID(), oJsonEntry.getString(&quot;object&quot;),
-            value.m_strValue, value.m_strAttrType );
-        //TODO: add record to special table for id,token
-        m_nInserted++;
-    }else if ( szDbOp &amp;&amp; strcmp(szDbOp,&quot;delete&quot;)==0 )
-    {
-        uint64 id = oJsonEntry.getUInt64(&quot;id&quot;);
-        getDB().executeSQL(&quot;DELETE FROM object_values where id=?&quot;, id );
-
-        m_nDeleted++;
-    }else{
-        LOG(ERROR) + &quot;Unknown DB operation: &quot; + (szDbOp ? szDbOp : &quot;&quot;);
-    }
-
-    return true;
-}*/
-
 void CSyncSource::processToken(uint64 token)
 {
     if ( token &gt; 1 &amp;&amp; getToken() == token ){</diff>
      <filename>platform/shared/sync/SyncSource.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -49,7 +49,7 @@ class CSyncSource
 {
     DEFINE_LOGCLASS;
 
-    enum ESyncServerDataPass{ edpNone, /*edpCreateObjects,*/ edpDeleteObjects };
+    enum ESyncServerDataPass{ edpNone, edpDeleteObjects };
 
     CSyncEngine&amp; m_syncEngine;
 
@@ -70,7 +70,6 @@ public:
     boolean m_bSearchSyncChanges;
     int     m_nProgressStep;
 private:
-    //String m_strPushBody;
     VectorPtr&lt;CSyncBlob*&gt; m_arSyncBlobs;
     String m_strAskParams;
 
@@ -95,7 +94,7 @@ public:
     CSyncSource(CSyncEngine&amp; syncEngine );
 
     void syncClientChanges();
-    //boolean isPendingClientChanges();
+    boolean isPendingClientChanges();
 
     void syncServerChanges();
     void makePushBody(String&amp; strBody, const char* szUpdateType);
@@ -113,13 +112,10 @@ public:
     int  getProgressStep(){ return m_nProgressStep; }
 
     void processServerData(const char* szData);
-    //boolean processSyncObject(json::CJSONEntry&amp; oJsonEntry);
     boolean processSyncObject_ver1(json::CJSONEntry oJsonObject, int nSrcID);//throws Exception
-    //void processServerData_Ver0(json::CJSONArrayIterator&amp; oJsonArr);
     void processServerData_Ver1(json::CJSONArrayIterator&amp; oJsonArr);
 
     void setSyncServerDataPass(ESyncServerDataPass ePass){m_eSyncServerDataPass = ePass;}
-    //boolean isCreateObjectsPass(){ return m_eSyncServerDataPass == edpCreateObjects; }
     boolean isDeleteObjectsPass(){ return m_eSyncServerDataPass == edpDeleteObjects; }
 
     VectorPtr&lt;CSyncBlob*&gt;&amp; getSyncBlobs(){ return m_arSyncBlobs; }</diff>
      <filename>platform/shared/sync/SyncSource.h</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>1dc5dbe2cf7e2a5181f423d6bcd4c9770e1cec0b</id>
    </parent>
  </parents>
  <author>
    <name>genywind</name>
    <email>evgeny@rhomobile.com</email>
  </author>
  <url>http://github.com/rhomobile/rhodes/commit/fe7db07d064b1de17415cb3fa596b30f694190cc</url>
  <id>fe7db07d064b1de17415cb3fa596b30f694190cc</id>
  <committed-date>2009-10-29T04:28:13-07:00</committed-date>
  <authored-date>2009-10-29T04:28:13-07:00</authored-date>
  <message>Refactor sync source, support conflict resolution for sync adapters with oo</message>
  <tree>d8803cb84552dc5d4f88f03f6bfbab40e1d48287</tree>
  <committer>
    <name>genywind</name>
    <email>evgeny@rhomobile.com</email>
  </committer>
</commit>
