mirror of
https://github.com/leanote/desktop-app.git
synced 2025-10-15 07:31:33 +00:00
send changes for notebook
This commit is contained in:
171
node_modules/sync.js
generated
vendored
171
node_modules/sync.js
generated
vendored
@@ -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();
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
|
Reference in New Issue
Block a user