send changes for notebook

This commit is contained in:
life
2015-01-25 13:24:57 +08:00
parent 93e5d7be6e
commit a137aada9f
12 changed files with 3122 additions and 30 deletions

171
node_modules/sync.js generated vendored
View File

@@ -1,4 +1,5 @@
var db = require('db');
var async = require('async');
var Common = require('common');
var User = require('user');
var Tags = db.tags;
@@ -16,10 +17,18 @@ function log(o) {
var Sync = {
// 同步的信息, 返回给调用者
_syncInfo: {
notebook: {changeAdds: [], adds: [], deletes: [], updates: []},
note: {changeAdds: [], adds: [], deletes: [], updates: [], conflicts: []},
tag: {}
},
/*
_sendInfo: {
notebook: {adds: [], deletes: [], updates: []},
note: {adds: [], deletes: [], updates: [], conflicts: []},
tag: {}
},
*/
_needIncrSyncAgain: false,
// notebook
_syncNotebookIsLastChunk: false,
@@ -47,11 +56,23 @@ var Sync = {
me._totalHasSyncNoteNum = 0;
me._lockNote = 1;
// 同步信息
me._syncInfo = {
notebook: {ok: false, changeAdds: [], adds: [], deletes: [], updates: []},
note: {ok: false, adds: [], changeAdds: [], deletes: [], updates: [], conflicts: []},
tag: {ok: false, adds: [], changeAdds: [], deletes: [], updates: [], conflicts: []},
};
// 发送改变信息
/*
me._sendInfo = {
notebook: {ok: false, adds: [], deletes: [], updates: []},
note: {ok: false, adds: [], deletes: [], updates: [], conflicts: []},
tag: {ok: false}
};
*/
// 是否还要来一次增量同步 ?
me._needIncrSyncAgain = false;
},
//---------------
@@ -295,9 +316,11 @@ var Sync = {
},
// 记录LastSyncUsn, LastUpdateTime 同步时间
updateLastSyncState: function() {
updateLastSyncState: function(callback) {
var me = this;
User.updateLastSyncState();
User.updateLastSyncState(function() {
callback();
});
},
// 全量同步
@@ -315,10 +338,10 @@ var Sync = {
// 同步标签
me.syncTag(-1, function() {
// 更新上次同步时间
me.updateLastSyncState();
// send changes
me.sendChanges(callback);
me.updateLastSyncState(function() {
// send changes
me.sendChanges();
});
});
} else {
callback && callback(me._syncInfo);
@@ -334,13 +357,19 @@ var Sync = {
_notebookWeb: null,
_noteWeb: null,
// 处理冲突
fixConflicts: function() {
fixConflicts: function(callback) {
var me = this;
log('--------------')
var afterInfo = me._syncInfo;
log('处理冲突....')
log(me._syncInfo);
log(me._syncInfo.note.updates);
Notebook.fixConflicts(me._syncInfo.notebook, me._notebookWeb);
Note.fixConflicts(me._syncInfo.note, me._noteWeb);
Note.fixConflicts(me._syncInfo.note, me._noteWeb, function() {
// 避免无限循环, 别send changes了
if(!me._needIncrSyncAgain) {
// send changes
callback && callback();
}
});
},
// 增量同步
@@ -370,12 +399,11 @@ var Sync = {
// 同步标签
me.syncTag(lastSyncUsn, function() {
log('-------incr tag ok-----------')
// 更新上次同步时间
me.updateLastSyncState();
// send changes
me.sendChanges();
me.updateLastSyncState(function() {
// send changes
me.sendChanges();
});
});
} else {
log('-------incr note not ok-----------')
@@ -389,13 +417,118 @@ var Sync = {
});
},
//---------
// 发送改变
sendChanges: function(callback) {
var me = this;
// 先处理冲突
me.fixConflicts();
//---------
// 发送笔记本的更改
sendNotebookChanges: function(callback) {
var me = this;
// 获取所有笔记本的更改
Notebook.getDirtyNotebooks(function(notebooks) {
log('dirty notebooks');
log(notebooks);
if(!notebooks) {
callback && callback();
} else {
// 调api, 所有执行后再callback();
// 一个一个同步执行, 因为要有
async.eachSeries(notebooks, function(notebook, cb) {
var api = Api.updateNotebook;
if(notebook.LocalIsNew) {
api = Api.addNotebook;
} else if(notebook.LocalIsDelete) {
api = Api.deleteNotebook;
}
api.call(Api, notebook, function(newNotebook) {
// 更新失败
if(!newNotebook) {
return cb();
}
// 更新成功, 是否有冲突?
// newNotebook是服务器上的笔记本
// 没有更新成功
if(!newNotebook.NotebookId) {
if(newNotebook.Msg == 'conflict') {
me._syncInfo.notebook.conflicts.push(newNotebook);
// me._sendInfo.notebook.conflicts.push(newNotebook);
}
}
else {
// 更新
Notebook.updateNotebookForceForSendChange(notebook.NotebookId, newNotebook);
if(notebook.LocalIsNew) {
newNotebook.OldNotebookId = notebook.NotebookId;
me._syncInfo.notebook.changeAdds.push(newNotebook);
// me._sendInfo.notebook.adds.push(newNotebook);
} else {
me._syncInfo.notebook.updates.push(newNotebook);
// me._sendInfo.notebook.updates.push(newNotebook);
}
}
// 如果之前都很正常
if(!me._needIncrSyncAgain) {
// 检查是否有问题
if(User.getLastSyncUsn() + 1 == newNotebook.Usn) {
// 更新到本地lastSyncUsn
User.updateLastSyncUsn(newNotebook.Usn);
} else {
// newNotebook.Usn > User.getLastSyncUsn + 1, 表示服务器端在本次同步后, sendChanges之前有更新
// 那么, 还需要来一次incrSync, 之后
me._needIncrSyncAgain = true;
}
}
cb();
});
}, function() {
callback && callback();
});
}
});
},
// 发送笔记改变
sendNoteChanges: function(callback) {
log('send note changes');
callback && callback();
},
// 发送标签改变
sendTagChanges: function(callback) {
log('send note changes');
callback && callback();
},
sendChanges: function() {
var me = this;
log('send changes before...')
// 先处理冲突, 可以同时进行
me.fixConflicts(function() {
// send changes
log('send changes');
me._initSyncInfo(); // 重新初始化[]
async.series([
function(cb) {
me.sendNotebookChanges(cb);
},
function(cb) {
me.sendNoteChanges(cb);
},
function(cb) {
me.sendTagChanges(cb);
}
], function() {
// 重新再来一次增量同步
if(me._needIncrSyncAgain) {
log('-- _needIncrSyncAgain -- ')
me.incrSync(me._notebookWeb, me._noteWeb);
} else {
log('send changes 后解决冲突');
me.fixConflicts();
}
});
});
}
};