void CSyncSource::syncServerChanges() { LOG(INFO) + "Sync server changes source ID :" + getID(); while( getSync().isContinueSync() ) { setCurPageCount(0); String strUrl = getProtocol().getServerQueryUrl(""); String strQuery = getProtocol().getServerQueryBody(getName(), getSync().getClientID(), getSync().getSyncPageSize()); if ( !m_bTokenFromDB && getToken() > 1 ) strQuery += "&token=" + convertToStringA(getToken()); LOG(INFO) + "Pull changes from server. Url: " + (strUrl+strQuery); PROF_START("Net"); NetResponse(resp,getNet().pullData(strUrl+strQuery, &getSync())); PROF_STOP("Net"); if ( !resp.isOK() ) { getSync().stopSync(); m_nErrCode = RhoAppAdapter.getErrorFromResponse(resp); m_strError = resp.getCharData(); continue; } const char* szData = resp.getCharData(); //const char* szData = "[{\"version\":3},{\"token\":\"\"},{\"count\":0},{\"progress_count\":28},{\"total_count\":28},{\"source-error\":{\"login-error\":{\"message\":\"s currently connected from another machine\"}}}]"; //const char* szData = "[{\"version\":3},{\"token\":\"\"},{\"count\":0},{\"progress_count\":0},{\"total_count\":0},{\"create-error\":{\"0_broken_object_id\":{\"name\":\"wrongname\",\"an_attribute\":\"error create\"},\"0_broken_object_id-error\":{\"message\":\"error create\"}}}]"; //const char* szData = "[{\"version\":3},{\"token\":\"35639160294387\"},{\"count\":3},{\"progress_count\":0},{\"total_count\":3},{\"metadata\":\"{\\\"foo\\\":\\\"bar\\\"}\",\"insert\":{\"1\":{\"price\":\"199.99\",\"brand\":\"Apple\",\"name\":\"iPhone\"}}}]"; //LOG(INFO) + szData; PROF_START("Parse"); CJSONArrayIterator oJsonArr(szData); PROF_STOP("Parse"); processServerResponse_ver3(oJsonArr); if (getSync().getSourceOptions().getBoolProperty(getID(), "pass_through")) processToken(0); if ( getToken() == 0 ) break; } if ( getSync().isSchemaChanged() ) getSync().stopSync(); }
boolean CSyncSource::processSyncObject_ver1(CJSONEntry oJsonObject, int nSrcID)//throws Exception { const char* strOldObject = oJsonObject.getString("oo"); if ( isDeleteObjectsPass() != (nSrcID < 0) ) return true; if ( oJsonObject.hasName("e") ) { const char* strError = oJsonObject.getString("e"); getNotify().addCreateObjectError(nSrcID,strOldObject,strError); return true; } const char* strObject = oJsonObject.getString("o"); CJSONArrayIterator oJsonArr(oJsonObject, "av"); //oo conflicts boolean bUpdatedOO = false; // for( ; !oJsonArr.isEnd() && getSync().isContinueSync(); oJsonArr.next() ) { CJSONEntry oJsonEntry = oJsonArr.getCurItem(); if ( oJsonEntry.isEmpty() ) continue; if ( nSrcID >= 0 ) //insert { CValue value(oJsonEntry,1); if ( !downloadBlob(value) ) return false; String strAttrib = oJsonEntry.getString("a"); //oo conflicts if ( strOldObject != null && !bUpdatedOO ) { getDB().executeSQL("UPDATE object_values SET object=? where object=? and source_id=?", strObject, strOldObject, nSrcID ); getDB().executeSQL("UPDATE changed_values SET object=? where object=? and source_id=?", strObject, strOldObject, nSrcID ); getNotify().onObjectChanged(nSrcID,strOldObject, CSyncNotify::enCreate); bUpdatedOO = true; } DBResult(resInsert, getDB().executeSQLReportNonUnique("INSERT INTO object_values \ (id, attrib, source_id, object, value, attrib_type) VALUES(?,?,?,?,?,?)", value.m_nID, strAttrib, nSrcID, strObject, value.m_strValue, value.m_strAttrType ) ); if ( resInsert.isNonUnique() ) { getDB().executeSQL("UPDATE object_values \ SET id=?, value=?, attrib_type=? WHERE object=? and attrib=? and source_id=?", value.m_nID, value.m_strValue, value.m_strAttrType, strObject, strAttrib, nSrcID ); // oo conflicts getDB().executeSQL("UPDATE changed_values SET main_id=? where object=? and attrib=? and source_id=? and sent<=1", value.m_nID, strObject, strAttrib, nSrcID ); getDB().executeSQL("UPDATE changed_values SET sent=4 where object=? and attrib=? and source_id=? and sent>1", strObject, strAttrib, nSrcID ); // } getNotify().onObjectChanged(nSrcID,strObject, CSyncNotify::enUpdate); m_nInserted++; }else
void CSyncSource::processServerData(const char* szData) { PROF_START("Parse"); CJSONArrayIterator oJsonArr(szData); PROF_STOP("Parse"); PROF_START("Data1"); if ( !oJsonArr.isEnd() && oJsonArr.getCurItem().hasName("error") ) { m_strError = oJsonArr.getCurItem().getString("error"); m_nErrCode = RhoRuby.ERR_CUSTOMSYNCSERVER; getSync().stopSync(); return; } if ( !oJsonArr.isEnd() ) { setCurPageCount(oJsonArr.getCurItem().getInt("count")); oJsonArr.next(); } int nVersion = 0; if ( !oJsonArr.isEnd() && oJsonArr.getCurItem().hasName("version") ) { nVersion = oJsonArr.getCurItem().getInt("version"); oJsonArr.next(); } if ( nVersion != getSync().SYNC_VERSION() ) { LOG(ERROR) + "Sync server send data with incompatible version. Client version: " + convertToStringA(getSync().SYNC_VERSION()) + "; Server response version: " + convertToStringA(nVersion) + ". Source name: " + getName(); getSync().stopSync(); m_nErrCode = RhoRuby.ERR_SYNCVERSION; return; } if ( !oJsonArr.isEnd() && oJsonArr.getCurItem().hasName("rt") ) { setRefreshTime(oJsonArr.getCurItem().getInt("rt")); oJsonArr.next(); } if ( !oJsonArr.isEnd() && oJsonArr.getCurItem().hasName("total_count") ) { setTotalCount(oJsonArr.getCurItem().getInt("total_count")); oJsonArr.next(); } //if ( getServerObjectsCount() == 0 ) // getNotify().fireSyncNotification(this, false, RhoRuby.ERR_NONE, ""); if ( !oJsonArr.isEnd() ) { processToken(oJsonArr.getCurItem().getUInt64("token")); oJsonArr.next(); }else if ( getCurPageCount() == 0 ) { //oo conflicts getDB().executeSQL("DELETE FROM changed_values where source_id=? and sent>=3", getID() ); // processToken(0); } LOG(INFO) + "Got " + getCurPageCount() + "(Processed: " + getServerObjectsCount() + ") records of " + getTotalCount() + " from server. Source: " + getName() + ". Version: " + nVersion; PROF_STOP("Data1"); if ( !oJsonArr.isEnd() && getSync().isContinueSync() ) { PROF_START("Data"); //TODO: support DBExceptions getDB().startTransaction(); int nSavedPos = oJsonArr.getCurPos(); setSyncServerDataPass(edpNone); processServerData_Ver1(oJsonArr); setSyncServerDataPass(edpDeleteObjects); oJsonArr.reset(nSavedPos); processServerData_Ver1(oJsonArr); PROF_STOP("Data"); PROF_START("DB"); getDB().endTransaction(); PROF_STOP("DB"); getNotify().fireObjectsNotification(); } PROF_START("Data1"); if ( getCurPageCount() > 0 ) getNotify().fireSyncNotification(this, false, RhoRuby.ERR_NONE, ""); PROF_STOP("Data1"); }