<- sync tag ok

This commit is contained in:
life
2015-02-07 00:32:22 +08:00
parent 19eb994845
commit 68c668514b
7 changed files with 219 additions and 37 deletions

52
node_modules/api.js generated vendored
View File

@@ -135,6 +135,25 @@ var Api = {
}
});
},
getSyncTags: function(afterUsn, maxEntry, callback) {
var me = this;
var url = this.getUrl('tag/getSyncTags', {afterUsn: afterUsn, maxEntry: maxEntry});
log(url);
needle.get(url, function(error, response) {
if(error) {
console.log('tag/getSyncTags');
console.log(error);
return callback && callback(false);
}
var ret = response.body;
console.log(ret);
if(Common.isOk(ret)) {
callback && callback(ret);
} else {
callback && callback(false);
}
});
},
getLastSyncState: function(callback) {
var me = this;
log('--getSyncState--')
@@ -375,22 +394,23 @@ var Api = {
console.log('end transfer data');
console.log(data);
needle.post(me.getUrl('note/addNote'), data, {multipart: needMultiple}, function(err, resp) {
if(err) {
return callback(false);
}
var ret = resp.body;
log('add note ret');
log(ret);
log('add note ret<-');
if(Common.isOk(ret)) {
// 将serverId保存
callback(ret);
} else {
callback(false);
}
});
try {
needle.post(me.getUrl('note/addNote'), data, {multipart: needMultiple}, function(err, resp) {
if(err) {
return callback(false);
}
var ret = resp.body;
log('add note ret');
log(ret);
log('add note ret<-');
if(Common.isOk(ret)) {
// 将serverId保存
callback(ret);
} else {
callback(false);
}
});
} catch(e) {};
});
},

22
node_modules/note.js generated vendored
View File

@@ -769,16 +769,22 @@ var Note = {
// console.log(file);
// 要传数据的
if(file.IsDirty) {
// TODO
if(file.Path.indexOf('data/') == 0) {
file.Path = Evt.getAbsolutePath(file.Path);
}
fs.exists(file.Path, function(isExists) {
needTransferFiles[file.FileId] = {
file: file.Path,
content_type: 'application/' + file.Type // TODO
if(isExists) {
needTransferFiles[file.FileId] = {
file: file.Path,
content_type: 'application/' + file.Type // TODO
}
if(file.Title) {
needTransferFiles[file.FileId].filename = file.Title;
}
needFile.HasBody = true;
needPostFilesAttr.push(needFile);
}
if(file.Title) {
needTransferFiles[file.FileId].filename = file.Title;
}
needFile.HasBody = true;
needPostFilesAttr.push(needFile);
return cb();
});
} else {

132
node_modules/sync.js generated vendored
View File

@@ -2,12 +2,14 @@ var db = require('db');
var async = require('async');
var Common = require('common');
var User = require('user');
var Tag = require('tag');
var Tags = db.tags;
var needle = require('needle');
var fs = require('fs');
var Api = require('api');
var Notebook = require('notebook');
var Note = require('note');
var Web = require('web');
function log(o) {
console.log(o);
@@ -41,6 +43,11 @@ var Sync = {
_totalSyncNoteNum: 0, // 需要同步的数量
_noteMaxEntry: 1,
// tag
_syncTagIsLastChunk: false,
_totalSyncTagNum: 0, // 需要同步的数量
_tagMaxEntry: 1,
_initSyncInfo: function() {
var me = this;
@@ -56,6 +63,12 @@ var Sync = {
me._totalHasSyncNoteNum = 0;
me._lockNote = 1;
// tag
me._syncTagIsLastChunk = false;
me._totalSyncTagNum = 0;
me._totalHasSyncTagNum = 0;
me._lockTag = 1;
// 同步信息
me._syncInfo = {
notebook: {ok: false, changeAdds: [], changeConflicts: [], changeNeedAdds: [], adds: [], deletes: [], updates: []},
@@ -317,12 +330,115 @@ var Sync = {
});
},
//----------------
// 同步标签
syncTag: function(afterUsn, callback) {
callback && callback(true);
// ---------------
// 增加, 有锁
_lockTag: 1,
_addSyncTagNum: function() {
var me = this;
if(me._lockTag) {
me._lockTag = 0;
me._totalHasSyncTagNum++;
me._lockTag = 1;
} else {
me._addSyncTagNum();
}
},
// 同步标签到本地
_syncTagToLocal: function(tags, callback) {
var me = this;
function canCall(isEmpty) {
// 为空时来判断是最后一次了, 可以之前的还没处理完
if(isEmpty && me._totalHasSyncTagNum < me._totalSyncTagNum) {
return;
}
// 是最后一块, 且
me._addSyncTagNum();
// log('tags: ' + me._totalHasSyncNoteNum + ' ' + me._totalSyncNoteNum + ' ' + me._syncNoteIsLastChunk);
if(me._syncTagIsLastChunk && me._totalHasSyncTagNum >= me._totalSyncTagNum) {
// 防止多次callback
if(!me._syncInfo.tag.ok) {
log('tag->next');
me._syncInfo.tag.ok = true;
callback && callback(true);
}
}
}
// 为什么会出现最后 > 的情况, 是因为这里length == 0 也判断了
if(!tags || tags.length == 0) {
return canCall(true);
}
for(var i in tags) {
var tag = tags[i];
// 得到本地的, 与之对比
(function(tag) {
var usn = tag.Usn;
var tagId = tag.TagId;
// 1) 服务器端删除了, 本地肯定删除
if(tag.IsDeleted) {
log('delete tag: ');
log(tag);
Tag.deleteTag(tag.Tag, function() {
me._syncInfo.tag.deletes.push(tag.Tag);
canCall();
}, true);
return;
}
// 2) 查看本地的, 与本地合并
Tag.getTag(tag.Tag, function(tagLocal) {
// 2.1 本地没有, 表示是新建
if(!tagLocal) {
log('add tag: ...')
Tag.addOrUpdateTag(tag.Tag, function(tagAdded) {
me._syncInfo.tag.adds.push(tagAdded);
return canCall();
}, true);
} else {
// 本地有, 不用操作
}
});
})(tag);
}
},
syncTag: function(afterUsn, callback) {
var me = this;
Api.getSyncTags(afterUsn, me._tagMaxEntry, function(tags) {
log('syncTags------------------------------------')
log(tags);
if(Common.isOk(tags)) {
me._totalSyncTagNum += tags.length;
// 证明可能还有要同步的
if(tags.length == me._tagMaxEntry) {
me._syncTagToLocal(tags, callback);
var last = tags[tags.length-1];
me.syncTag(last.Usn, callback);
} else {
log('no more');
me._syncTagIsLastChunk = true;
me._syncTagToLocal(tags, callback);
}
} else {
// 同步失败
me._syncInfo.tag.ok = false;
me._syncInfo.tag.msg = "cann't get all chunks";
console.log(tags);
console.log('tags eeeeeeeeeeeeeeeeeerrror')
callback && callback(false);
}
});
},
//----------
// 记录LastSyncUsn, LastUpdateTime 同步时间
updateLastSyncState: function(callback) {
var me = this;
@@ -384,6 +500,9 @@ var Sync = {
}
});
}
// 添加或删除一些tag
Web.addOrDeleteTagFromSync(me._syncInfo.tag);
},
// 增量同步
@@ -405,14 +524,14 @@ var Sync = {
// 同步笔记本
me.syncNotebook(lastSyncUsn, function(ok) {
if(ok) {
log('-------incr notebook ok-----------')
log('-------incr notebook ok-----------' + lastSyncUsn)
// 同步笔记
me.syncNote(lastSyncUsn, function(ok) {
if(ok) {
log('-------incr note ok-----------')
log('-------incr note ok-----------' + lastSyncUsn)
// 同步标签
me.syncTag(lastSyncUsn, function() {
log('-------incr tag ok-----------')
log('-------incr tag ok-----------' + lastSyncUsn)
// 更新上次同步时间
me.updateLastSyncState(function() {
// send changes
@@ -647,6 +766,7 @@ var Sync = {
log('send changes before...')
// 先处理冲突, 可以同时进行
me.fixConflicts(function() {
return;
// send changes
log('send changes');
me._initSyncInfo(); // 重新初始化[]

22
node_modules/tag.js generated vendored
View File

@@ -19,7 +19,7 @@ Count 笔记数
var Tag = {
// 添加或更新标签
addOrUpdateTag: function(title, callback) {
addOrUpdateTag: function(title, callback, isForce) {
var userId = User.getCurActiveUserId();
Tags.findOne({UserId: userId, Tag: title}, function(err, tag) {
// 存在, 则更新该tag下的笔记数量
@@ -38,7 +38,7 @@ var Tag = {
TagId: Common.objectId(),
UserId: userId,
Tag: title,
IsDirty: true, // 新添加的
IsDirty: !isForce, // 新添加的
Count: 1,
LocalIsDelete: false,
CreatedTime: date,
@@ -64,24 +64,34 @@ var Tag = {
},
// 删除标签, 更新为LocaleIsDelete = true
deleteTag: function(title, callback) {
deleteTag: function(title, callback, isForce) {
var me = this;
Tags.update({UserId: User.getCurActiveUserId(), Tag: title}, {$set: {LocalIsDelete: true, UpdatedTime: new Date()}}, function() {
Tags.update({UserId: User.getCurActiveUserId(), Tag: title}, {$set: {LocalIsDelete: true, IsDirty: !isForce, UpdatedTime: new Date()}}, function() {
});
// 笔记本
//
Note.updateNoteToDeleteTag(title, function(updates) {
callback(updates);
callback && callback(updates);
});
},
// 更新标签的数量, 在彻底删除笔记时调用
updateTagCount: function(title, count) {
userId = User.getCurActiveUserId();
// 更新Tag's Count
Tags.update({UserId: userId, Tag: title}, {$set: {Count: cnt}});
// 更新web
Web.updateTagCount({Tag: title, Count: cnt});
},
getTag: function(title, callback) {
userId = User.getCurActiveUserId();
Tags.findOne({UserId: userId, Tag: title}, function(err, tag) {
if(err || !tag) {
return callback && callback(false);
}
callback && callback(tag);
});
}
/*
// 添加多个标签
addTags: function(titles) {

9
node_modules/web.js generated vendored
View File

@@ -23,6 +23,15 @@ var Web = {
updateTagCount: function(tag) {
var me = this;
me.Tag.updateTagCount(tag);
},
//
addOrDeleteTagFromSync: function(tagSyncInfo) {
var me = this;
var adds = tagSyncInfo.adds;
me.Tag.addTagsNav(adds);
var deletes = tagSyncInfo.deletes;
me.Tag.deleteTagsNav(deletes);
}
};
module.exports = Web;