Beispiel #1
0
        boolean downloadBlob(CAttrValue value)
        {
            String fName  = makeFileName(value);
            String url    = value.m_strValue;
            int    nQuest = url.lastIndexOf('?');

            if (nQuest > 0)
            {
                url += "&";
            }
            else
            {
                url += "?";
            }
            url += "client_id=" + getSync().getClientID();

            try{
                NetResponse resp = getNet().pullFile(url, fName, getSync(), null);
                if (!resp.isOK())
                {
                    getSync().stopSync();
                    m_nErrCode = RhoAppAdapter.getErrorFromResponse(resp);
                    return(false);
                }
            }catch (Exception exc)
            {
                m_nErrCode = RhoAppAdapter.getNetErrorCode(exc);
                throw exc;
            }

            value.m_strValue = CFilePath.getRelativePath(fName, CRhodesApp.getRhoRootPath());

            return(true);
        }
Beispiel #2
0
        void processServerCmd_Ver3(String strCmd, String strObject, String strAttriba, String strValuea)
        {
            CAttrValue oAttrValue = new CAttrValue(strAttriba, strValuea);

            if (strCmd.compareTo("insert") == 0)
            {
                if (!processBlob(strCmd, strObject, oAttrValue))
                {
                    return;
                }

                IDBResult resInsert = getDB().executeSQLReportNonUnique("INSERT INTO object_values " +
                                                                        "(attrib, source_id, object, value) VALUES(?,?,?,?)",
                                                                        oAttrValue.m_strAttrib, getID(), strObject, oAttrValue.m_strValue);

                if (resInsert.isNonUnique())
                {
                    getDB().executeSQL("UPDATE object_values " +
                                       "SET value=? WHERE object=? and attrib=? and source_id=?",
                                       oAttrValue.m_strValue, strObject, oAttrValue.m_strAttrib, getID());

                    if (getSyncType().compareTo("none") != 0)
                    {
                        // oo conflicts
                        getDB().executeSQL("UPDATE changed_values SET sent=4 where object=? and attrib=? and source_id=? and sent>1",
                                           strObject, oAttrValue.m_strAttrib, getID());
                        //
                    }
                }

                if (getSyncType().compareTo("none") != 0)
                {
                    getNotify().onObjectChanged(getID(), strObject, SyncNotify.enUpdate);
                }

                m_nInserted++;
            }
            else if (strCmd.compareTo("delete") == 0)
            {
                getDB().executeSQL("DELETE FROM object_values where object=? and attrib=? and source_id=?", strObject, oAttrValue.m_strAttrib, getID());

                if (getSyncType().compareTo("none") != 0)
                {
                    getNotify().onObjectChanged(getID(), strObject, SyncNotify.enDelete);
                    // oo conflicts
                    getDB().executeSQL("UPDATE changed_values SET sent=3 where object=? and attrib=? and source_id=?", strObject, oAttrValue.m_strAttrib, getID());
                    //
                }
                m_nDeleted++;
            }
            else if (strCmd.compareTo("links") == 0)
            {
                processAssociations(strObject, oAttrValue.m_strValue);

                getDB().executeSQL("UPDATE object_values SET object=? where object=? and source_id=?", oAttrValue.m_strValue, strObject, getID());
                getDB().executeSQL("UPDATE changed_values SET object=?,sent=3 where object=? and source_id=?", oAttrValue.m_strValue, strObject, getID());

                getNotify().onObjectChanged(getID(), strObject, SyncNotify.enCreate);
            }
        }
Beispiel #3
0
        boolean processBlob(String strCmd, String strObject, CAttrValue oAttrValue)
        {
            //TODO: when server return delete with rhoblob postfix - delete isBlobAttr
            if (!(oAttrValue.m_strBlobSuffix.length() > 0 || getDB().getAttrMgr().isBlobAttr(getID(), oAttrValue.m_strAttrib)))
            {
                return(true);
            }

            boolean bDownload  = true;
            String  strDbValue = "";

            if (!getDB().getAttrMgr().isOverwriteBlobFromServer(getID(), oAttrValue.m_strAttrib))
            {
                if (m_bSchemaSource)
                {
                    String    strSelect = "SELECT " + oAttrValue.m_strAttrib + " FROM " + getName() + " WHERE object=?";
                    IDBResult res       = getDB().executeSQL(strSelect, strObject);
                    if (!res.isEnd())
                    {
                        strDbValue = res.getStringByIdx(0);
                        bDownload  = strDbValue == null || strDbValue.length() == 0;
                    }
                }
                else
                {
                    IDBResult res = getDB().executeSQL(
                        "SELECT value FROM object_values WHERE object=? and attrib=? and source_id=?",
                        strObject, oAttrValue.m_strAttrib, getID());
                    if (!res.isEnd())
                    {
                        strDbValue = res.getStringByIdx(0);
                        bDownload  = strDbValue == null || strDbValue.length() == 0;
                    }
                }
            }

            if (bDownload)
            {
                boolean bRes = false;
                getDB().endTransaction();
                try{
                    bRes = downloadBlob(oAttrValue);
                }finally
                {
                    getDB().startTransaction();
                }

                return(bRes);
            }

/*
 *              String fName = makeFileName( oAttrValue );
 *              String fOldName = RHODESAPP().resolveDBFilesPath(strDbValue);
 *              RhoClassFactory.createFile().renameOverwrite(fOldName, fName);
 *
 *              oAttrValue.m_strValue = FilePath.getRelativePath( fName, RhodesApp.getInstance().getRhoRootPath());
 */
            oAttrValue.m_strValue = strDbValue;
            return(true);
        }
Beispiel #4
0
        private String makeFileName(CAttrValue value)
        {
            String strExt = "";

            String strQuest = URI.getQueryString(value.m_strValue);

            if (strQuest != null && strQuest.length() > 0)
            {
                int nExt = strQuest.indexOf("extension=");
                if (nExt >= 0)
                {
                    int nExtEnd = strQuest.indexOf("&", nExt);
                    if (nExtEnd < 0)
                    {
                        nExtEnd = strQuest.length();
                    }

                    strExt = strQuest.substring(nExt + 10, nExtEnd);
                }
            }

            if (strExt.length() == 0)
            {
                String strFileName = URI.getLastNamePart(value.m_strValue);
                int    nExt        = strFileName != null?strFileName.lastIndexOf('.') : -1;

                if (nExt >= 0)
                {
                    strExt = strFileName.substring(nExt);
                }
            }

            if (strExt.length() == 0)
            {
                strExt = ".bin";
            }
            else if (strExt.charAt(0) != '.')
            {
                strExt = "." + strExt;
            }

            String fName = RHODESAPP().getBlobsDirPath() + "/id_" + TimeInterval.getCurrentTime().toULong() + strExt;

            return(fName);
        }
Beispiel #5
0
	    void processServerCmd_Ver3_Schema(String strCmd, String strObject, JSONStructIterator attrIter)
	    {
	        if ( strCmd.compareTo("insert") == 0 )
	        {
	            Vector<Object> vecValues = new Vector<Object>();
                Vector<String> vecAttrs = new Vector<String>();
	            String strCols = "", strQuest = "", strSet = "";
	            for( ; !attrIter.isEnd() && getSync().isContinueSync(); attrIter.next() )
	            {
	                CAttrValue oAttrValue = new CAttrValue(attrIter.getCurKey(),attrIter.getCurString());
	                if ( !processBlob(strCmd,strObject,oAttrValue) )
	                    continue;
	        	
	                if ( strCols.length() > 0 )
	                    strCols += ",";
	                if ( strQuest.length() > 0)
	                    strQuest += ",";
	                if ( strSet.length() > 0)
	                    strSet += ",";

	                strCols += oAttrValue.m_strAttrib;
	                strQuest += "?";
	                strSet += oAttrValue.m_strAttrib + "=?";
	                vecAttrs.addElement(oAttrValue.m_strAttrib);
	                vecValues.addElement(oAttrValue.m_strValue);
	            }
	            vecValues.addElement(strObject);
	            if ( strCols.length() > 0 )
	                strCols += ",";
	            if ( strQuest.length() > 0)
	                strQuest += ",";
	        
	            strCols += "object";
	            strQuest += "?";

	            String strSqlInsert = "INSERT INTO ";
	            strSqlInsert += getName() + " (";
	            strSqlInsert += strCols + ") VALUES(" + strQuest + ")";

	            if ( !getSync().isContinueSync() )
	                return;

	            IDBResult resInsert = getDB().executeSQLReportNonUniqueEx(strSqlInsert, vecValues );
	            if ( resInsert.isNonUnique() )
	            {
	                String strSqlUpdate = "UPDATE ";
	                strSqlUpdate += getName() + " SET " + strSet + " WHERE object=?";
	                getDB().executeSQLEx(strSqlUpdate, vecValues);

	                if ( getSyncType().compareTo("none") != 0 )
	                {
		                // oo conflicts
		                for( int i = 0; i < (int)vecAttrs.size(); i++ )
		                {
		                    getDB().executeSQL("UPDATE changed_values SET sent=4 where object=? and attrib=? and source_id=? and sent>1", 
		                        strObject, vecAttrs.elementAt(i), getID() );
		                }
		                //
	                }
	            }

	            if ( getSyncType().compareTo("none") != 0 )	        
	        	    getNotify().onObjectChanged(getID(),strObject, SyncNotify.enUpdate);
	        
	            m_nInserted++;
	        }else if (strCmd.compareTo("delete") == 0)
	        {
	    	    Vector<String> vecAttrs = new Vector<String>();
	            String strSet = "";
	            for( ; !attrIter.isEnd() && getSync().isContinueSync(); attrIter.next() )
	            {
	        	    CAttrValue oAttrValue = new CAttrValue(attrIter.getCurKey(),attrIter.getCurString());
	        	
	                if ( strSet.length() > 0 )
	                    strSet += ",";

	                vecAttrs.addElement(oAttrValue.m_strAttrib);
	                strSet += oAttrValue.m_strAttrib + "=NULL";
	            }

	            String strSqlUpdate = "UPDATE ";
	            strSqlUpdate += getName() + " SET " + strSet + " WHERE object=?";
	        
	            if ( strSet.length() == 0 || !getSync().isContinueSync() )
	                return;
	        
	            getDB().executeSQL(strSqlUpdate, strObject);
	            //Remove item if all nulls
	            String strSelect = "SELECT * FROM " + getName() + " WHERE object=?";
	            IDBResult res = getDB().executeSQL( strSelect, strObject );
	            if ( !res.isEnd() )
	            {
	                boolean bAllNulls = true;
	                for( int i = 0; i < res.getColCount(); i ++)
	                {
	                    if ( !res.isNullByIdx(i) && res.getColName(i).compareTo("object")!=0 )
	                    {
	                        bAllNulls = false;
	                        break;
	                    }
	                }

	                if (bAllNulls)
	                {
	                    String strDelete = "DELETE FROM " + getName() + " WHERE object=?";
	                    getDB().executeSQL( strDelete, strObject);
	                }
	            }
	        
	            if ( getSyncType().compareTo("none") != 0 )
	            {
		            getNotify().onObjectChanged(getID(), strObject, SyncNotify.enDelete);
		            // oo conflicts
		            for( int i = 0; i < (int)vecAttrs.size(); i++ )
		            {
		                getDB().executeSQL("UPDATE changed_values SET sent=3 where object=? and attrib=? and source_id=?", 
		                    strObject, vecAttrs.elementAt(i), getID() );
		            }
		            //
	            }
	        
	            m_nDeleted++;
	        }else if ( strCmd.compareTo("links") == 0 )
	        {
	            String strValue = attrIter.getCurString();
	            processAssociations(strObject, strValue);
	        
	            String strSqlUpdate = "UPDATE ";
	            strSqlUpdate += getName() + " SET object=? WHERE object=?";
	            getDB().executeSQL(strSqlUpdate, strValue, strObject);

	            getDB().executeSQL("UPDATE changed_values SET object=?,sent=3 where object=? and source_id=?", strValue, strObject, getID() );
	            getNotify().onObjectChanged(getID(), strObject, SyncNotify.enCreate);
	        }

	    }
Beispiel #6
0
	    boolean downloadBlob(CAttrValue value)
	    {
		    String fName = makeFileName( value );
		    String url = value.m_strValue;
		    int nQuest = url.lastIndexOf('?');
		    if ( nQuest > 0 )
			    url += "&";
		    else
			    url += "?";
		    url += "client_id=" + getSync().getClientID();
		
		    try{
			    NetResponse resp = getNet().pullFile(url, fName, getSync(), null);
	            if ( !resp.isOK() )
	            {
	        	    getSync().stopSync();
	        	    m_nErrCode = RhoAppAdapter.getErrorFromResponse(resp);
	        	    return false;
	            }
	        }catch(Exception exc)
	        {
	    	    m_nErrCode = RhoAppAdapter.getNetErrorCode(exc);
	    	    throw exc;
	        }
        
	        value.m_strValue = CFilePath.getRelativePath( fName, CRhodesApp.getRhoRootPath());
        
            return true;
	    }
Beispiel #7
0
	    private String makeFileName(CAttrValue value)
	    {
		    String strExt = "";

	        String strQuest = URI.getQueryString(value.m_strValue);

	        if (strQuest != null && strQuest.length() > 0)
	        {
			    int nExt = strQuest.indexOf("extension=");
			    if ( nExt >= 0 )
	            {
				    int nExtEnd = strQuest.indexOf("&", nExt);
				    if (nExtEnd < 0 )
					    nExtEnd = strQuest.length();
				
				    strExt = strQuest.substring(nExt+10, nExtEnd);
			    }
	        }

	        if ( strExt.length() == 0 )
	        {
	            String strFileName = URI.getLastNamePart(value.m_strValue);
	            int nExt = strFileName != null ? strFileName.lastIndexOf('.') : -1;
			    if ( nExt >= 0 )
	                strExt = strFileName.substring(nExt);
	        }

	        if ( strExt.length() == 0 )
	            strExt = ".bin";
	        else if ( strExt.charAt(0) != '.' )    
	            strExt = "." + strExt;

		    String fName = RHODESAPP().getBlobsDirPath() + "/id_" + TimeInterval.getCurrentTime().toULong() + strExt;
		
		    return  fName;
	    }
Beispiel #8
0
	    void processServerCmd_Ver3(String strCmd, String strObject, String strAttriba, String strValuea)
	    {
	        CAttrValue oAttrValue = new CAttrValue(strAttriba,strValuea);
		
	        if ( strCmd.compareTo("insert") == 0 )
	        {
	            if ( !processBlob(strCmd,strObject,oAttrValue) )
	                return;

	            IDBResult resInsert = getDB().executeSQLReportNonUnique("INSERT INTO object_values "+
	                    "(attrib, source_id, object, value) VALUES(?,?,?,?)", 
	                    oAttrValue.m_strAttrib, getID(), strObject, oAttrValue.m_strValue );
	        
	            if ( resInsert.isNonUnique() )
	            {
	                getDB().executeSQL("UPDATE object_values " +
                        "SET value=? WHERE object=? and attrib=? and source_id=?", 
                         oAttrValue.m_strValue, strObject, oAttrValue.m_strAttrib, getID() );

	                if ( getSyncType().compareTo("none") != 0 )
	                {
		                // oo conflicts
		                getDB().executeSQL("UPDATE changed_values SET sent=4 where object=? and attrib=? and source_id=? and sent>1", 
		                        strObject, oAttrValue.m_strAttrib, getID() );
		                //
	                }
	            }

	            if ( getSyncType().compareTo("none") != 0 )	        
	        	    getNotify().onObjectChanged(getID(),strObject, SyncNotify.enUpdate);
	        
	            m_nInserted++;
	        }else if (strCmd.compareTo("delete") == 0)
	        {
	            getDB().executeSQL("DELETE FROM object_values where object=? and attrib=? and source_id=?", strObject, oAttrValue.m_strAttrib, getID() );
	        
	            if ( getSyncType().compareTo("none") != 0 )
	            {
		            getNotify().onObjectChanged(getID(), strObject, SyncNotify.enDelete);
		            // oo conflicts
		            getDB().executeSQL("UPDATE changed_values SET sent=3 where object=? and attrib=? and source_id=?", strObject, oAttrValue.m_strAttrib, getID() );
		            //
	            }
	            m_nDeleted++;
	        }else if ( strCmd.compareTo("links") == 0 )
	        {
	            processAssociations(strObject, oAttrValue.m_strValue);

	            getDB().executeSQL("UPDATE object_values SET object=? where object=? and source_id=?", oAttrValue.m_strValue, strObject, getID() );
	            getDB().executeSQL("UPDATE changed_values SET object=?,sent=3 where object=? and source_id=?", oAttrValue.m_strValue, strObject, getID() );

	            getNotify().onObjectChanged(getID(), strObject, SyncNotify.enCreate);
	        }

	    }
Beispiel #9
0
	    boolean processBlob( String strCmd, String strObject, CAttrValue oAttrValue )
	    {
	        //TODO: when server return delete with rhoblob postfix - delete isBlobAttr
	        if ( !(oAttrValue.m_strBlobSuffix.length() > 0 || getDB().getAttrMgr().isBlobAttr(getID(), oAttrValue.m_strAttrib)) )
	            return true;

	        boolean bDownload = true;
	        String strDbValue = "";
	        if ( !getDB().getAttrMgr().isOverwriteBlobFromServer(getID(), oAttrValue.m_strAttrib) )
	        {
	            if ( m_bSchemaSource )
	            {
	                String strSelect = "SELECT " + oAttrValue.m_strAttrib + " FROM " + getName() + " WHERE object=?";
	                IDBResult res = getDB().executeSQL( strSelect, strObject);
	                if (!res.isEnd())
	                {
	                    strDbValue = res.getStringByIdx(0);
	                    bDownload = strDbValue == null || strDbValue.length() == 0;
	                }
	            }else
	            {
	                IDBResult res = getDB().executeSQL(
	                    "SELECT value FROM object_values WHERE object=? and attrib=? and source_id=?",
	                    strObject, oAttrValue.m_strAttrib, getID() );
	                if (!res.isEnd())
	                {
	                    strDbValue = res.getStringByIdx(0);
	                    bDownload = strDbValue == null || strDbValue.length() == 0;
	                }
	            }
	        }

	        if ( bDownload )
	        {
	    	    boolean bRes = false;
	            getDB().endTransaction();
	            try{
	        	    bRes = downloadBlob(oAttrValue);
	            }finally
	            {
	        	    getDB().startTransaction();
	            }
	        
	            return bRes;
	        }
/*	    
	        String fName = makeFileName( oAttrValue );	  
	        String fOldName = RHODESAPP().resolveDBFilesPath(strDbValue);
	        RhoClassFactory.createFile().renameOverwrite(fOldName, fName); 
	    
	        oAttrValue.m_strValue = FilePath.getRelativePath( fName, RhodesApp.getInstance().getRhoRootPath());
 */
            oAttrValue.m_strValue = strDbValue;
	        return true;
	    }
Beispiel #10
0
        void processServerCmd_Ver3_Schema(String strCmd, String strObject, JSONStructIterator attrIter)
        {
            if (strCmd.compareTo("insert") == 0)
            {
                Vector <String> vecValues = new Vector <String>(), vecAttrs = new Vector <String>();
                String          strCols = "", strQuest = "", strSet = "";
                for ( ; !attrIter.isEnd() && getSync().isContinueSync(); attrIter.next())
                {
                    CAttrValue oAttrValue = new CAttrValue(attrIter.getCurKey(), attrIter.getCurString());
                    if (!processBlob(strCmd, strObject, oAttrValue))
                    {
                        continue;
                    }

                    if (strCols.length() > 0)
                    {
                        strCols += ",";
                    }
                    if (strQuest.length() > 0)
                    {
                        strQuest += ",";
                    }
                    if (strSet.length() > 0)
                    {
                        strSet += ",";
                    }

                    strCols  += oAttrValue.m_strAttrib;
                    strQuest += "?";
                    strSet   += oAttrValue.m_strAttrib + "=?";
                    vecAttrs.addElement(oAttrValue.m_strAttrib);
                    vecValues.addElement(oAttrValue.m_strValue);
                }
                vecValues.addElement(strObject);
                if (strCols.length() > 0)
                {
                    strCols += ",";
                }
                if (strQuest.length() > 0)
                {
                    strQuest += ",";
                }

                strCols  += "object";
                strQuest += "?";

                String strSqlInsert = "INSERT INTO ";
                strSqlInsert += getName() + " (";
                strSqlInsert += strCols + ") VALUES(" + strQuest + ")";

                if (!getSync().isContinueSync())
                {
                    return;
                }

                IDBResult resInsert = getDB().executeSQLReportNonUniqueEx(strSqlInsert, vecValues);
                if (resInsert.isNonUnique())
                {
                    String strSqlUpdate = "UPDATE ";
                    strSqlUpdate += getName() + " SET " + strSet + " WHERE object=?";
                    getDB().executeSQLEx(strSqlUpdate, vecValues);

                    if (getSyncType().compareTo("none") != 0)
                    {
                        // oo conflicts
                        for (int i = 0; i < (int)vecAttrs.size(); i++)
                        {
                            getDB().executeSQL("UPDATE changed_values SET sent=4 where object=? and attrib=? and source_id=? and sent>1",
                                               strObject, vecAttrs.elementAt(i), getID());
                        }
                        //
                    }
                }

                if (getSyncType().compareTo("none") != 0)
                {
                    getNotify().onObjectChanged(getID(), strObject, SyncNotify.enUpdate);
                }

                m_nInserted++;
            }
            else if (strCmd.compareTo("delete") == 0)
            {
                Vector <String> vecAttrs = new Vector <String>();
                String          strSet   = "";
                for ( ; !attrIter.isEnd() && getSync().isContinueSync(); attrIter.next())
                {
                    CAttrValue oAttrValue = new CAttrValue(attrIter.getCurKey(), attrIter.getCurString());

                    if (strSet.length() > 0)
                    {
                        strSet += ",";
                    }

                    vecAttrs.addElement(oAttrValue.m_strAttrib);
                    strSet += oAttrValue.m_strAttrib + "=NULL";
                }

                String strSqlUpdate = "UPDATE ";
                strSqlUpdate += getName() + " SET " + strSet + " WHERE object=?";

                if (strSet.length() == 0 || !getSync().isContinueSync())
                {
                    return;
                }

                getDB().executeSQL(strSqlUpdate, strObject);
                //Remove item if all nulls
                String    strSelect = "SELECT * FROM " + getName() + " WHERE object=?";
                IDBResult res       = getDB().executeSQL(strSelect, strObject);
                if (!res.isEnd())
                {
                    boolean bAllNulls = true;
                    for (int i = 0; i < res.getColCount(); i++)
                    {
                        if (!res.isNullByIdx(i) && res.getColName(i).compareTo("object") != 0)
                        {
                            bAllNulls = false;
                            break;
                        }
                    }

                    if (bAllNulls)
                    {
                        String strDelete = "DELETE FROM " + getName() + " WHERE object=?";
                        getDB().executeSQL(strDelete, strObject);
                    }
                }

                if (getSyncType().compareTo("none") != 0)
                {
                    getNotify().onObjectChanged(getID(), strObject, SyncNotify.enDelete);
                    // oo conflicts
                    for (int i = 0; i < (int)vecAttrs.size(); i++)
                    {
                        getDB().executeSQL("UPDATE changed_values SET sent=3 where object=? and attrib=? and source_id=?",
                                           strObject, vecAttrs.elementAt(i), getID());
                    }
                    //
                }

                m_nDeleted++;
            }
            else if (strCmd.compareTo("links") == 0)
            {
                String strValue = attrIter.getCurString();
                processAssociations(strObject, strValue);

                String strSqlUpdate = "UPDATE ";
                strSqlUpdate += getName() + " SET object=? WHERE object=?";
                getDB().executeSQL(strSqlUpdate, strValue, strObject);

                getDB().executeSQL("UPDATE changed_values SET object=?,sent=3 where object=? and source_id=?", strValue, strObject, getID());
                getNotify().onObjectChanged(getID(), strObject, SyncNotify.enCreate);
            }
        }
Beispiel #11
0
	    void processServerCmd_Ver3(String strCmd, String strObject, String strAttriba, String strValuea)
	    {
	        CAttrValue oAttrValue = new CAttrValue(strAttriba,strValuea);
		
	        if ( strCmd.compareTo("insert") == 0 )
	        {
	            
                String strFreezedProps = SyncEngine.getSourceOptions().getProperty(getID(), "freezed");
                if ( strFreezedProps.length() > 0 && strFreezedProps.indexOf(oAttrValue.m_strAttrib) < 0 ) 	
                {
                    LOG.INFO("Skip Non-exist property : " + oAttrValue.m_strAttrib + ". For model : " + getName());
                    return;
                }
                
                if ( !processBlob(strCmd,strObject,oAttrValue) )
	                return;

	            IDBResult resInsert = getDB().executeSQLReportNonUnique("INSERT INTO object_values "+
	                    "(attrib, source_id, object, value) VALUES(?,?,?,?)", 
	                    oAttrValue.m_strAttrib, getID(), strObject, oAttrValue.m_strValue );
	        
	            if ( resInsert.isNonUnique() )
	            {
	                getDB().executeSQL("UPDATE object_values " +
                        "SET value=? WHERE object=? and attrib=? and source_id=?", 
                         oAttrValue.m_strValue, strObject, oAttrValue.m_strAttrib, getID() );

	                if ( getSyncType().compareTo("none") != 0 )
	                {
		                // oo conflicts
		                getDB().executeSQL("UPDATE changed_values SET sent=4 where object=? and attrib=? and source_id=? and sent>1", 
		                        strObject, oAttrValue.m_strAttrib, getID() );
		                //
	                }
	            }

	            if ( getSyncType().compareTo("none") != 0 )	        
	        	    getNotify().onObjectChanged(getID(),strObject, SyncNotify.enUpdate);
	        
	            m_nInserted++;
	        }else if (strCmd.compareTo("delete") == 0)
	        {
	            getDB().executeSQL("DELETE FROM object_values where object=? and attrib=? and source_id=?", strObject, oAttrValue.m_strAttrib, getID() );
	        
	            if ( getSyncType().compareTo("none") != 0 )
	            {
		            getNotify().onObjectChanged(getID(), strObject, SyncNotify.enDelete);
		            // oo conflicts
		            getDB().executeSQL("UPDATE changed_values SET sent=3 where object=? and attrib=? and source_id=?", strObject, oAttrValue.m_strAttrib, getID() );
		            //
	            }
	            m_nDeleted++;
	        }else if ( strCmd.compareTo("links") == 0 )
	        {
	            processAssociations(strObject, oAttrValue.m_strValue);

	            getDB().executeSQL("UPDATE object_values SET object=? where object=? and source_id=?", oAttrValue.m_strValue, strObject, getID() );
	            getDB().executeSQL("UPDATE changed_values SET object=?,sent=3 where object=? and source_id=?", oAttrValue.m_strValue, strObject, getID() );

	            getNotify().onObjectChanged(getID(), strObject, SyncNotify.enCreate);
	        }

	    }